PySpark MLLIB 随机森林:预测总是 0
Posted
技术标签:
【中文标题】PySpark MLLIB 随机森林:预测总是 0【英文标题】:PySpark MLLIB Random Forest: prediction always 0 【发布时间】:2017-04-14 23:47:44 【问题描述】:使用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 文件,并填充可能的空值:
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
的形式,为什么?我猜这可能是错误的来源。【问题讨论】:
我已经在我的个人要点上回答了一个类似的问题。你可以看看gist.github.com/eliasah/8709e6391784be0feb7fe9dd31ae0c0a 谢谢@eliasah 我会看看分层抽样。你知道为什么有些特征结果以元组的形式出现,而另一些则以列表的形式出现吗? 这些只是密集和稀疏向量的表示。 预测呢?你会关心训练后的预测分组吗?我也相信我已经回答了你关于向量表示的一个问题。这不是错误的来源。还有一个问题,你的数据有重复吗? 【参考方案1】:您的功能[N1, N2, ...]
似乎是字符串。您想将您的所有功能都转换为FloatType()
或类似的东西。 fillna()
after 类型转换可能是谨慎的。
【讨论】:
以上是关于PySpark MLLIB 随机森林:预测总是 0的主要内容,如果未能解决你的问题,请参考以下文章
在 PySpark mllib 中使用随机森林的非法参数异常
如何使用 pySpark 决定将 numClasses 参数传递给 SPark MLlib 中的随机森林算法
PySpark - 无法显示随机森林模型的预测(无法执行用户定义的函数($anonfun$1: (vector) => vector))