我被分配了一个任务,需要创建一个决策树分类器,并使用训练集和10折交叉验证来确定准确率。我查看了cross_val_predict
的文档,因为我认为这是我需要的模块。
我遇到的困难是数据集的分割。据我所知,通常情况下,train_test_split()
方法用于将数据集分割成两个部分——训练集和测试集。据我了解,对于K折验证,您需要进一步将训练集分割成K个部分。
我的问题是:我是否需要在一开始将数据集分割成训练集和测试集?
回答:
这取决于情况。我个人认为是的,您需要将数据集分割成训练集和测试集,然后您可以在训练集上进行K折交叉验证。为什么?因为在训练和调整模型后,在未见过的样本上进行测试是有趣的。
但有些人只是进行交叉验证。以下是我常用的工作流程:
# 数据分割
X_train, X_valid, Y_train, Y_valid = model_selection.train_test_split(X, Y, test_size=0.2, random_state=21)
# 在多个模型上进行交叉验证,以查看哪个模型给出最佳结果
print('开始交叉验证')
cv_score = cross_val_score(model, X_train, Y_train, scoring=metric, cv=5)
# 然后使用均值、标准差或绘图来可视化您刚获得的分数
print('平均CV分数 : ' + str(cv_score.mean()))
# 然后我使用另一个交叉验证来调整最佳(或前n个最佳)模型的超参数
for param in my_param:
model = model_with_param
cv_score = cross_val_score(model, X_train, Y_train, scoring=metric, cv=5)
print('带参数的平均CV分数: ' + str(cv_score.mean()))
# 现在我有了模型的最佳参数,我可以训练最终模型
model = model_with_best_parameters
model.fit(X_train, y_train)
# 最后在测试集上测试调整后的模型
y_pred = model.predict(X_test)
plot_or_print_metric(y_pred, y_test)