
机器学习入门:线性回归详解与Python实现
本文详细介绍了机器学习中的基础算法——线性回归。通过阐述线性回归的数学原理、实现方法和应用场景,帮助读者深入理解这一重要的预测模型。文章不仅给出了理论解析,还提供了基于Python的实践代码,并对线性回归的优缺点进行了全面剖析,适合机器学习初学者和希望系统学习回归算法的读者。
线性回归概念介绍
1、什么是线性回归?
线性回归是一种用于预测连续数值型目标变量的监督学习算法。它通过构建一个线性模型,使用自变量来预测因变量。
假设你想预测一个商店的销售额。你知道商店的广告费用、促销活动等因素会影响销售额。你有过去一段时间的广告费用和销售额数据,比如:
广告费用(万元) | 销售额(万元) |
---|---|
1 | 5 |
2 | 10 |
3 | 15 |
4 | 20 |
你可以用线性回归来找出广告费用和销售额之间的关系。具体来说,线性回归会通过一条直线来描述这种关系,比如公式是:
销售额 = 5 × 广告费用 + 0 销售额=5×广告费用+0 销售额=5×广告费用+0
这意味着每花费1万元广告费用,销售额会增加5万元。而通过这个公式,你可以预测未来不同广告费用下的销售额。总的来说,线性回归就是根据已有的数据找到一条“最佳”直线,帮助你预测新的结果。
线性回归的基本公式:
y = w x + b y = wx + b y=wx+b
其中:
y:因变量(预测目标)
x:自变量(特征)
w:权重(斜率)
b:偏置项(截距)
2、线性回归的数学原理
线性回归的核心是最小二乘法,目标是最小化预测值和实际值之间的误差平方和。
损失函数(代价函数):
J ( w , b ) = 1 2 n ∑ i = 1 n ( y i − ( w x i + b ) ) 2 J(w, b) = \frac{1}{2n} \sum_{i=1}^{n} \left( y_i - (w x_i + b) \right)^2 J(w,b)=2n1i=1∑n(yi−(wxi+b))2
3、python代码实现
运行代码前要确保安装了scikit-learn
,如果没安装可以使用如下命令安装:
pip install -U scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
安装matplotlib、numpy
使用
pip install matplotlib numpy
# 标准库导入
import numpy as np
# 第三方库导入
import matplotlib
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
# 设置matplotlib后端
matplotlib.use('TkAgg')
# 设置字体为黑体(SimHei),确保支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
plt.rcParams['axes.unicode_minus'] = False # 显示负号
# 生成模拟数据
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 2 * X + 1 + np.random.randn(100, 1)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 模型评估
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
# 可视化
plt.scatter(X_test, y_test, color='blue', label='实际值')
plt.plot(X_test, y_pred, color='red', label='预测值')
plt.title('线性回归:实际值 vs 预测值')
plt.xlabel('特征值')
plt.ylabel('目标值')
plt.legend()
plt.show()
# 输出模型参数和评估指标
print(f"模型权重(斜率):{model.coef_[0][0]:.4f}")
print(f"模型偏置(截距):{model.intercept_[0]:.4f}")
print(f"均方误差(MSE):{mse:.4f}")
print(f"R²分数:{r2:.4f}")
4、线性回归中的过拟合与欠拟合
过拟合(overfitting):
过拟合指的是模型在训练数据上表现得非常好,但在新数据(测试数据)上的表现差。
1. 表现: 训练误差很小,但是测试误差很大。
2. 原因: 模型过于复杂,使用了太多的特征或过多的多项式,导致模型太过“灵活”,适应了训练数据中的噪声。
3.如何避免: 可以通过正则化(例如L1或L2正则化),减少特征数量,或者使用交叉验证等方法来减轻过拟合的影响。
欠拟合(Underfitting)
欠拟合指的是模型过于简单,无法捕捉数据的真正规律,导致在训练数据和测试数据上的表现都不好。
1. 表现: 训练误差和测试误差都很大。
2. 原因: 模型过于简单,使用了过少的特征,或者选择的模型本身不能充分表示数据的规律。
3.如何避免: 可以通过使用更复杂的模型,添加更多的特征,或者减少正则化强度来解决欠拟合问题。
5、线性回归中的超参数与模型评估方法
线性回归中的超参数:
在线性回归模型中,超参数并不如在其他复杂模型中那么多,但仍然有一些重要的超参数可以影响模型的表现,特别是当你在使用正则化线性回归时(例如岭回归、Lasso回归等)。
(1)正则化参数(例如岭回归的λ 或 Lasso回归的α)
- 岭回归(Ridge Regression):岭回归通过在损失函数中加入一个正则化项来控制模型复杂度,防止过拟合。正则化项是特征权重的平方和,λ 是正则化强度的超参数。增大 λ 会加强正则化,使模型更简单,减小 λ 会使模型更复杂,可能导致过拟合。
- Lasso回归(Lasso Regression) :Lasso回归与岭回归类似,只不过它加入的是特征权重的绝对值和。Lasso回归的正则化强度是通过 α 来控制的。Lasso的特点是当α较大时,部分特征的权重会被压缩到零,从而实现特征选择。
(2)学习率(在梯度下降法中):
- 学习率:如果使用梯度下降算法来训练线性回归模型,学习率就是一个超参数。学习率决定了每次更新模型参数时步长的大小。过大可能导致跳过最优解,而过小会导致收敛太慢。
线性回归的模型评估方法:
评估线性回归模型的好坏,主要依赖于以下几种指标:
-
均方误差(MSE, Mean Squared Error):
MSE 是一种常见的回归问题评估指标,用于衡量模型预测值与真实值之间的差异。计算公式如下:
M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1∑n(yi−y^i)2
MSE 越小,说明模型的拟合效果越好。 -
均方根误差(RMSE, Root Mean Squared Error)
RMSE 是 MSE 的平方根,它与 MSE 类似,但是单位与原始数据的单位相同,容易理解。
R M S E = M S E RMSE = \sqrt{MSE} RMSE=MSE
RMSE 也是用来衡量模型预测误差的,越小越好。 -
平均绝对误差(MAE, Mean Absolute Error):
MAE 是预测值与真实值之间差异的绝对值的平均数。它不像 MSE 那样对较大的误差给予较大权重,因此适用于对大误差不敏感的场景。 M A E = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ MAE = \frac{1}{n} \sum_{i=1}^{n} \left| y_i - \hat{y}_i \right| MAE=n1i=1∑n∣yi−y^i∣
MAE 越小表示模型误差越小。 -
R 2 R^2 R2 或 决定系数(Coefficient of Determination)
R 2 R^2 R2是线性回归中最常见的评估指标,衡量模型对数据的拟合度。其值介于 0 和 1 之间,值越接近 1 表示模型解释了更多的变异性。
R 2 = 1 − ∑ i = 1 n ( y i − y ˉ ) 2 ∑ i = 1 n ( y i − y ^ i ) 2 R^2 = 1 - \frac{\sum_{i=1}^{n} (y_i - \bar{y})^2}{\sum_{i=1}^{n} (y_i - \hat{y}_i)^2} R2=1−∑i=1n(yi−y^i)2∑i=1n(yi−yˉ)2 -
交叉验证(Cross-Validation)
交叉验证是一种模型评估方法,通常用来评估模型在不同数据集上的表现。最常用的交叉验证方法是 K折交叉验证,即将数据分为 K 个子集,依次将每个子集作为验证集,剩下的作为训练集,计算每次验证的误差,最后取其平均值。交叉验证有助于避免因数据分割的不均匀而产生的过拟合或欠拟合。
更多推荐
所有评论(0)