2017-07-06 137 views
2

我正在嘗試在UCI銀行營銷數據 - >https://archive.ics.uci.edu/ml/datasets/bank+marketing上構建決策樹和隨機森林分類器。數據集中有許多分類特徵(具有字符串值)。如何處理spark tree中的決策樹,隨機森林的分類特徵?

在spark ml文檔中,提到可以使用StringIndexer或VectorIndexer通過索引將分類變量轉換爲數字。我選擇使用StringIndexer(矢量索引需要矢量特徵和矢量彙編器,它將特徵轉換爲矢量特徵只接受數字類型)。使用這種方法,分類特徵的每個級別都將根據其頻率(對於類別特徵的最頻繁標籤爲0)分配數值。

我的問題是隨機森林或決策樹算法如何理解新特徵(派生自分類特徵)與連續變量不同。將索引特徵視爲在算法中是連續的?這是正確的方法嗎?或者,我應該繼續使用單熱編碼進行分類功能。

我從這個論壇讀了一些答案,但是我沒有弄清楚最後一部分。

回答

4

一個熱碼應該分類變量進行與類別> 2.

要理解爲什麼,你應該知道分類數據的子類別之間的區別:Ordinal dataNominal data

序數據:這些值之間有某種排序。例如: 客戶反饋(優秀,好,中立,壞,非常糟糕)。正如你所看到的,它們之間有一個明確的順序(優秀>好>中立>差>非常糟糕)。在這種情況下,StringIndexer就足以用於建模目的。

標稱數據:這些值之間沒有定義的順序。例如:顏色(黑色,藍色,白色,...)。在這種情況下,StringIndexer單獨是不是足夠。 String Indexing後需要One Hot Encoding

String Indexing後讓我們假設輸出是:

id | colour | categoryIndex 
----|----------|--------------- 
0 | black | 0.0 
1 | white | 1.0 
2 | yellow | 2.0 
3 | red  | 3.0 

然後不One Hot Encoding,機器學習算法假定:red > yellow > white > black,我們知道這不是真的。 OneHotEncoder()將幫助我們避免這種情況。

因此,要回答你的問題

將索引功能被認爲是算法連續?

它將被視爲連續變量。

這是正確的做法嗎?或者我應該繼續用獨熱編碼 的類別特徵

取決於你data.Although隨機森林和一些增強方法的理解並不需要OneHot Encoding,最ML算法需要它。

參見:https://spark.apache.org/docs/latest/ml-features.html#onehotencoder

+0

感謝您的詳細回覆。我更關心名義數據。在火花毫升中,我無法提供字符串值,因爲它是隨機森林。我需要將其轉換爲數字值。當我將它轉換爲數字時,這些值的順序沒有意義,所以看起來像我將不得不爲隨機森林的名義分類特徵做一個熱點編碼。所以,你的回答「取決於你對數據的理解。儘管隨機森林和一些增強方法不需要單向編碼,但大多數ML算法都需要它」不適用於標稱數據。如果你不同意,請告訴我。 – user6200992

+0

是的,如果您知道特定列包含標稱數據,請執行一個熱門編碼。如果它是一個有序的數據,你可以做StringIndexing。 (儘管對有序數據進行一次熱編碼並不錯) – vdep

2

總之,星火的隨機森林不需要通過StringIndexer或VectorIndexer創建類別特徵OneHotEncoder。

更長的解釋。通常DecisionTrees可以處理序數和名義數據類型。然而,當涉及到實現時,可能需要OneHotEncoder(因爲它在Python的scikit-learn中)。
幸運的是,如果處理得當並且不需要OneHotEncoder,Spark的RandomForest實現將授予分類特徵! 適當的處理意味着分類特徵包含相應的元數據,以便RF知道它正在處理的內容。由StringIndexer或VectorIndexer創建的功能包含DataFrame中關於由Indexer生成且屬於分類的元數據。

相關問題