一句话概念和岭回归类似但使用的是L1正则化。它不仅能防止过拟合还能把不重要的特征系数强行压缩为0。使用场景当你有很多特征想要自动筛选出最重要的几个特征时。Lasso回归模型使用示例# Lasso回归 (Lasso Regression) from sklearn.linear_model import LinearRegression, Lasso from sklearn.metrics import mean_squared_error from sklearn.preprocessing import StandardScaler # 1. 构造多特征测试数据大部分特征不重要 np.random.seed(42) # 设置随机种子以确保结果可复现 n_samples 100 n_features 10 # 总共10个特征 # 生成10个特征前3个是真正重要的后7个是不重要的 X np.random.randn(n_samples, n_features) # 真实系数前3个特征有较大的非零系数后7个特征的系数为0 true_coef np.zeros(n_features) true_coef[0] 10.0 # 重要特征1 true_coef[1] -8.0 # 重要特征2 true_coef[2] 5.0 # 重要特征3 # 生成目标变量Y X * 真实系数 随机噪声 Y_true X.dot(true_coef) Y Y_true np.random.randn(n_samples) * 5 # 加入噪声 # 2. 数据标准化Lasso对特征缩放敏感 scaler StandardScaler() X_scaled scaler.fit_transform(X) Y_scaled scaler.fit_transform(Y.reshape(-1, 1)).ravel() # 3. 普通线性回归 linear_model LinearRegression() linear_model.fit(X_scaled, Y_scaled) Y_linear_pred linear_model.predict(X_scaled) # 4. Lasso回归不同的正则化参数λ lambdas [0.01, 0.1, 0.5, 1.0, 5.0] # 不同的λ值 lasso_models {} lasso_preds {} lasso_coefs [] for lam in lambdas: model Lasso(alphalam, max_iter10000) # 增加最大迭代次数避免收敛警告 model.fit(X_scaled, Y_scaled) lasso_models[lam] model lasso_preds[lam] model.predict(X_scaled) lasso_coefs.append(model.coef_) # 5. 可视化结果 #... 省略 ... # 计算并比较MSE print(\n 模型性能比较 (MSE) ) print(f普通线性回归 MSE: {mean_squared_error(Y_scaled, Y_linear_pred):.4f}) for lam in lambdas: mse mean_squared_error(Y_scaled, lasso_preds[lam]) print(fLasso回归 (λ{lam}) MSE: {mse:.4f}) ## 运行结果 模型性能比较 (MSE) 普通线性回归 MSE: 0.1024 Lasso回归 (λ0.01) MSE: 0.1034 Lasso回归 (λ0.1) MSE: 0.1384 Lasso回归 (λ0.5) MSE: 0.6845 Lasso回归 (λ1.0) MSE: 1.0000 Lasso回归 (λ5.0) MSE: 1.0000 从图中可以看出随着λ增大越来越多的系数被压缩为0Lasso能够自动识别并保留重要特征前3个适当的λ值可以在保持预测精度的同时实现特征选择这个示例很好地展示了Lasso回归的特征选择能力非常适合用户描述的使用场景当有很多特征想要自动筛选出最重要的几个特征时。1.7. 弹性网络回归 (Elastic Net Regression)一句话概念岭回归和套索回归的“混血儿”结合了它俩的优点。使用场景特征非常多且彼此高度相关你既想选特征又想保持模型稳定时。弹性网络回归模型使用示例# 弹性网络回归 (Elastic Net Regression) from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet from sklearn.metrics import mean_squared_error from sklearn.preprocessing import StandardScaler # 1. 构造高相关多特征测试数据 np.random.seed(42) # 设置随机种子以确保结果可复现 n_samples 100 n_features 10 # 总共10个特征 # 生成基础特征 base_feature np.random.randn(n_samples, 1) # 生成高度相关的特征组 # 前3个特征高度相关重要特征 X np.zeros((n_samples, n_features)) X[:, 0] base_feature.ravel() np.random.randn(n_samples) * 0.1 # 主特征1 X[:, 1] X[:, 0] * 0.8 np.random.randn(n_samples) * 0.2 # 相关特征2 X[:, 2] X[:, 0] * 0.5 X[:, 1] * 0.3 np.random.randn(n_samples) * 0.2 # 相关特征3 # 中间3个特征高度相关但不重要 X[:, 3] np.random.randn(n_samples) * 0.3 X[:, 0] * 0.1 # 弱相关特征4 X[:, 4] X[:, 3] * 0.7 np.random.randn(n_samples) * 0.2 # 相关特征5 X[:, 5] X[:, 3] * 0.6 X[:, 4] * 0.4 np.random.randn(n_samples) * 0.2 # 相关特征6 # 最后4个特征是随机噪声完全不重要 X[:, 6:] np.random.randn(n_samples, 4) * 0.5 # 真实系数只有前3个重要特征有非零系数 true_coef np.zeros(n_features) true_coef[0] 10.0 true_coef[1] -5.0 true_coef[2] 3.0 # 生成目标变量 Y_true X.dot(true_coef) Y Y_true np.random.randn(n_samples) * 3 # 加入噪声 # 2. 数据标准化正则化模型对特征缩放敏感 scaler StandardScaler() X_scaled scaler.fit_transform(X) Y_scaled scaler.fit_transform(Y.reshape(-1, 1)).ravel() # 3. 训练不同的回归模型 # 普通线性回归 linear_model LinearRegression() linear_model.fit(X_scaled, Y_scaled) # Lasso回归λ0.1 lasso_model Lasso(alpha0.1, max_iter10000) lasso_model.fit(X_scaled, Y_scaled) # Ridge回归λ1.0 ridge_model Ridge(alpha1.0) ridge_model.fit(X_scaled, Y_scaled) # 弹性网络回归不同的l1_ratio elastic_models {} l1_ratios [0.1, 0.5, 0.9] # 控制L1和L2的比例 alpha 1.0 # 总正则化强度 for ratio in l1_ratios: model ElasticNet(alphaalpha, l1_ratioratio, max_iter10000) model.fit(X_scaled, Y_scaled) elastic_models[ratio] model # 4. 预测 Y_linear_pred linear_model.predict(X_scaled) Y_lasso_pred lasso_model.predict(X_scaled) Y_ridge_pred ridge_model.predict(X_scaled) Y_elastic_pred { ratio: model.predict(X_scaled) for ratio, model in elastic_models.items() } # 5. 可视化结果 # ... 省略 ... # 6. 模型评估和特征选择效果 print( 模型性能评估 ) print(f普通线性回归 MSE: {mean_squared_error(Y_scaled, Y_linear_pred):.4f}) print(fLasso回归 MSE: {mean_squared_error(Y_scaled, Y_lasso_pred):.4f}) print(fRidge回归 MSE: {mean_squared_error(Y_scaled, Y_ridge_pred):.4f}) for ratio in l1_ratios: mse mean_squared_error(Y_scaled, Y_elastic_pred[ratio]) print(f弹性网络 (l1_ratio{ratio}) MSE: {mse:.4f}) print(\n 特征选择效果 ) print(f普通线性回归非零系数数: {np.sum(linear_model.coef_ ! 0)}) print(fLasso回归非零系数数: {np.sum(lasso_model.coef_ ! 0)}) print( fRidge回归非零系数数: {np.sum(ridge_model.coef_ ! 0)} ) # Ridge几乎不会产生严格零系数 for ratio in l1_ratios: non_zero_count np.sum(elastic_models[ratio].coef_ ! 0) print(f弹性网络 (l1_ratio{ratio}) 非零系数数: {non_zero_count}) ## 运行结果 模型性能评估 普通线性回归 MSE: 0.1352 Lasso回归 MSE: 0.1677 Ridge回归 MSE: 0.1369 弹性网络 (l1_ratio0.1) MSE: 0.2676 弹性网络 (l1_ratio0.5) MSE: 0.5002 弹性网络 (l1_ratio0.9) MSE: 0.9711 特征选择效果 普通线性回归非零系数数: 10 Lasso回归非零系数数: 2 Ridge回归非零系数数: 10 弹性网络 (l1_ratio0.1) 非零系数数: 3 弹性网络 (l1_ratio0.5) 非零系数数: 3 弹性网络 (l1_ratio0.9) 非零系数数: 1 从图中可以看出弹性网络结合了Lasso的特征选择能力和Ridge的稳定性通过调整l1_ratio可以在特征选择和系数稳定性之间找到平衡当特征高度相关时弹性网络比Lasso更稳定比Ridge更能进行特征选择这个示例很好地展示了弹性网络回归在处理高维、高度相关数据时的优势特别适合需要同时进行特征选择和保持模型稳定的场景。
Lasso回归 (Lasso Regression)
一句话概念和岭回归类似但使用的是L1正则化。它不仅能防止过拟合还能把不重要的特征系数强行压缩为0。使用场景当你有很多特征想要自动筛选出最重要的几个特征时。Lasso回归模型使用示例# Lasso回归 (Lasso Regression) from sklearn.linear_model import LinearRegression, Lasso from sklearn.metrics import mean_squared_error from sklearn.preprocessing import StandardScaler # 1. 构造多特征测试数据大部分特征不重要 np.random.seed(42) # 设置随机种子以确保结果可复现 n_samples 100 n_features 10 # 总共10个特征 # 生成10个特征前3个是真正重要的后7个是不重要的 X np.random.randn(n_samples, n_features) # 真实系数前3个特征有较大的非零系数后7个特征的系数为0 true_coef np.zeros(n_features) true_coef[0] 10.0 # 重要特征1 true_coef[1] -8.0 # 重要特征2 true_coef[2] 5.0 # 重要特征3 # 生成目标变量Y X * 真实系数 随机噪声 Y_true X.dot(true_coef) Y Y_true np.random.randn(n_samples) * 5 # 加入噪声 # 2. 数据标准化Lasso对特征缩放敏感 scaler StandardScaler() X_scaled scaler.fit_transform(X) Y_scaled scaler.fit_transform(Y.reshape(-1, 1)).ravel() # 3. 普通线性回归 linear_model LinearRegression() linear_model.fit(X_scaled, Y_scaled) Y_linear_pred linear_model.predict(X_scaled) # 4. Lasso回归不同的正则化参数λ lambdas [0.01, 0.1, 0.5, 1.0, 5.0] # 不同的λ值 lasso_models {} lasso_preds {} lasso_coefs [] for lam in lambdas: model Lasso(alphalam, max_iter10000) # 增加最大迭代次数避免收敛警告 model.fit(X_scaled, Y_scaled) lasso_models[lam] model lasso_preds[lam] model.predict(X_scaled) lasso_coefs.append(model.coef_) # 5. 可视化结果 #... 省略 ... # 计算并比较MSE print(\n 模型性能比较 (MSE) ) print(f普通线性回归 MSE: {mean_squared_error(Y_scaled, Y_linear_pred):.4f}) for lam in lambdas: mse mean_squared_error(Y_scaled, lasso_preds[lam]) print(fLasso回归 (λ{lam}) MSE: {mse:.4f}) ## 运行结果 模型性能比较 (MSE) 普通线性回归 MSE: 0.1024 Lasso回归 (λ0.01) MSE: 0.1034 Lasso回归 (λ0.1) MSE: 0.1384 Lasso回归 (λ0.5) MSE: 0.6845 Lasso回归 (λ1.0) MSE: 1.0000 Lasso回归 (λ5.0) MSE: 1.0000 从图中可以看出随着λ增大越来越多的系数被压缩为0Lasso能够自动识别并保留重要特征前3个适当的λ值可以在保持预测精度的同时实现特征选择这个示例很好地展示了Lasso回归的特征选择能力非常适合用户描述的使用场景当有很多特征想要自动筛选出最重要的几个特征时。1.7. 弹性网络回归 (Elastic Net Regression)一句话概念岭回归和套索回归的“混血儿”结合了它俩的优点。使用场景特征非常多且彼此高度相关你既想选特征又想保持模型稳定时。弹性网络回归模型使用示例# 弹性网络回归 (Elastic Net Regression) from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet from sklearn.metrics import mean_squared_error from sklearn.preprocessing import StandardScaler # 1. 构造高相关多特征测试数据 np.random.seed(42) # 设置随机种子以确保结果可复现 n_samples 100 n_features 10 # 总共10个特征 # 生成基础特征 base_feature np.random.randn(n_samples, 1) # 生成高度相关的特征组 # 前3个特征高度相关重要特征 X np.zeros((n_samples, n_features)) X[:, 0] base_feature.ravel() np.random.randn(n_samples) * 0.1 # 主特征1 X[:, 1] X[:, 0] * 0.8 np.random.randn(n_samples) * 0.2 # 相关特征2 X[:, 2] X[:, 0] * 0.5 X[:, 1] * 0.3 np.random.randn(n_samples) * 0.2 # 相关特征3 # 中间3个特征高度相关但不重要 X[:, 3] np.random.randn(n_samples) * 0.3 X[:, 0] * 0.1 # 弱相关特征4 X[:, 4] X[:, 3] * 0.7 np.random.randn(n_samples) * 0.2 # 相关特征5 X[:, 5] X[:, 3] * 0.6 X[:, 4] * 0.4 np.random.randn(n_samples) * 0.2 # 相关特征6 # 最后4个特征是随机噪声完全不重要 X[:, 6:] np.random.randn(n_samples, 4) * 0.5 # 真实系数只有前3个重要特征有非零系数 true_coef np.zeros(n_features) true_coef[0] 10.0 true_coef[1] -5.0 true_coef[2] 3.0 # 生成目标变量 Y_true X.dot(true_coef) Y Y_true np.random.randn(n_samples) * 3 # 加入噪声 # 2. 数据标准化正则化模型对特征缩放敏感 scaler StandardScaler() X_scaled scaler.fit_transform(X) Y_scaled scaler.fit_transform(Y.reshape(-1, 1)).ravel() # 3. 训练不同的回归模型 # 普通线性回归 linear_model LinearRegression() linear_model.fit(X_scaled, Y_scaled) # Lasso回归λ0.1 lasso_model Lasso(alpha0.1, max_iter10000) lasso_model.fit(X_scaled, Y_scaled) # Ridge回归λ1.0 ridge_model Ridge(alpha1.0) ridge_model.fit(X_scaled, Y_scaled) # 弹性网络回归不同的l1_ratio elastic_models {} l1_ratios [0.1, 0.5, 0.9] # 控制L1和L2的比例 alpha 1.0 # 总正则化强度 for ratio in l1_ratios: model ElasticNet(alphaalpha, l1_ratioratio, max_iter10000) model.fit(X_scaled, Y_scaled) elastic_models[ratio] model # 4. 预测 Y_linear_pred linear_model.predict(X_scaled) Y_lasso_pred lasso_model.predict(X_scaled) Y_ridge_pred ridge_model.predict(X_scaled) Y_elastic_pred { ratio: model.predict(X_scaled) for ratio, model in elastic_models.items() } # 5. 可视化结果 # ... 省略 ... # 6. 模型评估和特征选择效果 print( 模型性能评估 ) print(f普通线性回归 MSE: {mean_squared_error(Y_scaled, Y_linear_pred):.4f}) print(fLasso回归 MSE: {mean_squared_error(Y_scaled, Y_lasso_pred):.4f}) print(fRidge回归 MSE: {mean_squared_error(Y_scaled, Y_ridge_pred):.4f}) for ratio in l1_ratios: mse mean_squared_error(Y_scaled, Y_elastic_pred[ratio]) print(f弹性网络 (l1_ratio{ratio}) MSE: {mse:.4f}) print(\n 特征选择效果 ) print(f普通线性回归非零系数数: {np.sum(linear_model.coef_ ! 0)}) print(fLasso回归非零系数数: {np.sum(lasso_model.coef_ ! 0)}) print( fRidge回归非零系数数: {np.sum(ridge_model.coef_ ! 0)} ) # Ridge几乎不会产生严格零系数 for ratio in l1_ratios: non_zero_count np.sum(elastic_models[ratio].coef_ ! 0) print(f弹性网络 (l1_ratio{ratio}) 非零系数数: {non_zero_count}) ## 运行结果 模型性能评估 普通线性回归 MSE: 0.1352 Lasso回归 MSE: 0.1677 Ridge回归 MSE: 0.1369 弹性网络 (l1_ratio0.1) MSE: 0.2676 弹性网络 (l1_ratio0.5) MSE: 0.5002 弹性网络 (l1_ratio0.9) MSE: 0.9711 特征选择效果 普通线性回归非零系数数: 10 Lasso回归非零系数数: 2 Ridge回归非零系数数: 10 弹性网络 (l1_ratio0.1) 非零系数数: 3 弹性网络 (l1_ratio0.5) 非零系数数: 3 弹性网络 (l1_ratio0.9) 非零系数数: 1 从图中可以看出弹性网络结合了Lasso的特征选择能力和Ridge的稳定性通过调整l1_ratio可以在特征选择和系数稳定性之间找到平衡当特征高度相关时弹性网络比Lasso更稳定比Ridge更能进行特征选择这个示例很好地展示了弹性网络回归在处理高维、高度相关数据时的优势特别适合需要同时进行特征选择和保持模型稳定的场景。