廣義線性模型(GLMs)算法原理及Spark MLlib調用實例(Scala/Java/Python)

廣義線性迴歸

算法介紹:

        與線性迴歸假設輸出服從高斯分佈不同,廣義線性模型(GLMs)指定線性模型的因變量 服從指數型分佈。Spark的GeneralizedLinearRegression接口允許指定GLMs包括線性迴歸、泊松迴歸、邏輯迴歸等來處理多種預測問題。目前 spark.ml僅支持指數型分佈家族中的一部分類型,如下:

家族

因變量類型

支持類型

高斯

連續型

Identity*, Log, Inverse

二項

二值型

Logit*, Probit, CLogLog

泊松

計數型

Log*, Identity, Sqrt

伽馬

連續型

Inverse*, Idenity, Log

*注意目前Spark在 GeneralizedLinearRegression僅支持最多4096個特徵,如果特徵超過4096個將會引發異常。對於線性迴歸和邏輯迴歸,如果模型特徵數量會不斷增長,則可通過 LinearRegression 和LogisticRegression來訓練。

GLMs要求的指數型分佈可以爲正則或者自然形式。自然指數型分佈爲如下形式:

 

其中 是強度參數, 是分散度參數。在GLM中響應變量 服從自然指數族分佈:

 

其中強度參數 與響應變量 的期望值聯繫如下:


其中 由所選擇的分佈形式所決定。GLMs同樣允許指定連接函數,連接函數決定了響應變量期望值與線性預測器之間的關係:

 

通常,連接函數選擇如 ,在強度參數與線性預測器之間產生一個簡單的關係。這種情況下,連接函數也稱爲正則連接函數:

 

GLM通過最大化似然函數來求得迴歸係數:

其中強度參數和迴歸係數的聯繫如下:


Spark的GeneralizedLinearRegression接口提供彙總統計來診斷GLM模型的擬合程度,包括殘差、p值、殘差、Akaike信息準則及其它。

參數:

family:

類型:字符串型。

含義:模型中使用的誤差分佈類型。

featuresCol:

類型:字符串型。

含義:特徵列名。

fitIntercept:

類型:布爾型。

含義:是否訓練攔截對象。

labelCol:

類型:字符串型。

含義:標籤列名。

link:

類型:字符串型。

含義:連接函數名,描述線性預測器和分佈函數均值之間關係。

linkPredictiongCol:

類型:字符串型。

含義:連接函數(線性預測器列名)。

maxIter:

類型:整數型。

含義:最多迭代次數(>=0)。

predictionCol:

類型:字符串型。

含義:預測結果列名。

regParam:

類型:雙精度型。

含義:正則化參數(>=0)。

solver:

類型:字符串型。

含義:優化的求解算法。

tol:

類型:雙精度型。

含義:迭代算法的收斂性。

weightCol:

類型:字符串型。

含義:列權重。

調用:

Scala:

import org.apache.spark.ml.regression.GeneralizedLinearRegression

// Load training data
val dataset = spark.read.format("libsvm")
  .load("data/mllib/sample_linear_regression_data.txt")

val glr = new GeneralizedLinearRegression()
  .setFamily("gaussian")
  .setLink("identity")
  .setMaxIter(10)
  .setRegParam(0.3)

// Fit the model
val model = glr.fit(dataset)

// Print the coefficients and intercept for generalized linear regression model
println(s"Coefficients: ${model.coefficients}")
println(s"Intercept: ${model.intercept}")

// Summarize the model over the training set and print out some metrics
val summary = model.summary
println(s"Coefficient Standard Errors: ${summary.coefficientStandardErrors.mkString(",")}")
println(s"T Values: ${summary.tValues.mkString(",")}")
println(s"P Values: ${summary.pValues.mkString(",")}")
println(s"Dispersion: ${summary.dispersion}")
println(s"Null Deviance: ${summary.nullDeviance}")
println(s"Residual Degree Of Freedom Null: ${summary.residualDegreeOfFreedomNull}")
println(s"Deviance: ${summary.deviance}")
println(s"Residual Degree Of Freedom: ${summary.residualDegreeOfFreedom}")
println(s"AIC: ${summary.aic}")
println("Deviance Residuals: ")
summary.residuals().show()
Java:

import java.util.Arrays;

import org.apache.spark.ml.regression.GeneralizedLinearRegression;
import org.apache.spark.ml.regression.GeneralizedLinearRegressionModel;
import org.apache.spark.ml.regression.GeneralizedLinearRegressionTrainingSummary;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;

// Load training data
Dataset<Row> dataset = spark.read().format("libsvm")
  .load("data/mllib/sample_linear_regression_data.txt");

GeneralizedLinearRegression glr = new GeneralizedLinearRegression()
  .setFamily("gaussian")
  .setLink("identity")
  .setMaxIter(10)
  .setRegParam(0.3);

// Fit the model
GeneralizedLinearRegressionModel model = glr.fit(dataset);

// Print the coefficients and intercept for generalized linear regression model
System.out.println("Coefficients: " + model.coefficients());
System.out.println("Intercept: " + model.intercept());

// Summarize the model over the training set and print out some metrics
GeneralizedLinearRegressionTrainingSummary summary = model.summary();
System.out.println("Coefficient Standard Errors: "
  + Arrays.toString(summary.coefficientStandardErrors()));
System.out.println("T Values: " + Arrays.toString(summary.tValues()));
System.out.println("P Values: " + Arrays.toString(summary.pValues()));
System.out.println("Dispersion: " + summary.dispersion());
System.out.println("Null Deviance: " + summary.nullDeviance());
System.out.println("Residual Degree Of Freedom Null: " + summary.residualDegreeOfFreedomNull());
System.out.println("Deviance: " + summary.deviance());
System.out.println("Residual Degree Of Freedom: " + summary.residualDegreeOfFreedom());
System.out.println("AIC: " + summary.aic());
System.out.println("Deviance Residuals: ");
summary.residuals().show();
Python:

from pyspark.ml.regression import GeneralizedLinearRegression

# Load training data
dataset = spark.read.format("libsvm")\
    .load("data/mllib/sample_linear_regression_data.txt")

glr = GeneralizedLinearRegression(family="gaussian", link="identity", maxIter=10, regParam=0.3)

# Fit the model
model = glr.fit(dataset)

# Print the coefficients and intercept for generalized linear regression model
print("Coefficients: " + str(model.coefficients))
print("Intercept: " + str(model.intercept))

# Summarize the model over the training set and print out some metrics
summary = model.summary
print("Coefficient Standard Errors: " + str(summary.coefficientStandardErrors))
print("T Values: " + str(summary.tValues))
print("P Values: " + str(summary.pValues))
print("Dispersion: " + str(summary.dispersion))
print("Null Deviance: " + str(summary.nullDeviance))
print("Residual Degree Of Freedom Null: " + str(summary.residualDegreeOfFreedomNull))
print("Deviance: " + str(summary.deviance))
print("Residual Degree Of Freedom: " + str(summary.residualDegreeOfFreedom))
print("AIC: " + str(summary.aic))
print("Deviance Residuals: ")
summary.residuals().show()

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章