正则化 l1 逻辑回归特征选择在重新运行时返回不同的 coef_
Posted
技术标签:
【中文标题】正则化 l1 逻辑回归特征选择在重新运行时返回不同的 coef_【英文标题】:Regularized l1 Logistic regression Feature Selection returns different coef_ when rerun 【发布时间】:2021-04-06 01:11:26 【问题描述】:这里已经提到了一个奇怪的问题:LinearSVC Feature Selection returns 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 个数量级)。
可以请任何人帮忙吗?我已经为此苦苦挣扎了一天多
【问题讨论】:
尝试修复random_state=42
【参考方案1】:
你使用了solver=liblinear
。来自documentation:
random_state : int,RandomState 实例,默认=None
在solver == ‘sag’、‘saga’或‘liblinear’时使用来打乱数据。有关详细信息,请参阅词汇表。
所以尝试为random_state
设置一个固定值,您应该会收敛到相同的结果。
经过非常快速的搜索,我发现liblinear
使用坐标下降来最小化成本函数(source)。这意味着它将选择一组随机系数并一次一步最小化成本函数。我想你的结果会略有不同,因为它们都从不同的点开始。
【讨论】:
感谢您的帮助。你知道为什么 liblinear 需要这种 shuffle 吗?背后的原因是什么?非常感谢 没问题(;我在答案中添加了一段。希望对您有所帮助!以上是关于正则化 l1 逻辑回归特征选择在重新运行时返回不同的 coef_的主要内容,如果未能解决你的问题,请参考以下文章