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

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


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


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


4、误差分析(损失函数)

损失函数定义为平方误差之和:


5、求解回归系数
求解回归系数通常有两种方法,一种是利用普通最小二乘法,另一种则是梯度下降法。
普通最小二乘法:利用矩阵求解

在进行矩阵求解中,为了简化运算,我们通常将函数的形式改为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、岭回归
岭回归最先用来处理特征数过多的情况,后来通过加入惩罚项,能够减少不重要的参数
求解公式:
在实际的算法过程中,通常采用交叉验证,寻求最佳的λ值


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))

原文地址:http://blog.51cto.com/14065757/2347615

时间: 2024-10-13 14:45:45

机器学习之线性回归、岭回归、Lasso回归的相关文章

笔记︱范数正则化L0、L1、L2-岭回归&Lasso回归(稀疏与特征工程)

一.正则化背景 监督机器学习问题无非就是"minimizeyour error while regularizing your parameters",也就是在规则化参数的同时最小化误差.最小化误差是为了让我们的模型拟合我们的训练数据, 而规则化参数是防止我们的模型过分拟合我们的训练数据. 问题背景:参数太多,会导致我们的模型复杂度上升,容易过拟合. 作用: 1.约束参数,降低模型复杂度. 2.规则项的使用还可以约束我们的模型的特性.这样就可以将人对这个模型的先验知识融入到模型的学习当

线性回归——lasso回归和岭回归(ridge regression)

目录 线性回归--最小二乘 Lasso回归和岭回归 为什么 lasso 更容易使部分权重变为 0 而 ridge 不行? References 线性回归很简单,用线性函数拟合数据,用 mean square error (mse) 计算损失(cost),然后用梯度下降法找到一组使 mse 最小的权重. lasso 回归和岭回归(ridge regression)其实就是在标准线性回归的基础上分别加入 L1 和 L2 正则化(regularization). 本文的重点是解释为什么 L1 正则化会

【机器学习】线性回归之自行车数据 版本1——简易版

数据说明 数据来源:http://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset 数据说明:仅使用day.csv文件 字段说明:Instant记录号 Dteday:日期 Season:季节 1=春天 2=夏天  3=秋天  4=冬天 yr:年份(0: 2011, 1:2012) mnth:月份( 1 to 12) holiday:是否是节假日 weekday:星期中的哪天,取值为 0-6 workingday:是否工作日 1=工作日 (非

线性回归、岭回归和LASSO回归

尽管有些内容还是不懂,先截取的摘录. 1.变量选择问题:从普通线性回归到lasso 使用最小二乘法拟合的普通线性回归是数据建模的基本方法.其建模要点在于误差项一般要求独立同分布(常假定为正态)零均值.t检验用来检验拟合的模型系数的显著性,F检验用来检验模型的显著性(方差分析).如果正态性不成立,t检验和F检验就没有意义. 对较复杂的数据建模(比如文本分类,图像去噪或者基因组研究)的时候,普通线性回归会有一些问题:(1)预测精度的问题 如果响应变量和预测变量之间有比较明显的线性关系,最小二乘回归会

机器学习-正则化(岭回归、lasso)和前向逐步回归

机器学习-正则化(岭回归.lasso)和前向逐步回归 本文代码均来自于<机器学习实战> 这三种要处理的是同样的问题,也就是数据的特征数量大于样本数量的情况.这个时候会出现矩阵不可逆的情况,为什么呢? 矩阵可逆的条件是:1. 方阵 2. 满秩 X.t*X必然是方阵(nxmxmxn=nxn,最终行列数是原来的X矩阵的列数,也就是特征数),但是要满秩的话,由于线性代数的一个结论,X.t*X的秩不会比X大,而X的秩是样本数和特征数中较小的那一个,所以,如果样本数小于特征数的话,X.t*X就不会是可逆的

岭回归和lasso回归(转)

回归和分类是机器学习算法所要解决的两个主要问题.分类大家都知道,模型的输出值是离散值,对应着相应的类别,通常的简单分类问题模型输出值是二值的,也就是二分类问题.但是回归就稍微复杂一些,回归模型的输出值是连续的,也就是说,回归模型更像是一个函数,该函数通过不同的输入,得到不同的输出. 那么,什么是线性回归,什么是非线性回归呢? 线性回归与非线性回归 前面说了,我们的回归模型是一个函数是吧,那么线性回归就是模型函数是由若干个基本函数线性加权得到的函数.也就是每一个基本函数前面都有一个权值来调和自己对

用Python实现岭回归算法与Lasso回归算法并处理Iris数据集

在介绍岭回归算法与Lasso回归算法之前,先要回顾一下线性回归算法.根据线性回归模型的参数估计公式可知可知,得到的前提是矩阵可逆.换句话说就是样本各个特征(自变量)之间线性无关.然而在实际问题中,常常会出现特征之间出现多重共线性的情况,使得行列式的值接近于0,最终造成回归系数无解或者无意义. 为了解决这个问题,岭回归算法的方法是在线性回归模型的目标函数之上添加一个l2的正则项,进而使得模型的回归系数有解.具体的岭回归目标函数可表示为如下: 在Python中,岭回归算法的实现方法如下. 在Pyth

用R建立岭回归和lasso回归

1 分别使用岭回归和Lasso解决薛毅书第279页例6.10的回归问题 例6.10的问题如下: 输入例题中的数据,生成数据集,并做简单线性回归,查看效果 cement <- data.frame(X1 = c(7, 1, 11, 11, 7, 11, 3, 1, 2, 21, 1, 11, 10), X2 = c(26,     29, 56, 31, 52, 55, 71, 31, 54, 47, 40, 66, 68), X3 = c(6, 15, 8, 8, 6,     9, 17, 2

岭回归与Lasso回归

线性回归的一般形式 过拟合问题及其解决方法 问题:以下面一张图片展示过拟合问题 解决方法:(1):丢弃一些对我们最终预测结果影响不大的特征,具体哪些特征需要丢弃可以通过PCA算法来实现:(2):使用正则化技术,保留所有特征,但是减少特征前面的参数θ的大小,具体就是修改线性回归中的损失函数形式即可,岭回归以及Lasso回归就是这么做的. 岭回归与Lasso回归 岭回归与Lasso回归的出现是为了解决线性回归出现的过拟合以及在通过正规方程方法求解θ的过程中出现的x转置乘以x不可逆这两类问题的,这两种