GBM处理因子变量,担心太多因素

时间:2016-12-17 07:04:49

标签: machine-learning gbm

我正在制作一个篮球模型,根据他们在本赛季所有比赛中的表现,预测NBA球员在下一场比赛中的表现。每支NBA球队大约有10名球员,本赛季30支球队中每支球队都打了25场比赛,所以我的数据框架目前大约有10 * 30 * 25 = 7,500个观测值。我每天运行我的模型,预测玩家在第二天的表现如何 - 因此,明天我将做出大约10 * 30 = 300次的预测。

我的问题是这个 - 目前我有大约50个列/特征/ x变量我用于预测,所有这些都是数字变量(平均得分点数,平均篮板数等)。但是,我认为这可能有助于我的模型知道每行对应哪个玩家。也就是说,我想传递第51列,一个包含球员名字的因子变量。我在网上看到GBM可以处理因子变量,因为它会在内部“模仿”它们,但我担心“假装”300名不同的玩家将无法表现良好。将所有玩家名称传递一个因子变量会适得其反并最终伤害我的模型,因为它会在内部创建大量的虚拟变量,或者这样可以吗?

my_df                        
                        PLAYER FG FGA X3P X3PA FT FTA
1042            Andre Drummond  6  16   0    0  6  10
17747            Marcus Morris  6  19   1    4  5   6
14861 Kentavious Caldwell-Pope  7  14   4    7  3   3
7976            Ersan Ilyasova  6  12   3    6  1   2
22401           Reggie Jackson  4  10   2    4  5   5
24475          Stanley Johnson  3  10   1    3  0   0
24649              Steve Blake  1   6   1    5  0   0
12489              Jodie Meeks  1   4   0    0  0   0
1955               Aron Baynes  3   5   0    0  0   0
21500             Paul Millsap  7  15   2    6  3   4

2 个答案:

答案 0 :(得分:0)

我在gbm中使用了具有大量级别的因子变量,并且您将面临的最大问题是您的计算时间将显着增加。(对于您的情况,这可能不是您正在使用的数据集的问题很小)另外,当你绘制变量重要性时

gbm_model <- train(A0 ~ ., 
                 data = training, 
                 method="gbm",
                 distribution = "bernoulli",
                 metric="ROC",
                 maximise=TRUE,
                 tuneGrid=grid,
                 train.fraction = 0.6,
                 trControl=ctrl) 
ggplot(varImp(gbm_model, scale=TRUE))

每个因子级别单独显示,这可能会使评估重要性变得非常混乱。

除此之外,你提到你有7,500个观察,50个特征和300个不同的玩家。如果你考虑添加玩家名称作为一个变量,这意味着每个玩家约25个障碍,这是一个非常小的样本,可能意味着你的模型不会很好地概括。因此,我个人的建议是不要这样做。

然而,我明白你为什么要这样做,并建议你尝试聚集玩家(使用玩家特定的标准,甚至可能是你已经拥有的一些功能),然后使用玩家所属的集群作为变量。

希望这有帮助! :)

答案 1 :(得分:0)

我对gbm函数有同样的问题,例如我添加了一个100级的randomn因子,它似乎是最有影响力的变量。