提问者:小点点

如何正确使用RandomizedSearchCV实现分层折叠


我试图实现一个随机森林分类器使用stratifiedKFold和随机搜索CV。事情是,我可以看到,"cv"参数的随机搜索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的数据集预测结果,以便能够比较训练数据和测试数据中的结果,以评估可能的过拟合...这是我的一段代码,我知道我做了两次工作,但我不知道如何正确使用stratifiedKfoldSearchCV:

...
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折叠的工作(或者我认为我正在做的…)只有能够得到四个数据集,我需要评估我的系统。提前感谢您的帮助。


共3个答案

匿名用户

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)

所有这些都将自动完成。在这之后,你应该看看诸如cv结果或最佳估计量之类的参数。如果您不想为分类器搜索最佳参数,则不应使用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_显示了所有分裂和所有斜度的训练和测试的精度。

匿名用户

params = { 
    'n_estimators': [200, 500],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [4,5,6,7,8],
    'criterion' :['gini', 'entropy']
}

匿名用户

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)