我在Spark(scala)中遇到了问题。 我创建了一个简单的人工数据集,其中包含以下规则:
y_3 = 2 * x1 + 3 * x2 + 0
所以样本日期是:
(y_3,[x1,x2]) (4302.84233756448,[513.470030229239,1091.967425702])
在将数据传递给线性回归之前,我正在对数据进行扩展,如下所示:
val scaler = new StandardScaler(withMean = true, withStd = true).fit(data.map(x => x.features))
(scaler, data.map(x => LabeledPoint(x.label, scaler.transform(x.features))))
但通过这种扩展我的数据将是这样的:
(y_3,[x1,x2]) (1350.80994484728,[ - 1.9520275434722287,-1.1671844333252521])
现在系数不是[2,3],并且截距也在变化,因为缩放只是缩放特征而不是y_3 !!
我的问题是:“我如何扩展功能和目标变量?”
我尝试将缩放代码更改为以下内容:
val scalerFeatures = new StandardScaler(withMean = true, withStd = true).fit(data.map(x => x.features))
val scalerLabel = new StandardScaler(withMean = true, withStd = true).fit(data.map(x => Vectors.dense(x.label)))
(scalerFeatures, data.map(x => LabeledPoint(scalerLabel.transform(x.label), scalerFeatures.transform(x.features))))
但它不接受 LabeledPoint 中的“ scalerLabel.transform(x.label)”(需要Double)。
那我怎么能这样做呢?
另一个问题是,当模型预测缩放的目标变量时,我如何将其转换为目标变量的实际值?
提前致谢。
答案 0 :(得分:0)
这很奇怪,你想通过缩放目标变量来实现什么?你做的是创建x1和x2然后使用因变量:y_3 = 2 * x1 + 3 * x2 + 0。因此,如果您通过任何变换(即不将它们乘以1)变换x1和/或x2,那么该函数将不再存在。而且您通常不希望将缩放应用于目标变量。
这可能更像是交叉验证的讨论,但您可以使用两个特征x_1,x_2和目标变量y,线性回归的最佳曲线如下:
y=ax_1+bx_2+c
我可以变换x_1和x_2(可能不是非线性变换),当你训练新的线性回归(不改变y)时,你得到不同的a,b,c值。一旦您想用于预测新案例,您只需先将相同的转换应用于x_1和x_2,然后将其用于预测。
要回答有关如何缩放标签的具体问题,您只需要更改发送到transform()的内容,它需要一个向量,并且您正在给x.label,这是一个应该有效的代码:< / p>
val scaleddata = data.map(x => (scalerLabel.transform(Vectors.dense(x.label)), scalerFeatures.transform(x.features)))
val scaleddataLast = scaleddata.map(x => LabeledPoint(x._1, x._2))