gpt4 book ai didi

apache-spark - Spark Linear Regression With SGD 对特征缩放非常敏感

转载 作者:行者123 更新时间:2023-12-01 02:08:12 25 4
gpt4 key购买 nike

我在 Spark 的 MLlib 中拟合 LinearRegressionWithSGD 时遇到问题。我用他们的例子从这里安装 https://spark.apache.org/docs/latest/mllib-linear-methods.html (使用 Python 接口(interface))。

在他们的示例中,所有特征几乎都以约 0 的平均值和约 1 的标准差进行缩放。现在,如果我将其中一个缩放因子 10,则回归中断(给出 nans 或非常大的系数):

from pyspark.mllib.regression import LabeledPoint, LinearRegressionWithSGD
from numpy import array

# Load and parse the data
def parsePoint(line):
values = [float(x) for x in line.replace(',', ' ').split(' ')]
# UN-SCALE one of the features by a factor of 10
values[3] *= 10

return LabeledPoint(values[0], values[1:])

data = sc.textFile(spark_home+"data/mllib/ridge-data/lpsa.data")
parsedData = data.map(parsePoint)

# Build the model
model = LinearRegressionWithSGD.train(parsedData)

# Evaluate the model on training data
valuesAndPreds = parsedData.map(lambda p: (p.label, model.predict(p.features)))
MSE = valuesAndPreds.map(lambda (v, p): (v - p)**2).reduce(lambda x, y: x + y) / valuesAndPreds.count()
print("Mean Squared Error = " + str(MSE))
print "Model coefficients:", str(model)

所以,我想我需要做特征缩放。如果我进行预缩放它可以工作(因为我回到了缩放功能)。但是现在我不知道如何在原始空间中获取系数。
from pyspark.mllib.regression import LabeledPoint, LinearRegressionWithSGD
from numpy import array
from pyspark.mllib.feature import StandardScaler
from pyspark.mllib.feature import StandardScalerModel

# Load and parse the data
def parseToDenseVector(line):
values = [float(x) for x in line.replace(',', ' ').split(' ')]
# UN-SCALE one of the features by a factor of 10
values[3] *= 10
return Vectors.dense(values[0:])

# Load and parse the data
def parseToLabel(values):
return LabeledPoint(values[0], values[1:])

data = sc.textFile(spark_home+"data/mllib/ridge-data/lpsa.data")

parsedData = data.map(parseToDenseVector)
scaler = StandardScaler(True, True)
scaler_model = scaler.fit(parsedData)
parsedData_scaled = scaler_model.transform(parsedData)

parsedData_scaled_transformed = parsedData_scaled.map(parseToLabel)

# Build the model
model = LinearRegressionWithSGD.train(parsedData_scaled_transformed)

# Evaluate the model on training data
valuesAndPreds = parsedData_scaled_transformed.map(lambda p: (p.label, model.predict(p.features)))
MSE = valuesAndPreds.map(lambda (v, p): (v - p)**2).reduce(lambda x, y: x + y) / valuesAndPreds.count()
print("Mean Squared Error = " + str(MSE))
print "Model coefficients:", str(model)

所以,这里我有转换空间中的所有系数。现在我怎么去原来的空间?我也有 scaler_model 是 StandardScalerModel 目的。但我无法从中获得任何手段或差异。这个类唯一的公共(public)方法是transform,它可以将点从原始空间转换为transform。但我无法让它逆转。

最佳答案

我刚刚遇到了这个问题。模型甚至无法学习 f(x) = x如果 x在训练数据中很高(>3)。太坏了。

我认为不是缩放数据,另一种选择是改变步长。这在 SPARK-1859 中进行了讨论.从那里解释:

The step size should be smaller than 1 over the Lipschitz constant L. For quadratic loss and GD, the best convergence happens at stepSize = 1/(2L). Spark has a (1/n) multiplier on the loss function.

Let's say you have n = 5 data points and the largest feature value is 1500. So L = 1500 * 1500 / 5. The best convergence happens at stepSize = 1/(2L) = 10 / (1500 ^ 2).



最后一个等式甚至没有意义(我们是如何在分子中得到 2 的?)但我以前从未听说过 Lipschitz 常数,所以我没有资格修复它。无论如何,我认为我们可以尝试不同的步长,直到它开始起作用。

关于apache-spark - Spark Linear Regression With SGD 对特征缩放非常敏感,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30981471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com