簡體   English   中英

二進制特征應該是one-hot編碼嗎?

[英]Should binary features be one-hot encoded?

我正在處理由幾十個關於人的二進制特征組成的數據,這些特征基本上歸結為“人具有特征 x”[真/假]。

從我可以找到的在線分類數據來看,應該是單熱編碼,而不是為每個類別分配任意值,因為您不能說“類別 1 小於類別 2”。 所以解決方案是為每個類別創建一個虛擬變量:

Cat || dummy 1 | dummy 2 | dummy 3
____||_________|_________|________
 1  ||   1     |   0     |   0
 2  ||   0     |   1     |   0
 3  ||   0     |   0     |   1

現在對於二元特征,可以選擇直接使用變量(1 表示真,0 表示假)或使用兩個虛擬變量((1, 0) 表示真,(0, 1) 表示假。)。 但我找不到任何顯示/解釋最佳方法的來源。

我自己很矛盾,因為一方面,虛擬變量降低了每個單獨變量的重要性,並且表明至少在某些情況下模型的准確性會受到影響, 來源 但另一方面,這也可以編碼丟失的數據(以 (0, 0) 的形式)。 此外,是否可以說“假小於真”?

我實際上在 python 中使用了隨機森林,我知道基於樹的分類器(如隨機森林)支持分類數據,但 Sklearn 包尚未實現這一點。

我在 Sklearn 數字數據集上寫了一個小測試。 該數據集有多個 8 x 8 的數字圖像 (0-9),每個像素的值在 0 到 16 之間,一個簡單的模型可以使用它來學習識別數字。

對於我的測試,我將 > 8 的值更改為 True,將 <= 8 的值更改為 False。 與原始數據相比,准確性當然會受到影響,但是當我實現單熱編碼時,因此將 True 更改為 (1, 0) 並將 False 更改為 (0, 1) 與二進制編碼相比,我找不到顯着差異.

對推薦方法的解釋將不勝感激!

將取 [0, 1] 值的二進制變量轉換為 [(0, 1), (1, 0)] 的單熱編碼是多余的,不建議這樣做,原因如下(其中一些已經提到在上面的評論中,但只是為了擴展這一點):

  1. 它是多余的,因為二進制變量已經是一種類似於 one-hot 編碼的形式,其中最后一列被刪除,因為它有或沒有它沒有任何區別,因為它可以從第一個給定的列中推斷出來:如果我給你[(0, ), (1,)],你可以知道補列[(, 1), (, 0)]。

  2. 假設您有多個二元變量,例如 4。 如果將它們轉換為one-hot編碼形式,維數將從4增加到8,不推薦使用后者,原因如下:

    • 維度詛咒:高維數據可能很麻煩。 這是因為許多算法(例如聚類算法)使用歐幾里得距離,由於平方項,它對噪聲很敏感。 事實上,隨着維度的增加,數據點散布得太細,使得數據變得非常嘈雜。 此外,鄰域的概念變得毫無意義,基於尋找數據點距離之間的相對對比度的方法變得不可靠。

    • 時間和內存復雜度:很直觀,增加特征的數量會花費算法更多的執行時間和內存空間需求。 僅舉幾例,在計算中使用協方差矩陣的算法將受到影響。 多項式算法最終會得到太多項……等等。 一般來說,學習通常更快,特征更少,特別是如果額外的特征是多余的。

    • 多重共線性:由於二進制變量的one-hot編碼形式的最后一列是冗余的,並且與第一列100%相關,這會給基於線性回歸的算法帶來麻煩。 例如,由於普通最小二乘估計涉及矩陣求逆,如果許多特征相關,計算機算法可能無法成功獲得近似逆,因此逆可能在數值上不准確。 此外,線性模型通過觀察因變量y的變化而工作,在將所有其他自變量保持為常數后,一個自變量的單位變化,但如果自變量高度相關,后者失敗(還有更多其他后果)多重共線性)(盡管其他一些算法可能對此不那么敏感,如決策樹)。

    • 容易過度擬合:通常,太多的特征(無論它們是否相關)可能會過度擬合您的模型並且無法推廣到新示例,因為您的數據集中的每個數據點都將被給定的特征完全識別(搜索 Andrew NG講座,他詳細解釋了

概括

簡而言之,將二進制變量轉換為單熱編碼的變量是多余的,可能會導致不必要和不請自來的麻煩。 盡管相關特征可能並不總是會使您的模型惡化,但它們也不總是會改善它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM