gpt4 book ai didi

python - Spark mllib 线性回归给出非常糟糕的结果

转载 作者:行者123 更新时间:2023-12-05 06:42:14 27 4
gpt4 key购买 nike

在尝试使用 Python 使用 Spark mllib 的 LinearRegressionWithSGD 进行线性回归时,我一直得到非常糟糕的结果

我调查了类似的问题,如下所示:

我很清楚,关键是调整参数恰到好处

我还了解到随机梯度下降不一定会找到最佳解决方案(就像交替最小二乘法那样),因为它有可能陷入局部最小值。但至少我希望找到一个 OK 模型。

这是我的设置,我选择使用 this example来自统计教育杂志及相应dataset .我从这篇论文(以及通过在 JMP 中复制结果)了解到,如果我只使用数值字段,我应该得到类似于以下等式的结果(R^2 为 ~44%,RMSE 为 ~7400):

价格 = 7323 - 0.171 里程 + 3200 气缸 - 1463 门 + 6206 巡航 - 2024 声音 + 3327 皮革

因为我不知道如何设置参数恰到好处,所以我运行了以下蛮力方法:

from collections import Iterable
from pyspark import SparkContext
from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.regression import LinearRegressionWithSGD
from pyspark.mllib.evaluation import RegressionMetrics

def f(n):
return float(n)

if __name__ == "__main__":
sc = SparkContext(appName="LinearRegressionExample")

# CSV file format:
# 0 1 2 3 4 5 6 7 8 9 10 11
# Price, Mileage, Make, Model, Trim, Type, Cylinder, Liter, Doors, Cruise, Sound, Leather
raw_data = sc.textFile('file:///home/ccastroh/training/pyspark/kuiper.csv')

# Grabbing numerical values only (for now)
data = raw_data \
.map(lambda x : x.split(',')) \
.map(lambda x : [f(x[0]), f(x[1]), f(x[6]), f(x[8]), f(x[9]), f(x[10]), f(x[11])])
points = data.map(lambda x : LabeledPoint(x[0], x[1:])).cache()

print "Num, Iterations, Step, MiniBatch, RegParam, RegType, Intercept?, Validation?, " + \
"RMSE, R2, EXPLAINED VARIANCE, INTERCEPT, WEIGHTS..."
i = 0
for ite in [10, 100, 1000]:
for stp in [1, 1e-01, 1e-02, 1e-03, 1e-04, 1e-05, 1e-06, 1e-07, 1e-08, 1e-09, 1e-10]:
for mini in [0.2, 0.4, 0.6, 0.8, 1.0]:
for regP in [0.0, 0.1, 0.01, 0.001]:
for regT in [None, 'l1', 'l2']:
for intr in [True]:
for vald in [False, True]:
i += 1

message = str(i) + \
"," + str(ite) + \
"," + str(stp) + \
"," + str(mini) + \
"," + str(regP) + \
"," + str(regT) + \
"," + str(intr) + \
"," + str(vald)

model = LinearRegressionWithSGD.train(points, iterations=ite, step=stp, \
miniBatchFraction=mini, regParam=regP, regType=regT, intercept=intr, \
validateData=vald)

predictions_observations = points \
.map(lambda p : (float(model.predict(p.features)), p.label)).cache()
metrics = RegressionMetrics(predictions_observations)
message += "," + str(metrics.rootMeanSquaredError) \
+ "," + str(metrics.r2) \
+ "," + str(metrics.explainedVariance)

message += "," + str(model.intercept)
for weight in model.weights:
message += "," + str(weight)

print message
sc.stop()

如您所见,我基本上运行了 3960 种不同的变体。在这些中,我都没有得到任何与论文或 JMP 中的公式相差甚远的东西。以下是一些要点:

  • 在很多次运行中,截距和权重都为 NaN
  • 我得到的最高 R^2 是 -0.89。我什至不知道你可以获得负 R^2。事实证明,负值表示所选模型 fits worse than a horizontal line .
  • 我得到的最低 RMSE 是 13600,比预期的 7400 差很多。

我也试过normalizing the values所以在 [0,1] 范围内,这也没有帮助

有没有人知道如何获得一半不错的线性回归模型?我错过了什么吗?

最佳答案

有类似的问题。使用 DecisionTree 和 RandomForest 回归效果很好,尽管如果您想要一个非常准确的解决方案,它不太适合生成连续标签。

然后测试线性回归,就像您对每个参数使用多个值以及使用多个数据集所做的那样,但没有得到任何与真实值相差甚远的解决方案。还尝试在训练模型之前使用 StandardScaler 进行特征缩放,但也不尽如人意。 :-(

编辑:将拦截设置为真可能会解决问题。

关于python - Spark mllib 线性回归给出非常糟糕的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37714635/

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