【问题标题】:LinearRegressionWithSGD() returns NaNLinearRegressionWithSGD() 返回 NaN
【发布时间】:2016-01-14 09:43:07
【问题描述】:

我正在尝试在百万歌曲数据集上使用 LinearRegressionWithSGD,我的模型返回 NaN 作为权重,返回 0.0 作为截距。错误可能是什么问题?我在独立模式下使用 Spark 1.40。

样本数据:http://www.filedropper.com/part-00000

这是我的完整代码:

// 导入依赖

import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.mllib.regression.LinearRegressionModel
import org.apache.spark.mllib.regression.GeneralizedLinearAlgorithm
import org.apache.spark.mllib.regression.LinearRegressionWithSGD

//定义RDD

val data =  
sc.textFile("/home/naveen/Projects/millionSong/YearPredictionMSD.txt")

// 转换为标注点

def parsePoint (line: String): LabeledPoint = {
val x = line.split(",")
val head = x.head.toDouble
val tail = Vectors.dense(x.tail.map(x => x.toDouble))
return LabeledPoint(head,tail)
}

// 查找范围

val parsedDataInit = data.map(x => parsePoint(x))
val onlyLabels = parsedDataInit.map(x => x.label)
val minYear = onlyLabels.min()
val maxYear = onlyLabels.max()

// 移动标签

val parsedData = parsedDataInit.map(x => LabeledPoint(x.label-minYear   
,   x.features))

// 训练、验证和测试集

val splits = parsedData.randomSplit(Array(0.8, 0.1, 0.1), seed = 123)
val parsedTrainData = splits(0).cache()
val parsedValData = splits(1).cache()
val parsedTestData = splits(2).cache()

val nTrain = parsedTrainData.count()
val nVal = parsedValData.count()
val nTest = parsedTestData.count()

// 均方根误差

def squaredError(label: Double, prediction: Double): Double = {

return scala.math.pow(label - prediction,2)
}

def calcRMSE(labelsAndPreds: RDD[List[Double]]): Double = {
return scala.math.sqrt(labelsAndPreds.map(x =>    
           squaredError(x(0),x(1))).mean())
}
val numIterations = 100
val stepSize = 1.0
val regParam = 0.01
val regType = "L2"
val algorithm = new LinearRegressionWithSGD()
algorithm.optimizer
.setNumIterations(numIterations)
.setStepSize(stepSize) 
.setRegParam(regParam)
val model = algorithm.run(parsedTrainData) 

【问题讨论】:

  • 提供您的数据样本,以便我们重现错误

标签: machine-learning apache-spark


【解决方案1】:

我不熟悉 SGD 的这种具体实现,但一般来说,如果梯度下降求解器转到 nan,则意味着学习率太大。 (在这种情况下,我认为它是 stepSize 变量)。

每次尝试将其降低一个数量级,直到它开始收敛

【讨论】:

    【解决方案2】:

    我认为有两种可能。

    1. stepSize 很大。你应该试试 0.01, 0.03, 0.1, 0.3、1.0、3.0....
    2. 您的火车数据包含 NaN。如果是这样,结果很可能是 NaN。

    【讨论】:

      猜你喜欢
      • 2017-08-12
      • 1970-01-01
      • 2011-04-22
      • 2016-05-20
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多