2016-12-18 50 views
0

我對Python和scikit-learn(sklearn)非常陌生,我試圖加載這個由7列屬性和1列數據分類(類/數據目標)組成的數據集。但是有一個屬性由數據[1,2,3,4,5]組成,它實際上標誌着某個事物的某個階段,因此使它成爲一個名義數字,而不是數字。但是,當然python將它識別爲一個數值數據(int64),實際上我希望它被當作一個標稱數據(對象)。如何將列類型更改爲標稱值?如何將Python中的列類型從int更改爲sklearn的對象?

我做了以下工作。

print(data.dtypes) 
data["col_name"]=data["col_name"].astype(numpy.object) 
print(data.dtypes) 

在第一次印刷,它仍然承認我的數據[「COL_NAME」] Int64形式,但astype行後,它已經改變了它object。但它對數據沒有任何影響,因爲當我嘗試使用matplotlib並創建直方圖時,它仍然將X和Y都識別爲數字而不是對象。

另外我已閱讀關於文檔One Hot EncodingLabel Encoding的文檔,但我認爲它們不是我需要的。我想知道我是否誤解了某些東西,或者有其他解決方案。

謝謝

回答

2

閱讀sklearn的文檔。這個軟件包有詳盡的文檔。特別是Preprocessing section on encoding categorical features

在問候保持在整數數組表示類別特徵,即[1,2,3,4,5],我們有這樣的:

這種整數表示不能直接與用來scikit學習 估計,因爲這些需要連續輸入,並且將 類別解釋爲被排序,這通常是不期望的(即,瀏覽器的集合 被任意排序)。將 分類特徵轉換爲可與scikit-learn 估算器一起使用的特徵的一種可能性是使用OneHotEncoder中實現的一個K或一個熱門編碼,即 。該估計器將每個 分類特徵轉換爲m個可能的值爲m個二元特徵, 只有一個有效。

所以你可以做的是使用one-hot encoding將你的數組轉換成5個新列(這種情況下,因爲你有5個可能的值)。

以下是一些工作代碼。輸入是明確的參數[1,2,3,4,5]的一列,所述輸出中是一個矩陣,5列,1爲每個5點可能的選擇的:

from sklearn.preprocessing import OneHotEncoder 

enc = OneHotEncoder() 
enc.fit([[1],[2],[3],[4],[5]]) 
OneHotEncoder(categorical_features='all', dtype='numpy.float64', handle_unknown='error', n_values='auto', sparse=True) 
print enc.transform([[1],[2],[3],[4],[5]]).toarray() 

輸出:

[[ 1. 0. 0. 0. 0.] 
[ 0. 1. 0. 0. 0.] 
[ 0. 0. 1. 0. 0.] 
[ 0. 0. 0. 1. 0.] 
[ 0. 0. 0. 0. 1.]] 

說出您的分類參數在此訂單:[1,3,2,5,4,3,2,1,3,4,2]。你會得到這個輸出:

[[ 1. 0. 0. 0. 0.] 
[ 0. 0. 1. 0. 0.] 
[ 0. 1. 0. 0. 0.] 
[ 0. 0. 0. 0. 1.] 
[ 0. 0. 0. 1. 0.] 
[ 0. 0. 1. 0. 0.] 
[ 0. 1. 0. 0. 0.] 
[ 1. 0. 0. 0. 0.] 
[ 0. 0. 1. 0. 0.] 
[ 0. 0. 0. 1. 0.] 
[ 0. 1. 0. 0. 0.]] 

因此,這1列將轉換爲5列。

+1

嘿,對於遲到的回覆抱歉,我沒有注意到我有一個新的答案。我想試試你的解決方案,但後來我發現data ['class'] = data ['class']。astype(str)'已經工作了,python已經將類列識別爲一個字符串(對象)。我認爲對我來說就足夠了,因爲它是一個班級,而不是一個屬性。但如果我將來遇到類似問題,我會記住您的解決方案。不管怎麼說,還是要謝謝你。 –

相關問題