关于使用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”值的概率有多高。
我建议使用一周中的某一天作为特征,因为这些是重复出现的,这样更有意义,可以看出在哪个工作日销售量特别高。
或者,你可以添加第二个特征,比如昨天的销售量。这将使算法能够实际预测前一天的销售情况。