Aller au contenu principal

Tutoriel : analyser les données avec glm

Découvrez comment effectuer une régression linéaire et logistique à l’aide d’un modèle linéaire généralisé (GLM) dans Databricks. glm ajuste un modèle linéaire généralisé, similaire à glm() de R.

Syntaxe : glm(formula, data, family...)

parameter :

  • formula: Description symbolique du modèle à ajuster, par ex. : ResponseVariable ~ Predictor1 + Predictor2. Opérateurs pris en charge : ~, +, - et .
  • data: n'importe quel SparkDataFrame
  • family: String, "gaussian" pour la régression linéaire ou "binomial" pour la régression logistique
  • lambda: Numérique, paramètre de régularisation
  • alpha: Paramètre de mélange numérique, Elastic-net

Sortie : MLlib PipelineModel

Ce tutoriel montre comment effectuer une régression linéaire et logistique sur le dataset diamonds.

Chargez les données sur les diamants et divisez-les en ensembles d'entraînement et de test

R
require(SparkR)

# Read diamonds.csv dataset as SparkDataFrame
diamonds <- read.df("/databricks-datasets/Rdatasets/data-001/csv/ggplot2/diamonds.csv",
source = "com.databricks.spark.csv", header="true", inferSchema = "true")
diamonds <- withColumnRenamed(diamonds, "", "rowID")

# Split data into Training set and Test set
trainingData <- sample(diamonds, FALSE, 0.7)
testData <- except(diamonds, trainingData)

# Exclude rowIDs
trainingData <- trainingData[, -1]
testData <- testData[, -1]

print(count(diamonds))
print(count(trainingData))
print(count(testData))
R
head(trainingData)

Entraîner un modèle de régression linéaire à l'aide de glm()

Cette section montre comment prédire le prix d'un diamant à partir de ses caractéristiques en entraînant un modèle de régression linéaire à l'aide des données d'entraînement.

Il existe un mélange de fonctionnalités catégorielles (taille - Idéale, Premium, Très bonne…) et de fonctionnalités continues (profondeur, carat). SparkR encode automatiquement ces fonctionnalités, vous n'avez donc pas à les encoder manuellement.

R
# Family = "gaussian" to train a linear regression model
lrModel <- glm(price ~ ., data = trainingData, family = "gaussian")

# Print a summary of the trained model
summary(lrModel)

Utilisez predict() sur les données de test pour voir comment le modèle fonctionne avec de nouvelles données.

Syntaxe : predict(model, newData)

Paramètres :

  • model: modèle MLlib
  • newData: SparkDataFrame, généralement votre ensemble de test

Résultat : SparkDataFrame

R
# Generate predictions using the trained model
predictions <- predict(lrModel, newData = testData)

# View predictions against mpg column
display(select(predictions, "price", "prediction"))

Évaluer le modèle.

R
errors <- select(predictions, predictions$price, predictions$prediction, alias(predictions$price - predictions$prediction, "error"))
display(errors)

# Calculate RMSE
head(select(errors, alias(sqrt(sum(errors$error^2 , na.rm = TRUE) / nrow(errors)), "RMSE")))

Entraîner un modèle de régression logistique à l'aide de glm()

Cette section montre comment créer une régression logistique sur le même dataset pour prédire la taille d'un diamant en fonction de certaines de ses caractéristiques.

La régression logistique dans MLlib prend en charge la classification binaire. Pour tester l'algorithme dans cet exemple, divisez les données pour travailler avec deux étiquettes.

R
# Subset data to include rows where diamond cut = "Premium" or diamond cut = "Very Good"
trainingDataSub <- subset(trainingData, trainingData$cut %in% c("Premium", "Very Good"))
testDataSub <- subset(testData, testData$cut %in% c("Premium", "Very Good"))
R
# Family = "binomial" to train a logistic regression model
logrModel <- glm(cut ~ price + color + clarity + depth, data = trainingDataSub, family = "binomial")

# Print summary of the trained model
summary(logrModel)
R
# Generate predictions using the trained model
predictionsLogR <- predict(logrModel, newData = testDataSub)

# View predictions against label column
display(select(predictionsLogR, "label", "prediction"))

Évaluer le modèle.

R
errorsLogR <- select(predictionsLogR, predictionsLogR$label, predictionsLogR$prediction, alias(abs(predictionsLogR$label - predictionsLogR$prediction), "error"))
display(errorsLogR)