PySpark MLLIB随机森林:预测始终为0

时间:2016-11-30 15:22:02

标签: python apache-spark classification random-forest apache-spark-mllib

使用mlSpark 2.0(Python)和120万行数据集,我正在尝试使用Random Forest Classifier创建一个预测购买趋势的模型。但是,将转换应用于拆分的test数据集时,预测始终为0.

数据集如下所示:

[Row(tier_buyer=u'0', N1=u'1', N2=u'0.72', N3=u'35.0', N4=u'65.81', N5=u'30.67', N6=u'0.0'....

tier_buyer是用作label indexer的字段。其余字段包含数字数据。

步骤

1.-加载镶木地板文件,并填写可能的空值:

parquet = spark.read.parquet('path_to_parquet')
parquet.createOrReplaceTempView("parquet")
dfraw = spark.sql("SELECT * FROM parquet").dropDuplicates()
df = dfraw.na.fill(0)

2.-创建特征向量:

features = VectorAssembler(
                inputCols = ['N1','N2'...],
                outputCol = 'features')

3.-创建字符串索引器:

label_indexer = StringIndexer(inputCol = 'tier_buyer', outputCol = 'label')

4.-拆分列车和测试数据集:

(train, test) = df.randomSplit([0.7, 0.3])

生成的火车数据集

enter image description here

生成的测试数据集

enter image description here

5.-定义分类器:

classifier = RandomForestClassifier(labelCol = 'label', featuresCol = 'features')

6.-管道阶段并适合列车模型:

pipeline = Pipeline(stages=[features, label_indexer, classifier])
model = pipeline.fit(train)

7.-转换测试数据集:

predictions = model.transform(test)

8.-输出测试结果,按预测分组:

predictions.select("prediction", "label", "features").groupBy("prediction").count().show()

enter image description here

正如你所看到的,结果总是为0.我尝试过多种功能变化,希望减少噪音,同时尝试从不同的来源推断架构,没有运气和相同的结果。

问题

  • 如上所述,当前设置是否正确?
  • 原始null上的Dataframe值是否会成为无法有效执行预测的来源?
  • 在上面显示的屏幕截图中,某些功能看起来像tuplelist的其他功能,为什么?我猜这可能是错误的可能来源。(它们是密集和稀疏向量的表示)

1 个答案:

答案 0 :(得分:0)

您的功能[N1, N2, ...]似乎是字符串。你想要将所有功能都转换为FloatType()或类似的东西。在类型转换后fillna() 可能是谨慎的。