使用交叉验证时如何使用测试数据集进行预测?
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
以上是关于使用交叉验证时如何使用测试数据集进行预测?的主要内容,如果未能解决你的问题,请参考以下文章
您是不是预测交叉验证后的测试数据(gridsearchcv w/KFold)以及如何预测?