Compartir a través de


Tutorial: análisis de datos con glm

Obtenga información sobre cómo realizar una regresión lineal y logística mediante un modelo lineal generalizado (GLM) en Azure Databricks. glm se ajusta a un modelo lineal generalizado, similar a glm() de R.

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

Parámetros:

  • formula: descripción simbólica del modelo que se va a instalar, por ejemplo: ResponseVariable ~ Predictor1 + Predictor2. Operadores admitidos: ~, +, - y .
  • data: cualquier objeto SparkDataFrame.
  • family: cadena, "gaussian" para regresión lineal o "binomial" para regresión logística.
  • lambda: parámetro numérico de regularización.
  • alpha: parámetro de combinación numérico de red elástica.

Salida: MLlib PipelineModel.

En este tutorial se muestra cómo realizar una regresión lineal y logística en el conjunto de datos diamonds.

Carga de datos de diamantes y división en conjuntos de entrenamiento y de prueba

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)

Entrenamiento de un modelo de regresión lineal mediante glm()

En esta sección se muestra cómo predecir el precio de un diamante a partir de sus características mediante el entrenamiento de un modelo de regresión lineal con los datos de entrenamiento.

Hay una mezcla de características categóricas (corte: ideal, prémium, muy bueno...) y características continuas (profundidad, quilates). SparkR codifica automáticamente estas características para que no tenga que codificar estas características manualmente.

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

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

Use predict() en los datos de prueba para ver cómo funciona el modelo en los datos nuevos.

Sintaxis: predict(model, newData)

Parámetros:

  • model: modelo de MLlib.
  • newData: SparkDataFrame, normalmente el conjunto de pruebas.

Salida: SparkDataFrame

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

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

Evalúe el modelo.

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

Entrenamiento de un modelo de regresión logística mediante glm()

En esta sección se muestra cómo crear una regresión logística sobre el mismo conjunto de datos para predecir el corte de un diamante en función de algunas de sus características.

La regresión logística en MLlib admite la clasificación binaria. Para probar el algoritmo en este ejemplo, se debe crear un subconjunto de los datos para trabajar con dos etiquetas.

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

Evalúe el modelo.

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