【问题标题】:Categorical Data - One-hot encoding分类数据 - One-hot 编码
【发布时间】:2017-11-06 09:34:03
【问题描述】:

我有一个很大的字符串列表。每个字符串都是训练数据集中的一个不同示例,并包含一个类别列表,其中每个类别用逗号分隔。例如。

mesh = ['aligator, dog, cat', 'cat, mouse, aligator', '']

某些示例可能不属于任何类别,因此将表示为空字符串。

我希望使用 one-hot 编码对这些类别进行编码以用于机器学习。

我该怎么做?我没有完整的类别列表,大约有 5,000 个可能的类别。

【问题讨论】:

  • 你的mesh 不像1-dimensional numpy array of strings...你有字符串数组还是字符串数组的一维数组?
  • @MaxU 已编辑
  • @MaxU 的回答有问题吗?它应该适用于空字符串

标签: python scikit-learn nltk one-hot-encoding


【解决方案1】:

有很多不同的方法可以对机器学习的分类变量进行编码,我们在 scikit-learn-contrib 包中实现了其中的一些(包括 One-Hot):category_encoders:

https://github.com/scikit-learn-contrib/categorical-encoding

如果您已经在使用 scikit-learn 和/或 pandas,这可能是一个简单的解决方案。对于您提到的非常高的维度,并且您不一定预先知道所有类别的情况,使用 HashingEncoder 之类的东西可能会更好。

【讨论】:

    【解决方案2】:

    演示:

    In [64]: from sklearn.feature_extraction.text import CountVectorizer
    
    In [65]: cv = CountVectorizer()
    
    In [66]: X = cv.fit_transform(mesh)
    
    In [67]: X.A
    Out[67]:
    array([[1, 1, 1, 0],
           [1, 1, 0, 1]], dtype=int64)
    

    列名:

    In [68]: cv.get_feature_names()
    Out[68]: ['aligator', 'cat', 'dog', 'mouse']
    

    我们可以使用 Pandas.SparseDataFrame 对其进行可视化:

    In [135]: import pandas as pd
    
    In [136]: pd.SparseDataFrame(X, columns=cv.get_feature_names(), default_fill_value=0)
    Out[136]:
       aligator  cat  dog  mouse
    0         1    1    1      0
    1         1    1    0      1
    

    【讨论】:

    • 有时某些示例可能是空字符串(即不属于任何类别),使用此代码会崩溃...
    • @scutnex,如果您没有完整的类别列表,如何区分它是否是类别?能否提供一个可重现的样本数据集?
    • 列表中字符串中的所有文本都是一个类别。
    • @scutnex,包括''??
    • 如果它是一个空字符串,我们希望将其分类为所有类别的 0。
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2017-06-21
    • 2018-03-24
    • 2018-03-29
    • 1970-01-01
    • 2021-11-02
    • 2021-04-19
    • 2017-02-16
    相关资源
    最近更新 更多