[PYTHON] Ridge retour avec Mllib à Pyspark

Fonction de carte pratique dans l'environnement Pyspark créé J'ai essayé la régression de crête.

L'histoire originale est tirée d'une conférence intitulée Scalable Machine Learning d'edX.

Les données peuvent être obtenues à partir du Million Song Dataset.

Donc, si vous écrivez le résultat en premier, même si vous avez effectué une recherche de grille avec la valeur par défaut Le résultat est que la régression effectuée avec la valeur par défaut est plus précise, ce qui est susceptible de provoquer du sang nasal.

Tout d'abord, importez.

#library import
from pyspark.mllib.regression import LinearRegressionWithSGD
from pyspark.mllib.regression import LabeledPoint
from test_helper import Test
import numpy as np

#data load
rawData = sc.textFile('millionsong.txt')

Régression de crête (par défaut)

J'ai utilisé LinearRegressionWithSGD.

samplePoints = rawData.take(2)

#Create LabeledPoint
def parsePoint(line):

    tokens = line.split(',')
    label = tokens[0]
    features = tokens[1:]
    return LabeledPoint(label, features)

parsedData = rawData.map(parsePoint)
print parsedData.take(3)

[LabeledPoint(2001.0, [0.884123733793,0.610454259079,0.600498416968,0.474669212493,0.247232680947,0.357306088914,0.344136412234,0.339641227335,0.600858840135,0.425704689024,0.60491501652,0.419193351817]), LabeledPoint(2001.0, [0.854411946129,0.604124786151,0.593634078776,0.495885413963,0.266307830936,0.261472105188,0.506387076327,0.464453565511,0.665798573683,0.542968988766,0.58044428577,0.445219373624]), LabeledPoint(2001.0, [0.908982970575,0.632063159227,0.557428975183,0.498263761394,0.276396052336,0.312809861625,0.448530069406,0.448674249968,0.649791323916,0.489868662682,0.591908113534,0.4500023818])]

Ensuite, divisez les données en Traning, Validation et Test.

#Devide rawData into Traning, Validation and Test
weights = [.8, .1, .1]
seed = 50
parsedTrainData, parsedValData, parsedTestData = parsedData.randomSplit(weights, seed)
# Fit the model with default values
fitModel = LinearRegressionWithSGD.train(parsedTrainData)
print  fitModel

(weights=[348.391703677,312.158507888,303.514705245,268.768326368,260.265535915,321.082923267,345.636059404,369.96940298,414.587178279,328.611497772,389.972179858,348.42792115], intercept=0.0)

Comparaison des valeurs mesurées et prévues sur la base de ce modèle. L'erreur est d'environ 2 ans.

# Prediction 
testPoint = parsedTrainData.take(1)[0]
print testPoint.label

testPrediction = fitModel.predict(testPoint.features)
print testPrediction

2001.0
2003.04838193

Ensuite, effectuez une évaluation du modèle à l'aide de l'erreur de racine carrée moyenne carrée (RMSE). De plus, nous rechercherons des hyper paramètres par recherche de grille en utilisant RMSE comme fonction d'évaluation.

# Define a formula to caluculate RMSE(Root Mean Square Error)
def squaredError(label, prediction):
    ##Calculates the the squared error for a single prediction.
    return (label - prediction)**2

def calcRMSE(labelsAndPreds):
    ##Calculates the root mean squared error for an `RDD` of (label, prediction) tuples.
    return np.sqrt(labelsAndPreds
                   .map(lambda (label, prediction): squaredError(label, prediction))
                   .mean())

#Create new RDD with actual label and predicted label 
labelsAndPreds = parsedValData.map(lambda lp: (lp.label, fitModel.predict(lp.features)))

#Calculation RMSE
rmseValLR1 = calcRMSE(labelsAndPreds)
print rmseValLR1

126.788570325

Retour de crête (recherche de grille)

RMSE est d'environ 126 en ajustement effectué avec la valeur par défaut. Ensuite, recherchons dans la grille des hyper paramètres.

##Grid search
# Values to use when training the linear regression model
miniBatchFrac = 1.0  # miniBatchFraction
regType = 'l2'  # regType
useIntercept = True  # intercept

# Seed of minmum RMSE
min_rmseVal = 10**10

#Fix HyperParameters
modelRMSEs = []

for grid_alpha in [1e-5,1.0,10,100]:
    for grid_numIters in [50,100,500]:
        for grid_reg in [1e-5,0.0, 1.0]:
            model = LinearRegressionWithSGD.train(parsedTrainData,
                                                  iterations=grid_numIters, 
                                                  step=grid_alpha,
                                                  regParam=grid_reg)
            
            labelsAndPreds = parsedValData.map(lambda lp: (lp.label, model.predict(lp.features)))
            rmseVal = calcRMSE(labelsAndPreds)
            
            
            
            if rmseVal < min_rmseVal:
                min_rmseVal = rmseVal
                best_alpha = grid_alpha
                best_numIter =grid_numIters
                best_reg = grid_reg
            
print "best_alpha:{},best_numIter:{}, best_reg:{}, best_rmseVal:{}".format(best_alpha, best_numIter, best_reg, min_rmseVal)
best_alpha:1.0,best_numIter:500, best_reg:1e-05, best_rmseVal:117.120806943

Ici, RMSE a légèrement baissé à environ 117, et on peut s'attendre à ce que la précision augmente. Donc, ajustement immédiat et comparaison de la valeur mesurée et de la valeur prédite comme dans le premier modèle.

#Fitting with HyperParameters fixed by grid search 
Final_model = LinearRegressionWithSGD.train(parsedTrainData,
                                           iterations=best_numIter, 
                                           step=best_alpha, 
                                           regParam =best_reg)

#Labels comparison between Final_model and actual data. 
Final_testPoint = parsedTrainData.take(1)[0]
print Final_testPoint.label

Final_Prediction = Final_model.predict(Final_testPoint.features)
print Final_Prediction

2001.0
1969.7210425

Avec une erreur de près de 30 ans, la précision s'est considérablement détériorée. Pourquoi? Je ne connais pas la cause tout de suite, alors je la réécrirai si j'essaye à nouveau.

Recommended Posts

Ridge retour avec Mllib à Pyspark
Régression linéaire avec statsmodels
Régression avec un modèle linéaire
Effectuer une analyse de régression avec NumPy
Essayez la régression avec TensorFlow
Régression du noyau avec Numpy uniquement
Analyse de régression multiple avec Keras
Comprendre l'apprentissage automatique ~ régression de crête ~.
[Python] Régression linéaire avec scicit-learn
Implémentation de la régression logistique avec NumPy
Régression linéaire robuste avec scikit-learn
Qu'est-ce que la régression de crête de rang réduit?
Régression linéaire avec distribution t de Student
Analyse de régression logistique Self-made avec python
Ridge Return (pour les débutants) -Code Edition-
Prédiction des ondes de Sin (retour) avec Pytorch