Java Spark 朴素贝叶斯 - 预测未来时间戳

Java Spark Naive Bayes - predict for future timestamp

关于 prediction/forecast 使用 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"

很简单,我就是想预测一下明天、后天等煎饼的销量……

因此,我尝试了朴素贝叶斯模型,按照这里的教程 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()})));

我什至看到如下结果:

-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                                                                                                   

但是对于预测本身,不幸的是,它总是显示明天的 0.0

请问这个问题的根本原因是什么?

谢谢

您不应使用用于预测的同一数据集进行训练。否则,你不会做任何预测。

Dataset<Row>[] splits = vectorData.randomSplit(new double[]{0.6, 0.4}, 1234L);
Dataset<Row> train = splits[0];
Dataset<Row> test = splits[1];

此外,算法绝对有可能了解到任何一天的可能结果为 0。如您所知,日期与销售数量之间没有真正的关系。这些日期不是重复出现的,因此无法做出真实的预测。贝叶斯算法也不理解这些条目实际上是一系列事件。它只是计算当值“feature”为“1622505600”时“label”的可能值有多高。

我建议使用诸如星期几之类的功能,因为这些功能会重复出现,而且查看在哪个工作日的销售额特别高会更有意义。

或者,您可以给它第二个特征,比如昨天的销售额。这将允许算法在前一天实际进行预测。