如何使用pySpark

时间:2015-12-01 22:02:13

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

我正在Classification使用Random Forest Spark算法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也将如此。为此,我将labelnumClasses编码为分类数据。现在我遇到的困难是决定我应该在Random Forest Spark的{​​{1}}算法中为MlLib参数传递什么?我的意思是它应该等于我label中唯一值的数量吗?我的标签有10000个唯一值,因此,如果我将10000作为numClasses的值,那么它是否会显着降低性能?

以下是在MlLib中为随机森林建立模型的典型签名:

model = RandomForest.trainClassifier(trainingData, numClasses=2, categoricalFeaturesInfo={},
                                     numTrees=3, featureSubsetStrategy="auto",
                                     impurity='gini', maxDepth=4, maxBins=32)

1 个答案:

答案 0 :(得分:1)

这种困惑来自于你正在做一些你不应该做的事情。你的问题显然是回归/排名,而不是分类。为什么你会把它看作一个分类?试着回答这两个问题:

  • 每个(100,000 * 100 = 1,000,000)至少有100个样本吗?
  • 类中是否完全没有结构,例如 - 值为“200”的对象更类似于值为“100”或“300”的对象,而不是具有值的对象-1000“或”+2300“?

如果至少有一个答案是,那么不应将此视为分类问题

如果由于一些奇怪的原因你回答了两次,那么答案是:“是的,你应该将每个不同的值编码为不同的类”,从而导致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%的确定性这不是分类问题,你应该:

  • 对最后一个值(关键字:reggresion)
  • 进行回归
  • 建立排名(关键字:学会排名)
  • 将您的值分配到最多10个不同的值然后 - 分类(关键字:不平衡分类,稀疏二进制表示)