如何使用cross_val_score进行机器学习预测?交叉验证模型无法用于测试数据
解决交叉验证后无法使用模型预测的问题
嘿,我来帮你搞定这个问题!你遇到的核心问题其实是对cross_val_score的作用理解有点偏差——它不会把你的modelo对象训练好!
为什么modelo.predict(X_test)会失败?
cross_val_score的本质是帮你评估模型的泛化能力:它会把数据集分成k份,每次用其中k-1份训练一个新的模型实例,剩下1份用来验证,最后返回的是这k次验证的分数。而你最开始定义的modelo,从头到尾都没有被拟合过,还是个“空模型”,调用predict当然会报错啦。
两种解决方案
方案1:先评估性能,再用全量训练数据拟合模型
这是最常用的做法——交叉验证只是用来确认你的模型在当前数据上的泛化能力没问题,最终要用来预测的模型,必须在全部训练数据上重新训练一次:
X = array[:,0:8] Y = array[:,8] X_test = ... # 替换成你的测试数据 # 第一步:用交叉验证评估模型性能 num_folds = 10 seed = 7 kfold = KFold(num_folds, True, random_state=seed) modelo = LogisticRegression() resultado = cross_val_score(modelo, X, Y, cv=kfold) print("Acurácia: %.3f" % (resultado.mean() * 100)) # 第二步:在全部训练数据上拟合模型 modelo.fit(X, Y) # 现在可以正常预测测试集了 y_pred = modelo.predict(X_test)
方案2:保存交叉验证中的每个模型,做集成预测
如果你想利用交叉验证中每个fold训练出的模型(比如做投票集成,提升泛化能力),可以手动遍历KFold的每个拆分,保存训练好的模型:
X = array[:,0:8] Y = array[:,8] X_test = ... # 替换成你的测试数据 num_folds = 10 seed = 7 kfold = KFold(num_folds, True, random_state=seed) treinados_modelos = [] # 手动遍历每个交叉验证拆分 for train_idx, val_idx in kfold.split(X): # 取出当前fold的训练和验证数据 X_train, X_val = X[train_idx], X[val_idx] Y_train, Y_val = Y[train_idx], Y[val_idx] # 训练当前fold的模型并保存 modelo_fold = LogisticRegression() modelo_fold.fit(X_train, Y_train) treinados_modelos.append(modelo_fold) # 用所有模型的预测结果做投票(取多数类) import numpy as np # 收集所有模型的预测结果 todas_predicoes = np.array([modelo.predict(X_test) for modelo in treinados_modelos]) # 对每个测试样本取众数作为最终预测 y_pred = np.apply_along_axis(lambda amostra: np.bincount(amostra).argmax(), axis=0, arr=todas_predicoes)
总结
简单来说,cross_val_score是用来“测评”模型的,不是用来“训练”最终模型的。你要么用全量数据重新训练一个模型,要么手动保存交叉验证中的每个模型来做集成。
内容的提问来源于stack exchange,提问作者Leonardo Henriques
相关产品推荐
相关产品推荐

