【发布时间】:2015-09-07 23:51:50
【问题描述】:
我在使用 Spark 的 MLlib 中的 LinearRegressionWithSGD 时遇到问题。我使用他们的示例从这里进行拟合 https://spark.apache.org/docs/latest/mllib-linear-methods.html(使用 Python 接口)。
在他们的示例中,所有特征几乎都以 0 左右的平均值和 1 左右的标准差进行缩放。现在,如果我将其中一个缩放 10 倍,则回归中断(给出 nan 或非常大的系数):
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 对象。但我无法从中获得任何手段或差异。该类唯一的公共方法是transform,它可以将点从原始空间转换为transform。但我不能让它反转。
【问题讨论】:
标签: apache-spark linear-regression apache-spark-mllib