2016-06-29 100 views
15

有關於如何分類數據編碼爲Sklearn Decission樹木幾個職位,但是從Sklearn文檔,我們得到了這些傳遞分類數據Sklearn決策樹

Some advantages of decision trees are:

(...)

Able to handle both numerical and categorical data. Other techniques are usually specialised in analysing datasets that have only one type of variable. See algorithms for more information.

但運行以下腳本

import pandas as pd 
from sklearn.tree import DecisionTreeClassifier 

data = pd.DataFrame() 
data['A'] = ['a','a','b','a'] 
data['B'] = ['b','b','a','b'] 
data['C'] = [0, 0, 1, 0] 
data['Class'] = ['n','n','y','n'] 

tree = DecisionTreeClassifier() 
tree.fit(data[['A','B','C']], data['Class']) 

輸出以下錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/sklearn/tree/tree.py", line 154, in fit 
    X = check_array(X, dtype=DTYPE, accept_sparse="csc") 
    File "/usr/local/lib/python2.7/site-packages/sklearn/utils/validation.py", line 377, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: could not convert string to float: b 

我知道在R中可以通過Sklearn傳遞分類數據,這有可能嗎?

回答

4

相反,接受的答案,我寧願使用所提供的工具Scikit,瞭解了這個目的。這樣做的主要原因是它們可以很容易地集成在Pipeline中。

Scikit-Learn本身提供了很好的類來處理分類數據。您應該使用LabelEncoder這是專門爲此目的設計的,而不是寫您的自定義功能。

請參閱下面的代碼從文檔:

le = preprocessing.LabelEncoder() 
le.fit(["paris", "paris", "tokyo", "amsterdam"]) 
le.transform(["tokyo", "tokyo", "paris"]) 

這會自動對其進行編碼成機器學習算法號碼。現在這也支持從整數返回字符串。您可以通過簡單地調用inverse_transform如下做到這一點:

list(le.inverse_transform([2, 2, 1])) 

這將返回['tokyo', 'tokyo', 'paris']

另請注意,對於許多其他分類器,除了決策樹(如邏輯迴歸或SVM)之外,您還想使用One-Hot encoding對分類變量進行編碼。 Scikit-learn通過OneHotEncoder課程支持這一點。

希望這會有所幫助!

+31

-1這是誤導。就目前而言,sklearn決策樹不處理分類數據 - [見問題#5442](https://github.com/scikit-learn/scikit-learn/issues/5442)。這種使用標籤編碼的方法將轉換爲DecisionTreeClassifier()**將視爲數字**的整數。如果你的分類數據不是序數,那麼這不好 - 你最終會得到分裂,這是不合理的。使用'OneHotEncoder'是目前唯一有效的方法,但計算量很大。 – kungfujam

+0

@Abhinav,是否有可能在一個數據框的多個列上同時應用「LabelEncoder」?例如,在問題的數據框中,我們可以做一些事情,比如'le.fit_transform(data [['A','B','C']])'一次爲所有分類列獲取標籤嗎?或者應該明確指定分類列來轉換分類列。 – Minu

+0

@kungfujam,另外,我想'一個熱門編碼'分類列一旦我'LabelEncode'他們 - 解決@kungfujam指出的問題。一旦我完成標籤編碼,我該怎麼做? – Minu

1

Sklearn決策樹不處理分類字符串轉換爲數字。我建議你找到Sklearn功能(也許this),它這樣或手動寫這樣一些代碼:

def cat2int(column): 
    vals = list(set(column)) 
    for i, string in enumerate(column): 
     column[i] = vals.index(string) 
    return column 
+0

是的,這通常是wat,但是對於印刷它並不是很好。 – 0xhfff

+0

如果你想從整數回到字符串表示,建立一個保存字符串和整數之間的映射並用它來「解碼」整數表示的字典。 – mrwyatt

+0

該聲明不準確。 Scikit-learn分類器不會隱式處理標籤編碼。但是,Scikit-learn提供了很多類來處理這個問題。我會建議使用scikit學習工具,因爲它們也可以用最少的努力適應機器學習管道。 –