【问题标题】:How to decide numClasses parameter to be passed to Random Forest algorithm in SPark MLlib with pySpark如何使用 pySpark 决定将 numClasses 参数传递给 SPark MLlib 中的随机森林算法
【发布时间】: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)

【问题讨论】:

    标签: machine-learning classification pyspark random-forest apache-spark-mllib


    【解决方案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 个不同的功能,并且数据与我上面显示的示例有点不同(由于限制无法发布实际数据,因此它是一种表示)。
    猜你喜欢
    • 2020-10-18
    • 2016-01-28
    • 2016-03-07
    • 2018-05-19
    • 2017-04-14
    • 2018-10-31
    • 2015-05-03
    • 2015-05-12
    • 2015-12-13
    相关资源
    最近更新 更多