如何在 Python 中进行一次热编码?

新手上路,请多包涵

我有一个包含 80% 分类变量的机器学习分类问题。如果我想使用某个分类器进行分类,我必须使用一种热编码吗?我可以在没有编码的情况下将数据传递给分类器吗?

我正在尝试执行以下功能选择:

  1. 我读了火车文件:
    num_rows_to_read = 10000
   train_small = pd.read_csv("../../dataset/train.csv",   nrows=num_rows_to_read)

  1. 我将分类特征的类型更改为“类别”:
    non_categorial_features = ['orig_destination_distance',
                             'srch_adults_cnt',
                             'srch_children_cnt',
                             'srch_rm_cnt',
                             'cnt']

   for categorical_feature in list(train_small.columns):
       if categorical_feature not in non_categorial_features:
           train_small[categorical_feature] = train_small[categorical_feature].astype('category')

  1. 我使用一种热编码:
    train_small_with_dummies = pd.get_dummies(train_small, sparse=True)

问题是第三部分经常卡住,尽管我使用的是一台强大的机器。

因此,如果没有一种热编码,我就无法进行任何特征选择,以确定特征的重要性。

你有什么建议吗?

原文由 avicohen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 497
1 个回答

方法 1:您可以使用熊猫的 pd.get_dummies

示例 1:

 import pandas as pd
s = pd.Series(list('abca'))
pd.get_dummies(s)
Out[]:
     a    b    c
0  1.0  0.0  0.0
1  0.0  1.0  0.0
2  0.0  0.0  1.0
3  1.0  0.0  0.0

示例 2:

以下将把给定的列转换为一个热列。使用前缀来拥有多个虚拟对象。

 import pandas as pd

df = pd.DataFrame({
          'A':['a','b','a'],
          'B':['b','a','c']
        })
df
Out[]:
   A  B
0  a  b
1  b  a
2  a  c

# Get one hot encoding of columns B
one_hot = pd.get_dummies(df['B'])
# Drop column B as it is now encoded
df = df.drop('B',axis = 1)
# Join the encoded df
df = df.join(one_hot)
df
Out[]:
       A  a  b  c
    0  a  0  1  0
    1  b  1  0  0
    2  a  0  0  1

方法 2:使用 Scikit-learn

使用 OneHotEncoder 的优点是能够 fit 在一些训练数据上,然后 transform 在一些其他实例上使用相同的数据我们还有 handle_unknown 来进一步控制编码器对 看不见 的数据执行的操作。

给定一个具有三个特征和四个样本的数据集,我们让编码器找到每个特征的最大值并将数据转换为二进制单热编码。

 >>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
   handle_unknown='error', n_values='auto', sparse=True)
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9], dtype=int32)
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

这是此示例的链接:http: //scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

原文由 Sayali Sonawane 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题