You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:42:31