Python Spark mllib预测奇数或NaN

Python Spark mllib预测奇数或NaN,python,apache-spark,pyspark,apache-spark-mllib,gradient-descent,Python,Apache Spark,Pyspark,Apache Spark Mllib,Gradient Descent,我是Apache Spark的新手,尝试使用机器学习库来预测一些数据。我现在的数据集只有大约350个点。以下是其中7点: "365","4",41401.387,5330569 "364","3",51517.886,5946290 "363","2",55059.838,6097388 "362","1",43780.977,5304694 "361","7",46447.196,5471836 "360","6",50656.121,5849862 "359","5",44494.476,5

我是Apache Spark的新手,尝试使用机器学习库来预测一些数据。我现在的数据集只有大约350个点。以下是其中7点:

"365","4",41401.387,5330569
"364","3",51517.886,5946290
"363","2",55059.838,6097388
"362","1",43780.977,5304694
"361","7",46447.196,5471836
"360","6",50656.121,5849862
"359","5",44494.476,5460289
这是我的密码:

def parsePoint(line):
    split = map(sanitize, line.split(','))
    rev = split.pop(-2)
    return LabeledPoint(rev, split)

def sanitize(value):
    return float(value.strip('"'))

parsedData = textFile.map(parsePoint)
model = LinearRegressionWithSGD.train(parsedData, iterations=10)

print model.predict(parsedData.first().features)

这种预测完全是疯狂的,比如
-6.92840330273e+136
。如果我没有在
train()
中设置迭代次数,那么我会得到
nan
。我做错了什么?是我的数据集(可能是它的大小)还是我的配置?

问题在于
LinearRegressionWithSGD
使用随机梯度下降(SGD)来优化线性模型的权重向量。SGD对提供的用于更新中间解决方案的
步长非常敏感

SGD所做的是计算给定输入点样本和当前权重的成本函数的梯度
g
。要更新权重
w
,请沿
g
的相反方向移动一定距离。距离是您的步长
s

w(i+1) = w(i) - s * g   
由于没有提供显式的步长值,MLlib假定
stepSize=1
。这似乎不适用于您的用例。我建议您尝试不同的步长,通常较小的值,以了解
LinearRegressionWithSGD
的行为:

LinearRegressionWithSGD.train(解析数据,数值=10,步长=0.001)

问题在于
LinearRegressionWithSGD
使用随机梯度下降(SGD)来优化线性模型的权重向量。SGD对提供的用于更新中间解决方案的
步长非常敏感

SGD所做的是计算给定输入点样本和当前权重的成本函数的梯度
g
。要更新权重
w
,请沿
g
的相反方向移动一定距离。距离是您的步长
s

w(i+1) = w(i) - s * g   
由于没有提供显式的步长值,MLlib假定
stepSize=1
。这似乎不适用于您的用例。我建议您尝试不同的步长,通常较小的值,以了解
LinearRegressionWithSGD
的行为:

LinearRegressionWithSGD.train(解析数据,数值=10,步长=0.001)

是线性回归中数值不稳定的常见原因。正则化项可能会有所帮助,首先进行降维也是如此。通过目视检查样本数据,我看不到明显的情况,但有时并不明显。是线性回归中数值不稳定的常见原因。正则化项可能会有所帮助,首先进行降维也是如此。通过目视检查样本数据,我看不到明显的情况,但有时它并不明显。当我设置
step=0.000000000000000 1
iterations=500
时,它可以工作。谢谢你的帮助。我认为默认参数(
miniBatchFraction
等于1.0)不再是随机的。当我设置
step=0.000000000000000 1
iterations=500
时,它就可以工作了。谢谢你的帮助。我认为默认参数(
miniBatchFraction
等于1.0)不再是随机的。