机器学习笔记02——线性回归

  • 周志华《机器学习》第三章
  • https://blog.csdn.net/weixin_45666566/article/details/107137877      其他up主博客总结 


目录

一. 线性回归API初步使用

1.1 步骤分析

1.2 代码过程

二、优化算法

三、案例:波士顿房价预测  

 3.1 正规方程进行波士顿房价预测

3.2 梯度下降法进行波士顿房价预测

​​​​​梯度下降法API:

四、 非线性回归

五、欠拟合和过拟合

六、正则化

 七、维灾难

八、正则化线性模型

8.1 岭回归(Ridge Regression)

8.2 LASSO回归 

8.3 Elastic Net弹性网络 

8.4 Early stopping [了解]

 8.5 岭回归的应用——波士顿房价预测

 波士顿房价预测——Ridge、RidgeCV:

九、模型的保存和加载


一. 线性回归API初步使用

  • sklearn.linear_model.LinearRegression()
    • LinearRegression.coef_ : 返回回归系数

sklearn.linear_model.LinearRegression — scikit-learn 1.1.3 documentationhttps://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression

1.1 步骤分析

  • 1.获取数据
  • 2.数据基本处理
  • 3.特征工程(标准化)
  • 4.机器学习(线性回归)
  • 5.模型评估(均方误差)

1.2 代码过程

  • 导入模块
from sklearn.linear_model import LinearRegression
  • 构造数据集
# 获取数据
x= [
    [80,86],
    [82,80],
    [85,78],
    [90,90],
    [86,82],
    [82,90]
]
y=[84.2,80.6,80.1,90,83.2,87.6]
  • 模型训练
    • 实例化一个估计器
    • 调用fit方法
# 1.实例化一个估计器
estimator = LinearRegression()
# 2.调用fit方法
estimator.fit(x,y)
# 3.查看一下系数值
coef = estimator.coef_
print('系数是:\n',coef)

二、优化算法

机器学习笔记02——线性回归_第1张图片
 

三、案例:波士顿房价预测  

1. 回归当中数据大小不一致,是否会导致结果影响较大,所以要做标准化处理

  • 数据分割与标准化处理
  • 回归预测
  • 线性回归的算法效果评估

2. 回归性能评估

均方误差(Mean Squard Error,MSE) 

sklearn.metrics.mean_squard_error(y_true,y_pred) 

 3.1 正规方程进行波士顿房价预测

 正规方程API:

  • sklearn.linear_model.LinearRegression(fit_intercept = True)
    • 正规方程优化
    • fit_intercept:是否计算偏置
    • LinearRegression.coef_ :回归系数
    • LinearRegression.intercept_:求偏置是什么
# 正规方程
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston  #获取数据
from sklearn.model_selection import train_test_split  #数据集划分
from sklearn.preprocessing import StandardScaler  #特征工程标准化
from sklearn.linear_model import LinearRegression  #机器学习
from sklearn.metrics import mean_squared_error    #模型评估

def linear_model1():
    '''
    正规方程
    '''
    # 1.获取数据
    boston=load_boston()

    # 2.数据基本处理 
    # 2.1 数据集划分
    x_train,x_test,y_train,y_test = train_test_split(boston.data,boston.target,test_size=0.2)

    # 3.特征工程 --标准化(实例化,fit_transform)
    transfer  = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)

    # 4.机器学习(线性回归)
    estimator = LinearRegression()
    estimator.fit(x_train,y_train)
    print('模型的偏置是:\n',estimator.intercept_)

    # 5.模型评估
    # 5.1 预测值和准确率
    y_pre = estimator.predict(x_test)
    print('预测值似乎:\n',y_pre)
    score = estimator.score(x_test,y_test)
    print('准确率是:\n',score)

    # 5.2 均方误差评估
    ret = mean_squared_error(y_test,y_pre)
    print('均方误差是:\n',ret)

if __name__='__main__':
    linear_model1()
模型的偏置是:
 22.590099009901042
预测值似乎:
 [16.18423286  9.4826414  29.97223094 20.92230567 20.18119974 28.0550033
 39.09520032 34.67667493  9.13493858 10.79386927 24.29023285 25.82819773
 20.90636029 12.24051743 11.97957095 20.77288158 15.86035645 24.28428371
...]
准确率是:
 0.7619097471422422
均方误差是:
 22.87140829473221

3.2 梯度下降法进行波士顿房价预测

​​​​​梯度下降法API:

  • sklearn.linear_model.SGDRegression(loss=‘squard_loss’,fit_intercept=True,learning_rate=‘invscaling’,eta0=0.01)
    • SGDRegression 实现了随机梯度下降学习,支持不同的Lasso函数和正则化惩罚项来拟合线性回归模型
    • loss:损失类型
      • loss=‘squard_loss’:普通最小二乘法
    • fit_intercept:是否计算偏置
    • learning_rate: string,optional
      • 学习率填充
      • ‘constant’:eta=eta0 — 常数,后期效果不好
      • ‘optimal’:eta=1.0/(alpha*(t+t0))[default] — 默认,随着t的增大eta变小
      • ‘invscaling’:eta=eta0/pow(t,power_t)
        -POWER_T=0.25:存在父类当中
      • 对于一个常数值的学习率来说,可以使用learning_rate = ‘constant’,并使用eta0来指定学习率。
    • SGDRegressor.coef_:回归系数
    • SGDRegressor.intercept_:偏置2.数据基本处理
  • -2.1 数据集划分
  • 3.特征工程 --标准化
  • 4.机器学习(线性回归)
  • 5.模型评估
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston  #获取数据
from sklearn.model_selection import train_test_split  #数据基本处理
from sklearn.preprocessing import StandardScaler  #特征工程
from sklearn.linear_model import LinearRegression, SGDRegressor    #机器学习(梯度下降法)
from sklearn.metrics import mean_squared_error   #模型评估

def linear_model2():
    '''
    梯度下降法
    '''
    # 1.获取数据
    boston = load_boston
    
    # 2.数据基本处理
    # 2.1数据集划分
    x_train,x_test,y_train,y_test = train_test_split(boston.data, boston.target, test_size = 0.2)
    
    # 3.特征工程: 实例化+fit_transform方法
    transfer = StandardScaler(x_train,x_test)
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)
    
    # 4.机器学习(线性回归)
    estimator = SGDRegressor(max_iter=1000,learning_rate = 'optimal')  #最大迭代次数1000
    estimator.fit(x_train,y_train)
    print('这个模型的偏置是:\n',estimator.intercept_)
    
    # 5.模型评估
    # 5.1 预测值和准确率
    y_pre = estimator.predict(x_test)
    print('预测值是:\n',y_pre)
    
    score = estimator.score(x_test,y_test)
    print('准确率是:\n',score)
    
    # 5.2均方误差
    ret = mean_squared_error(y_test,y_pre)
    print('均方误差是:\n',ret)
    
if __name__ == '__main__':
    linear_model2( )
  • 我们可以尝试着去修改学习率

estimator = SGDRegressor ( max_iter=1000, learning_rate=‘constant’, eta0=0.1 )

四、 非线性回归

  • 例如二次函数、三次函数等等
  • 以后会讨论一些算法,能够自动选择要使用什么特征,观察数据并自动为我们选择什么函数。

五、欠拟合和过拟合

  • 欠拟合原因及解决方法:
    • 原因:学习到数据的特征过少
    • 解决方法:
      • 1)添加其他特征项:很多时候欠拟合是因为特征项不够导致的
      • 2)添加多项式特征:例如添加二次项或者三次项使模型泛化能力更强
  • 过拟合原因及解决办法:
    • 原因:原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点
    • 解决办法:
      • 1)重新清洗数据,导致过拟合的一个原因可能是我们使用的数据不纯
      • 2)增大数据的训练量,还有一个过拟合原因是我们用于训练的数据量太小导致的,训练数据占比过小
      • 3)正则化
      • 4)减少特征数量(维度),防止维灾难

六、正则化

        正则化是结构风险(损失函数+正则化项)最小化策略的体现,是在经验风险(平均损失函数)上加一个正则化项λ f ( ω ) \lambda f(\omega)λf(ω)即参数的一个函数,其中λ \lambdaλ称为正则化参数。正则化的作用就是选择经验风险和模型复杂度同时较小的模型。
        正则化的基本思想:限制高次项的系数,进而防止过拟合。

        防止过拟合的原理:如果我们令λ 的值很大的话,为了使损失函数尽可能的小,所有的参数ω的值都会在一定程度上减小。

  • L2正则化

    • 作用:可以使得其中一些w都很小,都接近于0,削弱某个特征的影响

    • 优点:越小的参数说明模型越简单,越简单的模型则越不容易发生过拟合现象

    • Ridge回归

    • 理解:将高次项前面的系数变得特别小

  • L1正则化

    • 作用:可以使得其中一些w的值直接为0,删除这个特征的影响。

    • LASSO回归

    • 理解:将高次项前面的系数变成0

原理:L1正则化和L2正则化都是在目标函数的后面添加一个正则项用来防止过拟合,L1正则项是基于L1范数,添加一个参数的绝对值和参数的积项;L2正则项是基于L2范数,添加一个参数的平方和和参数的积项    区别:

1.使用不同的方法来调整系数的上限:L1正则项将系数设置为0来进行特征选择,以减少相关性较低的特征;L2正则项是对值比较大的系数进行惩罚但并不设置为0,并且还调整参数λ的值,确保系数不会受到严厉的惩罚,不至于欠拟合。

2.鲁棒性:L1对异常点不敏感,L2对异常点有放大效果。 

3.稳定性:对于新数据的调整,L1变动很大,L2整体变动不大。 答案解析 数据分析只需要简单知道原理和区别就行,公式推导不需要,面试过程中也不会出现。

 七、维灾难

随着维度(特征数量)的增加,分类器性能逐步上升,到达某点之后,其性能便逐渐下降。所以以后维度不要设置太多。

八、正则化线性模型

8.1 岭回归(Ridge Regression)

机器学习笔记02——线性回归_第2张图片

  • λ越大,系数值越小;λ越小,系数值越大。 
  • 在拟合数据时,使模型的权重尽可能小。
  • 前面我们学习了标准线性回归算法,最后求得标准线性回归的代价函数的解析解,如果矩阵 X 的转置与矩阵 X 相乘后的矩阵不是满秩矩阵时,这个矩阵是不可逆的,其本质是多个自变量 x 之间存在多重共线性。
  • 加了惩罚项后,相较于标准线性回归的结果,拟合可能会变差,但是通过人为的控制惩罚项的大小,可以解决自变量多重共线性的问题
  • 多重共线性(Multicollinearity)是指多变量线性回归中,变量之间由于存在精确相关关系或高度相关关系而使回归估计不准确。

8.2 LASSO回归 

         我们学习了解决多重共线性的一种方法是对代价函数正则化,其中一种正则化的算法叫岭回归算法(Ridge Regression Algorithm)。下面我们来学习另一种正则化的算法 - Lasso回归算法1(Lasso Regression Algorithm)。

机器学习笔记02——线性回归_第3张图片

  • Lasso回归的代价函数在w=0处不可导(绝对值在顶点处不可导),所以进行计算的过程中产生很多0,很多特征的系数为0
  • 解决方法:在w=0处用一个次梯度向量代替梯度。
  • lasso回归的重要性质是:倾向于完全消除不重要的权重。
    • 例如,当λ取值较大时,高阶多项式退化为二次甚至线性。 高阶多项式特征的权重置为0.

 机器学习笔记02——线性回归_第4张图片机器学习笔记02——线性回归_第5张图片

8.3 Elastic Net弹性网络 

机器学习笔记02——线性回归_第6张图片

 API:

from sklearn.linear_model import Ridge, ElasticNet, Lasso

8.4 Early stopping [了解]

 Early Stopping也是正则化迭代学习的方法之一

其做法是:在验证错误率达到最小值的时候停止训练。通过限制错误率的阈值,进行停止。

 8.5 岭回归的应用——波士顿房价预测

岭回归API: 

  • sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, solver='auto', normalize=False)
    • alpha:正则化力度,也叫λ,使用默认值即可
      • λ取值:0-1  1-10
    • solver:会根据数据自动选择优化算法,最多sag梯度下降
      • sag:如果数据集、特征都比较大,选择该随机梯度下降法优化
    • normalize:数据是否进行标准化
      • normalize=True,就可以不用再另外fit调用preprocession.StandardScaler标准化数据
    • Ridge.coef_:回归权重
    • Ridge.intercept_:回归偏置

        Ridge方法相当于随机梯度下降法(SGDRegression(penalty='l2', loss='squared_loss')),只不过SGDRegression实现了一个普通的随机梯度下降学习,推荐使用Ridge(实现了SAG:随机平均梯度下降法)

RidgeCV回归API:

  • sklearn.linear_model.RidgeCV(_BaseRidgeCV, RegressorMixin)
    • alpha对应的值可以通过网格搜索进行值的传递,默认alpha=(0.1,1.0,10.0),去尝试哪个值更好,这里的alpha就相当于lambda,正则化力度
    • 具有L2正则化的线性回归,可以进行交叉验证
    • coef_:回归系数
    • normalize=True:默认封装了,对数据进行标准化处理,如果之前StandardScaler进行了标准化,就normalize=False
def _BaseRidgeCV(LinearModel):
    def __init__(self, alphas=(0.1,1.0,10.0),    #alpha就是λ,正则化力度
    fit_intercept=True, normallize=False, scoring=None,
    cv=None, gcv_mode=None,
    store_cv_values=False):

         正则化力度越大,权重系数会越小; 正则化力度越小,权重系数会越大。

 波士顿房价预测——Ridge、RidgeCV:

import pandas as pd
import numpy as np
from sklearn.datasets import load_boston  #获取数据
from sklearn.model_selection import train_test_split  #数据基本处理
from sklearn.preprocessing import StandardScaler  #特征工程
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge #机器学习
from sklearn.externals import joblib #模型保存和加载
from sklearn.metrics import mean_squared_error   #模型评估

def linear_model3():
    '''
    线性回归:岭回归
    '''
    # 1.获取数据
    boston = load_boston
    
    # 2.数据基本处理
    # 2.1数据集划分
    x_train,x_test,y_train,y_test = train_test_split(boston.data, boston.target, test_size = 0.2)
    
    # 3.特征工程: 实例化+fit_transform方法
    transfer = StandardScaler(x_train,x_test)
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.fit_transform(x_test)
    
    # 4.机器学习(线性回归)
    # 4.1 模型训练
    #estimator = Ridge(alpha=1)#岭回归
    estimator = RidgeCV(alphas=(0.001,0.1,1,10.0,100.0)#RidgeCV,正则系数,自动选择
    
    # 4.2 模型保存
    joblib.dump(estimator,'./data/linghuigui.pkl')
    estimator.fit(x_train,y_train)
    print('这个模型的偏置是:\n',estimator.intercept_)
    
    # 5.模型评估
    # 5.1 预测值和准确率
    y_pre = estimator.predict(x_test)
    print('预测值是:\n',y_pre)
    
    score = estimator.score(x_test,y_test)
    print('准确率是:\n',score)
    
    # 5.2均方误差
    ret = mean_squared_error(y_test,y_pre)
    print('均方误差是:\n',ret)
    
if __name__ == '__main__':
    linear_model3()

        通过比较正规方程、梯度下降法、岭回归(Ridge)三者的结果(均方误差大小),发现岭回归比梯度下降法好一些,但是没有正规方程好。但是只要比梯度下降法好就OK,因为岭回归使用了正则化且使用了SAG梯度下降法。所以以后选择随机梯度下降和SAG梯度下降时,优先选择SAG梯度下降。

九、模型的保存和加载

sklearn模型的保存和加载API

  • from sklearn.externals import joblib
    • 保存:joblib.dump(eatimator, 'file_name.pkl') #保存哪个训练模型eatimator,保存的名字(后缀是**.pkl)
    • 加载:estimator = joblib.load('file_name.pkl'),需要一个变量承接

 实例在岭回归的波士顿房价预测案例中。将模型保存之后,注释掉模型训练和保存代码,利用

estimator = joblib.load('./data/test.pkl')#加载模型

进行模型加载,如果没有成功加载输出结果,说明没有成功。如果数据时固定的,那么结果也应该相同。

你可能感兴趣的:(机器学习,python)