2

我有一個包含41個特徵[0到40列]的數據集,其中7個是分類的。如何在sklearn中編碼分類特徵?

  • 字符串類型的一個子集(列特徵1,2,3)
  • 整型的一個子集,以二進制形式0或1(列 - :該分類組是在兩個子集劃分功能6,11,20,21)

此外,(字符串類型)的列特徵1,2和3分別具有基數3,66和11。 在這種情況下,我必須對它們進行編碼以使用支持向量機算法。 這是我的代碼:

import numpy as np 
import pandas as pd 
from sklearn import preprocessing 
from sklearn import feature_extraction 

df = pd.read_csv("train.csv") 
datanumpy = df.as_matrix() 
X = datanumpy[:, 0:40] # select columns 1 through 41 (the features) 
y = datanumpy[:, 41] # select column 42 (the labels) 

我不知道,如果是更好地使用DictVectorizer()OneHotEncoder() [對於我上面露出的理由],而且大多以何種方式使用它們[在長期代碼]與我有的X矩陣。 或者我應該簡單地爲字符串類型的子集中的每個基數分配一個數字(因爲它們具有較高的基數,因此我的特徵空間將以指數形式增加)?

編輯 對於子集的int類型的我想這是最好的選擇是保持柱的功能,因爲它們(不要把它們傳遞給任何編碼器) 問題持續字符串類型的子集高基數。

回答

3

這是迄今爲止最簡單的:

df = pd.get_dummies(df, drop_first=True) 

如果你得到一個內存溢出或太慢則降低了基數:

top = df[col].isin(df[col].value_counts().index[:10]) 
df.loc[~top, col] = "other" 
+0

在我的理解中,這不是一個可以接受的答案,因爲它不能保證不同'DataFrame'對象(例如train和test)之間的一致性。 – ldavid

+0

在列車/測試的情況下,您可以在分割之前申請,但當然可能會出現與您嘗試預測的新數據集相同的問題。在這種情況下,一個解決方案是使用熊貓分類數據指定類別,然後對每個數據集應用相同的規範。這樣,get_dummies每次都會使用相同的編碼。 – simon

0

可以使用pandas方法.get_dummies()的建議通過上面的@simon,或者您可以使用由OneHotEncoder給出的相當於sklearn

喜歡OneHotEncoder,因爲你可以傳遞給它的參數,如要編碼的類別特徵和數值,以保持每個功能(如果沒有說明,它會自動選擇最佳的數字)。

如果對於某些功能,基數太大,請施加低n_values。 如果你有足夠的內存不用擔心,編碼你的功能的所有值。

我猜想基數爲66,如果你有一臺基本的計算機,編碼所有的66個功能都不會導致內存問題。內存溢出通常發生在例如某個功能的值與數據集中的樣本數量相同時(對於每個樣本唯一的ID)。數據集越大,您就越有可能遇到內存問題。

+0

我同意你的看法,但由於我的數據集非常龐大,我也擔心支持向量運行的時間。無論如何,你有一個使用OneHotEncoder的腳本庫(以前我使用過的LabelEncoder)? – Gil

-1
from sklearn.preprocessing import LabelEncoder, OneHotEncoder 
labelencoder_X = LabelEncoder() 
X[:, 0] = labelencoder_X.fit_transform(X[:, 0]) 
onehotencoder = OneHotEncoder(categorical_features = [0]) 
X = onehotencoder.fit_transform(X).toarray() 
+2

請編輯您的答案以包含一些解釋。僅有代碼的答案對未來SO讀者的教育很少。您的回答是在低質量的審覈隊列中。 – mickmackusa

+0

@mickmackusa同意 –

+0

正確的記錄,這不是我downvote。我只是希望SO的答案對每個人都是教育/有幫助的(不僅僅是OP)。把它想象成一個教室,成爲你最好的老師。 – mickmackusa

0

根據One Hot Encoder的官方文檔,它應該應用於組合數據集(訓練和測試)。否則它可能無法形成正確的編碼。

性能方面,我認爲一個熱門編碼器比DictVectorizer要好得多。

+0

爲什麼單熱編碼器比DictVectorizer好得多?有沒有任何數據可以支持這個? –

相關問題