参考R语言实现 波士顿犯罪数据集Python版Lasso回归求助
波士顿犯罪数据集Lasso回归Python实现指南
前置依赖
你需要提前安装以下Python库:
- numpy
- pandas
- scikit-learn
- matplotlib(可选,用于绘制正则路径匹配可视化输出)
完整实现代码
1. 导入依赖与加载数据集
Lasso对特征尺度敏感,默认和R的glmnet实现逻辑一致,需要先做特征标准化:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import Lasso, LassoCV from sklearn.preprocessing import StandardScaler from sklearn.metrics import r2_score, mean_squared_error from sklearn.datasets import fetch_openml # 加载波士顿犯罪数据集 boston = fetch_openml(name="boston", version=1, parser="auto") X = boston.data y = boston.target # 特征标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
2. 交叉验证选择最优正则参数
sklearn中Lasso的alpha参数对应R实现中的lambda参数,用10折交叉验证自动选最优值:
# 10折交叉验证选最优正则参数 lasso_cv = LassoCV(cv=10, random_state=42, max_iter=10000) lasso_cv.fit(X_scaled, y) print(f"最优正则参数alpha:{lasso_cv.alpha_:.4f}")
如果原R代码指定了固定的lambda序列,可以传入alphas参数对齐数值,就能得到完全一致的筛选结果。
3. 训练最优模型并输出系数
系数为0的特征即为被Lasso自动筛选掉的特征,输出规则和原R实现一致:
# 训练最终模型 lasso_best = Lasso(alpha=lasso_cv.alpha_, max_iter=10000) lasso_best.fit(X_scaled, y) # 输出非零系数的特征 coef_df = pd.DataFrame({ "特征名": X.columns, "系数": lasso_best.coef_ }) print("筛选后的有效特征及系数:") print(coef_df[coef_df["系数"] != 0].sort_values(by="系数", ascending=False).round(4)) print(f"模型截距项:{lasso_best.intercept_:.4f}") # 输出模型效果指标 y_pred = lasso_best.predict(X_scaled) print(f"训练集R²:{r2_score(y, y_pred):.4f}") print(f"训练集均方误差:{mean_squared_error(y, y_pred):.4f}")
4. 绘制正则路径(匹配可视化输出)
如果原输出包含正则系数变化路径,可以用以下代码生成完全一致的图:
# 生成不同alpha下的系数变化路径 alphas = np.logspace(-4, 1, 100) coefs = [] for a in alphas: lasso = Lasso(alpha=a, max_iter=10000) lasso.fit(X_scaled, y) coefs.append(lasso.coef_) plt.figure(figsize=(10,6)) ax = plt.gca() ax.plot(alphas, coefs) ax.set_xscale('log') plt.xlabel('Alpha (对应R中的Lambda)') plt.ylabel('特征系数') plt.title('Lasso正则系数路径') plt.axvline(lasso_cv.alpha_, color='r', linestyle='--', label='最优正则参数') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

