机器学习算法基础5-线回归与岭回归

文章目录

    • 一、线回归
      • 1.线性回归的定义
      • 2.线性回归策略-损失函数-最小二乘法
        • 1)最小二乘法之正规方程
        • 2)最小二乘法之梯度下降
      • 3.sklearn线性回归正规方程、梯度下降API
      • 4.线性回归案例-波士顿房价数据集分析
      • 5.回归性能评估
      • 6.LinearRegression与SGDRegressor评估
      • 7.过拟合与欠拟合
      • 8.正则化
    • 二、岭回归

一、线回归

1.线性回归的定义

回归问题的判定?-目标值连续

线性回归:

定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。
其中特点为一个或多个称为回归系数的模型参数的线性组合
通俗理解,就是属性与权重的线性组合

一元线性回归:涉及到的变量只有一个
多元线性回归:涉及到的变量两个或两个以上
通用公式:

机器学习算法基础5-线回归与岭回归_第1张图片

2.线性回归策略-损失函数-最小二乘法

预测结果与真实值的误差大小
机器学习算法基础5-线回归与岭回归_第2张图片

1)最小二乘法之正规方程

找到最小损失对应的W值,数学原理简单
机器学习算法基础5-线回归与岭回归_第3张图片

2)最小二乘法之梯度下降

机器学习算法基础5-线回归与岭回归_第4张图片

3.sklearn线性回归正规方程、梯度下降API

sklearn.linear_model.LinearRegression
# 正规方程

sklearn.linear_model.SGDRegressor
# 梯度下降

•sklearn.linear_model.LinearRegression()
# 普通最小二乘线性回归

# 方法
coef_:回归系数

sklearn.linear_model.SGDRegressor( )
# 通过使用SGD最小化线性模型

# 方法
coef_:回归系数

sklearn优点与缺点:
优点:封装好,建立模型简单、预测简单
缺点:看不到算法的过程,有些参数在算法API内部已经优化好了

tensorflow:封装高低,很多东西可以自己指定

4.线性回归案例-波士顿房价数据集分析

波士顿房价数据案例分析流程:

1、波士顿地区房价数据获取
2、波士顿地区房价数据分割
3、训练与测试数据标准化处理
4、使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行
预测
# 线性回归案例-波士顿房价数据集分析
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

def mylinear():
    '''
    线性回归预测房子价格
    :return:
    '''
    # 一、获得数据
    lb = load_boston()

    # 二、处理数据

    # 1.取得数据集中特征值与目标值
    x = lb.data
    y = lb.target

    # 2.分割数据集  训练集与测试集
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)

    # 三、进行特征工程
    # 1.训练集与测试集标准化处理
    # 特征值与目标值都必须进行标准化处理,实例化两个API,分别处理特征值与目标值
    # 特征值
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    # 目标值
    std_y = StandardScaler()
    # 要求传入的y_train是二维数组,后面也一样,用reshape(-1,1)方法转换
    y_train = std_y.fit_transform(y_train.reshape(-1,1))
    y_test = std_y.transform(y_test.reshape(-1,1))

    # 四、线性回归模型-estimator预测

    # 1.正规方程求解方式预测结果
    lr = LinearRegression()
    lr.fit(x_train, y_train)
    # 回归系数
    print('回归系数为:\n',lr.coef_)
    # 预测测试集房子的价格,
    y_predict = std_y.inverse_transform(lr.predict(x_test))
    print('预测测试集房子的价格:\n',y_predict)

    # 2.梯度下降法对房价进行预测
    sgd = SGDRegressor()
    sgd.fit(x_train, y_train)
    # 回归系数
    print('回归系数为:\n', sgd.coef_)
    # 预测测试集房子的价格,
    y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
    print('预测测试集房子的价格:\n', y_sgd_predict)

    return None
if __name__ == '__main__':
    mylinear()

# 正规方程的回归系数为:
#  [[-0.10585364  0.10729515 -0.01182419  0.10537416 -0.15782269  0.31884582
#   -0.03722253 -0.33811139  0.23264086 -0.21290059 -0.21755264  0.09053632
#   -0.36598622]]

# 梯度下降法的回归系数为:
#  [-0.07640904  0.05813942 -0.04414127  0.13573824 -0.06123698  0.37556306
#  -0.02720198 -0.22558641  0.06958108 -0.07072683 -0.19329438  0.08788201
#  -0.34746047]

5.回归性能评估

机器学习算法基础5-线回归与岭回归_第5张图片

sklearn回归评估API:sklearn.metrics.mean_squared_error

# 均方误差回归损失
mean_squared_error(y_true, y_pred)
# 参数
y_true:真实值
y_pred:预测值
注:真实值,预测值为标准化之前的值

return:浮点数结果

6.LinearRegression与SGDRegressor评估

机器学习算法基础5-线回归与岭回归_第6张图片

特点:线性回归器是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归
器作为大多数系统的首要选择。
 
小规模数据:LinearRegression(不能解决拟合问题)以及其它
大规模数据:SGDRegressor

7.过拟合与欠拟合

过拟合与欠拟合概念:

过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集
上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)

欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很
好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)


对线性模型进行训练学习会变成复杂模型
模型变复杂的原因是数据的特征与目标值之间的关系不仅仅是线性关系

机器学习算法基础5-线回归与岭回归_第7张图片

欠拟合与过拟合原因以及解决办法

欠拟合原因以及解决办法
原因:学习到数据的特征过少
解决办法:增加数据的特征数量

过拟合原因以及解决办法
原因:原始特征过多,存在一些嘈杂特征, 模型过于复杂是因为模型尝试去兼顾各个测试
数据点
解决办法:
1.进行特征选择,消除关联性大的特征(很难做)
2.交叉验证(让所有数据都有过训练)
3.正则化(了解)

•解决办法:
•进行特征选择,消除关联性大的特征(很难做)
•交叉验证(让所有数据都有过训练)
•正则化(了解)

L2正则化:
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象

8.正则化

L2正则化:
作用:可以使得W的每个元素都很小,都接近于0
优点:越小的参数说明模型越简单,越简单的模型则越不
容易产生过拟合现象

二、岭回归

机器学习算法基础5-线回归与岭回归_第8张图片

带有正则化的线性回归-Ridge

岭回归API:
sklearn.linear_model.Ridge

sklearn.linear_model.Ridge(alpha=1.0)
# 具有l2正则化的线性最小二乘法

# 超参数
alpha:正则化力度

# 方法
coef_:回归系数

*机器学习算法基础5-线回归与岭回归_第9张图片

线性回归 LinearRegression与Ridge对比

岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,
变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。
# 线性回归、岭回归案例-波士顿房价数据集分析
import numpy as np
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.metrics import mean_squared_error

def mylinear():
    '''
    线性回归预测房子价格
    :return:
    '''
    # 一、获得数据
    lb = load_boston()

    # 二、处理数据

    # 1.取得数据集中特征值与目标值
    x = lb.data
    y = lb.target

    # 2.分割数据集  训练集与测试集
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)

    # 三、进行特征工程
    # 1.训练集与测试集标准化处理
    # 特征值与目标值都必须进行标准化处理,实例化两个API,分别处理特征值与目标值
    # 特征值
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)

    # 目标值
    std_y = StandardScaler()
    # 要求传入的y_train是二维数组,后面也一样,用reshape(-1,1)方法转换
    y_train = std_y.fit_transform(y_train.reshape(-1,1))
    y_test = std_y.transform(y_test.reshape(-1,1))

    # 四、线性回归模型-estimator预测

    # 1.正规方程求解方式预测结果
    lr = LinearRegression()
    lr.fit(x_train, y_train)
    # 回归系数
    print('正规方程的回归系数为:\n',lr.coef_)
    # 预测测试集房子的价格,
    y_predict = std_y.inverse_transform(lr.predict(x_test))
    print('正规方程预测测试集房子的价格:\n',y_predict)
    # 回归性能评估
    y_test = std_y.inverse_transform(y_test)
    print('正规方程的回归性能评估为:',mean_squared_error(y_test, y_predict))

    # 2.梯度下降法对房价进行预测
    sgd = SGDRegressor()
    sgd.fit(x_train, y_train)
    # 回归系数
    print('梯度下降法的回归系数为:\n', sgd.coef_)
    # 预测测试集房子的价格,
    y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
    print('梯度下降法的预测测试集房子的价格:\n', y_sgd_predict)
    # 回归性能评估
    print('梯度下降法的回归性能评估为:', mean_squared_error(y_test, y_sgd_predict))

    # 3.岭回归进行房价预测
    rd = Ridge(alpha=1.0)

    rd.fit(x_train,y_train)
    # 回归系数
    print('岭回归的回归系数为:\n',rd.coef_)

    # 预测测试集房子价格
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
    print('测试集房子价格为:\n',y_rd_predict)

    # 回归性能评估
    print('岭回归的回归性能评估为:',mean_squared_error(y_test,y_rd_predict))


    # 4.岭回归交叉验证与网格搜索
    rd_1 = Ridge()
    # 网格搜索
    # 构造一些参数的值用于搜索
    param = {'alpha': [0.5, 1.0, 2]}
    gc = GridSearchCV(rd_1, param_grid=param, cv=5)
    gc.fit(x_train, y_train)

    # 预测测试集房子价格
    y_gc_predict = std_y.inverse_transform(gc.predict(x_test))
    # 回归性能评估
    print('岭回归网格搜索的回归性能评估为:',mean_squared_error(y_test,y_gc_predict))
    print('在交叉验证中最好的结果是:\n', gc.best_score_)
    print('最好的参数选择是:\n', gc.best_params_)
    return None
if __name__ == '__main__':
    mylinear()

# 岭回归的回归性能评估为: 16.978116222418087
# 岭回归网格搜索的回归性能评估为: 16.890653980333717

你可能感兴趣的:(算法,python,机器学习,线性回归,岭回归)