Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning XGBoost:最大限度地减少连续线性特征对分类特征的影响_Machine Learning_Random Forest_Data Science_Xgboost_Feature Selection - Fatal编程技术网

Machine learning XGBoost:最大限度地减少连续线性特征对分类特征的影响

Machine learning XGBoost:最大限度地减少连续线性特征对分类特征的影响,machine-learning,random-forest,data-science,xgboost,feature-selection,Machine Learning,Random Forest,Data Science,Xgboost,Feature Selection,假设我有100个独立的特征——90个是二进制的(例如0/1),10个是连续变量(例如年龄、身高、体重等)。我使用100个特征来预测具有足够样本量的分类器问题 当我设置XGBClassifier函数并进行拟合时,从gain的角度来看,10个最重要的特性始终是10个连续变量。目前我对封面或频率不感兴趣。10个连续变量在gain列表中占据了大约.8到.9的空间(sum(gain)=1) 我试着调整gamma,reg\u alpha,reg\u lambda,max\u depth,colsample。

假设我有100个独立的特征——90个是二进制的(例如0/1),10个是连续变量(例如年龄、身高、体重等)。我使用100个特征来预测具有足够样本量的分类器问题

当我设置XGBClassifier函数并进行拟合时,从
gain
的角度来看,10个最重要的特性始终是10个连续变量。目前我对
封面
频率
不感兴趣。10个连续变量在
gain
列表中占据了大约.8到.9的空间(sum(gain)=1)

我试着调整
gamma
reg\u alpha
reg\u lambda
max\u depth
colsample
。按增益排列的前10个功能始终是连续的10个功能

有什么建议吗


小更新——有人问我为什么会这样。我相信这是因为一个连续变量可以在每个决策树上多次拆分。二进制变量只能拆分一次。因此,树中连续变量的流行率越高,因此获得的
得分越高
我可以建议您尝试几件事

  • 在没有这些数据的情况下测试您的模型(仅90个特征),并评估您的分数下降情况。如果不重要,您可能需要删除这些功能
  • 把他们分成小组。 例如,年龄可以分为组,
    0:0-7、1:8-16、2:17-25
    等等

  • 把它们转换成二进制。关于如何选择最佳值将其拆分为二进制的现成想法是:构建一棵树,其中包含一个节点(最大深度=1),并且只使用一个特性。(连续特征中的1个)。然后,将模型转储到一个.txt文件中,查看它选择拆分的值。使用此值,可以将所有要素列转换为二进制


  • 我现在正在处理非常类似的问题,因此我很高兴听到您的结果和您选择的尝试路径。

    是的,众所周知,树(/forest)算法(xgboost/rpart/等)在变量选择中通常会“更喜欢”连续变量而不是二进制分类变量,因为它可以在任何想要最大化信息增益的地方选择连续分割点(并且可以在其他节点或其他树中为同一变量自由选择不同的分割点)。如果这是最优树(对于那些特定的变量),那么它就是最优树。请参阅姐妹站点交叉验证

    当你说“任何建议”时,取决于你到底想要什么,它可能是以下之一:

    • a) 找出其他90个二进制分类特征中哪一个提供了最多的信息增益
    • b) 训练一棵次优树,只为了找出那些特征是什么
    • c) 通过将二进制特征组合成具有更多信息增益的n位分类特征来设计一些“复合”特征(同时确保从输入中删除单个二进制特征)
    • d) 您可以查看关联规则:
    如果您想探索a)…c),请含糊地提出如下建议:

    • 排除10个连续变量的不同子集,然后查看哪些二进制特征显示为具有最大增益。假设这为您提供了N个候选特性。N将等于T
    • 如果在此步骤中没有合并,则将T减少一些值(如T-=0.05)或比率(如T*=0.9)。如果仍然没有合并,则继续减少T,直到有合并,或直到达到某个终止值(如T=0.03)
    • 重新训练树,包括复合变量,不包括其组成子变量
    • 现在回到过去,重新训练应该是一个包含所有10个连续变量的改进树,以及你的复合分类特征
    • 或者您可以提前终止复合特征选择,以查看完整的重新训练树的外观
    这一问题出现在2014年,当时保单覆盖率选项A、B、C、D、E、F、G都是2-4个值之间的类别,并且彼此高度相关。(当前的C选项“C_previous”是输入功能之一)。有关更多信息,请参阅和发布的解决方案。请注意保单=(A、B、C、D、E、F、G)是输出。但C_previous是输入变量

    关于Kaggle的特征选择,一些一般的快速和肮脏的经验法则是:

    • 扔掉任何接近常量/极低方差的变量(因为它们的信息内容接近于零)
    • 扔掉任何非常高的基数分类变量(基数>~训练集大小/2),(因为它们往往信息含量较低,但会导致大量虚假的过度拟合和训练时间过长)。这可能包括客户ID、行ID、事务ID、序列ID和其他变量,这些变量本来不应该进行培训,但意外地在培训集中结束

    我从@smci的回答中学到了很多,所以我建议按照他的建议去做

    在这种情况下,如果二进制分类特征实际上是多个分类特征的表示,每个分类特征中包含多个类,那么您可以遵循另外两种方法:

    • 将OHE转换为标签编码。是的,这有一个警告,即在分类特征中引入顺序,这可能是没有意义的,例如绿色=3>红色=2>蓝色=1。但在实践中,树似乎可以很好地处理标签=编码的分类变量(即使顺序没有意义)
    • 将OHE转换为目标/平均/似然编码。这很棘手,因为您需要应用正则化以避免数据泄漏
    这两种想法都是基于对特征含义的先验知识,将几个二进制特征组合成一个单一的特征