机器学习——线性回归、逻辑回归、正则化

线性回归

原理

        线性回归的目标是对给定的训练数据以一条直线进行拟合。其不仅可以用来进行预测,还可以评估x和y之间关系的强弱。

        线性回归通过产生一条直线与数据进行拟合,直线表示为:\hat{y}=b_{0}+b_{1}x。其中\hat{y}为线性回归预估的值,b_{0}b_{1}为模型参数。

        为了找到与数据拟合最好的直线,需要定义预测误差。单个数据的误差可以定义为\varepsilon =y_{i}-\hat{y}_{i}。其中y_{i}为数据的真实值。而模型的整体误差可以用SSE表示,SSE定义为SSE=\sum (y_{i}-\hat{y}_{i})^{2}。模型训练需要最小化SSE,这可以使用最小二乘法,根据最小二乘法得到的参数b_{0}b_{1}表示如下:

b_{1}=\frac{\sum x_{i}y_{i}-[(\sum x_{i})(\sum y_{i})]/n}{\sum x_{i}^{2}-(\sum x_{i})^{2}/n}                                                                                              (1)

b_{0}=\bar{y}-b_{1}\bar{x}                                                                                                                                (2)

其中\bar{y}\bar{x}分别为x和y的平均值,n为训练样本数量。

例子

现有数据如表所示:

data
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)可以求出b_{0}=59.4b_{1}=2.42。模型绘制直线如图所示。

机器学习——线性回归、逻辑回归、正则化_第1张图片

          此时,可以根据线性回归模型估算sugars=1g时的Rating。\hat{y}=59.4-2.42*1=56.98

逻辑回归

        上述的线性回归只能用于回归问题,虽然逻辑回归也叫做“回归”,但其实应用于分类问题。逻辑回归通过样本特征计算其属于不同分类的概率,计算方法如下:

p=\frac{e^{b_{0}+b_{1}x}}{1+e^{b_{0}+b_{1}x}}                                                                                                                           (3)

计算得出的p为待测样本属于第1类的概率

正则化

        正则化的提出是为了克服上述的模型中可能存在的过拟合问题。通过添加了一个正则项来减少模型的复杂程度。根据正则项的不同,可以分为L1正则化和L2正则化。通过在代价函数中添加L2正则项就可以得到岭回归,添加L1正则项则得到Lasso回归。

        代价函数可以由均方误差(Mean Squared Error, MSE)表示。

MSE=\tfrac{1}{n}\sum_{i=1}^{n}(\widehat{y}_{i} -y_{i})^{2}                                                                                                              (4)

岭回归

        如式(5)所示,在MSE上添加R2正则项即可得到岭回归的代价函数。

MSE=\tfrac{1}{n}\sum_{i=1}^{n}(\widehat{y}_{i} -y_{i})^{2}+{\color{DarkGreen} \alpha \sum_{i=1}^{m}w^{2}_{i}}                                                                                          (5)​​​​​​​

其中绿色部分为L2正则项。

Lasso回归

        L1正则项与L2正则项类似,只是将L2正则项中的平方改为了绝对值。如式(6)所示,在MSE上添加R1正则项即可得到Lasso回归的代价函数。

MSE=\tfrac{1}{n}\sum_{i=1}^{n}(\widehat{y}_{i} -y_{i})^{2}+{\color{DarkGreen} \alpha \sum_{i=1}^{m}\left |w_{i} \right |}                                                                                         (6)

其中绿色部分为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)))

你可能感兴趣的:(机器学习,逻辑回归,线性回归)