使用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
是用作标签索引器
的字段。其余字段包含数字数据。
步骤
1.加载parquet文件并填充可能的null值:
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。我尝试了多种特征组合以减少噪音,并尝试从不同的来源推断模式,但仍然没有运气和相同的结果。
问题
- 上述当前设置是否正确?
- 原始数据集中的
null
值填充是否会导致无法有效执行预测? 在上面显示的屏幕截图中,某些特征看起来是(它们是密集和稀疏向量的表示)元组
形式,而其他特征则是列表
形式,这是为什么?我猜这可能是一个可能的错误来源。