Python运行XGBoost报xgboost.core.XGBoostError 0特征输入错误求助
错误根本原因
你的数据集仅包含Posts Frequency、Likes Count两列,构造训练特征时把两列都排除了,导致输入XGBoost的训练特征集为空,触发了0 feature is supplied的报错。
具体问题点
- 构造
X_train时使用了~train_data.columns.isin(['Posts Frequency','Likes Count'])的过滤规则,直接把仅有的两列都过滤掉,训练特征维度为0 - 重复执行了两次
GroupShuffleSplit拆分逻辑,属于冗余代码 - 构造
y_test时列名多输入了前置空格,写为[' Likes Count'],会导致测试集标签为空 - 预测函数中过滤规则写为
~data.columns.isin( ['Posts Frequency'] ),如果后续特征构造正确的话,也会导致预测时传入空特征
修复方案
- 修正训练/测试集的特征构造逻辑,仅过滤标签列
Likes Count,保留特征列Posts Frequency - 删除重复的拆分代码,修正y_test的列名空格问题
- 同步修正预测函数的特征过滤规则
修正后的核心代码片段
# 仅保留一次拆分逻辑即可 gss = GroupShuffleSplit(test_size=.20, n_splits=1, random_state = 7).split(data, groups=data['Posts Frequency']) X_train_inds, X_test_inds = next(gss) train_data= data.iloc[X_train_inds] # 仅排除标签列,保留特征列 X_train = train_data.loc[:, ~train_data.columns.isin(['Likes Count'])] y_train = train_data.loc[:, train_data.columns.isin(['Likes Count'])] groups = train_data.groupby('Posts Frequency').size().to_frame('size')['size'].to_numpy() test_data= data.iloc[X_test_inds] X_test = test_data.loc[:, ~test_data.columns.isin(['Likes Count'])] # 修正列名的空格问题 y_test = test_data.loc[:, test_data.columns.isin(['Likes Count'])] # 训练代码不变 model = xgb.XGBRanker( tree_method='gpu_hist', booster='gbtree', objective='rank:pairwise', random_state=42, learning_rate=0.1, colsample_bytree=0.9, eta=0.05, max_depth=6, n_estimators=110, subsample=0.75 ) model.fit(X_train, y_train, group=groups, verbose=True) # 修正预测函数的特征过滤规则 def predict(model, data): return model.predict( data.loc[:, ~data.columns.isin( ['Likes Count'] )] ) predictions = (data.groupby( 'Posts Frequency' ) .apply( lambda x: predict( model, x ) ))
内容的提问来源于stack exchange,提问作者Sofia Vlachou
相关产品推荐
相关产品推荐

