Pat*_*Pat 4 java machine-learning apache-spark naivebayes
关于使用 SparkML 和朴素贝叶斯进行预测的小问题。
我有一个非常简单的数据集,它只是时间戳,代表一天,以及当天售出了多少煎饼:
dataSetPancakes.show();
+----------+-----+
| time|label|
+----------+-----+
|1622505600| 1|
|1622592000| 0|
|1622678400| 3|
|1622764800| 1|
|1622851200| 1|
|1622937600| 1|
|1623024000| 1|
|1623110400| 2|
|1623196800| 2|
|1623283200| 0|
+----------+-----+
only showing top 10 rows"
Run Code Online (Sandbox Code Playgroud)
很简单,我只是想预测明天、后天等煎饼会卖多少……
因此,我尝试了朴素贝叶斯模型,按照此处的教程https://spark.apache.org/docs/latest/ml-classification-regression.html#naive-bayes,我写道:
VectorAssembler vectorAssembler = new VectorAssembler().setInputCols(new String[]{"time"}).setOutputCol("features");
Dataset<Row> vectorData = vectorAssembler.transform(dataSetPancakes);
NaiveBayes naiveBayes = new NaiveBayes();
NaiveBayesModel model = naiveBayes.fit(vectorData);
Dataset<Row> predictions = model.transform(vectorData);
predictions.show();
model.predict(new DenseVector(new double[]{getTomorrowTimestamp()})));
Run Code Online (Sandbox Code Playgroud)
我什至看到了如下结果:
-RECORD 0--------------------------------------------------------------------------------------------------------------
time | 1622505600
label | 1
features | [1.6225056E9]
rawPrediction | [-0.9400072584914714,-1.0831081021321447,-1.702147310538368,-2.5494451709255714,-4.564348191467836]
probability | [0.39062499999999994,0.33854166666666663,0.18229166666666666,0.07812500000000001,0.01041666666666667]
prediction | 0.0
-RECORD 1--------------------------------------------------------------------------------------------------------------
time | 1622592000
label | 0
features | [1.622592E9]
rawPrediction | [-0.9400072584914714,-1.0831081021321447,-1.702147310538368,-2.5494451709255714,-4.564348191467836]
probability | [0.39062499999999994,0.33854166666666663,0.18229166666666666,0.07812500000000001,0.01041666666666667]
prediction | 0.0
Run Code Online (Sandbox Code Playgroud)
但不幸的是,就预测本身而言,明天总是显示 0.0 。
请问这个问题的根本原因是什么?
谢谢
小智 6
您不应使用用于预测的相同数据集进行训练。否则,你不会做任何预测。
Dataset<Row>[] splits = vectorData.randomSplit(new double[]{0.6, 0.4}, 1234L);
Dataset<Row> train = splits[0];
Dataset<Row> test = splits[1];
Run Code Online (Sandbox Code Playgroud)
此外,算法绝对有可能了解到任何一天的可能结果都是 0。您应该知道,日期和销售计数之间没有真正的关系。这些日期不是重复出现的,因此无法做出真实的预测。贝叶斯算法也没有意识到这些条目实际上是一系列事件。它只是计算当“feature”值为“1622505600”时,“label”的概率值有多高。
我建议将一周中的某一天作为该功能,因为这些功能会重复出现,并且了解工作日的销售量特别高会更有意义。
或者,您可以为其提供第二个功能,例如昨天的销售情况。这将使算法能够在前一天实际进行预测。
| 归档时间: |
|
| 查看次数: |
176 次 |
| 最近记录: |