Didacticiel : Analyser des 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é (MLG) dans Azure Databricks. glm correspond à un modèle linéaire généralisé, similaire aux R glm().

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

Paramètres :

  • formula : description symbolique du modèle à adapter, par exemple : ResponseVariable ~ Predictor1 + Predictor2. Opérateurs pris en charge : ~, +, - et .
  • data : tout SparkDataFrame
  • family : chaîne, "gaussian" pour une régression linéaire ou "binomial" pour une régression logistique
  • lambda : numérique, paramètre Regularization
  • alpha: numérique, paramètre de mélange Elastic-net

Sortie : MLlib PipelineModel

Ce tutoriel montre comment effectuer une régression linéaire et logistique sur le jeu de données diamonds.

Charger les données des diamants diviser en jeux d’apprentissage et de test

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))
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 effectuant l’apprentissage d’un modèle de régression linéaire à l’aide des données d’apprentissage.

Il existe un mélange de caractéristiques catégorielles (taille – Idéale, Premium, Très Bonne…) et de caractéristiques continues (profondeur, carat). SparkR encode automatiquement ces fonctionnalités afin que vous n'ayez pas à encoder ces fonctionnalités manuellement.

# 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 le fonctionnement du modèle sur de nouvelles données.

Syntaxe :predict(model, newData)

Paramètres :

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

Sortie :SparkDataFrame

# 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.

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 jeu de données afin de prédire la taille d’un diamant en fonction de certaines caractéristiques de celui-ci.

La régression logistique dans MLlib prend en charge la classification binaire. Pour tester l'algorithme dans cet exemple, sous-ensemblez les données pour qu'elles fonctionnent avec deux étiquettes.

# 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"))
# 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)
# 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.

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