2016-09-28 29 views
3

我有一個由因子變量,數值變量和目標列組成的大型數據集我試圖正確地將其饋入xgboost,目標是製作xgb.Matrix和培訓一個模型。使用NAs爲稀疏矩陣和XGBOOST準備數據

我很困惑正確的處理讓我的數據框到一個xgb.DMatrix對象。特別是,我在因子和數字變量中都有NAs,並且我想在創建xgb.Matrix之前從我的數據框中創建一個sparse.model.matrix。對新手的適當處理確實讓我感到困惑。

我有以下示例數據框df包含一個二進制分類變量,兩個連續變量和一個目標。分類變量和一個連續變量來港

'data.frame': 10 obs. of 4 variables: 
$ v1 : Factor w/ 2 levels "0","1": 1 2 2 1 NA 2 1 1 NA 2 
$ v2 : num 3.2 5.4 8.3 NA 7.1 8.2 9.4 NA 9.9 4.2 
$ v3 : num 22.1 44.1 57 64.2 33.1 56.9 71.2 33.9 89.3 97.2 
$ target: Factor w/ 2 levels "0","1": 1 1 2 2 1 1 1 2 1 1 

    v1 v2 v3 target 
1  0 3.2 22.1  0 
2  1 5.4 44.1  0 
3  1 8.3 57.0  1 
4  0 NA 64.2  1 
5 <NA> 7.1 33.1  0 
6  1 8.2 56.9  0 
7  0 9.4 71.2  0 
8  0 NA 33.9  1 
9 <NA> 9.9 89.3  0 
10 1 4.2 97.2  0 

matrix庫將不接受來港sparse.model.matrix。它消除了行(我不想要)。所以,我需要到NAS變成一個數字替代像-999

如果我用簡單的命令:

df[is.na(df)] = -999 

,只替換來港的數字列:

 v1  v2 v3 target 
1  0 3.2 22.1  0 
2  1 5.4 44.1  0 
3  1 8.3 57.0  1 
4  0 -999.0 64.2  1 
5 <NA> 7.1 33.1  0 
6  1 8.2 56.9  0 
7  0 9.4 71.2  0 
8  0 -999.0 33.9  1 
9 <NA> 9.9 89.3  0 
10 1 4.2 97.2  0 

所以我首先(想我)需要將因子變量更改爲數字,然後執行 替換。這樣做,我得到:

 v1  v2 v3 target 
1  1 3.2 22.1  0 
2  2 5.4 44.1  0 
3  2 8.3 57.0  1 
4  1 -999.0 64.2  1 
5 -999 7.1 33.1  0 
6  2 8.2 56.9  0 
7  1 9.4 71.2  0 
8  1 -999.0 33.9  1 
9 -999 9.9 89.3  0 
10 2 4.2 97.2  0 

但因子變量轉換回一個因數(我認爲這是必要的 所以xgboost稍後會知道它的一個因素),我得到三個層次:

data.frame': 10 obs. of 4 variables: 
$ v1 : Factor w/ 3 levels "-999","1","2": 2 3 3 2 1 3 2 2 1 3 
$ v2 : num 3.2 5.4 8.3 -999 7.1 8.2 9.4 -999 9.9 4.2 
$ v3 : num 22.1 44.1 57 64.2 33.1 56.9 71.2 33.9 89.3 97.2 
$ target: Factor w/ 2 levels "0","1": 1 1 2 2 1 1 1 2 1 1 

我現在最終還不能確定如何使sparse.model.matrix和xgb.matrix對象最終變得有意義,因爲v1顯得很混亂。

爲了使事情更加令人困惑,xgb.Dmatrix()有一個參數missing ,我可以用它來識別表示NA的數值(-999)。但是這個 只能用於密集矩陣。如果我提交了密集矩陣,我只需要擁有NAs並且不需要它。但是,在我有-999s的稀疏矩陣 中,我無法使用它。

我希望我不會輕易看到一些東西。廣泛地通過xgboost.pdf並在Google上查看。

請幫忙。提前致謝。

+0

如果只有3個預測變量,爲什麼要製作一個稀疏矩陣?其次,'xgboost'只接受數字特徵。 – mtoto

+1

1.我的真實數據集有185個預測變量和70000個觀測數據。 2. xgboost接受分類變量(我認爲)當改變爲數字形式(0,1)時,就像Ive做的那樣。 – Windstorm1981

+2

你可以使用'options(na.action ='na.pass'); sm <-sparse.model.matrix(target〜。,df)',然後將它提供給'xgboost'。稀疏矩陣只會爲虛擬變量包含非缺失值。對於連續變量,會學習缺失(默認)方向。 – mtoto

回答

0

options(na.action='na.pass')正如@mtoto所提到的那樣,是處理此問題的最佳方法。它將確保在構建模型矩陣時不會丟失任何數據。

具體的XGBoost實現;在NAs的情況下,在增長樹時進行分割時檢查更高的增益。因此,舉例來說,如果不考慮NA的分割被確定爲變量var1(範圍[0,1])值0.5,則其考慮var1 NA將計算增益爲< 0.5並且> 0.5。無論分裂方向如何,它都可以獲得更多的收益,因此它有助於NAs獲得分裂的方向因此,現在NA具有範圍[0,0.5][0.5,1],但是沒有分配給它的實際值(即,估算的)。請參閱(2014年8月12日原作者tqchen的comment)。

如果你在輸入-99xxx,那麼你就限制了算法學習NA的適當範圍(以標籤爲條件)的能力。