我想在scikit-learn中使用10折交叉验证(即cross_val_predict
或cross_validate
)来执行递归特征消除与交叉验证(rfecv)
。
由于rfecv
名称中本身就包含交叉验证部分,我不太清楚如何操作。我当前的代码如下所示。
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(random_state = 0, class_weight="balanced")
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
rfecv = RFECV(estimator=clf, step=1, cv=k_fold)
请告诉我如何在10折交叉验证
中使用数据X
和y
与rfecv
一起使用。
如果需要,我很乐意提供更多细节。
回答:
要将递归特征消除与预定义的k_fold
结合使用,您应该使用RFE
而不是RFECV
:
from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import accuracy_score
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
clf = RandomForestClassifier(random_state = 0, class_weight="balanced")
selector = RFE(clf, 5, step=1)
cv_acc = []
for train_index, val_index in k_fold.split(X, y):
selector.fit(X[train_index], y[train_index])
pred = selector.predict(X[val_index])
acc = accuracy_score(y[val_index], pred)
cv_acc.append(acc)
cv_acc
# result:[1.0, 0.9333333333333333, 0.9333333333333333, 1.0, 0.9333333333333333, 0.9333333333333333, 0.8666666666666667, 1.0, 0.8666666666666667, 0.9333333333333333]