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

3

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

具体操作如下:

enter image description here

作为一个机器学习模型,我想使用随机森林和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),它会返回一个预测列表。 - undefined
@badhushamuhammed 谢谢你的回答,但问题是如何做到呢? - undefined
2
你听起来有些困惑,我认为你的困惑根源在于你帖子的第一句话:“我想要在预测模型中使用交叉验证”。你为什么要这样做呢?你在这里试图实现什么目标?(“因为其他人都这样做”当然不是一个有效的答案。)澄清这些问题的答案将有助于你接下来的步骤。希望我下面的回答能给你一些启示。 - undefined
感谢您的回答,旧模型在训练过程中显示了95%的成功率。但是预测成功率下降到了70%。因此,我打算通过使用交叉验证来提高成功率。 - undefined
1
嗯,CV本身并不能提高性能;它只是给你一个更准确可靠的估计。 - undefined
2个回答

3

一般来说,交叉验证(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 的步骤应该类似。


我认为问题的根源是,“我们不应该使用每个折叠生成的模型来预测测试集吗?”我也在为此苦苦挣扎。我应该基于我创建的每个折叠训练k个模型,然后对模型的测试预测结果进行平均,还是像您展示的那样仅在整个数据集上训练一个模型就足够了? - undefined
这篇Stack Exchange的帖子讲得很清楚。https://stats.stackexchange.com/questions/52274/how-to-choose-a-predictive-model-after-k-fold-cross-validation。简而言之,你不应该在测试集上使用交叉验证中生成的模型。它只是一个检查,以查看您的模型在新数据上的表现如何。 - undefined

1
  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) 

因此,预测结果是一个列表,然后您可以使用这些预测结果来检查准确性。

关于交叉验证的内容为空。 - undefined
你可以使用cross_val_predict代替cross_val_score - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接