【问题标题】:How to encode categorical features in sklearn?如何在sklearn中编码分类特征?
【发布时间】:2016-11-15 19:11:04
【问题描述】:

我有一个包含 41 个特征的数据集 [从 0 到 40 列],其中 7 个是分类的。这个分类集分为两个子集:

  • 字符串类型的子集(列特征 1、2、3)
  • int 类型的子集,二进制形式 0 或 1(列特征 6、11、20、21)

此外,列特征 1、2 和 3(字符串类型)分别具有基数 3、66 和 11。 在这种情况下,我必须对它们进行编码以使用支持向量机算法。 这是我的代码:

import numpy as np
import pandas as pd
from sklearn import preprocessing
from sklearn import feature_extraction

df = pd.read_csv("train.csv")
datanumpy = df.as_matrix()
X = datanumpy[:, 0:40]  # select columns 1 through 41 (the features)
y = datanumpy[:, 41]  # select column 42 (the labels)

我不知道使用DictVectorizer()OneHotEncoder() [由于我上面公开的原因] 是否更好,并且主要以哪种方式使用它们[在代码方面] 与X 矩阵我有。 或者我应该简单地为字符串类型子集中的每个基数分配一个数字(因为它们具有高基数,所以我的特征空间将呈指数增长)?

编辑 关于 int 类型的子集,我想最好的选择是保持列特征不变(不要将它们传递给任何编码器) 对于具有高基数的字符串类型的子集,问题仍然存在。

【问题讨论】:

    标签: python scikit-learn categorical-data one-hot-encoding dictvectorizer


    【解决方案1】:

    根据 One Hot Encoder 的官方文档,它应该应用于组合数据集(训练和测试)。否则可能无法形成正确的编码。

    在性能方面,我认为 One Hot Encoder 比 DictVectorizer 要好得多。

    【讨论】:

    • 为什么 One-Hot Encoder 比 DictVectorizer 好很多?有什么数据可以支持吗?
    【解决方案2】:

    这是迄今为止最简单的:

     df = pd.get_dummies(df, drop_first=True)
    

    如果出现内存溢出或速度太慢,请降低基数:

    top = df[col].isin(df[col].value_counts().index[:10])
    df.loc[~top, col] = "other"
    

    【讨论】:

    • 据我了解,这不是一个可接受的答案,因为它不能保证不同 DataFrame 对象之间的一致性(例如训练和测试)。
    • 在训练/测试的情况下,您可以在拆分之前应用,当然,您尝试预测的新数据集可能会出现同样的问题。在这种情况下,一种解决方案是使用 pandas 分类数据指定类别,然后将相同的规范应用于每个数据集。这样 get_dummies 每次都会使用相同的编码。
    【解决方案3】:

    您可以使用上面@simon 建议的pandas方法.get_dummies(),或者您可以使用OneHotEncoder 给出的sklearn 等效项。

    更喜欢OneHotEncoder,因为您可以将参数传递给它,例如您要编码的分类特征以及每个特征要保留的值的数量(如果不是指示,它将自动选择最佳数量)。

    如果对于某些特征,基数太大,则施加较低的n_values。 如果您有足够的内存,请不要担心,对您的特征的所有值进行编码。

    我猜对于 66 的基数,如果您有一台基本的计算机,编码所有 66 个功能不会导致内存问题。例如,当您拥有与数据集中的样本数量一样多的特征值时,通常会发生内存溢出(每个样本唯一的 ID 的情况)。数据集越大,出现内存问题的可能性就越大。

    【讨论】:

    • 我同意你的观点,但由于我的数据集非常庞大,我也担心支持向量运行所需的时间。无论如何,您是否有一个使用 OneHotEncoder 的脚本库(我猜以前使用的是 LabelEncoder)?
    猜你喜欢
    • 2022-10-05
    • 2015-04-23
    • 2015-10-30
    • 2014-09-21
    • 2023-03-13
    • 2020-12-09
    • 2017-12-11
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多