大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」
吴恩达:机器学习的六个核心算法!--> 线性回归
在许多实际场景中,简单的线性回归无法捕捉复杂的模式,这时候就该祭出我们多项式回归大法了,一种在数据分析和预测中常用的机器学习方法。
本文的目的在于为大侠们提供多项式回归的基础理解,并通过代码示范和数据可视化,展示如何在实践中应用这一技术。同时,本文将避免过多复杂的数学推导,侧重于实用性和可操作性。
多项式回归是对线性回归的一种扩展,它通过添加多项式项来拟合数据中的非线性关系。其基本思想是将原始特征扩展为多项式特征,然后应用线性回归模型。多项式回归的方程形式如下:
线性回归: 线性回归假设目标变量和特征变量之间存在线性关系,即:
这种方法在特征与目标变量呈线性关系时效果很好,但在处理复杂的非线性关系时表现较差。
多项式回归: 多项式回归通过引入高次项来拟合数据的非线性关系,如上节所述。通过增加多项式的阶数,可以捕捉到更多复杂的模式,但同时也增加了模型的复杂性和过拟合的风险。
多项式回归适用于以下场景:
多项式回归的基本方程是通过在线性回归模型中加入多项式特征来构建的。其一般形式为:
通过这种方式,多项式回归可以拟合出更加复杂的曲线,而不仅仅是直线。
通过对这些参数进行估计,我们可以建立一个多项式回归模型,用于预测和分析非线性关系。
我们将创建一个包含武侠元素的数据集,模拟大侠们的武功修炼数据。假设数据集中有以下字段:练功时间(小时),武功修炼程度(等级)。
首先,我们生成模拟数据,并可视化数据:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成模拟数据
np.random.seed(42)
practice_time = np.random.uniform(1, 10, 100)
skill_level = 2 + 3 * practice_time + 1.5 * practice_time**2 + np.random.normal(0, 10, 100)
# 创建数据集
data = pd.DataFrame({
'练功时间': practice_time,
'武功修炼程度': skill_level
})
# 可视化数据
plt.figure(figsize=(10, 6))
plt.scatter(data['练功时间'], data['武功修炼程度'], color='blue')
plt.xlabel('练功时间')
plt.ylabel('武功修炼程度')
plt.title('练功时间对武功修炼程度的影响')
plt.show()
在这里,我们创建了一个包含练功时间和武功修炼程度的数据集,并通过散点图展示了练功时间对武功修炼程度的影响。
接下来,我们使用 PolynomialFeatures 生成多项式特征,以便模型能够捕捉数据中的非线性关系:
from sklearn.preprocessing import PolynomialFeatures
# 生成多项式特征
poly = PolynomialFeatures(degree=2, include_bias=False)
poly_features = poly.fit_transform(data[['练功时间']])
# 查看生成的多项式特征
poly_features_df = pd.DataFrame(poly_features, columns=poly.get_feature_names_out(['练功时间']))
poly_features_df.head()
这段代码生成了练功时间的二次多项式特征,并展示了生成的特征。
最后,我们使用生成的多项式特征训练线性回归模型,并评估其性能:
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 训练线性回归模型
model = LinearRegression()
model.fit(poly_features, data['武功修炼程度'])
# 预测并评估模型
predictions = model.predict(poly_features)
mse = mean_squared_error(data['武功修炼程度'], predictions)
print(f'均方误差: {mse:.2f}')
# 为了生成平滑的拟合曲线,创建更多的数据点
practice_time_smooth = np.linspace(data['练功时间'].min(), data['练功时间'].max(), 500).reshape(-1, 1)
# 生成平滑数据点的多项式特征
smooth_poly_features = poly.transform(practice_time_smooth)
# 使用模型进行预测
smooth_predictions = model.predict(smooth_poly_features)
# 可视化实际值和拟合曲线
plt.figure(figsize=(10, 6))
plt.scatter(data['练功时间'], data['武功修炼程度'], color='blue', label='实际值')
# 绘制平滑的拟合曲线
plt.plot(practice_time_smooth, smooth_predictions, color='red', label='拟合曲线')
plt.xlabel('练功时间')
plt.ylabel('武功修炼程度')
plt.legend()
plt.title('多项式回归模型预测结果')
plt.show()
通过以上步骤,我们成功构建了一个多项式回归模型,并通过可视化展示了模型的预测效果。使用单一特征生成平滑的拟合曲线,展示了模型如何捕捉数据中的非线性关系,从而更直观地显示多项式回归的强大之处。
过拟合: 过拟合是指模型在训练数据上表现很好,但在新数据上的表现很差。具体到多项式回归,当多项式阶数过高时,模型会对训练数据中的噪声进行拟合,从而失去对新数据的泛化能力。
欠拟合: 欠拟合是指模型在训练数据和新数据上的表现都很差。具体到多项式回归,当多项式阶数过低时,模型无法捕捉数据中的复杂关系,导致预测效果不佳。
为了解决过拟合问题,可以在多项式回归中引入正则化方法。常见的正则化方法有岭回归(L2正则化)和Lasso回归(L1正则化)。
岭回归: 岭回归通过在损失函数中加入参数的平方和惩罚项,来限制模型参数的大小,从而防止过拟合。其损失函数如下:
其中,𝜆 是正则化参数,用于控制惩罚项的权重。
Lasso回归: Lasso回归通过在损失函数中加入参数的绝对值和惩罚项,来进行特征选择和防止过拟合。其损失函数如下:
其中,𝜆 是正则化参数,用于控制惩罚项的权重。
除了多项式回归外,还有其他多种非线性回归模型,如支持向量回归(SVR)和决策树回归等。
支持向量回归(SVR): 支持向量回归是一种基于支持向量机的回归方法,通过引入核函数,将数据映射到高维空间,从而能够处理复杂的非线性关系。
决策树回归: 决策树回归是一种基于决策树的回归方法,通过将数据划分成不同的区域,并在每个区域内拟合简单的模型,来处理数据中的非线性关系。
许多大侠在使用多项式回归时,可能会倾向于增加多项式的阶数,以期获得更好的拟合效果。然而,过高的多项式阶数往往会导致模型过拟合,即在训练数据上表现很好,但在新数据上的表现很差。为避免过拟合,应根据实际情况选择适当的多项式阶数,并使用交叉验证等方法评估模型的泛化能力。
数据预处理在多项式回归中同样重要。在建模之前,应对数据进行充分的清洗和处理,包括处理缺失值、异常值和特征缩放等。这可以帮助提高模型的训练效果和预测准确性。例如,特征缩放可以防止在多项式特征生成时出现数值不稳定的问题。
在多项式回归中,选择合适的模型评估方法尤为重要。常见的评估指标包括均方误差(MSE)、决定系数(R²)等。此外,还应使用交叉验证等方法对模型进行评估,以全面了解模型的性能和泛化能力。以下是一些常见的模型评估方法:
本文介绍了多项式回归的基本概念和应用场景,并通过实际案例展示了多项式回归的强大之处。在学习和应用多项式回归的过程中,大侠们需要注意以下几点:
每天一个简单通透的小案例,如果你对类似于这样的文章感兴趣。欢迎关注、点赞、转发~
- 科研为国分忧,创新与民造福 -
日更时间紧任务急,难免有疏漏之处,还请大侠海涵 内容仅供学习交流之用,部分素材来自网络,侵联删
如果觉得内容有价值,烦请大侠多多 分享、在看、点赞,助力算法金又猛又持久、很黄很 BL 的日更下去;
同时邀请大侠 关注、星标 算法金,围观日更万日,助你功力大增、笑傲江湖