2013-11-23 138 views
0

我想用Sklearn的GradientBoostingRegressor類預測值的迴歸問題的目標變量推進。我擁有的功能是混合類型 - 一些是連續數字,一些是布爾型,兩種是分類型的,一種是連續數字的向量。我選擇漸變增強樹,因爲數據是混合數據類型。一個特徵向量的例子如下:梯度Sklearn

['Category1',41.93655,-87.642079,0,0,< 1x822'''稀疏矩陣類型'',其中4個存儲元素以壓縮稀疏行格式>,'mobile_app', 「NA」]

然而,當我嘗試訓練相契合的GradientBoostingRegressor(),我得到一個錯誤說:

ValueError異常:無法將字符串轉換爲float:組別

此功能的值用枚舉實現。我只是有一個方法:

def enum(self, **enums): 
    return type('Enum',(), enums) 

後來,當我創建我的類別,我不喜歡這樣寫道:

categories = self.enum(Category1='Category1', Category2='Category2', ...) 

我猜問題是,它仍然是返回的實際值作爲一個字符串。但是,如果我將值更改爲0,1,2等,這會使某些類別與其他類別「距離更近」,因爲它們應該與其他所有類別等距。

那麼這個對象實際上是混合類型的句柄數據還是這一切都必須做數值?如果必須是全部數字,那麼使用此對象處理分類數據的任何人都可以瞭解表示類別的最佳方式?任何幫助表示讚賞

回答

1

每一個功能必須是數字。由於梯度提升基於決策樹,並且決策樹基於特徵分割而不是距離工作,所以「0,1,2等」只要您正確設置了max_depth參數(網格搜索確定),表示法實際上應該可以正常工作。

0

正如Fred Foo所寫 - 每個特徵都必須是數字的,因爲當搜索最佳分割時,GradientBoosting算法正在爲每個屬性進行排序。

您可以將分類屬性轉換爲二進制表示或數字。這裏有準備好的sklearn實現:sklearn.preprocessing.LabelEncoder和sklearn.preprocessing.LabelBinarizer