2013-11-28 45 views
2

我有一個數據集的名義和數字特徵。如果可能,我希望能夠完全用數字表示這個數據集。數字表示名義數據,同時保留數據語義

理想情況下,我可以做到這一點n-ary名義功能。我意識到在二進制情況下,可以用整數表示兩個名義值。但是,當一個名義特徵可以有許多排列時,如果可能的話,這將如何實現?

回答

2

有許多技術將分類屬性「嵌入」爲數字。

例如,給定,可以採取的值red,​​blue和,我們就可以平凡編碼此作爲屬性isRed={0,1}isGreen={0,1}isBlue={0,1}分類變量。雖然這很受歡迎,並且很明顯會「起作用」,但許多人認爲後來的數值處理技術會產生明智的結果。

如果您運行例如以這種方式編碼的數據集上的k-均值,結果可能不會太有意義。特別是,如果你得到一個如isRed=.3 isGreen=.2 isBlue=.5的意思 - 你不能合理地將其映射回原始數據。更糟糕的是,有些算法甚至可能得到isRed=0 isGreen=0 isBlue=0

我建議您嘗試使用您的實際的數據,並儘可能避免編碼。如果你有一個好的工具,它可以讓你使用混合的數據類型。 不要嘗試使一切成爲數字向量。這種數據的數學視圖是相當有限的,數據不會給你所有需要從這個視圖中受益的數學假設(例如度量空間)。

1

不要這樣做:我試圖編碼某些名義屬性爲整數。

除名稱特徵只有兩種排列組合。可以爲每個使用不同的整數(例如1和3)。

但是,如果有兩個以上的置換,整數不能使用。假設我們將1,2和3分配給三個排列組合。正如我們所看到的,由於不同,1-2和2-3之間的關係比1-3更高。

而是對每個名義屬性的每個值使用單獨的二進制特徵。因此,你的問題的答案是:這是不可能的/明智的。

0

如果您使用熊貓,您可以在名義值列上使用名爲.get_dummies()的函數。這會將N唯一值的列轉換爲N(或者如果您想要N-1,稱爲drop_first)新列指示10是否存在值。

實施例:

s = pd.Series(list('abca')) 

get_dummies(s) 
    a b c 
0 1 0 0 
1 0 1 0 
2 0 0 1 
3 1 0 0