【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] 方法都一样

   

四、建议

多思考,多尝试,这个问题在网站上并没有找到答案。

   

尝试这个:

https://stackoverflow.com/questions/21057621/sklearn-labelencoder-with-never-seen-before-values/48169252#48169252

posted @ 2020-10-27 21:11  忆凡人生  阅读(2623)  评论(0编辑  收藏  举报