【问题标题】:Spark scaling the data for both features and the labelSpark 缩放特征和标签的数据
【发布时间】:2015-07-17 00:01:36
【问题描述】:

我在 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)。

那我该怎么做呢?

另外一个问题是,当模型预测出被缩放的目标变量时,如何将其转换为目标变量的实际值?

提前致谢。

【问题讨论】:

    标签: scala apache-spark scaling


    【解决方案1】:

    这很奇怪,你想通过缩放目标变量来完成什么?您所做的是创建 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,下面是一个应该可以工作的代码:

    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))
    

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 1970-01-01
      • 2020-05-31
      • 2019-03-21
      • 2019-03-09
      • 2017-10-13
      • 1970-01-01
      • 2017-05-21
      • 2020-04-21
      相关资源
      最近更新 更多