【E-15-Xgboost】ValueError: y contains previously unseen labels: [169, 977, …]
一、问题源头
训练xgboost分类时报错的,错误如题
二、原因
因为做了:train_test_split,导致train中的label不一定包含test的,从而出现上述问题
三、解决方案
1、方案一:确保每个类都能取到并放到train中;
2、方案二:忽略测试集,将全部数据放到train中。但是未来不可预计,只能使用历史数据;最大缺点是会影响验证集和测试集的检测的真实性;
3、方案三:添加一个类"unknown",在训练集中添加一个键值对,再将test中的匹配下,没有在训练集中的label,均视为类"unknown"
本文采用
之前采用方案二,目前采用方案三:
X_train = np.vstack((X_train,np.random.rand(1,128))) #增加一个unknow的部分,in test set,not in train set,这里我的数据是【1,128】的
y_train_code = np.append(y_train_code,np.array("unknown")) #同样对应的Y也需要增加,因为这是键值对的形式。
vocab_code = list(set(y_train_code))
idx_to_code = [code for code in vocab_code]
code_to_idx = {code:i for i,code in enumerate(idx_to_code)}
y_train_idx = np.array([code_to_idx.get(t) for t in y_train_code] )
y_val_idx = np.array([code_to_idx.get(t) if t in vocab_code else code_to_idx["unknown"] for t in y_val_code] ) #测试中的数据若没有,标注为unknown类
#code_to_idx.get(t) code_to_idx[t] 方法都一样
四、建议
多思考,多尝试,这个问题在网站上并没有找到答案。
尝试这个: