Ho appena iniziato con ML e Apache Spark, quindi ho provato la regressione lineare basata sugli esempi Spark. Non riesco a generare un modello corretto per tutti i dati tranne il campione nell'esempio e l'intercetta è sempre 0.0, indipendentemente dai dati di input.L'intercettazione del modello di regressione lineare Spark MLLib è sempre 0.0?
ho preparato un data-set di semplice allenamento in base alla funzione:
y = (2 * x1) + (3 * x2) + 4
cioè mi aspetterei l'intercetta di essere 4 e i pesi devono essere (2, 3).
Se corro il LinearRegressionWithSGD.train (...) sui dati grezzi, il modello è:
Model intercept: 0.0, weights: [NaN,NaN]
E le previsioni sono tutte NaN:
Features: [1.0,1.0], Predicted: NaN, Actual: 9.0
Features: [1.0,2.0], Predicted: NaN, Actual: 12.0
ecc
Se scala prima i dati, ottengo:
Model intercept: 0.0, weights: [17.407863391511754,2.463212481736855]
Features: [1.0,1.0], Predicted: 19.871075873248607, Actual: 9.0
Features: [1.0,2.0], Predicted: 22.334288354985464, Actual: 12.0
Features: [1.0,3.0], Predicted: 24.797500836722318, Actual: 15.0
ecc
O sto facendo qualcosa di sbagliato, o non capisco quale dovrebbe essere l'output di questo modello, quindi qualcuno può suggerire dove potrei sbagliare qui?
Il mio codice è qui sotto:
// Load and parse the dummy data (y, x1, x2) for y = (2*x1) + (3*x2) + 4
// i.e. intercept should be 4, weights (2, 3)?
val data = sc.textFile("data/dummydata.txt")
// LabeledPoint is (label, [features])
val parsedData = data.map { line =>
val parts = line.split(',')
val label = parts(0).toDouble
val features = Array(parts(1), parts(2)) map (_.toDouble)
LabeledPoint(label, Vectors.dense(features))
}
// Scale the features
val scaler = new StandardScaler(withMean = true, withStd = true)
.fit(parsedData.map(x => x.features))
val scaledData = parsedData
.map(x =>
LabeledPoint(x.label,
scaler.transform(Vectors.dense(x.features.toArray))))
// Building the model: SGD = stochastic gradient descent
val numIterations = 1000
val step = 0.2
val model = LinearRegressionWithSGD.train(scaledData, numIterations, step)
println(s">>>> Model intercept: ${model.intercept}, weights: ${model.weights}")`
// Evaluate model on training examples
val valuesAndPreds = scaledData.map { point =>
val prediction = model.predict(point.features)
(point.label, point.features, prediction)
}
// Print out features, actual and predicted values...
valuesAndPreds.take(10).foreach({case (v, f, p) =>
println(s"Features: ${f}, Predicted: ${p}, Actual: ${v}")})
Per PySpark, se qualcuno si chiede, questo sarebbe 'model = LinearRegressionWithSGD.train (res, intercettare = True)' –