Как выполнить выбор функции (rfecv) при перекрестной проверке в sklearn - PullRequest
0 голосов
/ 30 марта 2020

Я хочу выполнить recursive feature elimination with cross validation (rfecv) в 10-кратной перекрестной проверке (т.е. cross_val_predict или cross_validate) в sklearn.

Поскольку 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)

Пожалуйста, дайте мне знать, как я могу использовать данные X и y с rfecv в 10-fold cross validation.

Я с радостью предоставлю более подробную информацию, если это необходимо.

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Чтобы использовать рекурсивное исключение признаков в сочетании с предопределенным 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]
1 голос
/ 30 марта 2020

Чтобы выполнить выбор функции с помощью RFE и , затем установите rf с 10-кратной перекрестной проверкой, вот как вы можете это сделать:

from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import confusion_matrix
from sklearn.feature_selection import RFE

rf = RandomForestClassifier(random_state = 0, class_weight="balanced")
rfe = RFE(estimator=rf, step=1)

Теперь преобразуйте оригинал X путем подбора с RFECV:

X_new = rfe.fit_transform(X, y)

Вот ранжированные функции (не большая проблема только с 4 из них):

rfe.ranking_
# array([2, 3, 1, 1])

Теперь разделить на Обучайте и проверяйте данные и выполняйте перекрестную проверку в сочетании с сеточным поиском, используя GridSearchCV (обычно они go вместе):

X_train, X_test, y_train, y_test = train_test_split(X_new,y,train_size=0.7)

k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

param_grid = {
                 'n_estimators': [5, 10, 15, 20],
                 'max_depth': [2, 5, 7, 9]
             }

grid_clf = GridSearchCV(rf, param_grid, cv=k_fold.split(X_train, y_train))
grid_clf.fit(X_train, y_train)

y_pred = grid_clf.predict(X_test)

confusion_matrix(y_test, y_pred)

array([[17,  0,  0],
       [ 0, 11,  0],
       [ 0,  3, 14]], dtype=int64)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...