我試圖根據日誌文件構建決策樹。一些功能集很大,包含數千個唯一值。我試圖在Java中使用管道和數據框架的新成語。我已經爲每個分類特徵列構建了一個包含多個StringIndexer流水線階段的流水線。然後我使用VectorAssembler創建一個特徵向量。在VectorAssembler階段之後,結果數據框對我來說非常完美。我的管道看起來幾乎相當於Spark MLLib 2.0管道中的分類特徵
StringIndexer-> StringIndexer-> StringIndexer-> VectorAssembler-> DecisionTreeClassifier
不過,我得到以下錯誤:
DecisionTree requires maxBins (= 32) to be at least as large as the number of values in each categorical feature, but categorical feature 5 has 49 values. Considering remove this and other categorical features with a large number of values, or add more training examples.
我可以用一個正規化解決此問題,但是由此產生的決策樹無法滿足我的需求,因爲我需要使用原始特徵值生成DSL決策樹。我不能手動設置maxBins,因爲整個管道一起執行。我希望得到的決策樹具有StringIndexer生成的值(例如Feature 5 < = 132)。此外,但不太重要,我希望能夠爲功能指定自己的名稱(例如,替代'功能5',說'域')
原來我需要兩兩件事:與設置爲一個值MaxCategories大於的絕對最大數量的計數一個VectorIndexer功能和DecisionTreeClassifier的maxBins設置爲大於最大分類要素數的值。由於我的所有功能都是分類的,因此我最初指定了MAX_INT,它產生了一個警告「DecisionTreeMetadata:DecisionTree正在減少maxBins ...」。將這兩個值都設置爲DataFrame中的採樣數就足夠了。 – Mike
只要您的功能都是絕對的,您可以使用VectorIndexer安全使用,但如果您的培訓具有延續功能,請注意。 VectorIndexer使連續和分類之間的選擇基於maxCategories參數。它可以將連續的特徵轉化爲分類。如果此答案或任何其他人解決了您的問題,請將其標記爲已接受。謝謝 – igorsf
感謝您的跟進。 VectorIndexer實際上是一個錯誤。流水線由一系列字符串索引器組成,然後是矢量彙編器,最後是帶有.setMaxBins調用的DecisionTreeClassifier。正如您已經正確指出的那樣,如果我們有一個持續的功能,我們會遇到麻煩。我想知道別人怎麼處理這個?很容易想到具有大量值的分類特徵和具有相對較少數量的特徵值的連續特徵。 – Mike