gpt4 book ai didi

machine-learning - 递归特征消除 (RFE) SKLearn

转载 作者:行者123 更新时间:2023-11-30 09:49:25 25 4
gpt4 key购买 nike

我创建了一个表格来测试我的理解

    F1  F2  Outcome
0 2 5 1
1 4 8 2
2 6 0 3
3 9 8 4
4 10 6 5

从 F1 和 F2 我试图预测结果

正如你所看到的,F1 与结果有很强的相关性,F2 是随机噪声

我测试过

pca = PCA(n_components=2)
fit = pca.fit(X)
print("Explained Variance")
print(fit.explained_variance_ratio_)
Explained Variance
[ 0.57554896 0.42445104]

这正是我所期望的,并且表明F1更重要

但是当我进行 RFE(递归特征消除)时

model = LogisticRegression()
rfe = RFE(model, 1)
fit = rfe.fit(X, Y)
print(fit.n_features_)
print(fit.support_)
print(fit.ranking_)
1
[False True]
[2 1]

它要求我保留 F2?它应该要求我保留 F1,因为 F1 是一个强预测变量,而 F2 是随机噪声......为什么是 F2?

谢谢

最佳答案

建议在运行递归特征消除 (RFE) 之前进行递归特征消除交叉验证 (RFECV)

这是一个例子:有列:

df.columns = ['age', 'id', 'sex', 'height', 'gender', 'marital status', 'income', 'race']

使用 RFECV 确定所需的最佳特征数量。

from sklearn.ensemble import RandomForestClassifier
rfe = RandomForestClassifier(random_state = 32) # Instantiate the algo
rfecv = RFECV(estimator= rfe, step=1, cv=StratifiedKFold(2), scoring="accuracy") # Instantiate the RFECV and its parameters
fit = rfecv.fit(features(or X), target(or y))
print("Optimal number of features : %d" % rfecv.n_features_)
>>>> Optimal number of output is 4

现在已经知道了最佳特征数量,我们可以使用递归特征消除来识别最佳特征

from sklearn.feature_selection import RFE
min_features_to_select = 1
rfc = RandomForestClassifier()
rfe = RFE(estimator=rfc, n_features_to_select= 4, step=1)
fittings1 = rfe.fit(features, target)
for i in range(features.shape[1]):
print('Column: %d, Selected %s, Rank: %.3f' % (i, rfe.support_[i], rfe.ranking_[i]))

output will be something like:
>>> Column: 0, Selected True, Rank: 1.000
>>> Column: 1, Selected False, Rank: 4.000
>>> Column: 2, Selected False, Rank: 7.000
>>> Column: 3, Selected False, Rank: 10.000
>>> Column: 4, Selected True, Rank: 1.000
>>> Column: 5, Selected False, Rank: 3.000

现在根据上面完成的递归特征消除显示要删除的特征

columns_to_remove = features.columns.values[np.logical_not(rfe.support_)]
columns_to_remove

output will be something like:
>>> array(['age', 'id', 'race'], dtype=object)

现在通过删除不需要的功能并选择所需的功能来创建新数据集

new_df = df.drop(['age', 'id', 'race'], axis = 1)

然后您可以进行交叉验证,以了解新选择的特征 (new_df) 对目标列的预测效果如何。

# Check how well the features predict the target variable using cross_validation
cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0)
scores = cross_val_score(RandomForestClassifier(), new_df, target, cv= cv)

print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))
>>> 0.84 accuracy with a standard deviation of 0.01

不要忘记,您还可以阅读此 documentation 中使用的最佳交叉验证 (CV) 参数。

递归特征消除 (RFE) documentation了解更多并更好地理解

递归特征消除交叉验证 (RFECV) documentation

关于machine-learning - 递归特征消除 (RFE) SKLearn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47688734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com