【sklearn实战】从入门到调优:线性回归模型全流程解析

张开发
2026/4/18 11:19:48 15 分钟阅读

分享文章

【sklearn实战】从入门到调优:线性回归模型全流程解析
1. 线性回归入门从数据加载到模型训练第一次接触线性回归时我被它简洁的数学表达和直观的可解释性吸引。作为机器学习中最基础的算法之一线性回归通过拟合最佳直线来描述特征与目标值之间的关系。在sklearn中这个看似简单的模型却能解决很多实际问题比如预测房价、分析用户行为等。让我们从最基础的数据加载开始。sklearn内置的波士顿房价数据集是个经典的入门案例它包含了506条房屋数据每条数据有13个特征比如犯罪率、房间数等和1个目标值房价中位数。加载数据非常简单from sklearn.datasets import load_boston import pandas as pd boston load_boston() df pd.DataFrame(boston.data, columnsboston.feature_names) df[PRICE] boston.target数据准备好了接下来要做的是划分训练集和测试集。我建议保持20%的数据作为测试集这样既能保证训练数据充足又能获得可靠的评估结果。sklearn的train_test_split函数可以轻松完成这个任务from sklearn.model_selection import train_test_split X df.drop(PRICE, axis1) y df[PRICE] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42)模型训练更是简单到令人惊讶。LinearRegression类封装了所有复杂计算我们只需要三行代码from sklearn.linear_model import LinearRegression model LinearRegression() model.fit(X_train, y_train)训练完成后我们可以查看模型的系数和截距。这些参数不仅告诉我们每个特征对房价的影响程度正相关还是负相关还能直观解释模型的工作原理。比如房间数(RM)的系数是正数说明房间越多房价越高而犯罪率(CRIM)的系数是负数说明犯罪率高的地区房价较低。2. 模型评估三大指标详解训练模型只是第一步评估模型性能才是关键。在房价预测场景中我们主要关注三个核心指标平均绝对误差(MAE)、均方误差(MSE)和决定系数(R²)。MAE是最容易理解的指标它直接告诉我们预测值与真实值之间的平均差距。比如MAE3表示预测房价平均偏差3万美元。计算MAE很简单from sklearn.metrics import mean_absolute_error y_pred model.predict(X_test) mae mean_absolute_error(y_test, y_pred) print(fMAE: {mae:.2f})MSE比MAE更关注大误差因为它对误差进行了平方。这意味着一个10万美元的误差会被视为比两个5万美元的误差更严重。MSE的计算方式与MAE类似from sklearn.metrics import mean_squared_error mse mean_squared_error(y_test, y_pred) print(fMSE: {mse:.2f})R²分数则告诉我们模型解释了目标变量多少比例的方差。R²1表示完美拟合R²0表示模型不比简单取平均值更好负值则表示模型表现极差。获取R²分数也很直接r2 model.score(X_test, y_test) print(fR²: {r2:.2f})在实际项目中我建议同时关注这三个指标。MAE给出直观的误差理解MSE帮助识别极端错误R²则从整体上评估模型质量。如果发现R²较低比如0.6可能需要考虑添加更多特征或尝试更复杂的模型。3. 交叉验证提升模型可靠性单一的训练-测试分割可能存在偶然性这就是交叉验证的价值所在。k折交叉验证将数据分成k份轮流用k-1份训练剩下1份测试重复k次后取平均结果。这种方法能更可靠地评估模型性能。在sklearn中实现10折交叉验证from sklearn.model_selection import KFold from sklearn.metrics import r2_score kf KFold(n_splits10, shuffleTrue, random_state42) scores [] for train_index, val_index in kf.split(X): X_train, X_val X.iloc[train_index], X.iloc[val_index] y_train, y_val y.iloc[train_index], y.iloc[val_index] model LinearRegression() model.fit(X_train, y_train) score model.score(X_val, y_val) scores.append(score) print(f平均R²: {np.mean(scores):.2f} (±{np.std(scores):.2f}))交叉验证不仅能给出更稳健的性能评估还能帮助我们发现数据划分带来的波动。如果不同折之间的分数差异很大标准差0.1说明模型可能对训练数据敏感需要进一步调优。更便捷的方法是使用cross_val_score函数它封装了交叉验证的整个过程from sklearn.model_selection import cross_val_score scores cross_val_score(LinearRegression(), X, y, cv10) print(f交叉验证R²: {scores.mean():.2f} (±{scores.std():.2f}))在实际项目中我通常会先做简单训练测试分割快速验证想法再用交叉验证确认模型稳定性。如果时间允许建议至少使用5折交叉验证。4. 正则化岭回归与Lasso实战当特征之间存在较强相关性时普通线性回归可能产生不稳定的系数估计。这时就需要引入正则化——通过在损失函数中添加惩罚项来控制模型复杂度。岭回归(L2正则化)通过在损失函数中添加系数平方和作为惩罚项防止系数过大from sklearn.linear_model import Ridge ridge Ridge(alpha1.0) ridge.fit(X_train, y_train) print(f岭回归测试R²: {ridge.score(X_test, y_test):.2f})选择合适的alpha值很关键。alpha太小正则化效果弱alpha太大会导致模型欠拟合。RidgeCV可以自动选择最佳alphafrom sklearn.linear_model import RidgeCV ridge_cv RidgeCV(alphas[0.1, 1.0, 10.0]) ridge_cv.fit(X_train, y_train) print(f最优alpha: {ridge_cv.alpha_})Lasso回归(L1正则化)则能将不重要的特征系数压缩为零实现自动特征选择from sklearn.linear_model import Lasso lasso Lasso(alpha0.1) lasso.fit(X_train, y_train) print(fLasso测试R²: {lasso.score(X_test, y_test):.2f}) print(f非零系数数量: {np.sum(lasso.coef_ ! 0)})同样LassoCV可以自动选择alphafrom sklearn.linear_model import LassoCV lasso_cv LassoCV(cv5) lasso_cv.fit(X_train, y_train) print(f最优alpha: {lasso_cv.alpha_})在实际项目中我通常会先尝试普通线性回归如果发现系数异常大或模型不稳定再考虑岭回归。当特征很多且怀疑很多特征不重要时Lasso是更好的选择。有时候还会结合两者优势使用ElasticNet。5. 模型优化与可视化模型训练完成后我们可以通过多种方式优化和展示结果。特征标准化是个常见的优化手段特别是当特征量纲差异很大时from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) model LinearRegression() model.fit(X_train_scaled, y_train) print(f标准化后R²: {model.score(X_test_scaled, y_test):.2f})可视化是理解模型的重要工具。我们可以绘制真实值与预测值的对比图import matplotlib.pyplot as plt plt.figure(figsize(10, 6)) plt.scatter(y_test, y_pred, alpha0.6) plt.plot([y.min(), y.max()], [y.min(), y.max()], k--, lw2) plt.xlabel(真实价格) plt.ylabel(预测价格) plt.title(真实vs预测房价) plt.show()还可以绘制特征重要性图直观展示哪些特征对预测影响最大coef pd.Series(model.coef_, indexX.columns) coef.sort_values().plot(kindbarh) plt.title(特征系数) plt.show()在真实项目中我还会记录每次实验的参数和结果形成实验日志。这有助于追踪哪些调整真正提升了模型性能。一个简单的实验记录可以这样实现experiments [] params {model: LinearRegression, scaling: False} score model.score(X_test, y_test) experiments.append({**params, score: score}) params {model: Ridge, alpha: 1.0, scaling: True} ridge Ridge(alpha1.0).fit(X_train_scaled, y_train) score ridge.score(X_test_scaled, y_test) experiments.append({**params, score: score}) pd.DataFrame(experiments)通过这些优化和可视化手段我们不仅能提升模型性能还能更深入地理解模型行为为业务决策提供有力支持。

更多文章