我想使用Apache Spark使用transform方法对数据集执行样本外预测。
假设我有一个像这样的数据集:
+-------+------+------+--------+
| label | lag1 | lag2 | Datum |
+-------+------+------+--------+
| 5 | 4 | 3 | 160101 |
| 6 | 5 | 4 | 160102 |
| 7 | 6 | 5 | 160103 |
| 8 | 7 | 6 | 160104 |
| 9 | 8 | 7 | 160105 |
| 10 | 9 | 8 | 160106 |
+-------+------+------+--------+
我估计了LinearRegression模型,估计的系数例如是0.5和1。现在,我想预测一些将来的值,如下所示:
prediction = 0.5*lag1 + 1*lag2
+------------+------+------+--------+
| prediction | lag1 | lag2 | Datum |
+------------+------+------+--------+
| 14 | 10 | 9 | 160107 |
| 17 | 14 | 10 | 160108 |
| 23.5 | 17 | 5 | 160109 |
+------------+------+------+--------+
其中14 = 0.5*10 + 9, 17 = 0.5*14 + 10, 23.5 = 0.5*17 + 5
仅在使用withColumn
方法时有效:
WindowSpec window = Window.orderBy("Datum");
DataSet<Row> dataset = dataset.withColumn("label", lit(0).plus(lag("label", 1).over(window)).multiply(0.5).plus(lag("label", 2).over(window)));
但是由于可能会改变滞后次数和一些其他功能,因此我想避免这种语法结构。使用纯Spark的最笨拙的方式是使用.transform()
中的org.apache.spark.ml.regression.LinearRegression
方法(最终使用org.apache.spark.sql.expressions.Window
函数)。有什么办法可以实现?由于与scala的版本不兼容,因此我无法使用spark-ts
或flint
(我们正在使用spark-mllib_2.12
2.4.3版本,需要scala 2.12)。