Python案例如何用Scikit-learn做线性回归

wen python案例 1

Python案例详解:如何用Scikit-learn轻松实现线性回归(附完整代码)

📚 目录导读


1️⃣ 什么是线性回归?为什么要用Scikit-learn?

线性回归是机器学习中最基础也最经典的监督学习算法,用于建立自变量(特征)与连续因变量(目标)之间的线性关系模型,就是找到一条直线(或高维超平面)来拟合数据点。

Python案例如何用Scikit-learn做线性回归

为什么选择Scikit-learn?

  • 它是Python最流行的机器学习库,API简洁统一
  • 内置多种回归算法(线性回归、岭回归、Lasso等)
  • 完美集成数据预处理、模型评估等工具链
  • 社区活跃,文档详尽,是必应和Google SEO高权重话题

核心公式
y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + ε
是回归系数,ε是误差项。


2️⃣ 案例背景:房价预测数据准备

我们将使用经典的波士顿房价数据集(说明:原数据集因伦理问题已从Scikit-learn移除,此处使用替代方案——加州住房数据集),这个案例将演示从数据加载到模型部署的全流程。

数据加载与初探

import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
# 加载数据
housing = fetch_california_housing()
X = pd.DataFrame(housing.data, columns=housing.feature_names)
y = pd.Series(housing.target, name='房价')
# 查看数据结构
print(X.head())
print(f"特征数量:{X.shape[1]},样本数量:{X.shape[0]}")

输出示例
包含MedInc(收入中位数)、HouseAge(房龄)等8个特征,共20640条样本。

数据分割(训练集/测试集)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
print(f"训练集:{X_train.shape},测试集:{X_test.shape}")

3️⃣ 核心步骤:Scikit-learn线性回归实战

第一步:导入模型并训练

from sklearn.linear_model import LinearRegression
# 创建模型实例
model = LinearRegression()
# 训练模型(拟合数据)
model.fit(X_train, y_train)
# 查看训练好的参数
print(f"截距 (β₀):{model.intercept_:.4f}")
print(f"系数 前5个:{model.coef_[:5]}")

关键点

  • fit()方法完成最小二乘法优化
  • 系数值反映了各特征对房价的影响方向与强度

第二步:进行预测

y_pred = model.predict(X_test)
print(f"前5个预测值:{y_pred[:5]}")
print(f"实际值:{y_test.values[:5]}")

完整代码模板(可直接运行)

# 完整流程汇总
import pandas as pd
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 1.数据准备
data = fetch_california_housing()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
# 2.分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3.训练模型
lr = LinearRegression()
lr.fit(X_train, y_train)
# 4.预测
y_pred = lr.predict(X_test)
# 5.评估
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"MSE:{mse:.4f},R²:{r2:.4f}")

4️⃣ 模型评估与可视化分析

关键评估指标

  • MSE(均方误差):值越小越好,本例约为0.56
  • R²(决定系数):取值范围[0,1],越接近1说明模型拟合越好,本例约为0.58
  • MAE(平均绝对误差):直观反映预测偏差的平均大小

可视化预测结果

import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
plt.scatter(y_test, y_pred, alpha=0.3, edgecolors='b')
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=2)
plt.xlabel('实际房价')
plt.ylabel('预测房价')'线性回归预测效果图')
plt.show()

图表解读
红色虚线为理想预测线(y=x),数据点越靠近该线说明预测越准确,散点分布呈现带状聚集,说明模型有一定的预测能力但存在误差。


5️⃣ 常见问题与优化技巧

❗ 问题1:特征需要标准化吗?

:对于普通线性回归,回归系数会受特征尺度影响,但预测结果不受影响,不过如果后续使用正则化(Lasso/Ridge)或梯度下降优化,必须进行标准化

❗ 问题2:出现多重共线性怎么办?

解决方法

  • 使用相关性矩阵筛选特征(去除相关系数>0.8的特征对)
  • 改用岭回归(Ridge)或Lasso回归
    from sklearn.linear_model import Ridge
    ridge = Ridge(alpha=1.0)
    ridge.fit(X_train, y_train)

❗ 问题3:模型欠拟合怎么办?

解决策略

  1. 增加多项式特征(例如PolynomialFeatures库)
  2. 减少正则化强度
  3. 收集更多有效特征

优化实战:添加多项式特征

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)
X_train_poly, X_test_poly, y_train, y_test = train_test_split(X_poly, y, test_size=0.2)
lr_poly = LinearRegression()
lr_poly.fit(X_train_poly, y_train)
print(f"多项式模型R²:{lr_poly.score(X_test_poly, y_test):.4f}")  # 通常提升明显

6️⃣ 问答环节:高频疑问解答

❓ Q1:线性回归和数据中的异常值有关系吗?

A:线性回归对异常值非常敏感,因为最小二乘法会放大离群点的影响,建议先使用箱线图或Z-score检测异常值,必要时进行截尾处理或使用鲁棒回归(如HuberRegressor)。

❓ Q2:如何判断线性回归是否适合我的数据?

A:可以绘制特征与目标变量的散点图矩阵,观察是否呈现线性趋势,更科学的方法是查看残差图——如果残差随机分布在零线附近,则适合;如果呈现喇叭状或弯曲形状,则可能需要非线性模型。

❓ Q3:Scikit-learn的线性回归和Statsmodels有什么区别?

A

  • Scikit-learn:侧重预测性能,API简洁,支持Pipeline管道,适合工程化部署
  • Statsmodels:侧重统计推断,提供详细的参数显著性检验(P值)、置信区间等,适合学术研究

❓ Q4:训练集和测试集的R²差距很大怎么办?

A:这是过拟合的典型信号,解决方案:

  • 增加训练数据量
  • 使用正则化(L1/L2)
  • 减少特征数量(特征选择)
  • 采用交叉验证(如cross_val_score)评估稳定性
from sklearn.model_selection import cross_val_score
scores = cross_val_score(LinearRegression(), X, y, cv=5, scoring='r2')
print(f"交叉验证R²:{scores.mean():.4f} ± {scores.std():.4f}")

本文通过完整的房价预测案例,从数据准备、模型训练到评估优化,系统讲解了Scikit-learn实现线性回归的完整流程,掌握这些知识后,你可以轻松扩展到其他回归问题(如销量预测、温度预测等)。没有最好的模型,只有最适合数据的模型——实践中要结合特征工程、交叉验证和残差分析不断迭代优化。

本文首发于技术博客「Python机器学习实战」,所有代码均经过测试可用,如需获取完整Jupyter Notebook或数据集,欢迎留言交流。

抱歉,评论功能暂时关闭!