正则化 l1 逻辑回归特征选择 returns 重新运行时不同的 coef_
Regularized l1 Logistic regression Feature Selection returns different coef_ when rerun
我这里已经提到了一个奇怪的问题:
但我真的无法理解。
我有一个用于特征选择的正则化 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 个数量级)。
可以请任何人帮忙吗?我为此苦苦挣扎了一天多
您使用了 solver=liblinear
。来自 documentation:
random_state : int, RandomState instance, default=None
Used when solver == ‘sag’, ‘saga’ or ‘liblinear’ to shuffle the data. See Glossary for details.
所以尝试为 random_state
设置一个固定值,你应该收敛到相同的结果。
经过快速搜索,我发现 liblinear
使用坐标下降来最小化成本函数 (source)。这意味着它将选择一组随机系数,并一次一步地最小化成本函数。我想您的结果略有不同,因为它们各自从不同的点开始。
我这里已经提到了一个奇怪的问题:
但我真的无法理解。
我有一个用于特征选择的正则化 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 个数量级)。
可以请任何人帮忙吗?我为此苦苦挣扎了一天多
您使用了 solver=liblinear
。来自 documentation:
random_state : int, RandomState instance, default=None
Used when solver == ‘sag’, ‘saga’ or ‘liblinear’ to shuffle the data. See Glossary for details.
所以尝试为 random_state
设置一个固定值,你应该收敛到相同的结果。
经过快速搜索,我发现 liblinear
使用坐标下降来最小化成本函数 (source)。这意味着它将选择一组随机系数,并一次一步地最小化成本函数。我想您的结果略有不同,因为它们各自从不同的点开始。