机器学习之线性回归、岭回归、Lasso回归

1、回归算法
分类算法的目标值是标称型数据,而回归的目标变量是连续型数据,主要包括线性回归,岭回归,lasso回归,前向逐步回归。


2、线性回归
线性回归主要用于处理线性数据,结果易于理解,计算复杂度不高,但是处理不了非线性数据。线性回归用最适直线(回归线)去建立因变量Y和一个或多个自变量X之间的关系。可以用公式来表示:Y = wX + b。其中w为权重,也称为回归系数,b为偏置顶。


3、理解线性回归
线性回归从高中数学就接触过了,不过我们主要学习二维形式的线性回归,即y = kx + b。其中斜率k就是权重,截距b就是偏置顶。我们在算法的数据中通常是多维(多特征)的,我们需要找出误差最小的超平面。


4、误差分析(损失函数)
机器学习之线性回归、岭回归、Lasso回归

损失函数定义为平方误差之和:
机器学习之线性回归、岭回归、Lasso回归


5、求解回归系数
求解回归系数通常有两种方法,一种是利用普通最小二乘法,另一种则是梯度下降法。
普通最小二乘法:利用矩阵求解
机器学习之线性回归、岭回归、Lasso回归

在进行矩阵求解中,为了简化运算,我们通常将函数的形式改为y = w1*x1 + w2*x2 + w3*x3 + ...+wn*1(wn*1表示的就是偏置顶b),输入数据处理为(x1,x2,x3,...,1),而我们做回归算法的目的就是求出权重w1,w2,...wn
梯度下降法:利用梯度下降不断迭代寻求最优超平面(详见《统计学习方法》感知机)


6、代码实现
6.1、 Python代码实现:

import numpy as np

def loadDataSet():
    #构造数据集
    x = np.mat([[1, 1 ,1], [1, 2 ,1], [2, 2 ,1], [2, 3 ,1]])#最后一列是偏置顶的转换,都是1
    y = np.mat([[103],[105],[106],[108]])#y=1*x0 + 2*x1 + 100
    return x,y

def standRegres(xMat,yMat):
    #利用矩阵求解回归系数
    xTx = xMat.T*xMat
    if np.linalg.det(xTx) == 0.0:
        #如果行列式等于0 就返回,因为在求解逆矩阵会出现错误
        return
    ws = xTx.I * (xMat.T*yMat)
    return ws

if __name__ == '__main__':
    x_train, y_train = loadDataSet()
    ws = standRegres(x_train,y_train)
    print(ws)

6.2、 sklearn库的实现:

from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split

def Regressor():
    #读取sklearn的数据:波士顿房价
    bos = load_boston()
    x = bos.data
    y = bos.target

    #切割数据集
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)

    #使用普通最下二乘法求解回归系数
    lr = LinearRegression()
    lr.fit(x_train,y_train)
    y_predict_1 = lr.predict(x_test)
    print('我是回归系数:',lr.coef_)#输出回归系数的权重
    print('我是偏置顶:',lr.intercept_)#输出回归系数的偏置顶
    print('我是预测值:',y_predict_1)#输出预测值

    print('----------------------------------我是华丽的分割线----------------------------------------------------')

    #使用梯度下降法求解回归系数
    sr = SGDRegressor()
    sr.fit(x_train, y_train)
    y_predict_2 = sr.predict(x_test)
    print('我是回归系数:',sr.coef_)#输出回归系数的权重
    print('我是偏置顶:',sr.intercept_)#输出回归系数的偏置顶
    print('我是预测值:',y_predict_2)#输出预测值

if __name__ == '__main__':
    Regressor()

7、正则化的线性回归:岭回归与Lasso回归
在使用普通最小二乘法求解回归系数时,会出现两个问题,一个就是数据的特征数目比样本点数目还多,一个是数据存在相同或成比例的行(非满秩矩阵)。此时,在求逆矩阵的时候就会出错。于是,便引进了岭回归,Lasso回归。


8、岭回归
岭回归最先用来处理特征数过多的情况,后来通过加入惩罚项,能够减少不重要的参数
求解公式:机器学习之线性回归、岭回归、Lasso回归
在实际的算法过程中,通常采用交叉验证,寻求最佳的λ值


9、Lasso回归
Lasso回归岭回归非常类似,不同的是求解回归系数的目标函数中使用的惩罚函数是L1范数,效果更好,但是计算会相对复杂一点。


10、代码实现
10.1、岭回归的sklearn库的实现

from sklearn.datasets import load_boston
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

def RidgeReression(alpha):
    #读取sklearn的数据:波士顿房价
    bos = load_boston()
    x = bos.data
    y = bos.target

    #切割数据集
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)

    #使用普通最下二乘法求解回归系数
    rd = Ridge(alpha=alpha)
    rd.fit(x_train,y_train)
    y_predict = rd.predict(x_test)
    error = mean_squared_error(y_predict, y_test)

    # print('我是回归系数:',rd.coef_)#输出回归系数的权重
    # print('我是偏置顶:',rd.intercept_)#输出回归系数的偏置顶
    # print('我是预测值:',y_predict)#输出预测值
    # print('我是方差:',error)
    return error

if __name__ == '__main__':
    alphas = [0,0.001,0.005,0.1,0.5,1,2,3,4,5,10,100,100]
    #交叉验证
    for a in alphas:
        print(a,':',RidgeReression(a))

10.2、Lasso的sklearn库的实现

from sklearn.datasets import load_boston
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

def LassoReression(alpha):
    # 读取sklearn的数据:波士顿房价
    bos = load_boston()
    x = bos.data
    y = bos.target

    # 切割数据集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

    # 使用普通最下二乘法求解回归系数
    ls = Lasso(alpha=alpha)
    ls.fit(x_train, y_train)
    y_predict = ls.predict(x_test)
    error = mean_squared_error(y_predict, y_test)

    # print('我是回归系数:',rd.coef_)#输出回归系数的权重
    # print('我是偏置顶:',rd.intercept_)#输出回归系数的偏置顶
    # print('我是预测值:',y_predict)#输出预测值
    # print('我是方差:',error)
    return error

if __name__ == '__main__':
    alphas = [0, 0.001, 0.005, 0.1, 0.5, 1, 2, 3, 4, 5, 10, 100]
    # 交叉验证
    for a in alphas:
        print(a, ':', LassoReression(a))

猜你喜欢

转载自blog.51cto.com/14065757/2347615