zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    Hia~hia~
    细节与销售
    敛财术
    酒井法子
    买了新手机NOKIA E71
    观《拉贝日记》
    居然不配套
    2009上海最新“四金”及个人所得税计算(器)
    有好听点的新歌么?
    我家乌龟终于下蛋了!
  • 原文地址:https://www.cnblogs.com/yifanrensheng/p/13887587.html
Copyright © 2011-2022 走看看