Press "Enter" to skip to content

机器学习(五):线性回归

一、方法介绍

 

线性回归是统计学分析数据的方法,目的在于了解 两个或多个变量间是否相关 ,研究其相关方向与强度,并建立数学模型以便观察特定变量来做 预测 ,由给出的自变量估计因变量的条件期望。

二、算法

 

(一)最小二乘法


缺点:

(1)XT*X必须可逆;

 

(2)特征较多时,求逆运算开销大;

 

(二)梯度下降法

 

梯度下降法是使得代价函数达到最小的经典方法之一。


算法调优 :步长α的选择、算法参数的初始值选择、归一化。
梯度下降法分类 :批量梯度下降BGD、随机梯度下降SGD和小批量梯度下降MBGD

(三)岭回归(Ridge Regression)


λ选择 :一般通过观察确定喇叭口附近的值,此时回归系数趋于稳定,平方误差不太大;但是也不能选太大的λ,因为实际的平方误差已经非常大,为了定量找到最佳参数值,还要进行交叉验证。另外,图中对应系数可以观察哪些变量对结果预测最有影响力。

(四)Lasso回归(Lasso Regression)

(五)坐标轴下降法和梯度下降法的比较:

 

坐标轴下降法在每次迭代中在当前点处沿一个坐标方向进行一维搜索,固定其他的坐标方向,找到一个函数的局部极小值。而梯度下降总是沿着梯度的负方向求函数的局部最小值。

 

坐标轴下降优化方法是一种非梯度优化算法。在整个过程中依次循环使用不同的坐标方向进行迭代一个周期的一维搜索迭代过程相当于一个梯度下降的迭代。

 

梯度下降是利用目标函数的导数来确定搜索方向的该梯度方向可能不与任何坐标轴平行。而坐标轴下降法法是利用当前坐标方向进行搜索,不需要求目标函数的导数 只按照某一坐标方向进行搜索最小值。

 

两者都是迭代方法,且每一轮迭代都需要O(mn)的计算量(m为样本数,n为系数向量的维度)。

 

(六)弹性网(Elastic Net)

(七)三种方法的选择

 

 

算法优缺点
岭回归计算精准(没有丢失特征);不具备特征选择功能
Lasso回归有特征选择功能,但是将某些θ化为0可能丢失特征,造成模型偏差较大
正则化正则化之前通常优先使用岭回归
弹性网特征很多时,尤其多个特征与一个特征相关时优先使用

 

三、模型优化

标准线性回归
带交叉验证的线性回归
利用网格搜索进行参数调优

四、Python代码实现

标准线性回归

#标准线性回归
from sklearn import linear_model
reg = linear_model.LinearRegression()        #创建模型
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) #训练,拟合
reg.predict([[4,4],[5,6]])#预测
reg.coef_#系数
reg.intercept_ #截距
reg.score([[0, 0], [1, 1], [2, 2]], [0, 1, 2]) #R2系数 用测试集测试:预测结果,将结果和真实比较求r2系数

岭回归

#岭回归
from sklearn import linear_model
reg = linear_model.Ridge(alpha=.5)
reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) 
reg.predict([[4,4],[3,4]])#预测
#带交叉验证的岭回归
import warnings
warnings.filterwarnings("ignore") #忽略警告
from sklearn import linear_model
reg = linear_model.RidgeCV(alphas=(0.1,0.2,0.3,0.4,0.5),cv=3)
reg.fit([[0, 0], [0, 0], [1, 1],[2,3]], [0, .1, 1, 2])   
reg.alpha_

lasso回归

#lasso回归
from sklearn import linear_model
reg = linear_model.Lasso(alpha=0.1)
reg.fit([[0, 0], [1, 1]], [0, 1])
reg.predict([[1, 1]])
#带交叉验证的lasso回归
from sklearn.linear_model import LassoCV
from sklearn.datasets import make_regression
X, y = make_regression(noise=4)
reg = LassoCV(alphas=(0.1,0.2,0.3,0.4,0.5),cv=5).fit(X, y)
reg.alpha_

弹性网

#弹性网
from sklearn.linear_model import ElasticNet
from sklearn.datasets import make_regression
X, y = make_regression(n_features=2)
regr = ElasticNet()
regr.fit(X, y)
#带交叉验证的弹性网
from sklearn.linear_model import ElasticNetCV
from sklearn.datasets import make_regression
X, y = make_regression(noise=4)
regr = ElasticNetCV(l1_ratio=[.1, .5, .7, .9, .95, .99, 1],alphas=[1,2],cv=5).fit(X, y)
regr.alpha_


模型的优化:网格搜索

from sklearn import linear_model
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV
def load_data():
    data=pd.read_csv(r'abalone.txt',sep='   ',names=['x1','x2','x3','x4','x5','x6','x7','x8','y'])
    feature=data.loc[:,'x1':'x8']
    label=data['y']
    return np.mat(feature), np.mat(label).T
X, y = load_data()
X, y = StandardScaler().fit_transform(X), StandardScaler().fit_transform(y)
# 参数要先进行粗调节再进行细调节
params={'alpha':[0.001,0.01,0.1,1,10,100]} #粗调节
ridge = linear_model.Ridge()
grid_search=GridSearchCV(ridge,param_grid=params,cv=10) # elasticNet弹性网
grid_search.fit(X, y)
grid_search.best_params_
params={'alpha':[18,19,20,21,22,23]} #细调节
ridge = linear_model.Ridge()#
grid_search=GridSearchCV(ridge,params,cv=10)
grid_search.fit(X, y)
grid_search.best_params_
grid_search.score(X, y)

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注