我在Python中查看了相同内容的帖子,但我想在R中找到解决方案。 我正在使用Kaggle的Titanic数据集,它看起来像这样:
'data.frame': 891 obs. of 13 variables:
$ PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
$ Survived : num 0 1 1 1 0 0 0 0 1 1 ...
$ Pclass : Factor w/ 3 levels "1","2","3": 3 1 3 1 3 3 1 3 3 2 ...
$ Age : num 22 38 26 35 35 ...
$ SibSp : int 1 1 0 1 0 0 0 3 0 1 ...
$ Parch : int 0 0 0 0 0 0 0 1 2 0 ...
$ Fare : num 7.25 71.28 7.92 53.1 8.05 ...
$ Child : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 2 1 1 ...
$ Embarked.C : num 0 1 0 0 0 0 0 0 0 1 ...
$ Embarked.Q : num 0 0 0 0 0 1 0 0 0 0 ...
$ Embarked.S : num 1 0 1 1 1 0 1 1 1 0 ...
$ Sex.female : num 0 1 1 1 0 0 0 0 1 1 ...
$ Sex.male : num 1 0 0 0 1 1 1 1 0 0 ...
这是在我使用虚拟变量之后。我的测试集:
'data.frame': 418 obs. of 12 variables:
$ PassengerId: int 892 893 894 895 896 897 898 899 900 901 ...
$ Pclass : Factor w/ 3 levels "1","2","3": 3 3 2 3 3 3 3 2 3 3 ...
$ Age : num 34.5 47 62 27 22 14 30 26 18 21 ...
$ SibSp : int 0 1 0 0 1 0 0 1 0 2 ...
$ Parch : int 0 0 0 0 1 0 0 1 0 0 ...
$ Fare : num 7.83 7 9.69 8.66 12.29 ...
$ Child : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
$ Embarked.C : num 0 0 0 0 0 0 0 0 1 0 ...
$ Embarked.Q : num 1 0 1 0 0 0 1 0 0 0 ...
$ Embarked.S : num 0 1 0 1 1 1 0 1 0 1 ...
$ Sex.female : num 0 1 0 0 1 0 1 0 1 0 ...
$ Sex.male : num 1 0 1 1 0 1 0 1 0 1 ...
我使用以下代码运行xgboost:
> param <- list("objective" = "multi:softprob",
+ "max.depth" = 25)
> xgb = xgboost(param, data = trmat, label = y, nround = 7)
[0] train-rmse:0.350336
[1] train-rmse:0.245470
[2] train-rmse:0.171994
[3] train-rmse:0.120511
[4] train-rmse:0.084439
[5] train-rmse:0.059164
[6] train-rmse:0.041455
trmat是:
trmat = data.matrix(train)
和temat是:
temat = data.matrix(test)
和y是幸存的变量:
y = train$Survived
但是我运行预测功能:
> x = predict(xgb, newdata = temat)
> x[1:10]
[1] 0.9584613 0.9584613 0.9584613 0.9584613 0.9584613 0.9584613 0.9584613
[8] 0.9584613 0.9584613 0.9584613
预测所有概率都是相同的。在python问题中,有人说增加max.depth会起作用,但它没有。我做错了什么?
答案 0 :(得分:1)
您必须删除测试集中的Survived
变量才能使用xgboost,因为这是您要预测的变量。
trmat = data.matrix(train[, colnames(train) != "Survived"])
它应该可以解决你的问题。
答案 1 :(得分:0)
我可能迟到了,我第一次使用xgboost时遇到了同样的问题。从火车组中删除“幸存”列应该可以解决您的问题。如果我们在xgboost中使用了用于标签的列集,那么算法最终会预测所有概率都是相同的。