Spark mllib 预测奇怪的数字或 NaN
Spark mllib predicting weird number or NaN
我是 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 对提供的 stepSize
非常敏感,用于更新中间解决方案。
SGD 所做的是在给定输入点样本和当前权重 w
的情况下计算成本函数的梯度 g
。为了更新权重 w
,你在 g
的相反方向上走了一段距离。距离就是你的步长s
.
w(i+1) = w(i) - s * g
由于您没有提供明确的步长值,MLlib 假定 stepSize = 1
。这似乎不适用于您的用例。我建议您尝试不同的步长大小,通常是较低的值,以查看 LinearRegressionWithSGD
的行为方式:
LinearRegressionWithSGD.train(parsedData, numIterartions = 10, stepSize = 0.001)
我是 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 对提供的 stepSize
非常敏感,用于更新中间解决方案。
SGD 所做的是在给定输入点样本和当前权重 w
的情况下计算成本函数的梯度 g
。为了更新权重 w
,你在 g
的相反方向上走了一段距离。距离就是你的步长s
.
w(i+1) = w(i) - s * g
由于您没有提供明确的步长值,MLlib 假定 stepSize = 1
。这似乎不适用于您的用例。我建议您尝试不同的步长大小,通常是较低的值,以查看 LinearRegressionWithSGD
的行为方式:
LinearRegressionWithSGD.train(parsedData, numIterartions = 10, stepSize = 0.001)