2017-06-05 108 views
-3

我有一大串字符串。每個字符串都是訓練數據集中的一個不同示例,幷包含一個類別列表,每個類別由逗號分隔。例如。分類數據 - 單熱編碼

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

某些示例可能不屬於任何類別,因此將表示爲空字符串。

我希望使用單熱編碼來編碼這些類別以用於機器學習。

我該怎麼做?我沒有完整的類別列表,並且有大約5000種可能的類別。

+0

你的'mesh'看起來不像'1維numpy字符串數組...'你有1D的字符串數組或字符串數​​組嗎? – MaxU

+0

@MaxU編輯 – scutnex

+0

@MaxU的答案有問題嗎?它應該爲空字符串工作 – elphz

回答

1

演示:

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 [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 
+0

Ocassioanly一些例子可能是一個空字符串(即不屬於任何類別),並使用此代碼,它會崩潰... – scutnex

+0

@scutnex,你如何區分是否是類別,如果你不'沒有完整的類別列表?你能否提供__reproducible__樣本數據集? – MaxU

+0

此_list_中的字符串中的所有文本都是一個類別。 – scutnex

0

還有一堆不同的方式來編碼分類變量:

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

我們可以通過可視化Pandas.SparseDataFrame它對於機器學習,我們在scikit-learn-cont中實現了其中的一小部分(包括One-Hot)肋骨包:category_encoders:

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

如果你已經在使用scikit學習和/或熊貓,它可能是一個簡單的解決方案。像你提到的那樣具有非常高的維度,以及你不一定知道所有類別的情況,你可能會更喜歡HashingEncoder。