python-3.x - 正则化 l1 逻辑回归特征选择在重新运行时返回不同的 coef_
问题描述
我这里已经提到了一个奇怪的问题:LinearSVC Feature Selection return different coef_ in Python
但我无法真正理解这一点。
我有一个用于特征选择的正则化 L1 逻辑回归。当我只是重新运行代码时,所选功能的数量会发生变化。目标变量为二进制 1, 0。特征数为 709。训练观察数为 435,因此特征多于观察数。惩罚 C 是通过 TimeSeriesSplit CV 获得的,并且在我重新运行时永远不会改变,我验证了这一点。
在功能选择部分的代码下方..
X=df_training_features
y=df_training_targets
lr_l1 = LogisticRegression(C = LR_penalty.C, max_iter=10000,class_weight=None, dual=False,
fit_intercept=True, intercept_scaling=1, l1_ratio=None, n_jobs=None,
penalty='l1', random_state=None, solver='liblinear', tol=0.0001, verbose=0,
warm_start=False).fit(X,y)
model = SelectFromModel(lr_l1, threshold=1e-5, prefit=True)
feature_idx = model.get_support()
feature_name = X.columns[feature_idx]
X_new = model.transform(X)
# Plot
importance = lr_l1.coef_[0]
for i,v in enumerate(importance):
if np.abs(v)>=1e-5:
print('Feature: %0d, Score: %.5f' % (i,v))
sel = importance[np.abs(importance)>=1e-5]
# plot feature importance
plt.figure(figsize=(12, 10))
pyplot.bar([x for x in feature_name], sel)
pyplot.xticks(fontsize=10, rotation=70)
pyplot.ylabel('Feature Importance', fontsize = 14)
pyplot.show()
如上所示,结果有时会给我选择 22 个特征(第一个图),有时是 24 个(第二个图)或 23 个。不确定发生了什么。我认为问题出在 SelectFromModel 中,所以我决定明确说明阈值 1e-5(这是 l1 正则化的默认值),但没有任何变化。
总是相同的特征有时进有时出,所以我检查了它们的系数,因为我认为它们可能接近该阈值,而不是它们不是(高 1 或 2 个数量级)。
可以请任何人帮忙吗?我已经为此苦苦挣扎了一天多
解决方案
推荐阅读
- java - 如何使用自定义 JDK 构建 Jenkins 项目?
- php - php graph api访问令牌过期
- reactjs - 在 antd 树上过滤时。如果我过滤父节点,则不能再展开该父节点
- arrays - "putchar(" .-+#"[*(p++) / 52]);" 中的 "[*(p++) / 52]" 如何 工作?
- javascript - 如何使用 promise 来等待函数执行
- sql - Oracle主键seq_id在select语句中没有按顺序排序
- sql - 使用 VBA 将数据从 SSMS 连接表导入 Excel 文件
- mysql - 在 mysql 数据上标记为已读
- r - 文件中的错误(描述 = xlsxFile):使用 lapply 时“描述”参数无效
- wildfly - 将 20.0.1 升级到 24.0.0 后,在应用重新部署期间 Web 会话随机丢失