使用带K折交叉验证的核岭回归时出现样本数不一致报错如何解决
报错根因
sklearn的train_test_split接口要求输入的特征集X和标签集y的样本行数必须完全一致,你的代码中将样本量为140的datasetTrain全量赋值给X,样本量为70的datasetTest全量赋值给y,二者样本数不匹配,直接触发该报错。- 你对
X和y的定义逻辑不符合机器学习数据拆分的基本规则:X和y应当来自同一个数据集,分别对应特征列和待预测的目标列,不能用两个独立的、样本量不同的数据集分别作为X和y。
修复方法
1. 常规训练验证拆分逻辑
首先需要从训练集、测试集中分别拆分特征列和目标列,假设你的待预测目标列列名为label,可替换为你实际的列名:
import pandas as pd from sklearn.model_selection import train_test_split datasetTrain = pd.read_csv('D:/set_AB.csv') datasetTest = pd.read_csv('D:/set_C.csv') # 拆分训练集的特征与标签 X_train_all = datasetTrain.drop(columns=['label']) y_train_all = datasetTrain['label'] # 从训练集中拆分出训练子集和验证子集 X_train, X_val, y_train, y_val = train_test_split(X_train_all, y_train_all, random_state=0) # 测试集单独拆分,用于最终模型效果评估 X_test = datasetTest.drop(columns=['label']) y_test = datasetTest['label']
2. K折交叉验证适配逻辑
如果你要实现K折交叉验证,不需要用train_test_split拆分训练集,直接调用KFold相关接口即可,示例如下:
from sklearn.model_selection import KFold from sklearn.kernel_ridge import KernelRidge # 初始化5折交叉验证 kf = KFold(n_splits=5, shuffle=True, random_state=0) # 初始化核岭回归模型,可按需调整核函数、超参数 kr_model = KernelRidge(kernel='rbf', alpha=1.0) # 交叉验证训练 for train_idx, val_idx in kf.split(X_train_all): X_tr, X_val = X_train_all.iloc[train_idx], X_train_all.iloc[val_idx] y_tr, y_val = y_train_all.iloc[train_idx], y_train_all.iloc[val_idx] kr_model.fit(X_tr, y_tr) # 输出当前折的验证集得分 print(f"当前折验证R2得分:{kr_model.score(X_val, y_val):.4f}")
内容的提问来源于stack exchange,提问作者NNN751
相关产品推荐
相关产品推荐

