线性回归的目标是对给定的训练数据以一条直线进行拟合。其不仅可以用来进行预测,还可以评估x和y之间关系的强弱。
线性回归通过产生一条直线与数据进行拟合,直线表示为:。其中为线性回归预估的值,和为模型参数。
为了找到与数据拟合最好的直线,需要定义预测误差。单个数据的误差可以定义为。其中为数据的真实值。而模型的整体误差可以用SSE表示,SSE定义为。模型训练需要最小化SSE,这可以使用最小二乘法,根据最小二乘法得到的参数和表示如下:
(2)
其中和分别为x和y的平均值,n为训练样本数量。
现有数据如表所示:
Sugars | Rating |
6 | 68.4034 |
8 | 33.9837 |
5 | 59.4255 |
0 | 93.7049 |
8 | 34.3848 |
10 | 29.5095 |
14 | 33.1741 |
8 | 37.0386 |
6 | 49.1203 |
5 | 53.3138 |
12 | 18.0429 |
1 | 50.7650 |
9 | 19.8236 |
7 | 40.4002 |
13 | 22.7364 |
根据公式(1)和(2)可以求出,。模型绘制直线如图所示。
此时,可以根据线性回归模型估算sugars=1g时的Rating。。
上述的线性回归只能用于回归问题,虽然逻辑回归也叫做“回归”,但其实应用于分类问题。逻辑回归通过样本特征计算其属于不同分类的概率,计算方法如下:
计算得出的p为待测样本属于第1类的概率
正则化的提出是为了克服上述的模型中可能存在的过拟合问题。通过添加了一个正则项来减少模型的复杂程度。根据正则项的不同,可以分为L1正则化和L2正则化。通过在代价函数中添加L2正则项就可以得到岭回归,添加L1正则项则得到Lasso回归。
代价函数可以由均方误差(Mean Squared Error, MSE)表示。
如式(5)所示,在MSE上添加R2正则项即可得到岭回归的代价函数。
其中绿色部分为L2正则项。
L1正则项与L2正则项类似,只是将L2正则项中的平方改为了绝对值。如式(6)所示,在MSE上添加R1正则项即可得到Lasso回归的代价函数。
其中绿色部分为L1正则项。
由于L1正则化采用了绝对值的方式,在w趋于0时,其惩罚力度不会变小。因此,采用L1正则化时,模型中的部分w会被调整为0。也就是说,模型会完全丢弃部分特征。
将线性回归,岭回归和Lasso回归应用在波士顿房价数据集的代码实现如下。
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler,PolynomialFeatures
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_boston
from sklearn.datasets import load_iris
from sklearn.linear_model import LinearRegression,Ridge,Lasso
def load_extended_boston():
boston = load_boston()
X = boston.data
X = MinMaxScaler().fit_transform(boston.data)
X = PolynomialFeatures(degree=2, include_bias=False).fit_transform(X)
return X, boston.target
boston = load_boston()
# using extended data
X,y = load_extended_boston()
# using original data
# X,y = boston.data, boston.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# build Linear Regression model and get the result
lr = LinearRegression().fit(X_train, y_train)
print("Training set score of Liner Regression: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score of Liner Regression: {:.2f}".format(lr.score(X_test, y_test)))
# build Ridge Regression model and get the result
# large alpha means more emphasis on regularization rerm
ridge=Ridge(alpha=1).fit(X_train, y_train)
print("Training set score of Ridge Regression: {:.2f}".format(ridge.score(X_train, y_train)))
print("Test set score of Ridge Regression: {:.2f}".format(ridge.score(X_test, y_test)))
# build Lasso Regression model and get the result
lasso=Lasso(alpha=0.01, max_iter=100000).fit(X_train, y_train)
print("Training set score of Lasso Regression: {:.2f}".format(lasso.score(X_train, y_train)))
print("Test set score of Lasso Regression: {:.2f}".format(lasso.score(X_test, y_test)))