首页 > 解决方案 > 正则化 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 个数量级)。

可以请任何人帮忙吗?我已经为此苦苦挣扎了一天多

标签: python-3.xscikit-learnlogistic-regressionfeature-selection

解决方案


你用过solver=liblinear。从文档中:

random_state : int,RandomState 实例,默认=None

当求解器 == 'sag'、'saga' 或 'liblinear' 对数据进行洗牌时使用。有关详细信息,请参阅词汇表。

所以尝试设置一个固定值random_state,你应该会收敛到相同的结果。

经过非常快速的搜索,我发现liblinear使用坐标下降来最小化成本函数(source)。这意味着它将选择一组随机系数并一次一步最小化成本函数。我想你的结果略有不同,因为它们都从不同的点开始。


推荐阅读