PySpark MLLIB随机林:预测始终为0 [英] PySpark MLLIB Random Forest: prediction always 0

查看:0
本文介绍了PySpark MLLIB随机林:预测始终为0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用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])

生成的训练数据集

结果测试数据集

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()

如您所见,结果始终为0。我已经尝试了多种功能变体,希望减少噪音,也尝试了不同的来源并推断了模式,但没有成功,也没有得到相同的结果。

问题

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

推荐答案

您的功能[N1, N2, ...]似乎是字符串。你想把你所有的特征都写成FloatType()或类似的东西。在类型转换之后使用fillna()可能是明智的。

这篇关于PySpark MLLIB随机林:预测始终为0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆