如何对数据应用交叉验证?

Posted

技术标签:

【中文标题】如何对数据应用交叉验证?【英文标题】:How to apply cross validation on data? 【发布时间】:2019-05-21 06:20:20 【问题描述】:

我想使用平均交叉验证分数来评估 ML 模型。

我将数据拆分为训练集和测试集。

但我不知道是否必须使用训练数据或测试数据来使用交叉验证分数来评估模型。

这是我的代码的一部分:

train, test = train_test_split(basic_df, test_size=0.3, random_state=42)  

# Separate the labels from the features and convert features & labels to numpy arrays
x_train=train.drop('successful',axis=1)
y_train=train['successful']

x_test=test.drop('successful',axis=1)
y_test=test['successful']

model = RandomForestClassifier()

model_random = RandomizedSearchCV(estimator = model, param_distributions = random_grid, n_iter = 100, cv = 5, verbose=2, random_state=42, n_jobs = -1)

model_random.fit(x_train, y_train)


print('Accuracy score: ', model_random.score(x_test,y_test))
print('Average Cross-Val-Score: ', np.mean(cross_val_score(model_random, x_train, y_train, cv=5))) # 5-Fold Cross validation

Y_predicted = model_random.predict(x_test.values)
print('f1_score (macro): ', f1_score(y_test, Y_pred, average='macro') )

主要问题在以下代码行:

print('Average Cross-Val-Score: ', np.mean(cross_val_score(model_random, x_train, y_train, cv=5))) # 5-Fold Cross validation

是正确的还是应该像这样使用测试集:

print('Average Cross-Val-Score: ', np.mean(cross_val_score(model_random, x_test, y_test, cv=5))) # 5-Fold Cross validation

【问题讨论】:

不确定我是否完全按照;但我们从不test 集上执行 CV... 好的,这是我的问题。所以上面的cross_val_score代码sn-p和x_train和y_train是对的 是的,但是您执行 CV 2 次(在 model_random.fit()cross_val_score 中),老实说,当您将 cross_val_score 应用于估算器时,不确定确切的结果是什么这已经是一个 CV 对象,比如model_random 这里... 如果我不使用第二行,如何获得交叉验证分数? (我想检查我是否正确)? print('Accuracy score: ', model_random.score(x_test,y_test)) 是否足够? 【参考方案1】:

您无需再次拟合即可了解您的模型在训练数据上的表现。您可以使用以下命令获取

import pandas as pd
pd.DataFrame(model_random.cv_results_) 

查看mean_test_score 列。请记住,这是交叉验证的测试折叠性能。这将使您了解模型对于 RandomizedSearchCV 选择的特定超参数组合的执行情况。可以使用

提取最佳超参数组合和相应的模型
model_random.best_params_
model_random.best_estimator_

对于您的实际测试数据,通常人们不会在那里使用交叉验证。 只需在那里做一个预测,就像你在这部分中所做的那样。在后台,它使用model_random.best_estimator_进行预测。

Y_predicted = model_random.predict(x_test.values)
print('f1_score (macro): ', f1_score(y_test, Y_pred, average='macro') )

查看此documentation 了解更多说明。

【讨论】:

以上是关于如何对数据应用交叉验证?的主要内容,如果未能解决你的问题,请参考以下文章

5倍交叉验证如何理解

如何对多类数据进行交叉验证?

如何交叉验证 RandomForest 模型?

如何对目录中的 keras 图像数据集使用交叉验证?

使用交叉验证时如何使用测试数据集进行预测?

整个数据集的交叉验证和数据的矢量化