如何基于L1正则筛选特征,用Sklearn重构无正则化逻辑回归生产模型
解决方案:基于筛选后特征构建无正则化逻辑回归模型
Hey,这个场景我之前在部署生产模型的时候碰到过,刚好能给你一套清晰的步骤来实现:
1. 确认筛选后的特征数据集
既然你已经手动选好了L1正则化保留的10个特征,并且完成了对应的特征变换(比如标准化、独热编码这些),首先要把这10个特征单独提取出来作为训练数据集:
- 如果你的数据是
pandas.DataFrame,直接用列名提取最直观(避免索引混乱):# 假设你已经确定了10个特征的列名列表 selected_feature_names = ['feat_a', 'feat_b', ..., 'feat_j'] X_selected = your_transformed_df[selected_feature_names] - 如果是
numpy.ndarray,可以通过L1模型的非零系数索引提取(如果你还没手动记录特征名的话):import numpy as np # model_l1是你之前训练好的L1正则化逻辑回归模型 non_zero_coef_indices = np.where(model_l1.coef_[0] != 0)[0] X_selected = your_transformed_array[:, non_zero_coef_indices]
2. 构建无正则化的逻辑回归模型
在Scikit-learn里,要实现完全无正则化的逻辑回归,有两种可靠的方式:
方式一:直接使用penalty='none'(推荐,Sklearn 0.21+支持)
这是最直接的无正则化设置,从Sklearn 0.21版本开始支持:
from sklearn.linear_model import LogisticRegression # 初始化无正则化模型,选择合适的solver(lbfgs适合中小规模数据) model_no_reg = LogisticRegression(penalty='none', solver='lbfgs', max_iter=1000) # 用筛选后的特征训练模型 model_no_reg.fit(X_selected, your_target_variable)
方式二:低版本Sklearn兼容方案(用L2正则化但设极大C值)
如果你的Sklearn版本低于0.21,不支持penalty='none',可以通过把正则化强度的倒数C设为极大值(比如1e10)来近似无正则化(C越大,正则化强度越弱,趋近于0):
model_no_reg = LogisticRegression(penalty='l2', C=1e10, solver='lbfgs', max_iter=1000) model_no_reg.fit(X_selected, your_target_variable)
3. 验证模型效果
训练完成后,你可以做两个简单的验证:
- 检查模型系数:确保10个特征的系数都不为零(因为没有正则化,不会被置零):
print(model_no_reg.coef_) - 用测试集评估性能:对比这个无正则化模型和之前的L1模型的指标(比如准确率、AUC),确认符合你的生产预期。
关键注意点
一定要确保训练无正则化模型时,使用的是已经完成特征变换后的10个特征——比如如果之前用StandardScaler对特征做了标准化,那么X_selected必须是用同一个StandardScaler转换后的结果,不能重新拟合变换,否则会引入数据泄露。
内容的提问来源于stack exchange,提问作者Fungie
相关产品推荐
相关产品推荐

