【问题标题】:how to deal with categorical data when training data has not got all expected categories?当训练数据没有得到所有预期的类别时,如何处理分类数据?
【发布时间】:2018-01-31 16:28:06
【问题描述】:

我的数据有一个称为级别的功能,数据可能有级别(-1,0,1,2,3),但我的数据现在只有 2 个级别 0 和 -1。我正在使用 python 进行二进制分类。如何对所有级别进行 one-hot-encoding?处理这个问题的正确方法是什么?我可以在测试数据中包含我可能期望的所有级别吗?还是应该只使用 2 个级别?

【问题讨论】:

    标签: python machine-learning categorical-data


    【解决方案1】:

    让我在这个块中重写它。

    训练数据中的级别:

    (-1, 0)
    

    测试数据中的水平:

    (-1, 0, 1, 2, 3)
    

    我认为最好的方法是:

    • 为训练数据创建 2 列(第 1 列将有 1,其中 value == -1,否则为 0;第 2 列将有 1,其中 value == 0,否则为 0)
    • 测试数据中的组 (1, 2, 3)
    • 执行与第一个项目符号中相同的编码,但对于组,您将在第一列中有 0,在第二列中有 0

    因此,您通常会有 2 个级别(对于 value == -1 和 value == 0)和第 3 个级别,其中 one-hot-encoded 向量中的所有值都将等于 0。

    【讨论】:

    • 感谢您的想法听起来很有趣,但我不确定这是否能解决我的问题,因为据我所知,这会将 1,2,3 类别视为单一类别!
    • 当然。但是,如果您在训练集中没有类别 1、2、3,您打算如何训练模型?
    【解决方案2】:

    如果X=[-1,0,1,2,3],对于onehot你可以试试:

    from sklearn.preprocessing import OneHotEncoder
    one_hot_enc=OneHotEncoder()
    X_onehot=one_hot_enc.fit_transform(X.reshape(-1,1)) #reshape to convert 1-d array to 2-d array
    print(X_onehot.toarray())
    

    由于您的班级中有像 -1 这样的负值,因此尝试 one_hot 会抛出

    ValueError: X needs to contain only non-negative integers.
    

    为此,您可以先尝试标签编码:

    from sklearn.preprocessing import LabelEncoder
    enc=LabelEncoder()
    x_new=enc.fit_transform(X)
    print(x_new.classes_)
    

    x_new 代替 X 馈送到OneHotEncoder

    【讨论】:

    • 感谢您的代码,但我的担忧有所不同。我想包含我的训练数据中不存在的级别,我希望在测试数据中存在这些级别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2017-11-08
    • 2022-01-08
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多