如何使用 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 也是如此。为此,我将featureslabel 编码为分类数据。现在我遇到的困难是在SparkMlLib 中决定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 中的随机森林算法的主要内容,如果未能解决你的问题,请参考以下文章

IOS 获取父类的所有子类

从集群将整数/字符串写入 pyspark 中的文本文件

如何使用 PySpark 将 JSON 列类型写入 Postgres?

如何将向量拆分为列 - 使用 PySpark

如何使用 pyspark 将 null 分配给配置单元表列

PySpark:如何将 GitHub 库导入 Databricks?