【数据竞赛】Kaggle知识点:树模型特征Embedding
在對數據進行編碼的過程中,經常會遇到一些非結構化的字段(如列表、文本),或者高維稀疏的字段。
在使用樹模型的過程中,上述字段對樹模型很不友好,會增加樹模型的訓練時間,一般情況需要通過人工特征提取,然后進行。
有沒有一種可以適合樹模型編碼的操作呢?在樹模型中可以通過葉子節點的次序作為進行編碼,在Kaggle中稱為Tree Categorical Embedding。
Tree Categorical Embedding
在訓練完樹模型之后,可以通過對模型進行預測,通過節點邏輯的判斷從根節點到葉子節點。
此時葉子節點中包含的樣本類別(或標簽均值)為最終的預測結果。這里想要具體的index,也就是樣本預測到第幾個葉子節點中。
在XGBoost中,擁有多棵樹。則一個樣本將會被編碼為多個index,最終可以將index作為額外的類別特征再加入到模型訓練。
具體API
XGBoost
使用Learning API,設置pred_leaf參數
import?xgboost?as?xgb from?sklearn.datasets?import?make_classificationX,?Y?=?make_classification(1000,?20) dtrain?=?xgb.DMatrix(X,?Y) dtest?=?xgb.DMatrix(X)param?=?{'max_depth':10,?'min_child_weight':1,?'learning_rate':0.1} num_round?=?200 bst?=?xgb.train(param,?dtrain,?num_round) bst.predict(dtest,?pred_leaf=True)LightGBM
使用sklearn API或者Learning API,設置pred_leaf參數
import?lightgbm?as?lgb from?sklearn.datasets?import?make_classificationX,?Y?=?make_classification(1000,?20) dtrain?=?lgb.Dataset(X,?Y) dtest?=?lgb.Dataset(X)param?=?{'max_depth':10,?'min_child_weight':1,?'learning_rate':0.1} num_round?=?200 bst?=?lgb.train(param,?dtrain,?num_round) bst.predict(X,?pred_leaf=True)CatBoost
使用calc_leaf_indexes函數
import?catboost?as?cab from?sklearn.datasets?import?make_classificationX,?Y?=?make_classification(1000,?20) clf?=?cab.CatBoostClassifier(iterations=200) clf.fit(X,?Y) clf.calc_leaf_indexes(X)使用細節
leaf index預測維度與具體樹個數相關,也就是與具體的round相關。
leaf index的預測結果為類別類型。
leaf index建議交叉驗證編碼,避免自己訓練并編碼自己。
交叉驗證實現:https://www.kaggle.com/mmueller/categorical-embedding-with-xgb/script
學習數據競賽,組隊參賽,交流分享
添加👇微信
總結
以上是生活随笔為你收集整理的【数据竞赛】Kaggle知识点:树模型特征Embedding的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java int比较用==,整数-在Ja
- 下一篇: Maven:repositories、d