在實踐中,決策樹是否會通過將分類值轉換為數值來執行節點拆分?
在決策樹中,在進行分類或回歸時,我們是否只使用數值?假設我有一個分類列
Wind
作為特徵。假設我有 5 行(觀察值),其值為Wind
[high
,low
,high
,medium
,medium
]。我可以將這些分類數據輸入決策樹分類器(如 scikit-learn),它會獲取數據嗎?也就是說,基於風的節點拆分是否會發生在
high
計數為 2、medium
計數為 2 和low
計數為 1 的分類值上。或者,系統會將其轉換為虛擬變量嗎?
理論不同於實踐。基本上,理論上如何描述算法在實踐中並不總是得到尊重。在 scikit-learn 的情況下,決策樹的實現僅考慮數字特徵。這是錯誤的,或者至少是不完整的,因為對於名義變量,與數值變量相比,您有不同的方法來查找拆分。
一個簡短的例子。首先對數值變量進行排序並遍歷排序值,然後創建和評估新測試。對數字輸入的測試具有以下形式:左側所有大於等於可能拆分值的值,右側是另一個。對於標稱值,有各種測試,其中一種具有以下形式:左邊是一個類別的實例,右邊是其餘實例。
人們總是可以使用某種編碼將名義變量轉換為數字變量。只要您不對編碼值進行一些數學運算,就可以了。但是 scikit-learn 實現的問題在於,它將在拆分時使用數值變量的邏輯,應用於名義變量的數值編碼。因此,您確實無法重現我作為示例提供給您的名詞行為。
它還考慮了一種熱編碼替代方案。這意味著您將一個名義變量轉換為多個二元變量(名義變量的每個級別一個)。處理名義變量的數字編碼或一種熱編碼可能會產生結果(毫無疑問)。關鍵是它們產生的結果與理論上指定的算法不同,因為它們沒有完全實現它。
有各種 ML 庫,其中大多數都支持處理分類變量(R 將它們命名為因子,Weka 將它們命名為名義變量等)。
[稍後編輯:解決 Soren 和 Candic3 的評論]
據我所知,Breiman 關於隨機森林的規範考慮了對來自所有變量組合組的名義變量的二元拆分。正如索倫所說,這是 $ 2^{L-1} $ . 這太多了。然而,有兩件事可以說。
第一個是你不必遵循這個名義上的秘訣。您可以搜索“一對多”形式的名義變量的二元拆分。即使對於具有多個級別的變量,它們的數量也很少。可以說,您可以通過某種編碼轉換成二進制指標。這是正確的,但並不完整,因為您必須以某種方式處理缺失值,這對於編碼而言並非易事。使用代理或加權隨機是不可能的。不知何故,您必須在編碼發生之前進行變量插補,或者將缺失視為另一個類別。
第二件事是,在對 Gini 雜質進行二元分類的情況下,有證據表明最好從所有 $ 2^{L-1} $ 如果您使用以下過程,則發現速度要快得多。計算每個級別子集的純度函數。根據在每個子集上計算的雜質函數值對變量進行排序。然後,計算子集的二進制拆分,其中一側您首先擁有 $ k $ 變量之前排序,其餘的值在另一組中。這個過程是在線性時間內計算的,因此效率很高,實際上可以處理超過 32 個級別的變量。有關詳細信息,請參閱Elements of Statistical Learning,第 2 版 - 第 310 頁,第 9.2.4 節其他問題。您將在那裡找到解釋和以下參考資料。
我對此類主題的個人結論如下。如果可能,請使用分類處理。即使對於大量級別,這有時也是可能的。但是,對於大量級別,您應該謹慎行事。太多的水平可以轉化為低預測能力。因此,也許一組級別提供的不僅僅是直接使用變量。
例如,如果您有郵政編碼。級別的數量可能很大。直接處理是可能的,但也許將郵政編碼解碼為區域具有更高的通用性,因此具有更強的預測能力。
我的想法是,應該以一種更具解釋性的方式直接通過編程技巧來分析和解決名義級別的過多粒度。