在sklearn中,既可以使用LinearRegression实现基于最小二乘法的线性回归,也可以使用随机梯度下降模型SGDRegressor实现基于梯度下降法的线性回归
1.基于最小二乘法的线性回归模型
在sklearn的linear_model模块中有一个LinearRegression类,该类使用最小二乘法实现线性回归分析。该类构造函数的语法如下:
sklearn.linear_model.LinearRegression(fit_intercept=True,normalize=False,copy_X=True,n_jobs=1)
函数主要参数:
fit_intercept:表示是否计算截距,默认为计算。如果使用中心化的数据,可以设置为False,不考虑截距。但一般还是要计算截距。
normalize:表示标准化开关,默认为关闭。该参数在fit_intercept设置为False时自动忽略。如果该参数值为True,回归则会标准化输入参数(X-X均值)/||X||,但还是建议将标准化工作放在训练模型之前;如果该参数值为False,在训练模型前可使用sklearn.preprocessing.StandardScaler进行标准化处理
copy_X:默认为True,否则X会被改写
n_jobs:默认为1,当为-1时默认使用全部的CPU
接下来我们看一下实验题:
假设有一个房屋销售的数据,如下表所示:
现有一套面积为200m2的房屋,试预测他的售价是多少?
代码如下:
import matplotlib.pyplot as plt
from sklearn import linear_model
# 设置中文字体
plt.rcParams['font.sans-serif'] = 'SimHei'
# 定义特征矩阵X和目标变量y
X = [[123], [150], [87], [102]]
y = [[250], [320], [160], [220]]
# 创建线性回归模型
model = linear_model.LinearRegression()
# 拟合模型
model.fit(X, y)
# 进行预测
y2 = model.predict(X) # y2为预测值
# 绘制分析图表
plt.xlabel('面积')
plt.ylabel('房价')
plt.title('房价和面积的回归分析')
plt.grid(True)
plt.axis([80, 160, 150, 350])
# 绘制真实数据散点图 设置颜色为黄色 圆点标记
plt.scatter(X, y, color='y', marker='o')
plt.plot(X, y2, 'g-') # 画拟合线
plt.legend(['预测值', '真实值'])
# 打印模型参数
print("截距:", model.intercept_) # 截距
print("斜率:", model.coef_) # 斜率
# 对特定面积进行房价的预测
a = model.predict([[200]])
print("value is {:.2f}".format(a[0][0]))
# 显示图表
plt.show()
这段代码实现了一个简单的线性回归分析并进行了结果可视化
1. 导入了 matplotlib 中的 pyplot 模块,并导入了 linear_model 模块中的 LinearRegression 类,同时设置了中文字体。
2. 定义了特征矩阵 X 和目标变量 y。这个例子中特征矩阵 X 包含了四个样本的房屋面积,目标变量 y 包含了对应的房价。
3. 创建了线性回归模型,并用给定的特征矩阵 X 和目标变量 y 对模型进行拟合。
4. 使用拟合好的模型对特征矩阵 X 进行预测得到预测结果 y2,并绘制出散点图和拟合线。
5. 调用 matlpotlib 库绘制了回归分析的可视化图表,包括了真实数据散点图和拟合直线。
6. 打印了模型的截距和斜率。
7. 使用模型对特定面积进行了房价的预测,并输出了预测值。
整体来看,该代码演示了使用 scikit-learn 中的 LinearRegression 对模型进行拟合和预测,并使用 matplotlib 进行了相关的结果可视化。
运行结果:

2.基于梯度下降法的线性回归模型
SGDRegressor(loss='squared_loss', penalty='l2', alpha=0.0001, l1_ratio=0.15, n_iter_no_change=5, fit_intercept=True, shuffle=True,verbose=0, epsilon=0.1, random_state=None, learning_rate='invscaling',eta0=0.01, power_t=0.25, warm_start=False, average=False)
loss:损失函数的计算方法,默认值为 squared_loss,表示普通最小二乘法。n_iter_no_change:梯度下降的迭代次数,默认值为 5,值设置得越大,步长越小,准确率越高。penalty:为损失函数添加正则项,如'none'、'l2'、'l1'或'elasticnet'。其中,l2 表示岭回归 Ridge Regression(L2 正则化),l1 表示 Lasso Regression(L1 正则化),Elastic Net 是 L1 正则化和 L2 正则化的结合,通过一个参数调整比例。加入少量的正则化一般会给模型性能带来一定的提升。
接着用梯度下降法预测房屋的价格:
代码如下:
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块 用于数据可视化
from sklearn.linear_model import SGDRegressor # 用于执行随机梯度下降的线性回归模型
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import numpy as np
# 设置图表的字体为 SimHei 确保中文显示正常
plt.rcParams['font.sans-serif'] = 'SimHei'
# 假设数据集 生成特征矩阵X和目标变量y
X = np.array([[123], [150], [87], [102]])
y = np.array([250, 320, 160, 220])
# 分割数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建SGDRegressor模型实例
# 增加max_iter和tol参数来控制迭代的次数和收敛的容忍度,设置penalty为l2以应用Ridge回归的正则化
model = SGDRegressor(max_iter=1000, tol=1e-3, penalty="l2", eta0=0.01, learning_rate="adaptive")
# 训练模型 使用特征集X和目标值集y训练模型 这个步骤中 模型会学习如何根据房屋面积来预测房价
model.fit(X_train, y_train)
# 使用测试集进行预测
y_pred = model.predict(X_test)
# 计算模型的均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差: {mse:.2f}")
# 根据模型对整个数据集进行预测
y2 = model.predict(X)
# 绘制图表
# 设置图标的x轴和y轴标签 标题
plt.xlabel('面积')
plt.ylabel('房价')
plt.title('房价和面积的回归分析')
# 启用网格线
plt.grid(True)
# 分别设置x轴和y轴的范围
plt.axis([80, 220, 150, 450])
# 绘制训练集数据点
plt.scatter(X_train, y_train, color='y', marker='o', label='训练数据')
# 绘制测试集数据点
plt.scatter(X_test, y_test, color='red', marker='s', label='测试数据')
# 绘制回归线
plt.plot(X, y2, 'g-', label='拟合线')
# 添加图例
plt.legend()
# 打印截距和斜率
print("截距:", model.intercept_) # 截距
print("斜率:", model.coef_) # 斜率
# 使用模型预测面积为200的房屋价格
a = model.predict([[200]])
# 输出面积为200时的预测房价 格式化为两位小数
print("200平方米的房价预测值为:{:.2f}".format(a[0]))
# 显示图表
plt.show()
这段代码的主要作用是:
使用 SGDRegressor 模型进行线性回归拟合,设置了最大迭代次数、容忍度、惩罚项和学习率等参数。
分割数据集为训练集和测试集,并进行模型拟合和预测。输出均方误差(MSE)。
绘制了回归分析的可视化结果,包括散点图、拟合线和训练/测试数据点的显示。
打印了回归模型的截距、斜率以及对特定面积的房价预测值。
根据代码,数据集通过train_test_split函数分割为训练集和测试集,其中测试集占比为 20%。这意味着在数据集中,有 80% 的数据被用于训练模型,而剩下的 20% 则用于测试模型的性能。
在代码的可视化部分,使用了scatter函数同时给出了训练数据和测试数据的散点图。根据代码,训练数据用黄色标记,测试数据用红色标记。
因此,代码中确实将最后一个数据点作为测试数据进行了标记。该行为是由数据集划分函数 train_test_split决定的,它随机采样,因此具体哪些数据被包括在训练集和测试集中可能会有一定的随机性。
运行结果:
此外,每次运行代码时会用train_test_split函数将数据集划分为训练集和测试集,其中测试集是随机选择的,因此每次运行时,随机性都会导致使用的训练数据和测试数据不同。这将导致每次训练的模型都略有不同,因而进行预测时得到的结果也会有所不同。
