2017-03-01 742 views
0

我試圖使用XGBoost作爲gbm的替代品。在R中使用XGBoost進行迴歸模型

我得到的分數很奇怪,所以我在想也許我在代碼中做錯了什麼。

我的數據包含幾個因子變量,所有其他數字。

響應變量是指示房價的連續變量。

我明白,爲了使用XGBoost,我需要使用一個熱門恩爲那些。我用下面的代碼這樣做:

Xtest <- test.data 
Xtrain <- train.data 
XSalePrice <- Xtrain$SalePrice 
Xtrain$SalePrice <- NULL 

# Combine data 
Xall <- data.frame(rbind(Xtrain, Xtest)) 

# Get categorical features names 
ohe_vars <- names(Xall)[which(sapply(Xall, is.factor))] 

# Convert them 
dummies <- dummyVars(~., data = Xall) 
Xall_ohe <- as.data.frame(predict(dummies, newdata = Xall)) 

# Replace factor variables in data with OHE 
Xall <- cbind(Xall[, -c(which(colnames(Xall) %in% ohe_vars))], Xall_ohe) 

在那之後,我分割數據回測試&車組:

Xtrain <- Xall[1:nrow(train.data), ] 
Xtest <- Xall[-(1:nrow(train.data)), ] 

再建立模型,並打印均方根誤差& Rsquared:

# Model 
xgb.fit <- xgboost(data = data.matrix(Xtrain), label = XSalePrice, 
    booster = "gbtree", objective = "reg:linear", 
    colsample_bytree = 0.2, gamma = 0.0, 
    learning_rate = 0.05, max_depth = 6, 
    min_child_weight = 1.5, n_estimators = 7300, 
    reg_alpha = 0.9, reg_lambda = 0.5, 
    subsample = 0.2, seed = 42, 
    silent = 1, nrounds = 25) 

xgb.pred <- predict(xgb.fit, data.matrix(Xtrain)) 
postResample(xgb.pred, XSalePrice) 

問題是我得到非常關RMSE & Rsxquare:

 RMSE  Rsquared 
1.877639e+05 5.308910e-01 

這是從結果中使用GBM當我走得很遠。

我想我做錯了,我最好的可能與一個熱編碼相,我不熟悉猜,所以使用調整我的數據,谷歌搜索代碼。

有人可以指出我做錯了什麼,以及如何「修復」它?

UPDATE:

審查@Codutie的答案後,我的代碼中有一些錯誤:

Xtrain <- sparse.model.matrix(SalePrice ~. , data = train.data) 
XDtrain <- xgb.DMatrix(data = Xtrain, label = "SalePrice") 

xgb.DMatrix生產:

Error in setinfo.xgb.DMatrix(dmat, names(p), p[[1]]) : 
    The length of labels must equal to the number of rows in the input data 

train.data是數據幀,它具有1453行。標籤SalePrice還包含1453個值(無遺漏值)

感謝

回答

0
train <- dat[train_ind,] 
train.y <- train[,ncol(train_ind)] 
xgboost(data =data.matrix(train[,-1]), 
    label = train.y, 
    objective = "reg:linear", 
    eval_metric = "rmse", 
    max.depth =15, 
    eta = 0.1, 
    nround = 15, 
    subsample = 0.5, 
    colsample_bytree = 0.5, 
    num_class = 12, 
    nthread = 3 
) 

兩條線索來控制XGB的迴歸,

1)埃塔:如果ETA小,模型往往過度擬合

2)eval_metric:不確定xgb是否允許用戶使用他們自己的eval_metric。但是,如果定量因變量包含異常值,則此度量標準無用。檢查XGB是否支持Hubber丟失功能。