我有一個由因子變量,數值變量和目標列組成的大型數據集我試圖正確地將其饋入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上查看。
請幫忙。提前致謝。
如果只有3個預測變量,爲什麼要製作一個稀疏矩陣?其次,'xgboost'只接受數字特徵。 – mtoto
1.我的真實數據集有185個預測變量和70000個觀測數據。 2. xgboost接受分類變量(我認爲)當改變爲數字形式(0,1)時,就像Ive做的那樣。 – Windstorm1981
你可以使用'options(na.action ='na.pass'); sm <-sparse.model.matrix(target〜。,df)',然後將它提供給'xgboost'。稀疏矩陣只會爲虛擬變量包含非缺失值。對於連續變量,會學習缺失(默認)方向。 – mtoto