Python Sklearn套索正则化不放弃随机变量?

Python Sklearn套索正则化不放弃随机变量?,python,scikit-learn,logistic-regression,lasso-regression,Python,Scikit Learn,Logistic Regression,Lasso Regression,我一直在使用sklearn中的SelectFromModel使用套索正则化来减少特征,我发现即使我将max_特征设置为非常低(低到足以对性能产生负面影响)时,随机变量也经常保持不变 我用假数据生成了一个例子来说明,但我看到了与实际数据类似的情况,我试图理解原因 import pandas as pd from sklearn import datasets from sklearn.linear_model import LogisticRegression from sklearn.featu

我一直在使用sklearn中的SelectFromModel使用套索正则化来减少特征,我发现即使我将max_特征设置为非常低(低到足以对性能产生负面影响)时,随机变量也经常保持不变

我用假数据生成了一个例子来说明,但我看到了与实际数据类似的情况,我试图理解原因

import pandas as pd
from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import SelectFromModel
from numpy import random

    
data = datasets.make_classification(n_features = 20, n_informative = 20, n_redundant = 0,n_samples= 1000, random_state = 3)
X = pd.DataFrame(data[0] )
y = data[1]

X['rand_feat1'] = random.randint(100, size=(X.shape[0]))
X['rand_feat2'] = random.randint(100, size=(X.shape[0]))/100

embeded_lr_selector = SelectFromModel(LogisticRegression(penalty="l1", 
                                                         solver='liblinear',random_state = 3),max_features=10)
embeded_lr_selector.fit(X, y)
embeded_lr_support = embeded_lr_selector.get_support()
embeded_lr_feature = X.loc[:,embeded_lr_support].columns.tolist()
print(str(len(embeded_lr_feature)), 'selected features')
print('Features kept', embeded_lr_feature)
尽管我已经将20个变量设置为信息变量,并添加了2个完全随机的变量,但在许多情况下,在选择前10个甚至前5个变量时,这将保持rand_feat2。另一方面,即使使用随机状态集,我也会得到不同的结果……不知道为什么?但这一点通常是一个随机变量会被列为前五名。我在现实世界的数据中看到了类似的情况,我必须去掉大量的变量才能去掉随机特征……这让我严重怀疑它的可靠性?我该怎么解释呢

编辑:

添加屏幕截图以及打印的sklearn/pandas版本。。。我并不总是包含随机特性,但如果我运行几次,它就会出现。在我的真实数据集上,即使删除了大约一半的变量,也几乎总是包含一个


我无法重新创建您的问题。我用50种不同的随机状态运行了您的代码,而rand_feat1/rand_feat2从未包含在get_support()中。你能发布你的输出来显示它们的包含吗?你在运行什么sklearn/pandas?在帖子中添加了屏幕。我只运行了100次,rand2功能只运行了不到一半的时间(45%)。兰德壮举1从来没有出现过,但我无法重现你的问题。我用50种不同的随机状态运行了您的代码,而rand_feat1/rand_feat2从未包含在get_support()中。你能发布你的输出来显示它们的包含吗?你在运行什么sklearn/pandas?在帖子中添加了屏幕。我只运行了100次,rand2功能只运行了不到一半的时间(45%)。然而,兰德壮举1从未出现过