如何使用 pySpark 决定将 numClasses 参数传递给 SPark MLlib 中的随机森林算法
Posted
技术标签:
【中文标题】如何使用 pySpark 决定将 numClasses 参数传递给 SPark MLlib 中的随机森林算法【英文标题】:How to decide numClasses parameter to be passed to Random Forest algorithm in SPark MLlib with pySpark 【发布时间】:2016-03-06 00:05:02 【问题描述】:我正在研究Classification
,在Spark
中使用Random Forest
算法有一个示例dataset
,如下所示:
Level1,Male,New York,New York,352.888890
Level1,Male,San Fransisco,California,495.8001345
Level2,Male,New York,New York,-495.8001345
Level1,Male,Columbus,Ohio,165.22352099
Level3,Male,New York,New York,495.8
Level4,Male,Columbus,Ohio,652.8
Level5,Female,Stamford,Connecticut,495.8
Level1,Female,San Fransisco,California,495.8001345
Level3,Male,Stamford,Connecticut,-552.8234
Level6,Female,Columbus,Ohio,7000
这里每行中的最后一个值将用作label
,其余的用作features
。但我想将label
视为一个类别而不是一个数字。所以165.22352099
将表示一个类别,-552.8234
也是如此。为此,我将features
和label
编码为分类数据。现在我遇到的困难是在Spark
MlLib
中决定Random Forest
算法中的numClasses
参数应该传递什么?我的意思是它应该等于我的label
中唯一值的数量吗?我的标签有 10000
这样的唯一值,所以如果我将 10000
设置为 numClasses
的值,那么它不会显着降低性能吗?
这是在 MlLib 中为随机森林构建模型的典型签名:
model = RandomForest.trainClassifier(trainingData, numClasses=2, categoricalFeaturesInfo=,
numTrees=3, featureSubsetStrategy="auto",
impurity='gini', maxDepth=4, maxBins=32)
【问题讨论】:
【参考方案1】:混淆来自于你正在做一些你不应该做的事情。您的问题显然是回归/排名,而不是分类。为什么你会认为它是一个分类?试着回答这两个问题:
每个值(100,000 * 100 = 1,000,000)是否至少有 100 个样本? 类中是否完全没有结构,例如 - 值“200”的对象不与值“100”或“300”的对象比值“的对象”更相似吗? -1000”还是“+2300”?如果至少有一个答案是否,那么您不应将此视为分类问题。
如果出于某种奇怪的原因您回答了两次 yes,那么答案是:“是的,您应该将每个不同的值编码为不同的类”,从而产生 10000 个独特的类,这会导致:
分类极度不平衡(RF,没有平衡元学习器在这种情况下几乎总是会失败) 极端数量的类(没有模型能够解决它,RF 肯定不会解决它)这个问题的维度非常小——如果你能从那个二元分类中预测出来,你的特征数量就会很小,我会感到惊讶。如您所见,这些值有多不规则,您有 3 个点仅在第一个值上发散,您会得到完全不同的结果:
Level1,Male,New York,New York,352.888890
Level2,Male,New York,New York,-495.8001345
Level3,Male,New York,New York,495.8
总而言之,几乎 100% 确定这不是分类问题,您应该:
最后一个值的回归(关键字:regression) 建立排名(关键字:学习排名) 将您的值存储到最多 10 个不同的值,然后 - 分类(关键字:不平衡分类、稀疏二进制表示)【讨论】:
我试图将此问题视为仅使用 RF 的回归,并将标签视为数值而不是对其进行编码(我仅对特征进行编码)但性能非常差(RMSE 约为 70-80) .我的猜测是负值会导致性能下降。所以我想尝试分类方法。对于每个值,我的完整数据中可能有 300 多个样本。如果我也在回归中对标签进行编码,会影响性能吗? 这是错误的做法。分类永远不会比回归本身更擅长回归。这不是解决问题的方式。此外,负值在回归中并不重要,它们与正值一样好。我最好的猜测是——你必须收集更多的特征,你当前的问题,归结为在高维空间中将每个向量表示为 4 个向量似乎不足以提供足够的信息来预测连续值。尤其是那个 City 意味着一个状态,所以它提供的知识比其他的更少。 实际上在我的实际代码中,我使用了一组 12 个不同的功能,并且数据与我上面显示的示例有点不同(由于限制无法发布实际数据,因此它是一种表示)。以上是关于如何使用 pySpark 决定将 numClasses 参数传递给 SPark MLlib 中的随机森林算法的主要内容,如果未能解决你的问题,请参考以下文章