Tutorial: Analysieren von Daten mit glm

Erfahren Sie, wie Sie in Azure Databricks eine lineare und logistische Regression mit einem generalisierten linearen Modell (GLM) durchführen. glm passt zu einem generalisierten linearen Modell, ähnlich wie glm() von R.

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

Parameter:

  • formula: Symbolische Beschreibung des Modells, das angepasst werden soll, z. B.: ResponseVariable ~ Predictor1 + Predictor2. Unterstützte Operatoren: ~, +, - und .
  • data: Beliebiger SparkDataFrame
  • family: Zeichenfolge, "gaussian" für lineare Regression oder "binomial" für logistische Regression
  • lambda: Numerisch, Abgrenzungsparameter
  • alpha: Numerisch, Elastischer Netzmischungsparameter

Ausgabe: MLlib PipelineModel

In diesem Tutorial erfahren Sie, wie Sie eine lineare und logistische Regression für das Diamonds-Dataset (Diamanten) durchführen.

Laden von Diamonds-Daten und Aufteilen in Trainings- und Testsätze

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)

Trainieren eines linearen Regressionsmodells mit glm()

In diesem Abschnitt wird gezeigt, wie Sie den Preis eines Diamanten anhand seiner Merkmale vorhersagen, indem Sie ein lineares Regressionsmodell mithilfe der Trainingsdaten trainieren.

Es gibt eine Mischung aus kategorischen Funktionen (Schnitt – Ideal, Premium, Sehr gut...) und weiterführenden Funktionen (Tiefe, Karat). SparkR codiert diese Features automatisch, sodass Sie diese Features nicht manuell codieren müssen.

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

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

Verwenden Sie predict() mit den Testdaten, um festzustellen, wie gut das Modell mit neuen Daten funktioniert.

Syntax: predict(model, newData)

Parameter:

  • model: MLlib-Modell
  • newData: SparkDataFrame, in der Regel Ihr Testsatz

Ausgabe: SparkDataFrame

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

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

Auswerten des Modells.

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

Trainieren eines logistischen Regressionsmodells mit glm()

In diesem Abschnitt wird gezeigt, wie Sie eine logistische Regression für dasselbe Dataset erstellen, um den Schliff eines Diamanten auf Grundlage einiger seiner Merkmale vorherzusagen.

Die logistische Regression in MLlib unterstützt die binäre Klassifizierung. Um den Algorithmus in diesem Beispiel zu testen, erstellen Sie aus den Daten Teilmengen, damit mit 2 Bezeichnungen gearbeitet wird.

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

Auswerten des Modells.

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