PySpark MLLIB随机林:预测始终为0 [英] PySpark MLLIB Random Forest: prediction always 0
本文介绍了PySpark MLLIB随机林:预测始终为0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
使用ml
、Spark 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屋!
查看全文