机器学习-8.线性回归(代码片段)

wyply115 wyply115     2022-12-06     713

关键词:

1. 概述

  • 定义:线性回归通过一个或多个自变量(理解为特征)与因变量(理解为目标值)之间进行建模的回归分析。其中可以为一个或多个自变量之间的线性组合(线性回归的一种)。
  • 一元线性回归:涉及到的变量只有一个。
  • 多元线性回归:涉及到的变量两个或两个以上。
  • 通用公式: h ( w ) = w 0 + w 1 x 1 + w 2 x 2 + . . . = w T x h(w)=w_0+w_1x_1+w_2x_2+... = w^Tx h(w)=w0+w1x1+w2x2+...=wTx
    其中w,x为矩阵:
    w = ( w 0 w 1 w 2 ) , x = ( 1 x 1 x 2 ) w=\\left(\\beginmatrixw_0\\\\w_1\\\\w_2\\endmatrix\\right),x=\\left(\\beginmatrix1\\\\x_1\\\\x_2\\endmatrix\\right) w=w0w1w2,x=1x1x2
  • 假设只有单特征(面积)计算目标值(房价)

    我们需要做的是找出一条线(是个迭代计算的过程),这条线和图中的点的误差最小,即损失函数最小。
  • 损失函数(就是误差的平方和):
  • 那么线性回归的目的就是:如何去求模型中的W,使得损失最小?
  • 如何寻找这个W值,有两种求解方式:
    1. 正规方程(非重点):可以直接求到损失最低的点(但特征复杂时很难求出来)
    2. 梯度下降

2. 正规方程与梯度下降

  • 正规方程API:sklearn.linear_model.LinearRegression
  • 梯度下降API:sklearn.linear_model.SGDRegressor
  • 案例:预测波士顿房价,数据集在sklearn.datasets.load_boston中获取,下面是影响房价的特征:
  • 正规方程方式:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler

def linear():
    '''
    线性回归预测房价
    :return: None
    '''
    # 获取数据
    lb = load_boston()

    # 分割数据
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    # 标准化,这里特征值和目标值都必须进行标准化处理
    std_1 = StandardScaler()
    x_train = std_1.fit_transform(x_train)
    x_test = std_1.transform(x_test)

    std_2 = StandardScaler()
    y_train = std_2.fit_transform(y_train.reshape(-1, 1))# 转换为2维数据
    y_test = std_2.transform(y_test.reshape(-1, 1))

    # estimator预测
    # 正规方程求解方式预测结果
    lr = LinearRegression()
    lr.fit(x_train, y_train)
    print(lr.coef_) # 回归系数,即W值
    y_predict = lr.predict(x_test)
    # 由于进行标准化了,所以y_predict需要转回来
    y_predict = std_2.inverse_transform(y_predict)

    print("测试集里每个房子的预测价格:", y_predict)

    return None

if __name__ == '__main__':
    linear()

输出结果部分截图:

  • 梯度下降方式:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import  SGDRegressor
from sklearn.preprocessing import StandardScaler

def linear():
    '''
    线性回归预测房价
    :return: None
    '''
    # 获取数据
    lb = load_boston()

    # 分割数据
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    # 标准化,这里特征值和目标值都必须进行标准化处理
    std_1 = StandardScaler()
    x_train = std_1.fit_transform(x_train)
    x_test = std_1.transform(x_test)

    std_2 = StandardScaler()
    y_train = std_2.fit_transform(y_train.reshape(-1, 1))# 转换为2维数据
    y_test = std_2.transform(y_test.reshape(-1, 1))

    # estimator预测
    # 梯度下降求解方式预测结果
    sgd = SGDRegressor()
    sgd.fit(x_train, y_train)
    print(sgd.coef_) # 回归系数,即W值
    y_predict = sgd.predict(x_test)
    # 由于进行标准化了,所以y_predict需要转回来
    y_predict = std_2.inverse_transform(y_predict)

    print("测试集里每个房子的预测价格:", y_predict)

    return None

if __name__ == '__main__':
    linear()

输出结果部分截图:

3. 回归性能评估

  • 均方误差API:sklearn.metrics.mean_squared_error
  • 以上面的案例中的梯度下降解法为基础,进行评估
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error

def linear():
    '''
    线性回归预测房价
    :return: None
    '''
    # 获取数据
    lb = load_boston()

    # 分割数据
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    # 标准化,这里特征值和目标值都必须进行标准化处理
    std_1 = StandardScaler()
    x_train = std_1.fit_transform(x_train)
    x_test = std_1.transform(x_test)

    std_2 = StandardScaler()
    y_train = std_2.fit_transform(y_train.reshape(-1, 1))# 转换为2维数据
    y_test = std_2.transform(y_test.reshape(-1, 1))

    # estimator预测
    # 梯度下降求解方式预测结果
    sgd = SGDRegressor()
    sgd.fit(x_train, y_train)
    #print(sgd.coef_) # 回归系数,即W值
    y_predict = sgd.predict(x_test)
    # 由于进行标准化了,所以y_predict需要转回来
    y_predict = std_2.inverse_transform(y_predict)
    #print("测试集里每个房子的预测价格:", y_predict)

    # 均方误差进行性能评估
    mse = mean_squared_error(std_2.inverse_transform(y_test),y_predict)
    print("均方误差为:", mse)

    return None

if __name__ == '__main__':
    linear()

输出结果:均方误差为: 29.37517305937515

4. 正规方程与梯度下降对比

5. 过拟合与欠拟合

  • 问题:训练数据训练的很好啊,误差也不大,为什么在测试集上面有问题呢?
  • 欠拟合:一个假设在训练数据上不能获得很好的拟合,但是在训练数据以外的数据集上也不能很好的拟合数据,此时认为这个假设出现了欠拟合现象。(模型过于简单
    下图所示,机器学习到的天鹅特征太少,导致区分标准太粗糙,不能准确识别出天鹅。
  • 过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集上却不能很好的拟合数据,此时认为这个假设出现了过拟合现象。(模型过于复杂
  • 再比如下图所示,更直观的看出欠拟合和过拟合的情况。
  • 欠拟合的原因:学到的数据的特征过少。
  • 欠拟合解决办法:增加数据的特征数量。
  • 过拟合原因:原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点。
  • 过拟合解决办法
  1. 进行特征选择,消除关联性大的特征(很难做)
  2. 交叉验证(让所有数据都有过训练)
  3. L2正则化
  • 正则化解决过拟合的思想:不断尝试减少高次项特征的权重,趋近于0。
  • L2正则化作用:可以使得W的每个元素都很小,都接近于0。
  • 优点:越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。

6. Ridge岭回归(带有正则化的线性回归)解决过拟合

  • API:sklearn.linear_model.Ridge

    alpha取值,根据经验通常情况下会取:0到1之间的小数,或者1-10之间的整数。
    官网给出的正则化力度和权重之间的关系图:正则化力度越大,权重越来越趋近于0(不会等于0)
  • 案例:同上面的波士顿房价一样。
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error

def linear():
    '''
    线性回归预测房价
    :return: None
    '''
    # 获取数据
    lb = load_boston()

    # 分割数据
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    # 标准化,这里特征值和目标值都必须进行标准化处理
    std_1 = StandardScaler()
    x_train = std_1.fit_transform(x_train)
    x_test = std_1.transform(x_test)

    std_2 = StandardScaler()
    y_train = std_2.fit_transform(y_train.reshape(-1, 1))# 转换为2维数据
    y_test = std_2.transform(y_test.reshape(-1, 1))

    # 岭回归进行房价预测
    rd = Ridge(alpha=1.0) #alpha为超参数,可通过网格搜索找到更合适的值
    rd.fit(x_train, y_train)
    #print(rd.coef_)  # 回归系数,即W值
    y_predict = rd.predict(x_test)
    # 由于进行标准化了,所以y_predict需要转回来
    y_predict = std_2.inverse_transform(y_predict)
    #print("测试集里每个房子的预测价格:", y_predict)

    # 均方误差进行性能评估
    mse = mean_squared_error(std_2.inverse_transform(y_test), y_predict)
    print("均方误差为:", mse)

    return None

if __name__ == '__main__':
    linear()

输出:均方误差为: 33.48485484981214

  • 线性回归LinearRegression与Ridge对比:
  • 岭回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。

机器学习线性回归(回炉重造)(代码片段)

机器学习---线性回归1.简单线性回归2.多元线性回归3.线性回归的正规方程解4.衡量线性回归的性能指标MSERMSEMAER-Squared5.scikit-learn线性回归实践-波斯顿房价预测LinearRegression线性回归是属于机器学习里面的监督学习,与分类问题... 查看详情

机器学习_线性回归(代码片段)

线性回归 人工智能是机器学习的父类;机器学习是深度学习的父类 1.怎么做线性回归?2.理解回归--最大似然函数3.应用正态分布概率密度函数--对数总似然4.推导出损失函数--推导出解析解       &... 查看详情

线性回归模型|机器学习(代码片段)

目录1.线性回归模型1.1一元线性回归模型1.2多元线性回归模型1.3损失函数2.相关代码2.1LinearRegression类2.2求解代码2.3绘图代码1.线性回归模型1.1一元线性回归模型简单的讲,一元线性模型就是指只有一个特征量,然后对应带... 查看详情

机器学习一般线性回归(代码片段)

...归"模型。 0.概述线性回归应该是我们听过次数最多的机器学习算法了。在一般的统计学教科书中,最后都会提到这种方法。因此该算法也算是架起了数理统计与机器学习之间的桥梁。线性回归虽然常见,但是却并不简单。该... 查看详情

机器学习导论————线性回归(linerregression)(代码片段)

机器学习导论————线性回归(LinerRegression)一、线性回归的应用场景监督学习-目标值连续房价预测销售额预测贷款额度预测二、什么是线性回归2.1定义与公式线性回归(LinearRegression)是利用回归方程(函数)对... 查看详情

机器学习之线性回归(代码片段)

目录预测数值型数据:回归用线性回归找到最佳拟合直线程序8-1标准回归函数和数据导入函数程序8-2基于程序8-1绘图图片8-1ex0的数据集和它的最佳拟合直线局部加权线性回归图片8-2参数k与权重的关系程序8-3局部加权线性回归函... 查看详情

机器学习—线性回归(代码片段)

一、原理部分:只能图片形式展现了~~~二、Python手工实现线性回归importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltclasslinear_regression(object):#计算均方误差损失defcompute_loss(self,y,y_hat):returnnp.average((y-y_hat)**2)#梯度下降算 查看详情

机器学习线性回归api快速入门(代码片段)

目录1线性回归API2举例2.1步骤分析2.2代码过程3小结1线性回归API机器学习线性回归简介:https://blog.csdn.net/ZGL_cyy/article/details/126918295sklearn.linear_model.LinearRegression()LinearRegression.coef_:回归系数2举例2.1步骤分析1.获取数据 查看详情

机器学习——线性回归(代码片段)

导入类库1fromsklearn.externalsimportjoblib2fromsklearn.model_selectionimporttrain_test_split3fromsklearn.datasetsimportload_boston4fromsklearn.preprocessingimportStandardScaler5fromsklearn.linear_modelimp 查看详情

机器学习(线性相关)(代码片段)

 目录一、线性回归<1>线性回归中的函数<2>线性回归方程绘图​二、多项式回归三、拟合度输出四、线性预测 五、多元回归一、线性回归<1>线性回归中的函数stats.mode()#众数numpy.median()#中位数numpy.mean()#平均数numpy.std... 查看详情

机器学习入门:多变量线性回归(代码片段)

...的两个小技巧。本文分享自华为云社区《【跟着小Mi一起机器学习吧!】多变量线性回归(一)》,原文作者:Skytier。1 多维特征既然是多变量线性回归,那么肯定是存在多个变量或者多个特征的情况啦。就拿之前研究的线... 查看详情

机器学习-线性回归(代码片段)

线性回归简介:之前的文章中介绍过一种回归算法,梯度下降算法,这里再看看另外一个回归算法,线性回归,主要的内容包括简单的线性回归和局部加权回归算法。在回归里面需要考虑的问题就是,我如... 查看详情

机器学习入门三------线性回归(代码片段)

...方法。本模块会先直观介绍线性回归,为介绍线性回归的机器学习方法奠定基础。人们早就知晓,相比凉爽的天气,蟋蟀在较为炎热的天气里鸣叫更为频繁。数十年来,专业和业余昆虫学者已将每分钟的鸣叫声和温度方面的数据... 查看详情

吴恩达机器学习--线性回归(代码片段)

文章目录前言一、单变量线性回归1.导入必要的库2.读取数据3.绘制散点图4.划分数据5.定义模型函数6.定义损失函数7.求权重向量w7.1梯度下降函数7.2最小二乘法8.训练模型9.绘制预测曲线10.试试正则化11.绘制预测曲线12.试试sklearn库... 查看详情

机器学习sklearn监督学习回归算法线性回归linearregression(代码片段)

importnumpyasnpimportmatplotlib.pyplotaspltfromsklearnimportlinear_model#设置中文字体plt.rcParams['font.sans-serif']='SimHei'plt.rcParams['axes.unicode_minus']=False#设置自变量和因变 查看详情

机器学习--线性回归的原理与基础实现(代码片段)

文章目录一、一元线性回归的实现1.1原理1.2Python底层实现一元线性回归二、多元线性回归的实现2.1参考文献2.2代码实现2.3相关性分析三、第三方库实现线性回归四、线性回归案例4.1回归知识复习4.2案例编写一、一元线性回归的实... 查看详情

机器学习基石线性回归(代码片段)

目录写在前面1.线性回归问题2.求解最小的Ein(w)E_in(w)Ein​(w)对应的www3.泛化问题4.与线性分类的对比写在前面本节主要介绍了线性回归原理以及它的可行性,最后与前面学过的线性分类进行了对比分析。1.线性回归问题∙\\bullet... 查看详情

机器学习:局部加权线性回归(locallyweightedlinearregression)(代码片段)

线性回归先复习一下线性回归的损失函数:我们的目标是使该函数最小,用矩阵表示为:对参数w求导得:令上式等于0可估计出回归系数w得最优解:但线性回归往往容易欠拟合,除了使用更复杂得函数拟合... 查看详情