廣義線性迴歸
算法介紹:
與線性迴歸假設輸出服從高斯分佈不同,廣義線性模型(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()