使用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.我尝试过多种功能变化,希望减少噪音,同时尝试从不同的来源推断架构,没有运气和相同的结果。
null
上的Dataframe
值是否会成为无法有效执行预测的来源?tuple
和list
的其他功能,为什么?我猜这可能是错误的可能来源。答案 0 :(得分:0)
您的功能[N1, N2, ...]
似乎是字符串。你想要将所有功能都转换为FloatType()
或类似的东西。在类型转换后fillna()
可能是谨慎的。