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

Posted

技术标签:

【中文标题】使用交叉验证时如何使用测试数据集进行预测?【英文标题】:How to predict with the test dataset while using cross validation? 【发布时间】:2020-11-07 06:53:36 【问题描述】:

我想对预测模型使用交叉验证。我想保留 20% 的数据作为测试集,并使用我的其余数据通过交叉验证来拟合我的模型。

希望如下:

作为机器学习模型,我想使用随机森林和 LightGBM。

from sklearn.ensemble import RandomForestRegressor 
random_forest = RandomForestRegressor (n_estimators=1400, max_depth=80, max_features='sqrt',
                                   min_samples_leaf=1, min_samples_split=5, 
                                   random_state=1, verbose=1, n_jobs=-1)

from sklearn.model_selection import cross_val_score
scores = cross_val_score(random_forest, X_train, y_train, cv=5, scoring = 'r2')

它给出了结果,但我想预测 X_test 数据的 y 值。你能帮我吗?之后,我也会为 LightGBM 创建一个模型。

【问题讨论】:

首先创建model,然后你可以使用model.predict(x_train)它会返回一个预测列表 @badhushamuhammed 感谢您的回答,但问题是如何做到这一点? 您听起来很困惑,我认为您困惑的根源在于您帖子的第一句话:“我想对预测模型使用交叉验证”。 为什么你想这样做?您在这里使用 CV 想要达到的目标是什么? (“因为其他人都这样做”当然不是一个有效的答案。)澄清这些问题的答案将有助于你接下来的步骤。希望我在下面的回答能有所启发。 感谢您的回答,旧模型经过训练显示成功率为 95%。但预测的成功率下降到了 70%。出于这个原因,我的目标是通过使用交叉验证来提高成功率。 嗯,CV 本身并不能提高性能;它只是给你一个更准确和可靠的估计。 【参考方案1】:

一般来说,使用交叉验证 (CV) 的原因有以下两个之一:

模型调优(即超参数搜索),以搜索最大化模型性能的超参数;在 scikit-learn 中,这通常使用 GridSearchCV 模块来完成 单个模型的性能评估,您对选择模型的超参数不感兴趣;这通常通过cross_val_score 实现

根据您的设置,很明显您处于上述第二种情况:无论出于何种原因,您似乎已经得出结论,要使用的超参数是您在模型定义中显示的超参数,并且在继续之前为了适应它,您需要了解它的性能。您已选择使用cross_val_score 来执行此操作,到目前为止,您显示的代码确实很好。

但你还没有完成:cross_val_score 只做这些,即它返回一个分数,它返回一个拟合模型。因此,为了真正拟合您的模型并在您的测试集上获得预测(当然假设您对cross_val_score 返回的实际分数感到满意),您需要继续这样做:

random_forest.fit(X_train, y_train)
pred = random_forest.predict(X_test) 

LightGBM 的过程也应该类似。

【讨论】:

【参考方案2】:
  from sklearn.ensemble import RandomForestRegressor
  random_forest = RandomForestRegressor(n_estimators=1400, max_depth=80, max_features='sqrt',
                               min_samples_leaf=1, min_samples_split=5, 
                               random_state=1, verbose=1, n_jobs=-1)

   model = random_forest.fit(x_train, y_train)
   prediction = model.predict(x_test) 

所以预测是列表,那么你可以使用这个预测来检查准确性

【讨论】:

没有关于交叉验证的内容。 你可以用cross_val_predict代替cross_val_score

以上是关于使用交叉验证时如何使用测试数据集进行预测?的主要内容,如果未能解决你的问题,请参考以下文章

如何进行交叉验证 SVM 分类器

您是不是预测交叉验证后的测试数据(gridsearchcv w/KFold)以及如何预测?

在执行 K 折交叉验证后,我们如何在初始数据集/数据帧中包含预测列?

机器学习基础:(Python)训练集测试集分割与交叉验证

交叉验证

交叉验证