详解 Python 实现线性回归模型:从理论到实践
线性回归是机器学习中最基础也最常用的算法之一,它可以用来自变量和因变量之间的线性关系进行建模。本文将通过实际代码示例,详细介绍如何使用 Python 的 scikit-learn 库实现线性回归模型,包括单变量、多变量线性回归的完整流程。
线性回归基本概念
线性回归的核心思想是寻找一条最佳拟合直线(或超平面)来描述自变量和因变量之间的关系。对于单变量线性回归,其数学表达式为:
y = ax + b
其中,a 是斜率(系数),b 是截距。
对于多变量线性回归,表达式扩展为:
y = a₁x₁ + a₂x₂ + ... + aₙxₙ + b
这里的 x₁, x₂, ..., xₙ是多个自变量,a₁, a₂, ..., aₙ是对应的系数,b 是截距。
LinearRegression 类参数解析
在 scikit-learn 库中,LinearRegression 类是实现线性回归的主要工具,它的常用参数包括:
- fit_intercept:布尔值,是否计算模型的截距。如果为 False,则直线过原点
- normalize:布尔值,是否将数据归一化
- copy_X:布尔值,是否对输入数据 X 进行复制。如果为 False,则可能会覆盖原数据
- n_jobs:整数,计算时使用的任务个数。设置为 - 1 表示使用所有可用的 CPU
LinearRegression 类的主要方法:
- fit(X, y):对训练数据 X 和 y 进行模型训练
- predict(X):使用训练好的模型对新数据 X 进行预测
- score(X, y):返回模型的决定系数 R²,用于评估模型拟合效果
单变量线性回归实践
单变量线性回归研究的是一个自变量与一个因变量之间的关系。下面以 "广告投入与销售额" 的关系为例进行演示:
import pandas as pd
from sklearn.linear_model import LinearRegression# 读取数据
data = pd.read_csv(r"D:\pythonProject11\class\data(1).csv")# 定义自变量和因变量
x = data[["广告投入"]] # 自变量,注意需要二维结构
y = data[["销售额"]] # 因变量# 创建并训练模型
lr_model = LinearRegression()
lr_model.fit(x, y)# 评估模型
score = lr_model.score(x, y)# 获取模型参数
a = round(lr_model.coef_[0][0], 2) # 系数
b = round(lr_model.intercept_[0], 2) # 截距# 输出结果
print(f"线性回归模型为y = {a}x + {b}")
print(f"模型R²评分:{round(score, 4)}")
代码解析:
- 首先导入必要的库,pandas 用于数据处理,LinearRegression 用于构建模型
- 使用 pd.read_csv () 读取数据文件
- 选择 "广告投入" 作为自变量 x,"销售额" 作为因变量 y
- 创建 LinearRegression 模型实例并使用 fit () 方法进行训练
- 使用 score () 方法获取模型的 R² 评分,该值越接近 1 表示模型拟合效果越好
- 通过 coef_属性获取回归系数,通过 intercept_属性获取截距
- 最后输出回归方程和模型评分
多变量线性回归实践
当影响因变量的因素不止一个时,就需要用到多变量线性回归。下面以 "体重、年龄与收缩压" 的关系为例:
import pandas as pd
from sklearn.linear_model import LinearRegression# 读取数据
data = pd.read_csv(r"D:\pythonProject11\class\多元线性回归.csv", encoding='gbk')# 定义自变量和因变量
x = data[["体重", "年龄"]] # 多个自变量
y = data["血压收缩"] # 因变量# 创建并训练模型
lr_model = LinearRegression()
lr_model.fit(x, y)# 评估模型
score = lr_model.score(x, y)# 获取模型参数
a = lr_model.coef_ # 系数数组,包含两个元素,分别对应体重和年龄
b = lr_model.intercept_ # 截距# 处理结果,保留两位小数
result_x1 = round(a[0], 2) # 体重的系数
result_x2 = round(a[1], 2) # 年龄的系数
result_y = round(b, 2) # 截距# 输出结果
print(f"模型R²评分:{score}")
print(f"线性方程为: y = {result_x1}x1 + {result_x2}x2 + {result_y}")
在多变量线性回归中,coef_返回的是一个数组,数组中的每个元素对应一个自变量的系数。上述代码中,result_x1 是体重的系数,result_x2 是年龄的系数,它们表示在其他变量不变的情况下,该变量每变化 1 单位对因变量的影响。
糖尿病数据预测实例
下面我们用一个更复杂的例子来演示线性回归的应用,使用糖尿病数据集中的多个特征来预测目标变量:
python
运行
import pandas as pd
from sklearn.linear_model import LinearRegression# 读取数据
data = pd.read_csv(r"D:\pythonProject11\class\糖尿病数据.csv")# 定义自变量和因变量
x = data[["age", "sex", "bmi", "bp", "s1", "s2", "s3", "s4", "s5", "s6"]] # 多个特征
y = data["target"] # 目标变量# 创建并训练模型
lr_model = LinearRegression()
lr_model.fit(x, y)# 评估模型
score = lr_model.score(x, y)# 使用模型进行预测
new_data = [[-0.005514555, -0.044641637, 0.042295589, 0.024574144, 0.023860567,0.01, 0.02, 0.03, 0.04, 0.05]] # 新的样本数据prediction = lr_model.predict(new_data)# 输出结果
print(f"预测结果: {prediction}")
print(f"模型评分: {score}")
预测时,我们需要提供与训练数据结构相同的新数据(特征数量和顺序必须一致),然后调用 predict () 方法即可得到预测结果。
相关系数分析
在进行线性回归之前,通常会先分析变量之间的相关性,这可以通过计算相关系数来实现:
import pandas as pd# 读取数据
data = pd.read_csv("你的数据文件路径")# 计算相关系数
correlation = data[["变量1", "变量2", "变量3"]].corr()
print(correlation)
相关系数的取值范围在 - 1 到 1 之间:
- 接近 1 表示强正相关
- 接近 - 1 表示强负相关
- 接近 0 表示几乎没有线性相关
分析相关系数可以帮助我们选择合适的自变量,提高模型效果。
总结
本文介绍了使用 Python 的 scikit-learn 库实现线性回归的完整流程,包括:
- 线性回归的基本概念和数学表达式
- LinearRegression 类的参数和方法
- 单变量线性回归的实现(广告投入与销售额)
- 多变量线性回归的实现(体重、年龄与血压)
- 如何使用训练好的模型进行预测
- 相关系数分析的重要性
线性回归作为一种简单而强大的模型,在很多实际问题中都有广泛应用。但需要注意的是,它假设变量之间存在线性关系,对于非线性关系的数据,可能需要考虑其他模型或对特征进行转换。
通过本文的示例代码,相信你已经掌握了线性回归的基本用法。在实际应用中,还需要结合数据预处理、特征工程和模型评估等步骤,才能构建出更稳健的预测模型。