XGBClassifier训练报错y应为1d数组得到shape(3210,0)如何解决?
错误根因
报错明确提示输入的标签y是空的二维数组,问题出在你对train数据集的特征和标签切分逻辑错误:
- 你使用
Y = train.iloc[:,9:]切分标签,9:表示取索引为9及之后的所有列,如果你的train数据集(不含你设置的索引列)总列数≤9,就会切出0列的空数据,对应报错的shape (3210, 0) - 即便你的train有第9列,带冒号的切片返回的是二维DataFrame结构,也不符合XGBoost分类器要求y为一维数组的规则。
排查解决步骤
- 第一步:先确认数据集列结构,在读取train之后加一行代码打印信息:
print("train数据集列数(不含索引列):", len(train.columns), "\n列名列表:", train.columns.tolist())
运行后核对你的标签列对应的索引位置(从0开始计数),比如标签是第10列对应索引9,标签是第9列对应索引8。
- 第二步:修正标签切分代码,去掉切片后的冒号,直接取对应列的一维Series:
比如标签列索引为9,就把原来的Y = train.iloc[:,9:]修改为:
Y = train.iloc[:,9]
如果你知道标签列的列名,更稳妥的写法是直接指定列名,比如标签列叫label就写:
Y = train['label']
- 第三步:切分完标签后增加校验逻辑,确认y的结构符合要求:
print("Y的形状:", Y.shape) # 正常应该输出 (总样本数,) ,如果是(总样本数, 0)说明列索引还是错的 print("Y前5行值:\n", Y.head()) # 确认输出的是你要的分类标签值,不是空值
修正后可运行的核心代码段
# 读取数据部分不变 train = pd.read_csv("train.csv", index_col=0) test = pd.read_csv("test.csv", index_col=0) submission = pd.read_csv("sample_submission.csv") # 新增校验代码 print(len(train.columns), train.columns.tolist()) # 修正特征标签切分,这里的索引请根据你上一步打印的结果调整 X = train.iloc[:,:9] # 去掉切片后的冒号,取一维标签 Y = train.iloc[:,9] # 可选打印校验 print(Y.shape, Y.head()) # 后续切分数据集、训练代码不变 seed = 5 test_size = 0.33 X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed) model = xgb.XGBClassifier() model.fit(X_train, y_train)
内容的提问来源于stack exchange,提问作者LEEJONG
相关产品推荐
相关产品推荐

