Как правильно реализовать StratifiedKFold с помощью RandomizedSearchCV

2

Я пытаюсь реализовать классификатор случайного леса, используя как stratifiedKFold, так и RandomizedSearchCV. Дело в том, что я вижу, что параметр «cv» RandomizedSearchCV используется для перекрестной проверки. Но я не понимаю, как это возможно. Мне нужны наборы данных X_train, X_test, y_train, y_test, и, если я попытаюсь реализовать свой код так, как я его видел, невозможно получить четыре набора ... Я видел такие вещи, как следующее:

cross_val = StratifiedKFold(n_splits=split_number)
clf = RandomForestClassifier()
n_iter_search = 45
random_search = RandomizedSearchCV(clf, param_distributions=param_dist,
                               n_iter=n_iter_search,
                               scoring=Fscorer, cv=cross_val,
                               n_jobs=-1)
random_search.fit(X, y) 

Но дело в том, что мне нужно сопоставить мои данные с наборами данных X_train и y_train и предсказать результаты с наборами данных X_train и X_test, чтобы иметь возможность сравнивать результаты в данных обучения и данных тестирования для оценки возможного переобучения. .. Это часть моего кода, я знаю, что делаю эту работу дважды, но я не знаю, как правильно использовать stratifiedKfold и RandomizedSearchCV:

...
cross_val = StratifiedKFold(n_splits=split_number)
index_iterator = cross_val.split(features_dataframe, classes_dataframe)
clf = RandomForestClassifier()
random_grid = _create_hyperparameter_finetuning_grid()
clf_random = RandomizedSearchCV(estimator = clf, param_distributions = random_grid, n_iter = 100, cv = cross_val,
                                verbose=2, random_state=42, n_jobs = -1)
for train_index, test_index in index_iterator:
    X_train, X_test = np.array(features_dataframe)[train_index], np.array(features_dataframe)[test_index]
    y_train, y_test = np.array(classes_dataframe)[train_index], np.array(classes_dataframe)[test_index]
    clf_random.fit(X_train, y_train)
    clf_list.append(clf_random)
    y_train_pred = clf_random.predict(X_train)
    train_accuracy = np.mean(y_train_pred.ravel() == y_train.ravel())*100
    train_accuracy_list.append(train_accuracy)
    y_test_pred = clf_random.predict(X_test)
    test_accuracy = np.mean(y_test_pred.ravel() == y_test.ravel())*100

    confusion_matrix = pd.crosstab(y_test.ravel(), y_test_pred.ravel(), rownames=['Actual Cultives'],
                                   colnames=['Predicted Cultives'])
...

Как вы можете видеть, я дважды выполняю работу со стратифицированным K-сгибом (или это то, что я думаю, что делаю ...) только для того, чтобы получить четыре набора данных, которые мне нужны для оценки моей системы. Спасибо заранее за вашу помощь.

1

RandomizedSearchCV используется для поиска лучших параметров для классификатора. Он выбирает рандомизированные параметры и подгоняет их под вашу модель. После этого необходимо оценить эту модель, и вы можете выбрать стратегию, это параметр cv. Потом с другими параметрами. Не нужно делать это дважды. Вы можете просто написать:

cross_val = StratifiedKFold(n_splits=split_number)
index_iterator = cross_val.split(features_dataframe, classes_dataframe)
clf = RandomForestClassifier()
random_grid = _create_hyperparameter_finetuning_grid()
clf_random = RandomizedSearchCV(estimator = clf, param_distributions = random_grid, n_iter = 100, cv = cross_val,
                                verbose=2, random_state=42, n_jobs = -1)
clf_random.fit(X, y)

И все будет автоматически. После этого U должен посмотреть на такие параметры, как cv_results_ или best_estimator_. Если вы не хотите искать лучшие параметры для классификатора - вам не следует использовать RandomizedSearchCV. Просто для этого.

И вот хороший пример .

UPD: Попробуйте сделать так:

clf = RandomForestClassifier()
random_grid = _create_hyperparameter_finetuning_grid()
clf_random = RandomizedSearchCV(estimator = clf, param_distributions = random_grid, 
                                score = 'accuracy', n_iter = 100, 
                                cv = StratifiedKFold(n_splits=split_number),
                                verbose=2, random_state=42, n_jobs = -1)
clf_random.fit(X, y)
print(clf_random.cv_results_)

Это то, что ты хочешь?

Cv_results_ показывает точность u для обучения и тестирования для всех разбиений и для всех итераций.

4
  • Спасибо за ваш ответ. Но у меня все еще есть сомнения. Мне нужны наборы X_train, y_train, X_test, y_test для выполнения следующего кода: y_train_pred = clf_random.predict (X_train) train_accuracy = np.mean (y_train_pred.ravel () == y_train.ravel ()) * 100 train_accuracy_list ( train_accuracy) y_test_pred = clf_random.predict (X_test) test_accuracy = np.mean (y_test_pred.ravel () == y_test.ravel ()) * 100 Я понял, что все делается в RandomizedSearchCV. Но мне нужно спрогнозировать точность набора тестовых данных и набора данных поезда.
    Naroa
    21 авг.
  • Вам нужно сделать это с помощью StratifiedKFold или просто для фиксированного обучения и тестирования? 21 авг.
  • Я предпочитаю использовать stratifiedKFold, чтобы избежать переобучения, вместо статического создания наборов поездов и тестов.
    Naroa
    21 авг.
  • спасибо Анна! Не видел обновления думаю то что надо !! Я вам скажу ... спасибо !!!
    Naroa
    22 авг.
1
params = { 
    'n_estimators': [200, 500],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [4,5,6,7,8],
    'criterion' :['gini', 'entropy']
}
0
cross_val = StratifiedKFold(n_splits=5)
index_iterator = cross_val.split(X_train, y_train)
clf = RandomForestClassifier()
clf_random = RandomizedSearchCV(estimator = clf, param_distributions = params, n_iter =100, cv = cross_val,
                            verbose=2, random_state=42, n_jobs = -1,scoring='roc_auc')
clf_random.fit(X, y)