我正在尝试同时使用stratifiedKFold和RandomizedSearchCV实现随机森林分类器。事实是,我可以看到RandomizedSearchCV的“ cv”参数用于进行交叉验证。但是我不知道这怎么可能。
我需要具有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折的工作(或者就是我认为我正在做的事情……),以便能够获得评估系统所需的四个数据集。
预先感谢您的帮助。
最佳答案
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。只是这样做。
这是一个很好的example。
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_显示所有分割和所有迭代的训练和测试的准确性。
关于python - 如何使用RandomizedSearchCV正确实现StratifiedKFold,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51944281/