【问题标题】:How to deal with changing cardinality in sci-kit learn model如何处理 sci-kit 学习模型中不断变化的基数
【发布时间】:2020-01-01 11:18:27
【问题描述】:

我正在尝试在 sci-kit 学习模型中使用高基数特征 (siteid),并正在使用 get_dummies 对该特征进行一次性编码。我得到了大约 800 个新的二进制列,它们使用逻辑回归返回了不错的准确性。我的问题是,当我通过我的模型传递一个新数据集时,我在这个特性上有一个不同的基数,比如 300 个唯一值,并且模型正确地问,你训练我的其他 500 列在哪里?我该如何解决这个问题?

我不想在每次基数变化时都训练模型,也不想在我的 SQL 数据加载中对这些列进行硬编码。

cat_columns = ["siteid"]

df = pd.get_dummies(df, prefix_sep="__",
                              columns=cat_columns)

【问题讨论】:

    标签: python pandas machine-learning scikit-learn cardinality


    【解决方案1】:

    我建议使用 scikit-learn 的 OneHotEncoder。

    documentation here

    在你的情况下,用法看起来像

    from sklearn.preprocessing import OneHotEncoder
    
    enc = OneHotEncoder(handle_unknown='ignore')
    enc.fit(df[['cat_columns']])
    
    categories = [cat for cats in enc.categories_ for cat in cats]
    
    df[categories] = enc.transform(df[['cat_columns']])
    

    handle_unknown 参数是关键,enc 对象是新数据可重复性所必需的。

    在您将运行的新数据帧上

    df_new[categories] = enc.transform(df_new[['cat_columns']])
    

    这将对相同的类别进行热编码,并忽略您的模型不习惯的任何新类别。

    【讨论】:

    【解决方案2】:

    我的建议是用零填充这些剩余的列。因此,如果您的新训练样本具有例如 10 个唯一值,并且模型需要 50 个值(total_cols 的数量),则在右侧创建 40 列零以“填写”其余数据:

    df = pd.DataFrame({"siteid": range(10)})
    cat_columns = ["siteid"]
    df1 = pd.get_dummies(df, columns=cat_columns)
    
    # df1 has shape (10, 10)
    
    total_cols = 50    # Number of columns that model expects
    zero_padding = pd.DataFrame(np.zeros((df1.shape[0], total_cols - df1.shape[1])))
    df = pd.concat([df1, zero_padding], axis=1)
    df.columns = ["siteid__" + str(i) for i in range(df.shape[1])]
    
    # df now has shape (10, 50)
    

    【讨论】:

    • 谢谢,这很有用,但我的特征将来可能比我的原始训练数据集有更高的基数,然后对我的模型就没有用了。我真正想要的是一种将这个特性作为单列传递的方法,我的模型不会将其解释为连续整数。
    • @Classic123456 如果您将新数据传递给模型,其中包含以前从未见过的列,那么它将不知道如何处理这些新列。
    • 是的,好点,我想我想忽略新列,直到我重新训练模型并且不希望它在我通过不熟悉的列时中断。 @Philip Martin 的解决方案就是这样做的。
    • @Classic123456 好的,我明白了。是的,他的回答非常有用。
    猜你喜欢
    • 2020-10-26
    • 2020-07-17
    • 2013-05-23
    • 2014-07-16
    • 2013-10-13
    • 2017-04-20
    • 1970-01-01
    • 2020-10-15
    • 2020-04-14
    相关资源
    最近更新 更多