机器学习——线性回归(LinearRegression):
线性回归(Linear Regression)线性回归是机器学习中最基础、最常用的监督学习算法之一,主要用于解决回归问题(即预测连续型输出变量)。
其核心思想是通过建立输入特征与输出变量之间的线性关系,来实现对未知数据的预测。
一、线性回归是什么?
线性回归是一种用于预测目标变量(因变量)与一个或多个特征变量(自变量)之间关系的模型
拟合出一条“最佳直线”
线性回归的模型通常表示为:
其中:
-
y:预测值
-
x1,x2,…,xn:特征
-
w1,w2,…,wn:系数(权重)
-
b:截距项
向量形式:
其中 w 和 x 均为向量。
实战理解如何实现,以及函数作用:
-
model = LinearRegression()
- 创建一个线性回归模型实例
-
model.fit(X, y)
- 训练模型,使用特征数据 X 和目标变量 y 进行拟合
- X 是特征矩阵,y 是目标变量向量
-
data.corr()
- 这不是 LinearRegression 的方法,而是 pandas 中 DataFrame 的方法
- 用于计算数据集中各列之间的相关系数
-
model.score(X, y)
- 计算模型在数据 (X, y) 上的决定系数 R²
- R² 越接近 1,表示模型拟合效果越好
-
model.coef_
- 线性回归模型的系数 (斜率)
- 表示每个特征对目标变量的影响程度
-
model.intercept_
- 线性回归模型的截距
- 当所有特征为 0 时,目标变量的预测值
model.predict()
- 用于根据训练好的模型对新数据进行预测
二、使用 sklearn 实现一元线性回归
我们从简单的一元线性回归入手,使用 scikit-learn
库实现。
先创建一个csv数据:
import csv
# 数据
data = [
["广告投入", "销售额"],
[29, 77],
[28, 62],
[34, 93],
[31, 84],
[25, 59],
[29, 64],
[32, 80],
[31, 75],
[24, 58],
[33, 91],
[25, 51],
[31, 73],
[26, 65],
[30, 84]
]
# 创建 CSV 文件并写入数据
with open('test1.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(data)
结果:
实现一元线性回归:
此代码看似长,其实是因为打印了很多数据和注释,为了让初学者加深了解。
实际作用代码就几行
import pandas as pd
from sklearn.linear_model import LinearRegression
data = pd.read_csv("data.csv")
# 准备训练数据:X为特征矩阵(所有列除了"销售额"),y为目标变量("销售额")
X = data.drop("销售额",axis=1) # 特征矩阵
y = data[["销售额"]] # 目标变量
# 创建线性回归模型实例
# 使用特征矩阵X和目标变量y训练线性回归模型
lr_model = LinearRegression()
lr_model.fit(X,y)
# 计算"广告投入"和"销售额"两列之间的相关系数矩阵
corr = data[["广告投入","销售额"]].corr() # 关系系数矩阵
print(corr)
print("-----")
# 计算模型在训练数据上的拟合优度(R²值),评估模型性能
score = lr_model.score(X,y)
print(f"模型拟合优度(R²): {score}")
# 获取模型参数:a为自变量系数(斜率),b为截距(偏置)
a = lr_model.coef_
b = lr_model.intercept_
print(f"自变量系数: {a}")
print(f"截距: {b}")
# 打印线性回归方程
print(f"线性回归模型为: y = {a[0][0]:.2f}x1 + {b[0]:.2f}")
# 预测广告投入为28时的销售额
print(f"当广告投入为28,30,38时,预测销售额为: {lr_model.predict([[28],[30],[38]])}")
#——————————————————————————————————————————————————————————————
import matplotlib.pyplot as plt
import numpy as np
# 生成用于绘制回归线的新数据点(广告投入范围从20到39)
# 使用模型预测新数据点对应的销售额
x_pred = np.arange(20, 40).reshape(-1, 1)
y_pred = lr_model.predict(x_pred)
# 绘制回归线
plt.plot(x_pred, y_pred, '--', color='#1F77B4', linewidth=2)
# 绘制散点图
plt.scatter(X,y)
plt.show()
输出结果:
三、多元线性回归示例
如果有多个特征变量:
创建数据:
import csv
data = [
["体重", "年龄", "血压收缩"],
[76.0, 50, 120],
[91.5, 20, 141],
[85.5, 20, 124],
[82.5, 30, 126],
[79.0, 30, 117],
[80.5, 50, 125],
[74.5, 60, 123],
[79.0, 50, 125],
[85.0, 40, 132],
[76.5, 55, 123],
[82.0, 40, 132],
[95.0, 40, 155],
[92.5, 20, 147]
]
with open('test2.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(data)
结果:
实现多元线性回归:
不同点:
特征变量、coef_自变量系数、predict()参数 变多了。
import pandas as pd
from sklearn.linear_model import LinearRegression
# 导入数据
data = pd.read_csv("多元线性回归.csv", encoding='gbk', engine='python')
# 第一步,打印相关系数矩阵
corr = data[["体重", "年龄", "血压收缩"]].corr()
print("相关系数矩阵:")
print(corr)
print("----------------------")
# 第二步,估计模型参数,建立回归模型
lr_model = LinearRegression()
x = data[['体重', '年龄']]
y = data['血压收缩']
# 第三步,训练模型
lr_model.fit(x, y)
# 第四步,对回归模型进行检验
score = lr_model.score(x, y) # 利用 score 方法获取模型拟合优度(R²)
print("模型拟合优度(R²):", score)
# 第五步,利用回归模型进行预测
print("预测结果 1:", lr_model.predict([[80, 60]]))
print("预测结果 2:", lr_model.predict([[70, 30], [70, 20]]))
# 获取自变量系数和截距
a = lr_model.coef_
b = lr_model.intercept_
print(f"自变量系数: {a}")
print(f"截距: {b}")
print("线性回归模型为: y = {:.2f}x1 + {:.2f}x2 + {:.2f}".format(a[0], a[1], b))
输出结果:
四、模型评估:R² 分数
线性回归模型的评估通常使用决定系数 R2:
代码使用:
r2 = model.score(X, y)
print(f"模型 R² 分数: {r2:.2f}")
-
R2=1:完美预测
-
R2=0:模型没有预测能力
-
R2<0:预测还不如使用平均值
五、相关系数矩阵
相关系数矩阵(Correlation Matrix)是描述多个变量之间两两线性相关程度的矩阵,通常使用皮尔逊相关系数(Pearson Correlation Coefficient)来衡量。
一、皮尔逊相关系数公式
皮尔逊相关系数 r 公式如下:
其取值范围为:
-
r=1:完全正相关
-
r=−1:完全负相关
-
r=0:无线性关系
二、相关系数的解释
相关系数范围 | 线性相关强度 | 解释 |
---|---|---|
0.9 ~ 1.0 | 极强正相关 | 几乎严格线性关系 |
0.7 ~ 0.9 | 强正相关 | 明显线性趋势 |
0.5 ~ 0.7 | 中等正相关 | 有一定线性趋势 |
0.3 ~ 0.5 | 弱正相关 | 稍有线性趋势 |
0.0 ~ 0.3 | 极弱或无相关 | 几乎无线性关系 |
< 0 | 负相关 | 越小,反向关系越强 |
六、几点注意事项
-
特征缩放:当特征尺度差异较大时,应使用
StandardScaler
进行归一化或标准化。 -
共线性问题:特征之间高度相关可能导致模型不稳定。
-
异常值:极端值会显著影响回归线。
-
残差分析:拟合后应分析残差是否符合正态分布。
七、总结
-
线性回归是回归分析的入门基础;
-
使用
sklearn.linear_model.LinearRegression
可以快速构建模型; -
可以可视化预测结果和分析模型性能;
-
推荐在实际应用中注重数据预处理、特征选择与残差分析。