精华内容
下载资源
问答
  • 回归
    千次阅读
    2021-01-21 15:06:37

    python 岭回归算法之回归实操

    基本概念

    正则化

    正则化是指对模型做显式约束,以避免过拟合。本文用到的岭回归就是L2正则化。(从数学的观点来看,岭回归惩罚了系数的L2范数或w的欧式长度)

    正则化的具体原理就不在这里多叙述了,感兴趣的朋友可以看一下这篇文章:机器学习中正则化项L1和L2的直观理解

    算法简介

    岭回归

    岭回归也是一种用于回归的线性模型,因此它的模型公式与最小二乘法的相同,如下式所示:

    y=w[0]*x[0]+w[1]*x[1]+w[2]x[2]+…+w[p]x[p]+b

    但在岭回归中,对系数w的选择不仅要在训练数据上得到很好的预测结果,而且还要拟合附加约束。换句话说,w的所有元素都应接近于0。直观上来看,这意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍给出很好的预测结果,这个约束也就是正则化

    数据来源

    波士顿房价:https://www.kaggle.com/altavish/boston-housing-dataset
    也是非常经典的一个数据
    在这里插入图片描述

    简单解释一下这个数据的几个主要指标:
    ZN:25,000平方英尺以上的土地划为住宅用地的比例。
    RM:每个住宅的平均房间数。
    AGE:1940年之前建造的自有住房的比例
    CHAS:有没有河流经过 (如果等于1,说明有,等于0就说明没有)
    CRIM:犯罪率
    MEDV:住房的价格
    其它指标就不用说了,都是一些住房的其它指标,感兴趣的小伙伴可以自己查一下。

    数据挖掘

    1.导入第三方库

    import pandas as pd
    import numpy as np
    import winreg
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import Ridge###导入岭回归算法
    from sklearn.metrics import r2_score
    

    老规矩,上来先依次导入建模需要的各个模块
    2.读取文件

    import winreg
    real_address = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',)
    file_address=winreg.QueryValueEx(real_address, "Desktop")[0]
    file_address+='\\'
    file_origin=file_address+"\\源数据-分析\\HousingData.csv"#设立源数据文件的桌面绝对路径
    house_price=pd.read_csv(file_origin)#https://www.kaggle.com/altavish/boston-housing-dataset
    

    因为之前每次下载数据之后都要将文件转移到python根目录里面,或者到下载文件夹里面去读取,很麻烦。所以我通过winreg库,来设立绝对桌面路径,这样只要把数据下载到桌面上,或者粘到桌面上的特定文件夹里面去读取就好了,不会跟其它数据搞混。
    其实到这一步都是在走流程,基本上每个数据挖掘都要来一遍,没什么好说的。

    3.清洗数据
    1.查找缺失值
    在这里插入图片描述

    可以看到这个数据并包括一些缺失值,并不是很多,所以直接删掉就好了。

    house_price1=house_price.dropna().reset_index()
    del house_price1["index"]
    

    2.突变值查找

    在这里插入图片描述
    一般是看看特征值里面是否包含等于零的数据。其实说的直接一点就是看看数据里面是否包含不符合实际的数值,比如像是犯罪率,实际中不可能出现犯罪率等于0的片区。那么从上面的结果来看,这份数据并没有其它问题。
    这份数据里面的ZN和CHAS都是利用0和1来当作一种指标,所以包含0是很正常的。
    4.建模

    train=house_price1.drop(["MEDV"],axis=1)
    X_train,X_test,y_train,y_test=train_test_split(train,house_price1["MEDV"],random_state=1)
    #将MEDV划分为预测值,其它的属性划分为特征值,并将数据划分成训练集和测试集。
    ridge=Ridge(alpha=10)#确定约束参数
    ridge.fit(X_train,y_train)
    print("岭回归训练模型得分:"+str(r2_score(y_train,ridge.predict(X_train))))#训练集
    print("岭回归待测模型得分:"+str(r2_score(y_test,ridge.predict(X_test))))#待测集
    

    引入ridge算法,进行建模后,对测试集进行精度评分,得到的结果如下:
    在这里插入图片描述

    可以看到,该模型的训练精度为79%左右,对于新的数据来说,模型精度在63%左右。
    至此,这个数据集的将建模就算是完成了。

    讨论

    1.参数的讨论

    由于岭回归与线性回归(最小二乘法)的模型公式是一样的,所以这里我们与线性回归做一个比较。不了解线性回归的朋友可以看一下我的另一篇文章:最小二乘算法之回归实操
    在这里插入图片描述

    之前我们设立的约束参数是10,而上面模型参数设的是0,可以看出模型的训练精度有所提高,但泛化能力有所降低。同时与线性回归模型相比,二者的分数是完全一样的。所以,当岭回归的约束参数设为0时,失去约束的岭回归与普通最小二乘法就是同一个算法。

    2.与普通最小二乘法的比较

    我们通过变换约束参数的取值,来具体看一下岭回归与普通最小二乘法的优缺点。

    result_b=pd.DataFrame(columns=["参数","岭回归训练模型得分","岭回归待测模型得分","线性回归训练模型得分","线性回归待测模型得分"])
    train=house_price1.drop(["MEDV"],axis=1)
    X_train,X_test,y_train,y_test=train_test_split(train,house_price1["MEDV"],random_state=23)
    for i in range(21):
        alpha=i/10#约定参数可以选定为小数
        ridge=Ridge(alpha=alpha)
        ridge.fit(X_train,y_train)
        linear=LinearRegression()
        linear.fit(X_train,y_train)
        result_b=result_b.append([{"参数":alpha,"岭回归训练模型得分":r2_score(y_train,ridge.predict(X_train)),"岭回归待测模型得分":r2_score(y_test,ridge.predict(X_test)),"线性回归训练模型得分":r2_score(y_train,linear.predict(X_train)),"线性回归待测模型得分":r2_score(y_test,linear.predict(X_test))}])
    

    结果如下所示:
    在这里插入图片描述
    可以看出如果只是针对训练模型的精度,最小二乘法是要优于岭回归的,但是对新的数据作出预测时,也就是考虑模型的泛化能力上,可以看出岭回归的模型得分比最小二乘法要好一点。
    我们通过一个折线图来更直观地表现上面的数据:

    import matplotlib.pyplot as plt
    import seaborn as sns
    plt.style.use("fivethirtyeight")
    sns.set_style({'font.sans-serif':['SimHei','Arial']})#设定汉字字体,防止出现方框
    %matplotlib inline
    #在jupyter notebook上直接显示图表
    fig= plt.subplots(figsize=(15,5))
    plt.plot(result_b["参数"],result_b["岭回归训练模型得分"],label="岭回归训练模型得分")#画折线图
    plt.plot(result_b["参数"],result_b["岭回归待测模型得分"],label="岭回归待测模型得分")
    plt.plot(result_b["参数"],result_b["线性回归训练模型得分"],label="线性回归训练模型得分")
    plt.plot(result_b["参数"],result_b["线性回归待测模型得分"],label="线性回归待测模型得分")
    plt.rcParams.update({'font.size': 12})
    plt.legend()
    plt.xticks(fontsize=15)#设置坐标轴上的刻度字体大小
    plt.yticks(fontsize=15)
    plt.xlabel("参数",fontsize=15)#设置坐标轴上的标签内容和字体
    plt.ylabel("得分",fontsize=15)
    

    结果如下所示:
    在这里插入图片描述
    可以看出岭回归模型在模型的简单性(系数都接近于0)与训练集性能之间作出权衡。简单性和训练性能二者对于模型的重要程度可以由用户通过设置aplha参数来制定。增大alpha会使得系数更加趋向于0,从而降低训练集性能,但会提高泛化性能。

    而且无论是岭回归还是线性回归,所有数据集大小对应的训练分数都要高于预测分数。由于岭回归是正则化的,所以它的训练分数要整体低于线性回归的训练分数。但岭回归的测试分数高,特别是对于较小的数据集。如果数据量小于一定程度的时候,线性回归将学不到任何内容,随着模型可用数据越来越多,两个模型的性能都在提升,最终线性回归的性能追上了岭回归。所以如果有足够多的训练内容,正则化变得不那么重要,并且岭回归和线性回归将具有相同的性能。

    个人博客:https://www.yyb705.com/
    欢迎大家来我的个人博客逛一逛,里面不仅有技术文,也有系列书籍的内化笔记。
    有很多地方做的不是很好,欢迎网友来提出建议,也希望可以遇到些朋友来一起交流讨论。

    更多相关内容
  • 本文介绍回归模型的原理知识,包括线性回归、多项式回归和逻辑回归,并详细介绍Python Sklearn机器学习库的LinearRegression和LogisticRegression算法及回归分析实例。进入基础文章,希望对您有所帮助。

    欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

    前一篇文章讲述了数据分析部分,主要普及网络数据分析的基本概念,讲述数据分析流程和相关技术,同时详细讲解Python提供的若干第三方数据分析库,包括Numpy、Pandas、Matplotlib、Sklearn等。本文介绍回归模型的原理知识,包括线性回归、多项式回归和逻辑回归,并详细介绍Python Sklearn机器学习库的LinearRegression和LogisticRegression算法及回归分析实例。进入基础文章,希望对您有所帮助。

    下载地址:

    前文赏析:

    第一部分 基础语法

    第二部分 网络爬虫

    第三部分 数据分析和机器学习

    作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


    监督学习(Supervised Learning)包括分类算法(Classification)和回归算法(Regression)两种,它们是根据类别标签分布的类型来定义的。回归算法用于连续型的数据预测,分类算法用于离散型的分布预测。回归算法作为统计学中最重要的工具之一,它通过建立一个回归方程用来预测目标值,并求解这个回归方程的回归系数。

    一.回归

    1.什么是回归

    回归(Regression)最早是英国生物统计学家高尔顿和他的学生皮尔逊在研究父母和子女的身高遗传特性时提出的。1855年,他们在《遗传的身高向平均数方向的回归》中这样描述“子女的身高趋向于高于父母的身高的平均值,但一般不会超过父母的身高”,首次提出来回归的概念。现在的回归分析已经和这种趋势效应没有任何瓜葛了,它只是指源于高尔顿工作,用一个或多个自变量来预测因变量的数学方法。

    在这里插入图片描述

    图1是一个简单的回归模型,X坐标是质量,Y坐标是用户满意度,从图中可知,产品的质量越高其用户评价越好,这可以拟合一条直线来预测新产品的用户满意度。

    在回归模型中,我们需要预测的变量叫做因变量,比如产品质量;选取用来解释因变量变化的变量叫做自变量,比如用户满意度。回归的目的就是建立一个回归方程来预测目标值,整个回归的求解过程就是求这个回归方程的回归系数。

    简言之,回归最简单的定义就是:

    • 给出一个点集,构造一个函数来拟合这个点集,并且尽可能的让该点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归,如果曲线是一条三次曲线,就被称为三次多项回归。

    2.线性回归

    首先,作者引用类似于斯坦福大学机器学习公开课线性回归的例子,给大家讲解线性回归的基础知识和应用,方便大家的理解。同时,作者强烈推荐大家学习原版Andrew Ng教授的斯坦福机器学习公开课,会让您非常受益。

    在这里插入图片描述

    假设存在表1的数据集,它是某企业的成本和利润数据集。数据集中2002年到2016年的数据集称为训练集,整个训练集共15个样本数据。重点是成本和利润两个变量,成本是输入变量或一个特征,利润是输出变量或目标变量,整个回归模型如图2所示。

    在这里插入图片描述

    现建立模型,x表示企业成本,y表示企业利润,h(Hypothesis)表示将输入变量映射到输出变量y的函数,对应一个因变量的线性回归(单变量线性回归)公式如下:

    在这里插入图片描述

    那么,现在要解决的问题是如何求解的两个参数和。我们的构想是选取的参数和使得函数尽可能接近y值,这里提出了求训练集(x,y)的平方误差函数(Squared Error Function)或最小二乘法。

    在回归方程里,最小化误差平方和方法是求特征对应回归系数的最佳方法。误差是指预测y值和真实y值之间的差值,使用误差的简单累加将使得正差值和负差值相互抵消,所采用的平方误差(最小二乘法)如下:

    在这里插入图片描述

    在数学上,求解过程就转化为求一组值使上式取到最小值,最常见的求解方法是梯度下降法(Gradient Descent)。根据平方误差,定义该线性回归模型的损耗函数(Cost Function)为,公式如下:
    在这里插入图片描述

    选择适当的参数让其最小化min,即可实现拟合求解过程。通过上面的这个示例,我们就可以对线性回归模型进行如下定义:根据样本x和y的坐标,去预估函数h,寻求变量之间近似的函数关系。公式如下:

    在这里插入图片描述

    其中,n表示特征数目,表示每个训练样本的第i个特种值,当只有一个因变量x时,称为一元线性回归,类似于;而当多个因变量时,成为多元线性回归。我们的目的是使最小化,从而最好的将样本数据集进行拟合,更好地预测新的数据。

    多项式回归或逻辑回归相关知识将在后面介绍。


    二.线性回归分析

    线性回归是数据挖掘中基础的算法之一,其核心思想是求解一组因变量和自变量之间的方程,得到回归函数,同时误差项通常使用最小二乘法进行计算。在本书常用的Sklaern机器学习包中将调用Linear_model子类的LinearRegression类进行线性回归模型计算。

    1.LinearRegression

    LinearRegression回归模型在Sklearn.linear_model子类下,主要是调用fit(x,y)函数来训练模型,其中x为数据的属性,y为所属类型。sklearn中引用回归模型的代码如下:

    from sklearn import linear_model          #导入线性模型  
    regr = linear_model.LinearRegression()    #使用线性回归  
    print(regr)
    

    输出函数的构造方法如下:

    LinearRegression(copy_X=True,   
    		fit_intercept=True,   
            n_jobs=1,   
            normalize=False) 
    

    其中参数说明如下:

    • copy_X:布尔型,默认为True。是否对X复制,如果选择False,则直接对原始数据进行覆盖,即经过中心化、标准化后,把新数据覆盖到原数据上。
    • fit_intercept:布尔型,默认为True。是否对训练数据进行中心化,如果是True表示对输入的训练数据进行中心化处理,如果是False则输入数据已经中心化处理,后面的过程不再进行中心化处理。
    • n_jobs:整型,默认为1。计算时设置的任务个数,如果设置为-1表示使用所有的CPU。该参数对于目标个数大于1且规模足够大的问题有加速作用。
    • normalize:布尔型,默认为False。是否对数据进行标准化处理。

    LinearRegression类主要包括如下方法:

    在这里插入图片描述

    • fit(X,y[,n_jobs])
      对训练集X,y进行训练,分析模型参数,填充数据集。其中X为特征,y为标记或类属性。
    • predict(X)
      使用训练得到的估计器或模型对输入的X数据集进行预测,返回结果为预测值。数据集X通常划分为训练集和测试集。
    • decision_function(X)
      使用训练得到的估计器或模型对数据集X进行预测。它与predict(X)区别在于该方法包含了对输入数据的类型检查和当前对象是否存在coef_属性的检查,更安全。
    • score(X, y[,]samples_weight)
      返回对于以X为samples、y为target的预测效果评分。
    • get_params([deep])
      获取该估计器(Estimator)的参数。
    • **set_params(params)
      设置该估计器(Estimator)的参数。
    • coef_
      存放LinearRegression模型的回归系数。
    • intercept_
      存放LinearRegression模型的回归截距。

    现在对前面的企业成本和利润数据集进行线性回归实验。完整代码如下:

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    from sklearn import linear_model     #导入线性模型
    import matplotlib.pyplot as plt       
    import numpy as np
    
    #X表示企业成本 Y表示企业利润
    X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]]
    Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]]
    print('数据集X: ', X)
    print('数据集Y: ', Y)
    
    #回归训练
    clf = linear_model.LinearRegression() 
    clf.fit(X, Y)
    
    #预测结果
    X2 = [[400], [750], [950]]
    Y2 = clf.predict(X2)
    print(Y2)
    res = clf.predict(np.array([1200]).reshape(-1, 1))[0]   
    print('预测成本1200元的利润:$%.1f' % res) 
    
    #绘制线性回归图形
    plt.plot(X, Y, 'ks')                 #绘制训练数据集散点图
    plt.plot(X2, Y2, 'g-')               #绘制预测数据集直线
    plt.show()
    

    调用sklearn包中的LinearRegression()回归函数,fit(X,Y)载入数据集进行训练,然后通过predict(X2)预测数据集X2的利润,并将预测结果绘制成直线,(X,Y)数据集绘制成散点图,如图3所示。

    在这里插入图片描述

    同时调用代码预测2017年企业成本为1200元的利润为575.1元。注意,线性模型的回归系数会保存在coef_变量中,截距保存在intercept_变量中。clf.score(X, Y) 是一个评分函数,返回一个小于1的得分。评分过程的代码如下:

    print('系数', clf.coef_)
    print('截距', clf.intercept_)
    print('评分函数', clf.score(X, Y))
    
    '''
    系数 [[ 0.62402912]]
    截距 [-173.70433885]
    评分函数 0.911831188777
    '''
    

    在这里插入图片描述

    该直线对应的回归函数为:y = 0.62402912 * x - 173.70433885,则X2[1]=400这个点预测的利润值为75.9,而X1中成本为400元对应的真实利润是80元,预测是基本准确的。


    2.线性回归预测糖尿病

    (1).糖尿病数据集
    Sklearn机器学习包提供了糖尿病数据集(Diabetes Dataset),该数据集主要包括442行数据,10个特征值,分别是:年龄(Age)、性别(Sex)、体质指数(Body mass index)、平均血压(Average Blood Pressure)、S1~S6一年后疾病级数指标。预测指标为Target,它表示一年后患疾病的定量指标。原网址的描述如图4所示:

    在这里插入图片描述

    下面代码进行简单的调用及数据规模的测试。

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    from sklearn import datasets
    diabetes = datasets.load_diabetes()                           #载入数据  
    print(diabetes.data)                                          #数据  
    print(diabetes.target)                                        #类标  
    print('总行数: ', len(diabetes.data), len(diabetes.target))         
    print('特征数: ', len(diabetes.data[0]))                      #每行数据集维数  
    print('数据类型: ', diabetes.data.shape)                     
    print(type(diabetes.data), type(diabetes.target))     
    

    调用load_diabetes()函数载入糖尿病数据集,然后输出其数据data和类标target。输出总行数442行,特征数共10个,类型为(442L, 10L)。其输出如下所示:

    [[ 0.03807591  0.05068012  0.06169621 ..., -0.00259226  0.01990842 
      -0.01764613] 
     [-0.00188202 -0.04464164 -0.05147406 ..., -0.03949338 -0.06832974 
      -0.09220405] 
      ... 
     [-0.04547248 -0.04464164 -0.0730303  ..., -0.03949338 -0.00421986 
       0.00306441]] 
    [ 151.   75.  141.  206.  135.   97.  138.   63.  110.  310.  101. 
      ... 
    64.   48.  178.  104.  132.  220.   57.] 
    总行数:  442 442 
    特征数:  10 
    数据类型:  (442L, 10L) 
    <type 'numpy.ndarray'> <type 'numpy.ndarray'>         
    

    (2).代码实现
    现在我们将糖尿病数据集划分为训练集和测试集,整个数据集共442行,我们取前422行数据用来线性回归模型训练,后20行数据用来预测。其中取预测数据的代码为diabetes_x_temp[-20:],表示从后20行开始取值,直到数组结束,共取值20个数。

    整个数据集共10个特征值,为了方便可视化画图我们只获取其中一个特征进行实验,这也可以绘制图形,而真实分析中,通常经过降维处理再绘制图形。这里获取第3个特征,对应代码为:diabetes_x_temp = diabetes.data[:, np.newaxis, 2]。完整代码如下:

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    from sklearn import datasets  
    import matplotlib.pyplot as plt  
    from sklearn import linear_model
    import numpy as np  
    
    #数据集划分
    diabetes = datasets.load_diabetes()                #载入数据  
    diabetes_x_temp = diabetes.data[:, np.newaxis, 2]  #获取其中一个特征  
    diabetes_x_train = diabetes_x_temp[:-20]           #训练样本  
    diabetes_x_test = diabetes_x_temp[-20:]            #测试样本 后20行  
    diabetes_y_train = diabetes.target[:-20]           #训练标记  
    diabetes_y_test = diabetes.target[-20:]            #预测对比标记
    
    #回归训练及预测  
    clf = linear_model.LinearRegression()  
    clf.fit(diabetes_x_train, diabetes_y_train)        #训练数据集  
    pre = clf.predict(diabetes_x_test)
    
    #绘图  
    plt.title(u'LinearRegression Diabetes')            #标题  
    plt.xlabel(u'Attributes')                          #x轴坐标  
    plt.ylabel(u'Measure of disease')                  #y轴坐标    
    plt.scatter(diabetes_x_test, diabetes_y_test, color = 'black')  #散点图   
    plt.plot(diabetes_x_test, pre, color='blue', linewidth = 2)     #预测直线
    plt.show()          
    

    输出结果如图5所示,每个点表示真实的值,而直线表示预测的结果。

    在这里插入图片描述


    (3).代码优化
    下面代码增加了几个优化措施,包括增加了斜率、 截距的计算,可视化绘图增加了散点到线性方程的距离线,增加了保存图片设置像素代码等。这些优化都更好地帮助我们分析真实的数据集。

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    from sklearn import datasets
    import numpy as np
    from sklearn import linear_model
    import matplotlib.pyplot as plt
    
    #第一步 数据集划分
    d = datasets.load_diabetes()  #数据 10*442
    x = d.data
    x_one = x[:,np.newaxis, 2]    #获取一个特征 第3列数据
    y = d.target                  #获取的正确结果
    x_train = x_one[:-42]         #训练集X [  0:400]
    x_test = x_one[-42:]          #预测集X [401:442]
    y_train = y[:-42]             #训练集Y [  0:400]
    y_test = y[-42:]              #预测集Y [401:442]
    
    #第二步 线性回归实现
    clf = linear_model.LinearRegression()
    print(clf)
    clf.fit(x_train, y_train)
    pre = clf.predict(x_test)
    print('预测结果', pre)
    print('真实结果', y_test)
       
    #第三步 评价结果
    cost = np.mean(y_test-pre)**2   #2次方
    print('平方和计算:', cost)
    print('系数', clf.coef_) 
    print('截距', clf.intercept_)  
    print('方差', clf.score(x_test, y_test))
    
    #第四步 绘图
    plt.plot(x_test, y_test, 'k.')      #散点图
    plt.plot(x_test, pre, 'g-')        #预测回归直线
    #绘制点到直线距离
    for idx, m in enumerate(x_test):
        plt.plot([m, m],[y_test[idx], pre[idx]], 'r-')
    
    plt.savefig('blog12-01.png', dpi=300) #保存图片
    plt.show()      
    

    绘制的图形如图6所示。

    在这里插入图片描述

    输出结果如下:

    LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
    预测结果 [ 196.51241167  109.98667708  121.31742804  245.95568858  204.75295782
      270.67732703   75.99442421  241.8354155   104.83633574  141.91879342
      126.46776938  208.8732309   234.62493762  152.21947611  159.42995399
      161.49009053  229.47459628  221.23405012  129.55797419  100.71606266
      118.22722323  168.70056841  227.41445974  115.13701842  163.55022706
      114.10695016  120.28735977  158.39988572  237.71514243  121.31742804
       98.65592612  123.37756458  205.78302609   95.56572131  154.27961264
      130.58804246   82.17483382  171.79077322  137.79852034  137.79852034
      190.33200206   83.20490209]
    真实结果 [ 175.   93.  168.  275.  293.  281.   72.  140.  189.  181.  209.  136.
      261.  113.  131.  174.  257.   55.   84.   42.  146.  212.  233.   91.
      111.  152.  120.   67.  310.   94.  183.   66.  173.   72.   49.   64.
       48.  178.  104.  132.  220.   57.]
    
    平方和计算: 83.192340827
    系数 [ 955.70303385]
    截距 153.000183957
    方差 0.427204267067
    

    其中cost = np.mean(y_test-pre)**2表示计算预测结果和真实结果之间的平方和,为83.192340827,根据系数和截距得出其方程为:y = 955.70303385 * x + 153.000183957。


    三.多项式回归分析

    1.基础概念

    线性回归研究的是一个目标变量和一个自变量之间的回归问题,但有时候在很多实际问题中,影响目标变量的自变量往往不止一个,而是多个,比如绵羊的产毛量这一变量同时受到绵羊体重、胸围、体长等多个变量的影响,因此需要设计一个目标变量与多个自变量间的回归分析,即多元回归分析。由于线性回归并不适用于所有的数据,我们需要建立曲线来适应我们的数据,现实世界中的曲线关系很多都是增加多项式实现的,比如一个二次函数模型:

    在这里插入图片描述

    再或者一个三次函数模型:

    在这里插入图片描述

    这两个模型我们绘制的图形如下所示:

    在这里插入图片描述

    多项式回归(Polynomial Regression)是研究一个因变量与一个或多个自变量间多项式的回归分析方法。如果自变量只有一个时,称为一元多项式回归;如果自变量有多个时,称为多元多项式回归。在一元回归分析中,如果依变量y与自变量x的关系为非线性的,但是又找不到适当的函数曲线来拟合,则可以采用一元多项式回归。17.3小节主要讲解一元多次的多项式回归分析,一元m次多项式方程如下:

    在这里插入图片描述

    其方程的求解过程希望读者下来自行学习,接下来作者主要讲解Python如何代码实现多项式回归分析的。


    2.PolynomialFeatures

    Python的多项式回归需要导入sklearn.preprocessing子类中PolynomialFeatures类实现。PolynomialFeatures对应的函数原型如下:

    class sklearn.preprocessing.PolynomialFeatures(degree=2, 
    		interaction_only=False, 
    		include_bias=True)
    

    PolynomialFeatures类在Sklearn官网给出的解释是:专门产生多项式的模型或类,并且多项式包含的是相互影响的特征集。共有三个参数,degree表示多项式阶数,一般默认值是2;interaction_only如果值是true(默认是False),则会产生相互影响的特征集;include_bias表示是否包含偏差列。

    PolynomialFeatures类通过实例化一个多项式,建立等差数列矩阵,然后进行训练和预测,最后绘制相关图形,接下来与前面的一元线性回归分析进行对比试验。


    3.多项式回归预测成本和利润

    本小节主要讲解多项式回归分析实例,分析的数据集是表17.1提供的企业成本和利润数据集。下面直接给出线性回归和多项式回归分析对比的完整代码和详细注释。

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    from sklearn.linear_model import LinearRegression     
    from sklearn.preprocessing import PolynomialFeatures
    import matplotlib.pyplot as plt       
    import numpy as np
    
    #X表示企业成本 Y表示企业利润
    X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]]
    Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]]
    print('数据集X: ', X)
    print('数据集Y: ', Y)
    
    #第一步 线性回归分析
    clf = LinearRegression() 
    clf.fit(X, Y)                     
    X2 = [[400], [750], [950]]
    Y2 = clf.predict(X2)
    print(Y2)
    res = clf.predict(np.array([1200]).reshape(-1, 1))[0]   
    print('预测成本1200元的利润:$%.1f' % res) 
    plt.plot(X, Y, 'ks')    #绘制训练数据集散点图
    plt.plot(X2, Y2, 'g-')  #绘制预测数据集直线
    
    #第二步 多项式回归分析
    xx = np.linspace(350,950,100) #350到950等差数列
    quadratic_featurizer = PolynomialFeatures(degree = 2) #实例化一个二次多项式
    x_train_quadratic = quadratic_featurizer.fit_transform(X) #用二次多项式x做变换
    X_test_quadratic = quadratic_featurizer.transform(X2)
    regressor_quadratic = LinearRegression()
    regressor_quadratic.fit(x_train_quadratic, Y)
    
    #把训练好X值的多项式特征实例应用到一系列点上,形成矩阵
    xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
    plt.plot(xx, regressor_quadratic.predict(xx_quadratic), "r--",
             label="$y = ax^2 + bx + c$",linewidth=2)
    plt.legend()
    plt.show()    
    

    输出图形如下图所示,其中黑色散点图表示真实的企业成本和利润的关系,绿色直线为一元线性回归方程,红色虚曲线为二次多项式方程。它更接近真实的散点图。

    在这里插入图片描述

    这里我们使用R方(R-Squared)来评估多项式回归预测的效果,R方也叫确定系数(Coefficient of Determination),它表示模型对现实数据拟合的程度。计算R方的方法有几种,一元线性回归中R方等于皮尔逊积矩相关系数(Pearson Product Moment Correlation Coefficient)的平方,该方法计算的R方是一定介于0~1之间的正数。另一种是Sklearn库提供的方法来计算R方。R方计算代码如下:

    print('1 r-squared', clf.score(X, Y))
    print('2 r-squared', regressor_quadratic.score(x_train_quadratic, Y))
    

    输出如下所示:

    ('1 r-squared', 0.9118311887769025)
    ('2 r-squared', 0.94073599498559335)
    

    在这里插入图片描述

    一元线性回归的R方值为0.9118,多项式回归的R方值为0.9407,说明数据集中超过94%的价格都可以通过模型解释。最后补充5次项的拟合过程,下面只给出核心代码。

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    from sklearn.linear_model import LinearRegression     
    from sklearn.preprocessing import PolynomialFeatures
    import matplotlib.pyplot as plt       
    import numpy as np
    
    #X表示企业成本 Y表示企业利润
    X = [[400], [450], [486], [500], [510], [525], [540], [549], [558], [590], [610], [640], [680], [750], [900]]
    Y = [[80], [89], [92], [102], [121], [160], [180], [189], [199], [203], [247], [250], [259], [289], [356]]
    print('数据集X: ', X)
    print('数据集Y: ', Y)
    
    #第一步 线性回归分析
    clf = LinearRegression() 
    clf.fit(X, Y)                     
    X2 = [[400], [750], [950]]
    Y2 = clf.predict(X2)
    print(Y2)
    res = clf.predict(np.array([1200]).reshape(-1, 1))[0]   
    print('预测成本1200元的利润:$%.1f' % res) 
    plt.plot(X, Y, 'ks')    #绘制训练数据集散点图
    plt.plot(X2, Y2, 'g-')  #绘制预测数据集直线
    
    #第二步 多项式回归分析
    xx = np.linspace(350,950,100) 
    quadratic_featurizer = PolynomialFeatures(degree = 5) 
    x_train_quadratic = quadratic_featurizer.fit_transform(X) 
    X_test_quadratic = quadratic_featurizer.transform(X2)
    regressor_quadratic = LinearRegression()
    regressor_quadratic.fit(x_train_quadratic, Y)
    #把训练好X值的多项式特征实例应用到一系列点上,形成矩阵
    xx_quadratic = quadratic_featurizer.transform(xx.reshape(xx.shape[0], 1))
    plt.plot(xx, regressor_quadratic.predict(xx_quadratic), "r--",
             label="$y = ax^2 + bx + c$",linewidth=2)
    plt.legend()
    plt.show()
    print('1 r-squared', clf.score(X, Y))
    print('5 r-squared', regressor_quadratic.score(x_train_quadratic, Y))
    
    # ('1 r-squared', 0.9118311887769025)
    # ('5 r-squared', 0.98087802460869788)
    

    输出如下所示,其中红色虚线为五次多项式曲线,它更加接近真实数据集的分布情况,而绿色直线为一元线性回归方程,显然相较于五次多项式曲线,线性方程拟合的结果更差。同时,五次多项式曲线的R方值为98.08%,非常准确的预测了数据趋势。

    在这里插入图片描述

    最后补充一点,建议多项式回归的阶数不要太高,否则会出现过拟合现象。


    四.逻辑回归

    1.基础原理

    在前面讲述的回归模型中,处理的因变量都是数值型区间变量,建立的模型描述是因变量的期望与自变量之间的线性关系或多项式曲线关系。比如常见的线性回归模型:

    在这里插入图片描述

    而在采用回归模型分析实际问题中,所研究的变量往往不全是区间变量而是顺序变量或属性变量,比如二项分布问题。通过分析年龄、性别、体质指数、平均血压、疾病指数等指标,判断一个人是否换糖尿病,Y=0表示未患病,Y=1表示患病,这里的响应变量是一个两点(0或1)分布变量,它就不能用h函数连续的值来预测因变量Y(Y只能取0或1)。

    总之,线性回归或多项式回归模型通常是处理因变量为连续变量的问题,如果因变量是定性变量,线性回归模型就不再适用了,此时需采用逻辑回归模型解决。

    逻辑回归(Logistic Regression)是用于处理因变量为分类变量的回归问题,常见的是二分类或二项分布问题,也可以处理多分类问题,它实际上是属于一种分类方法。

    在这里插入图片描述

    二分类问题的概率与自变量之间的关系图形往往是一个S型曲线,如图17.10所示,采用的Sigmoid函数实现。这里我们将该函数定义如下:

    在这里插入图片描述

    函数的定义域为全体实数,值域在[0,1]之间,x轴在0点对应的结果为0.5。当x取值足够大的时候,可以看成0或1两类问题,大于0.5可以认为是1类问题,反之是0类问题,而刚好是0.5,则可以划分至0类或1类。对于0-1型变量,y=1的概率分布公式定义如下:

    在这里插入图片描述

    y=0的概率分布公式定义如下:

    在这里插入图片描述

    其离散型随机变量期望值公式如下:

    在这里插入图片描述

    采用线性模型进行分析,其公式变换如下:

    在这里插入图片描述

    而实际应用中,概率p与因变量往往是非线性的,为了解决该类问题,我们引入了logit变换,使得logit§与自变量之间存在线性相关的关系,逻辑回归模型定义如下:

    在这里插入图片描述

    通过推导,概率p变换如下,这与Sigmoid函数相符,也体现了概率p与因变量之间的非线性关系。以0.5为界限,预测p大于0.5时,我们判断此时y更可能为1,否则y为0。

    在这里插入图片描述

    得到所需的Sigmoid函数后,接下来只需要和前面的线性回归一样,拟合出该式中n个参数θ即可。下列为绘制Sigmoid曲线,输出如图10所示。

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    import matplotlib.pyplot as plt
    import numpy as np
    
    def Sigmoid(x):
        return 1.0 / (1.0 + np.exp(-x))
    
    x= np.arange(-10, 10, 0.1)
    h = Sigmoid(x)                #Sigmoid函数
    plt.plot(x, h)
    plt.axvline(0.0, color='k')   #坐标轴上加一条竖直的线(0位置)
    plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted')  
    plt.axhline(y=0.5, ls='dotted', color='k') 
    plt.yticks([0.0, 0.5, 1.0])  #y轴标度
    plt.ylim(-0.1, 1.1)          #y轴范围
    plt.show()
    

    由于篇幅有限,逻辑回归构造损失函数J函数,求解最小J函数及回归参数θ的方法就不在叙述,原理和前面介绍的一样,请读者下去深入研究。

    在这里插入图片描述


    2.LogisticRegression

    LogisticRegression回归模型在Sklearn.linear_model子类下,调用sklearn逻辑回归算法步骤比较简单,即:

    • 导入模型。调用逻辑回归LogisticRegression()函数。
    • fit()训练。调用fit(x,y)的方法来训练模型,其中x为数据的属性,y为所属类型。
    • predict()预测。利用训练得到的模型对数据集进行预测,返回预测结果。

    代码如下:

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    from sklearn.linear_model import LogisticRegression  #导入逻辑回归模型 
    clf = LogisticRegression()
    print(clf)
    clf.fit(train_feature,label)
    predict['label'] = clf.predict(predict_feature)
    

    输出函数的构造方法如下:

    LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
              intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
              penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
              verbose=0, warm_start=False)
    

    这里仅介绍两个参数:参数penalty表示惩罚项,包括两个可选值L1和L2。L1表示向量中各元素绝对值的和,常用于特征选择;L2表示向量中各个元素平方之和再开根号,当需要选择较多的特征时,使用L2参数,使他们都趋近于0。C值的目标函数约束条件为:s.t.||w||1<C,默认值是0,C值越小,则正则化强度越大。


    3.鸢尾花数据集回归分析实例

    下面将结合Scikit-learn官网的逻辑回归模型分析鸢尾花数据集。由于该数据分类标签划分为3类(0类、1类、2类),属于三分类问题,所以能利用逻辑回归模型对其进行分析。

    (1).鸢尾花数据集
    在Sklearn机器学习包中,集成了各种各样的数据集,包括前面的糖尿病数据集,这里引入的是鸢尾花卉(Iris)数据集,它也是一个很常用的数据集。该数据集一共包含4个特征变量,1个类别变量,共有150个样本。其中四个特征分别是萼片的长度和宽度、花瓣的长度和宽度,一个类别变量是标记鸢尾花所属的分类情况,该值包含三种情况,即山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。鸢尾花数据集详细介绍如表2所示:

    在这里插入图片描述

    Class 类别变量。0表示山鸢尾,1表示变色鸢尾,2表示维吉尼亚鸢尾。 int
    iris里有两个属性iris.data,iris.target。data是一个矩阵,每一列代表了萼片或花瓣的长宽,一共4列,每一行代表一个被测量的鸢尾植物,一共采样了150条记录,即150朵鸢尾花样本。

    from sklearn.datasets import load_iris   #导入数据集iris
    iris = load_iris()  #载入数据集
    print(iris.data)
    

    输出如下所示:

    [[ 5.1  3.5  1.4  0.2]
     [ 4.9  3.   1.4  0.2]
     [ 4.7  3.2  1.3  0.2]
     [ 4.6  3.1  1.5  0.2]
     ....
     [ 6.7  3.   5.2  2.3]
     [ 6.3  2.5  5.   1.9]
     [ 6.5  3.   5.2  2. ]
     [ 6.2  3.4  5.4  2.3]
     [ 5.9  3.   5.1  1.8]]
    

    target是一个数组,存储了每行数据对应的样本属于哪一类鸢尾植物,要么是山鸢尾(值为0),要么是变色鸢尾(值为1),要么是维吉尼亚鸢尾(值为2),数组的长度是150。

    print(iris.target)           #输出真实标签
    print(len(iris.target))      #150个样本 每个样本4个特征
    print(iris.data.shape)  
    
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
     1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
     2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
     2 2]
    150
    (150L, 4L)
    

    从输出结果可以看到,类标共分为三类,前面50个类标位0,中间50个类标位1,后面为2。下面给详细介绍使用逻辑回归对这个数据集进行分析的代码。


    (2).散点图绘制
    在载入了鸢尾花数据集(数据data和标签target)之后,我们需要获取其中两列数据或两个特征,再调用scatter()函数绘制散点图。其中获取一个特征的核心代码为:X = [x[0] for x in DD],将获取的值赋值给X变量。完整代码如下:

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.datasets import load_iris    #导入数据集iris
      
    #载入数据集  
    iris = load_iris()  
    print(iris.data)           #输出数据集  
    print(iris.target)         #输出真实标签
    
    #获取花卉两列数据集  
    DD = iris.data  
    X = [x[0] for x in DD]  
    print(X)  
    Y = [x[1] for x in DD]  
    print(Y)  
      
    #plt.scatter(X, Y, c=iris.target, marker='x')
    plt.scatter(X[:50], Y[:50], color='red', marker='o', label='setosa') #前50个样本
    plt.scatter(X[50:100], Y[50:100], color='blue', marker='x', label='versicolor') #中间50个
    plt.scatter(X[100:], Y[100:],color='green', marker='+', label='Virginica') #后50个样本
    plt.legend(loc=2) #左上角
    plt.show()
    

    输出如图11所示:

    在这里插入图片描述


    (3).线性回归分析
    下述代码先获取鸢尾花数据集的前两列数据,再调用Sklearn库中线性回归模型进行分析,完整代码如文件所示。

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    
    #第一步 导入数据集
    from sklearn.datasets import load_iris
    hua = load_iris()
    
    #获取花瓣的长和宽
    x = [n[0] for n in hua.data]
    y = [n[1] for n in hua.data]
    import numpy as np #转换成数组
    x = np.array(x).reshape(len(x),1)
    y = np.array(y).reshape(len(y),1)
    
    #第二步 线性回归分析
    from sklearn.linear_model import LinearRegression
    clf = LinearRegression()
    clf.fit(x,y)
    pre = clf.predict(x)
    print(pre)
    
    #第三步 画图
    import matplotlib.pyplot as plt
    plt.scatter(x,y,s=100)
    plt.plot(x,pre,"r-",linewidth=4)
    for idx, m in enumerate(x):
        plt.plot([m,m],[y[idx],pre[idx]], 'g-')
    plt.show()
    

    输出图形如图12所示,并且可以看到所有散点到拟合的一元一次方程的距离。

    在这里插入图片描述


    (4).逻辑回归分析鸢尾花
    讲解完线性回归分析之后,那如果用逻辑回归分析的结果究竟如何呢?下面开始讲述。从散点图(图11)中可以看出,数据集是线性可分的,划分为3类,分别对应三种类型的鸢尾花,下面采用逻辑回归对其进行分析预测。

    前面使用X=[x[0] for x in DD]获取第一列数据,Y=[x[1] for x in DD]获取第二列数据,这里采用另一种方法,iris.data[:, :2]获取其中两列数据或两个特征,完整代码如下:

    # -*- coding: utf-8 -*-
    # By:Eastmount CSDN 2021-07-03
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.datasets import load_iris   
    from sklearn.linear_model import LogisticRegression 
    
    #载入数据集
    iris = load_iris()         
    X = X = iris.data[:, :2]   #获取花卉两列数据集
    Y = iris.target           
    
    #逻辑回归模型
    lr = LogisticRegression(C=1e5)  
    lr.fit(X,Y)
    
    #meshgrid函数生成两个网格矩阵
    h = .02
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    
    #pcolormesh函数将xx,yy两个网格矩阵和对应的预测结果Z绘制在图片上
    Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.figure(1, figsize=(8,6))
    plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
    
    #绘制散点图
    plt.scatter(X[:50,0], X[:50,1], color='red',marker='o', label='setosa')
    plt.scatter(X[50:100,0], X[50:100,1], color='blue', marker='x', label='versicolor')
    plt.scatter(X[100:,0], X[100:,1], color='green', marker='s', label='Virginica') 
    
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())
    plt.xticks(())
    plt.yticks(())
    plt.legend(loc=2) 
    plt.show()
    

    输出如图13所示。经过逻辑回归后划分为三个区域,左上角部分为红色的圆点,对应setosa鸢尾花;右上角部分为绿色方块,对应virginica鸢尾花;中间下部分为蓝色星形,对应versicolor鸢尾花。散点图为各数据点真实的花类型,划分的三个区域为数据点预测的花类型,预测的分类结果与训练数据的真实结果结果基本一致,部分鸢尾花出现交叉。

    在这里插入图片描述

    下面作者对导入数据集后的代码进行详细讲解。

    • lr = LogisticRegression(C=1e5)
      初始化逻辑回归模型,C=1e5表示目标函数。
    • lr.fit(X,Y)
      调用逻辑回归模型进行训练,参数X为数据特征,参数Y为数据类标。
    • x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    • y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    • xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
      获取鸢尾花数据集的两列数据,对应为花萼长度和花萼宽度,每个点的坐标就是(x,y)。 先取X二维数组的第一列(长度)的最小值、最大值和步长h(设置为0.02)生成数组,再取X二维数组的第二列(宽度)的最小值、最大值和步长h生成数组, 最后用meshgrid函数生成两个网格矩阵xx和yy,如下所示:
    [[ 3.8   3.82  3.84 ...,  8.36  8.38  8.4 ]
     [ 3.8   3.82  3.84 ...,  8.36  8.38  8.4 ]
     ..., 
     [ 3.8   3.82  3.84 ...,  8.36  8.38  8.4 ]
     [ 3.8   3.82  3.84 ...,  8.36  8.38  8.4 ]]
    [[ 1.5   1.5   1.5  ...,  1.5   1.5   1.5 ]
     [ 1.52  1.52  1.52 ...,  1.52  1.52  1.52]
     ..., 
     [ 4.88  4.88  4.88 ...,  4.88  4.88  4.88]
     [ 4.9   4.9   4.9  ...,  4.9   4.9   4.9 ]]
    
    • Z = lr.predict(np.c_[xx.ravel(), yy.ravel()])
      调用ravel()函数将xx和yy的两个矩阵转变成一维数组,由于两个矩阵大小相等,因此两个一维数组大小也相等。np.c_[xx.ravel(), yy.ravel()]是获取并合并成矩阵,即:
    xx.ravel() 
    [ 3.8   3.82  3.84 ...,  8.36  8.38  8.4 ]
    yy.ravel() 
    [ 1.5  1.5  1.5 ...,  4.9  4.9  4.9]
    np.c_[xx.ravel(), yy.ravel()]
    [[ 3.8   1.5 ]
     [ 3.82  1.5 ]
     [ 3.84  1.5 ]
     ..., 
     [ 8.36  4.9 ]
     [ 8.38  4.9 ]
     [ 8.4   4.9 ]]
    

    总之,上述操作是把第一列花萼长度数据按h取等分作为行,并复制多行得到xx网格矩阵;再把第二列花萼宽度数据按h取等分作为列,并复制多列得到yy网格矩阵;最后将xx和yy矩阵都变成两个一维数组,再调用np.c_[]函数将其组合成一个二维数组进行预测。

    • Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
      调用predict()函数进行预测,预测结果赋值给Z。即:
    Z = logreg.predict(np.c_[xx.ravel(), yy.ravel()])
    [1 1 1 ..., 2 2 2]
    size: 39501
    
    • Z = Z.reshape(xx.shape)
      调用reshape()函数修改形状,将Z变量转换为两个特征(长度和宽度),则39501个数据转换为171*231的矩阵。Z = Z.reshape(xx.shape)输出如下:
    [[1 1 1 ..., 2 2 2]
     [1 1 1 ..., 2 2 2]
     [0 1 1 ..., 2 2 2]
     ..., 
     [0 0 0 ..., 2 2 2]
     [0 0 0 ..., 2 2 2]
     [0 0 0 ..., 2 2 2]]
    
    • plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
      调用pcolormesh()函数将xx、yy两个网格矩阵和对应的预测结果Z绘制在图片上,可以发现输出为三个颜色区块,分布表示分类的三类区域。cmap=plt.cm.Paired表示绘图样式选择Paired主题,输出区域如下图所示:

    在这里插入图片描述

    • plt.scatter(X[:50,0], X[:50,1], color=‘red’,marker=‘o’, label=‘setosa’)
      调用scatter()绘制散点图,第一个参数为第一列数据(长度),第二个参数为第二列数据(宽度),第三、四个参数为设置点的颜色为红色,款式为圆圈,最后标记为setosa。

    五.本章小结

    回归分析是通过建立一个回归方程用来预测目标值,并求解这个回归方程的回归系数的方法。它是统计学中最重要的工具之一,包括线性回归、多项式回归、逻辑回归、非线性回归等。常用来确定变量之间是否存在相关关系,并找出数学表达式,也可以通过控制几个变量的值来预测另一个变量的值,比如房价预测、增长趋势、是否患病等问题。

    在Python中,我们通过调用Sklearn机器学习库的LinearRegression模型实现线性回归分析,调用PolynomialFeatures模型实现多项式回归分析,调用LogisticRegression模型实现逻辑回归分析。希望读者实现本章节中的每一部分代码,从而更好的用于自己的研究领域、解决自己遇到的问题。

    该系列所有代码下载地址:

    感谢在求学路上的同行者,不负遇见,勿忘初心。这周的留言感慨~

    在这里插入图片描述

    (By:娜璋之家 Eastmount 2021-07-03 夜于武汉 https://blog.csdn.net/Eastmount )


    参考文献:

    • [1] 杨秀璋. 专栏:知识图谱、web数据挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.
    • [2] 张良均,王路,谭立云,苏剑林. Python数据分析与挖掘实战[M]. 北京:机械工业出版社,2016.
    • [3] (美)Wes McKinney著. 唐学韬等译. 利用Python进行数据分析[M]. 北京:机械工业出版社,2013.
    • [4] Jiawei Han,Micheline Kamber著. 范明,孟小峰译. 数据挖掘概念与技术. 北京:机械工业出版社,2007.
    • [5] 杨秀璋. [Python数据挖掘课] 五.线性回归知识及预测糖尿病实例[EB/OL].(2016-10-28)[2017-11-07]. http://blog.csdn.net/eastmount/article/details/52929765.
    • [6] 杨秀璋. [Python数据挖掘课程] 九.回归模型LinearRegression简单分析氧化物数据[EB/OL]. (2017-03-05)[2017-11-07].http://blog.csdn.net/eastmount/article/
      details/60468818.
    • [7] scikit-learn. sklearn.linear_model.LogisticRegression[EB/OL]. (2017)[2017-11-17]. http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html.
    • [8] scikit-learn. Logistic Regression 3-class Classifier[EB/OL]. (2017)[2017-11-17]. http://scikit-learn.org/stable/auto_examples/linear_model/plot_iris_logistic.html#sphx-glr-auto-examples-linear-model-plot-iris-logistic-py.
    • [9] 吴恩达. Coursera公开课: 斯坦福大学机器学习"[EB/OL]. (2011-2017)[2017-11-15]. http://open.163.com/special/opencourse/machinelearning.html.
    • [10] scikit-learn. Sklearn Datasets[EB/OL]. (2017)[2017-11-15]. http://scikit-learn.org/
      stable/datasets/.
    • [11] lsldd. 用Python开始机器学习(7:逻辑回归分类)[EB/OL]. (2014-11-27)[2017-11-15]. http://blog.csdn.net/lsldd/article/details/41551797.
    • [12] 杨秀璋. [python数据挖掘课程] 十六.逻辑回归LogisticRegression分析鸢尾花数据[EB/OL]. (2017-09-10)[2017-11-15]. http://blog.csdn.net/eastmount/article/details/77920470.
    • [13] 杨秀璋. [python数据挖掘课程] 十八.线性回归及多项式回归分析四个案例分享[EB/OL]. (2017-11-26)[2017-11-26]. http://blog.csdn.net/eastmount/article/details/78635096.
    展开全文
  • 数学建模之统计回归模型详解

    千次阅读 多人点赞 2022-03-17 11:43:37
    码字总结不易,老铁们来个三连:点赞、关注、评论 作者:[左手の明天] ...回归模型是用统计分析方法建立的最常用的一类模型 1、适用的范围:无法分析实际对象的因果关系,建立合乎确定的机理的数学模型,只可能根..

    码字总结不易,老铁们来个三连:点赞、关注、评论
    作者:[左手の明天]
     原创不易,转载请联系作者并注明出处
    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    由于客观事物内部规律的复杂及人们认识程度的限制,无法分析实际对象内在的因果关系,建立合乎机理规律的数学模型。通过对数据的统计分析,找出与数据拟合最好的模型。

    回归模型是用统计分析方法建立的最常用的一类模型

    1、适用的范围:无法分析实际对象的因果关系,建立合乎确定的机理的数学模型,只可能根据数据去建立模型,再根据数据去检验模型。

    2、具体的适用对象:在数学建模中必须用到的统计回归模型的知识

    3、解决步骤:根据已知数据,从常识和经验来判断和分析,辅以作图,决定取那几个回归变量,以及他们的形式。

    目录

    一元线性回归模型

    一元线性回归模型的形式

    matlab实现

    多元线性回归模型

    多元线性回归模型形式

    一般形式

    解析形式

    矩阵形式

    多元线性回归模型的假设

    matlab实现

    1、确定回归系数的点估计值

    2、求回归系数的点估计和区间估计、并检验回归模型

     3、画出残差及其置信区间

    多项式回归模型

    一元多项式回归

    1、回归

    2、预测和预测误差估计

    多元二项式回归 

    非线性回归模型

    逐步回归

    常见模型实例

    线性回归实例——牙膏的销售量

    问题提出

    基本模型

    模型求解

    结果分析

    销售量预测

    模型改进

    两模型销售量预测比较

    两模型与x1,x2关系的比较

    交互作用影响的讨论 

    完全二次多项式模型 

    非线性回归实例——酶促反应

    问题提出

    方案

    分析:酶促反应的基本性质

    基本模型:Michaelis-Menten模型

     解决方案一:线性化模型

     线性化模型结果分析

    解决方案二:非线性化模型

    非线性模型结果分析

    混合反应模型

    混合模型求解

    简化的混合模型 

    一般混合模型与简化混合模型预测比较

    模型评注

    软件开发人员的薪金

    问题提出

    模型假设

    模型:线性回归

    ​模型求解 

    结果

    结果分析:残差分析方法

    模型改进

    模型应用 

    模型评注 

    投资额与国民生产总值和物价指数

    问题提出

    模型分析

    基本回归模型

     结果与分析

    自相关性的定性诊断:残差诊断法

    自回归性的定量诊断:D-W检验 

    D-W统计量与D-W检验

    ​广义差分变换

    投资额新模型的建立  

    新模型的自相关性检验 

    模型结果比较

    投资额预测 


    一元线性回归模型

    一元线性回归模型的形式

    1、估计参数ab,σ^2;

    2、检验模型正确与否;(即b→0)

    3、预测或控制;

    matlab实现

    使用命令regress实现一元线性回归模型的计算

    b = regress (Y, X)   
    
    或
    
    [b, bint, r, rint, stats] = regress(Y, X, alpha) 

    残差及其置信区间可以用rcoplot(r,rint)画图

    例如:为了研究钢材消费量与国民收入之间的关系,在统计年鉴上查得一组历史数据。

    年  份

    1964

    1965

    1966

    ……

    1978

    1979

    1980

    消费(吨)

    698

    872

    988

    ……

    1446

    2736

    2825

    收入(亿)

    1097

    1284

    1502

    ……

    2948

    3155

    3372

    试分析预测若1981年到1985年我国国民收入以4.5%的速度递增,钢材消费量将达到什么样的水平?

    x=[1097  1284  1502  1394  1303  1555  1917  2051  2111  2286  2311  2003  2435  2625  2948  3155  3372];
    y=[698  872  988  807  738  1025  1316  1539  1561  1765  1762  1960  1902  2013  2446  2736  2825];
    plot(x,y,'*')

     

    x=[1097 1284 1502 1394 1303 1555 1917 2051 2111  
       2286 2311 2003 2435 2625 2948 3155  3372];
    y=[698 872 988 807 738 1025 1316 1539 1561  
       1765 1762 1960 1902 2013 2446 2736 2825];
    X=[ones(size(x')),x'],pause    
    [c,cint,r,rint,stats]=regress(y',X,0.05),pause
    
    c =    -460.5282 (参数a)     0.9840 (参数b)
    
    cint =  -691.8478   -229.2085  ( a的置信区间 )
                  0.8779     1.0900  ( b的置信区间 )
    
    r =  [ 79.1248   69.1244  -29.3788 -104.1112  -83.5709  -44.5286
          -109.7219  -18.5724  -55.6100  -23.8029  -51.4019  449.6576
          -33.4128  -109.3651    5.8160   92.1364  -32.3827]’(残差向量)
    
    rint=(略)(参见残差分析图)
    
    stats = 0.9631  391.2713    0.0000

    rcoplot(r,rint)

     预测:

    x1(1)=3372;
    for  i=1:5
       x1(i+1)=1.045*x1(i);
       y1(i+1)=-460.5282+0.9840*x1(i+1);
    end
    x1 = 3372.0   3523.7   3682.3   3848.0  4021.2   4202.1
    y1 =  3006.8    3162.9    3325.9    3496.3    3674.4

    多元线性回归模型

    多元线性回归模型形式

    一般形式

    解析形式

    矩阵形式

    多元线性回归模型的假设

    • 解释变量 Xi 是确定性变量,不是随机变量;解释变量之间互不相关,即无多重共线性。
    • 随机误差项具有0均值和同方差
    • 随机误差项不存在序列相关关系
    • 随机误差项与解释变量之间不相关
    • 随机误差项服从0均值、同方差的正态分布

    matlab实现

    1、确定回归系数的点估计值

    2、求回归系数的点估计和区间估计、并检验回归模型

     3、画出残差及其置信区间

     rcoplot(r, rint)

    例如:某建材公司对某年20个地区的建材销售量Y(千方)、推销开支、实际帐目数、同类商品竞争数和地区销售潜力分别进行了统计。试分析推销开支、实际帐目数、同类商品竞争数和地区销售潜力对建材销售量的影响作用。试建立回归模型,且分析哪些是主要的影响因素。

    设:推销开支——x1 实际帐目数——x2同类商品竞争数——x3地区销售潜力——x4

     

    x1=[5.5 2.5 8 3 3 2.9 8 9 4 6.5 5.5 5 6 5 3.5 8 6 4 7.5 7]';
    x2=[31 55 67 50 38 71 30 56 42 73 60 44 50 39 55 70 40 50 62 59]';
    x3=[10 8 12 7 8 12 12 5 8 5 11 12 6 10 10 6 11 11 9 9]';
    x4=[8 6 9 16 15 17 8 10 4 16 7 12 6 4 4 14 6 8 13 11]';
    y=[79.3 200.1 163.1 200.1 146.0 177.7 30.9 291.9 160 339.4 159.6 86.3 237.5 107.2 155 201.4 100.2 135.8 223.3 195]';
    X=[ones(size(x1)),x1,x2,x3,x4];
    [b,bint,r,rint,stats]=regress(y,X)
    Q=r'*r
    sigma=Q/18
    输出结果是:
    b =  191.9158   -0.7719    3.1725  -19.6811   -0.4501
                 β0         β1         β2         β3            β4
    bint =  103.1071   280.7245……(系数的置信区间)
    r =[  -6.3045   -4.2215 ……8.4422   23.4625    3.3938]
    rint=(略)
    stats =    0.9034(R2)   35.0509(F)    0.0000(p)
    Q = r’*r
    σ^2= Q/(n-2) = 537.2092 (近似)


    多项式回归模型

    一元多项式回归

    1、回归

    (1)确定多项式系数的命令:[p,S]=polyfit(x,y,m)

     (2)一元多项式回归命令:polytool(x,y,m)

    2、预测和预测误差估计

    (1)Y=polyval(p,x)求polyfit所得的回归多项式在x处  的预测值Y;

    (2)[Y,DELTA]=polyconf(p,x,S,alpha)求polyfit所得的回归多项式在x处的预测值Y及预测值的显著性为DELTA

    alpha缺省时为0.5

    方法一

    直接作二次多项式回归:

    t=1/30:1/30:14/30;
    s=[11.86 15.67 20.60 26.69 33.71 41.93 51.13 61.49 72.90   
          85.44 99.08 113.77 129.54 146.48];
    [p,S]=polyfit(t,s,2)
    

    得回归模型为 :

     方法二

    化为多元线性回归:

    t=1/30:1/30:14/30;
    s=[11.86 15.67 20.60 26.69 33.71 41.93 51.13 61.49 72.90   
          85.44 99.08 113.77 129.54 146.48];
    T=[ones(14,1) t' (t.^2)'];
    [b,bint,r,rint,stats]=regress(s',T);
    b,stats
    

    得回归模型为 :


    预测及作图
     

    Y=polyconf(p,t,S)
    
    plot(t,s,'k+',t,Y,'r')

    多元二项式回归 

    例:设某商品的需求量与消费者的平均收入、商品价格的统计数          据如下,建立回归模型,预测平均收入为1000、价格为6时的商品需求量.

    方法一

     直接用多元二项式回归:

    x1=[1000 600 1200 500 300 400 1300 1100 1300 300];
    x2=[5 7 6 6 8 7 5 4 3 9];
    y=[100 75 80 70 50 65 90 100 110 60]';
    x=[x1' x2'];
    rstool(x,y,'purequadratic')

    在左边图形下方的方框中输入1000,右边图形下方的方框中输入6。

    则画面左边的“Predicted Y”下方的数据变为88.47981,即预测出平均收入为1000、价格为6时的商品需求量为88.4791.

    在画面左下方的下拉式菜单中选”all”, 则beta、rmse和residuals都传送到Matlab工作区中.

    在Matlab工作区中输入命令: beta, rmse

     

     方法二

     

     结果为:

    b =
                110.5313
                0.1464
                -26.5709
                -0.0001
                1.8475
    
    stats =
                0.9702   40.6656    0.0005

    非线性回归模型

     (2)非线性回归命令:nlintool(x,y,’model’, beta0,alpha)

    [Y,DELTA]=nlpredci(’model’, x,beta,r,J) 求nlinfit 或nlintool所得的回归函数在x处的预测值Y及预测值的显著性为1-alpha的置信区间Y±DELTA.


    逐步回归

    逐步回归的命令是:

    运行stepwise命令时产生三个图形窗口:Stepwise  Plot,Stepwise  Table,Stepwise  History.

    在Stepwise  Plot窗口,显示出各项的回归系数及其置信区间.

    Stepwise Table 窗口中列出了一个统计表,包括回归系数及其置信区间,以及模型的统计量剩余标准差(RMSE)、相关系数(R-square)、F值、与F对应的概率P.

    例:水泥凝固时放出的热量y与水泥中4种化学成分x1、x2、x3、 x4 有关,今测得一组数据如下,试用逐步回归法确定一线性模型.

     1、数据输入:

    x1=[7 1 11 11 7 11 3 1 2 21 1 11 10]';
    x2=[26 29 56 31 52 55 71 31 54 47 40 66 68]';
    x3=[6 15 8 8 6 9 17 22 18 4 23 9 8]';
    x4=[60 52 20 47 33 22 6 44 22 26 34 12 12]';
    y=[78.5 74.3 104.3 87.6 95.9 109.2 102.7 72.5 93.1 115.9 83.8   
          113.3 109.4]';
    x=[x1 x2 x3 x4];
    

    2、逐步回归:

    (1)先在初始模型中取全部自变量:                    

    stepwise(x,y) 得图Stepwise Plot 和表Stepwise Table

    图Stepwise Plot中四条直线都是虚线,说明模型的显著性不好

    从表Stepwise Table中看出变量x3和x4的显著性最差.

    (2)在图Stepwise Plot中点击直线3和直线4,移去变量x3和x4

    移去变量x3和x4后模型具有显著性.

    虽然剩余标准差(RMSE)没有太大的变化,但是统计量F的 值明显增大,因此新的回归模型更好.


    常见模型实例

    线性回归实例——牙膏的销售量

    问题提出

    建立牙膏销售量与价格、广告投入之间的模型;预测在不同价格和广告费用下的牙膏销售量。

    收集了30个销售周期本公司牙膏销售量、价格、广告费用,及同期其他厂家同类牙膏的平均售价。

    基本模型

    模型求解

    结果分析

    销售量预测

    模型改进

    两模型销售量预测比较

    两模型\hat{y}与x1,x2关系的比较

    交互作用影响的讨论 

    完全二次多项式模型 

     MATLAB中有命令rstool直接求解

     从输出 Export 可得

    鼠标移动十字线(或下方窗口输入)可改变x1, x2, 左边窗口显示预测值 \hat{y}及预测区间

    x1=[-0.0500 0.2500 0.6000 0 0.2500 0.2000 0.1500 0.0500 -0.1500 0.1500 0.0200 0.0100 0.4000 0.4500 0.3500 0.3000 0.5000 0.5000 0.4000 -0.0500 -0.0500 -0.1000 0.2000 0.1000 0.5000 0.6000 -0.0500 0 0.0500 0.5500];
    x2=[5.5000 6.7500 7.2500 5.5000 7.0000 6.5000 6.7500 5.2500 5.2500 6.0000 6.5000 6.2500 7.0000 6.9000 6.8000 6.8000 7.1000 7.0000 6.8000 6.5000 6.2500 6.0000 6.5000 7.0000 6.8000 6.8000 6.5000 5.7500 5.8000 6.8000];
    y=[7.3800 8.5100 9.5200 7.5000 9.3300 8.2800 8.7500 7.8700 7.1000 8.0000 7.8900 8.1500 9.1000 8.8600 8.9000 8.8700 9.2600 9.0000 8.7500 7.9500 7.6500 7.2700  8.0000  8.5000  8.7500 9.2100 8.2700 7.6700 7.9300 9.2600];
    x=[x1',x2'];
    rstool(x,y,'quadratic')
    

     在Matlab工作区中输入命令: beta 得

    beta =
       31.1478
       16.7348
       -8.3212
       -2.4124
        1.5219
        0.7338
    

    非线性回归实例——酶促反应

    问题提出

    研究酶促反应(酶催化反应)中嘌呤霉素对反应速度与底物(反应物)浓度之间关系的影响

    建立数学模型,反映该酶促反应的速度与底物浓度以及经嘌呤霉素处理与否之间的关系

    方案

    设计了两个实验 :酶经过嘌呤霉素处理;酶未经嘌呤霉素处理。实验数据见下表: 

    分析:酶促反应的基本性质

    底物浓度较小时,反应速度大致与浓度成正比;

    底物浓度很大、渐进饱和时,反应速度趋于固定值。

    基本模型:Michaelis-Menten模型

     解决方案一:线性化模型

     线性化模型结果分析

    解决方案二:非线性化模型

    x=[0.02 0.02 0.06 0.06 0.11 0.11 0.22 0.22 0.56 0.56 1.10 1.10];
    y=[76 47 97 107 123 139 159 152 191 201 207 200];
    beta0=[195.8027 0.04841];
    [beta,R,J]=nlinfit(x,y,'hx',beta0);
    betaci=nlparci(beta,R,J);
    beta,betaci
    yy=beta(1)*x./(beta(2)+x);
    plot(x,y,'o',x,yy,'+'),pause
    nlintool(x,y,'hx',beta)
    

    非线性模型结果分析

    混合反应模型

    在同一模型中考虑嘌呤霉素处理的影响,用未经嘌呤霉素处理的模型附加增量的方法。

    混合模型求解

    简化的混合模型 

    一般混合模型与简化混合模型预测比较

    模型评注

    软件开发人员的薪金

    问题提出

    建立模型研究薪金与资历、管理责任、教育程度的关系

    分析人事策略的合理性,作为新聘用人员薪金的参考

    46名软件开发人员的档案资料

    资历~ 从事专业工作的年数;

    管理~ 1=管理人员,0=非管理人员;

    教育~ 1=中学,2=大学,3=更高程度

    模型假设

    假设: y~ 薪金,x1 ~资历(年)               x2 = 1~ 管理人员,0~ 非管理人员

    假设: 资历每加一年薪金的增长是常数;               管理、教育、资历之间无交互作用

    模型:线性回归

    模型求解 

     

    Matlab程序: xinjindata.m  xinjin.m

    xinjindata.m:

    序号、工资y、资历x1、管理x2、学历、x3、x4、xx

    xinjin.m :

    M=dlmread('xinjindata.m');
    x1=M(:,3);x2=M(:,4);x3=M(:,6);x4=M(:,7);y=M(:,2);
    x=[ones(size(x1)) x1 x2 x3 x4 ]
    [b,bi,r,ri,s]=regress(y,x)
    

    结果

    结果分析:残差分析方法

     

     

     残差大概分成3个水平,6种管理—教育组合混在一起,未正确反映 

     

     

     残差全为正,或全为负,管理—教育组合处理不当

    模型改进

    模型应用 

    模型评注 

    • 对定性因素(如管理、教育),可以引入0-1变量处理,0-1变量的个数应比定性因素的水平少1
    • 残差分析方法可以发现模型的缺陷,引入交互作用项常常能够改善模型
    • 剔除异常数据,有助于得到更好的结果
    • 可以直接对6种管理—教育组合引入5个0-1变量

    投资额与国民生产总值和物价指数

    问题提出

    建立投资额模型,研究某地区实际投资额与国民生产总值 ( GNP ) 及物价指数 ( PI ) 的关系

    根据对未来GNP及PI的估计,预测未来投资额 

    模型分析

    许多经济数据在时间上有一定的滞后性

    以时间为序的数据,称为时间序列 

    时间序列中同一变量的顺序观测值之间存在自相关

    若采用普通回归模型直接处理,将会出现不良后果

    需要诊断并消除数据的自相关性,建立新的模型

    基本回归模型

     结果与分析

    自相关性的定性诊断:残差诊断法

    自回归性的定量诊断:D-W检验 

    D-W统计量与D-W检验

    广义差分变换

    投资额新模型的建立  

     

    新模型的自相关性检验 

    模型结果比较

    投资额预测 

    对未来投资额yt 作预测,需先估计出未来的国民生产总值x1t 和物价指数 x2t

    文章到这里就介绍了,有没有收获满满,那就快巩固吧,当然看到这里说明你是好学的,毕竟文章这么长,觉得不错的话来个三连~~~~

    展开全文
  • 在本文中,我们以美国南瓜数据为例,讲解了三种线性回归的原理与使用方法,探寻数据之间的相关性,并构建了6种线性回归模型。将准确率从一开始的0.04提升到0.96.

    本文所用数据均可免费下载

    ps:1万多字写了四天,累死我了;如有错别字请评论告诉我。创作不易,恳请四联🥰

    课前测验464149337166404d83bc7badc11f304a.png

    目录

    一、内容介绍

    二、理论实践

    1.学习准备

    ①数据准备

    ②运行环境

    2.提出问题

    3.线性回归概念及数学原理

    ①简单线性回归理论

    ②多项式线性回归理论

    ③多元线性回归理论

    4.相关系数概念

    5.寻找相关性

    6.分类特征变量的处理

    6.简单线性回归

    ①调用Python库

    ②数据格式转换

    ③划分数据集

    ④训练模型

    ⑤模型评估

    ⑥南瓜种类回归

    7.多项式回归

    ①销售日期-南瓜价格

    ②南瓜种类-南瓜价格

    8.多元线性回归

    ①数据准备

    ②划分数据集

    ③训练模型

    ④评估模型

    ⑤多元线性回归(多项式)

    三、内容总结


     

    一、内容介绍

            在前一篇文章中,我们已经在南瓜定价数据集的示例数据中探索了线性回归,本文中我们将使用之前处理好的数据比较简单线性回归、多项式线性回归以及多元线性回归。并使用Matplotlib库对其进行可视化。

            现在,你已经准备好更加深入的了解机器学习的回归。虽然可视化可以让你更好的理解数据,但机器学习的真正力量来自于训练模型。机器学习模型通过历史数据(先验知识)进行训练以自动捕获(寻找)数据间的依赖关系(规律),并通过此规律预测新输入的结果。

            在本文中,我将带你了解三种回归类型:简单线性回归、多项式回归以及多元线性回归。以及这些技术背后的一些数学知识。这些不同的模型将使我们能够根据不同的输入数据预测南瓜价格。

    在整个课程中,为了使本文的受众更广,文章中尽量避免了数学知识,但为了更好的学习效果,请大家多多注意图表,标注和其他学习工具,以帮助理解。

     

    二、理论实践

    1.学习准备

    ①数据准备

            你现在应该熟悉我们正在研究的南瓜数据的结构。你可以在上一篇文章中得知它已经过预处理。数据已经上传到我的资源,免费下载即可。

            输入以下代码:查看本文需要的数据:

    import pandas as pd#调用pandas库并命名为pd 
    new_pumpkins =pd.read.csv("new_pumpkins.csv")#利用pandas库打开csv数据 
    print(new_pumpkins.head())#查看数据的前5行 
    new_pumpkins.info() #查看数据组织结构

    图1 new_pumpkins

    da0e1abe21b04e41b8bfc02bf67bd44f.png

            在图1中我们查看之前处理好的new_pumpkins数据,其中的DayOfYear列表示销售日期,如267代表一年中的第267天,这是为了按天数可视化数据。计算代码如下:

    day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)

    图2 数据组织结构

    3b831c41dddf482887c76cb844758ff9.png

            查看数据结构,可以看出销售日期DayOfYear是数值类型,南瓜种类Variety是Object类型。

     

    ②运行环境

            开发环境依旧是Jupyter notebook,安装方法可见前文。

    e39c0625c0d94f66bf3b6814ed34b73b.png

     

    2.提出问题

            在你开始练习之前,提出你的问题。

    0 什么时候是购买南瓜的最佳时间?

    1 我如何预测一箱迷你南瓜的价格?

    2 我应该在用1/2 bushel的篮子里买它们,还是用10/9 Bushel的篮子买?让我们继续深入研究这些数据。(buhsel是体积测量的单位)

     

    3.线性回归概念及数学原理

            线性回归包括简单线性回归(一元线性回归)、多项式回归、多元线性回归

            简单线性回归可以看作是次数和特征数量为1的多元线性回归。多项式回归也可以转化为多元线性回归。

            之前我们学到:线性回归练习的目标是能够绘制一条回归线来。且:

    0 显示变量关系。显示变量之间的关系

    1 进行预测。准确预测新数据点与该线的关系。

            最小二乘回归就是绘制回归线的常用方法。最小二乘法(Least squares)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳匹配函数。利用最小二乘法可以方便地求得未知的线性函数,并使得线性函数拟合的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其核心就是保证所有数据偏差的平方和最小。

            使用最小二乘法是因为我们想要对一条距离所有数据点的累积误差最小的线进行建模。我们对误差进行平方是因为我们关注的是误差的大小而不是方向。

    图3 线性回归

    635d8deac4b647e8adddac169c31b681.png

            最小二乘回归线也称为最佳拟合线,可以用一个式子来表示:

    Y = wX + b

            X是“自变量”。 Y是“因变量”。直线的斜率是w,也称权重或系数;a 是 Y的截距,也称常数项系数。

            这与我们初中所学的斜线方程并无区别,原理一样:

    Y = kX + b

    (k是斜率,b是截距)

            在这里我们思考一下,因为监督分类是有训练的机器学习,因此我们训练的数据中已经包括了特征变量X与预测标签Y,我们基于最小二乘回归模型需要求解的参数只有w与b。那么我们训练此模型的流程就可以分为:

    0 计算斜率与截距

    1 测试评估模型

            随着特征变量的增多,我们需要计算的w(系数或斜率)也增多,截距或常量b则始终只有一个。

            回忆之前南瓜数据的原始问题:“按月预测每bushel(体积单位)南瓜的价格”,是指将月份作为自变量X。将南瓜价格作为因变量Y。根据拟合出的回归线,我们便可根据月份预测出当月的南瓜价格。反之,如果知道南瓜价格,也能预测出月份!但预测结果不仅取决于斜率w,也取决于截距b。

            你可以在这个网站输入数据点来拟合回归线,或者使用Excel尝试。

     

    ①简单线性回归理论

            我们以及了解了线性回归的数学原理,所谓简单线性回归,就是单变量的线性回归,如销售日期与南瓜价格的线性关系或南瓜种类与南瓜价格的线性关系,简单线性回归的回归线是一条直线。它可以单方面的探索特征间的相关性。

     

    ②多项式线性回归理论

            虽然变量之间有时存在线性关系 。如南瓜体积越大,价格越高;但并不是所有的关系都是呈现线性,在这种情况下一元线性回归拟合出来的回归线欠拟合,不能很好的预测价格。因此我们可以采用多项式回归,

            在数学中,多项式(polynomial)是指由变量、系数以及它们之间的加、减、乘、幂运算(非负整数次方)得到的表达式。如若给定两个输入特征变量 X 和 Y,一次多项式表示输入特征为X,Y;二次多项式表示增X^2、XY 和 Y^2三个特征。以此类推。

            多项式中的每个单项式叫做多项式的项,这些单项式中的最高项次数,就是这个多项式的次数。单项式由单个或多个变量和系数相乘组成,或者不含变量,即不含字母的单个系数(常数)组成,这个不含字母的项叫做常数项。

            多项式回归模型创建的曲线可以更好地拟合非线性数据。在我们的例子中,如果我们在输入数据中包含一个平方变量如x^2,我们就可以用抛物线曲线来拟合我们的数据,我们也知道该抛物线在一年中的某个时候将具有最小值或者最大值。

            多项式回归算法并没有新的特点,完全是使用线性回归的思路,关键在于为数据添加新的特征,而这些新的特征是原有的特征的多项式组合,采用这样的方式就能解决非线性问题。这样的思路跟PCA这种降维思想刚好相反,而多项式回归则是升维,添加了新的特征之后,使得更好地拟合高维数据。这类似于走迷宫,在迷宫里走效率低,从高空看迷宫则简单的多。

    在这里我们使用Scikit-learn中封装的两个函数来简化代码量:

    0 make_pipeline()

    1 PolynomialFeatures()

            make_pipeline()可以将许多算法模型串联起来,把多个estamitors级联成一个estamitor,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。这类似与ArcGIS中的模型构建器。在本此学习中,我们将创建一个pipeline,将多项式特征添加到我们的模型中,然后训练回归模型。

            PolynomialFeatures()函数可以通过输入的变量来创建新特征,其中的参数表示多项式的次数。

     

    ③多元线性回归理论

            多元,即特征向量不唯一,这与多项式回归类似;实际上多项式回归也可以转化为多元线性回归。

    4513d61c98b3411aa4ea651d4785af9a.png

            从式中可以看出,随着特征变量X的增多,我们需要计算的w系数也增加。这与简单线性回归原理区别不大,只是拟合出来的回归线是曲线。多元回归线往往有更好的相关性,但也要注意避免过拟合。

     

    4.相关系数概念

            相关系数是表示自变量与因变量之间相关程度的系数,其取值区间为(0,1),越靠近1相关系数越高;1为完全相关,0为完全不相关;我们可以使用散点图来可视化此系数。聚集在回归线周围的数据点具有高度相关性,分散在回归线周围的数据点具有低相关性。

            一个优秀的线性回归模型是使用最小二乘回归方法且数据具有高度相关性。

     

    5.寻找相关性

            现在你已经了解了线性回归背后的数学原理,让我们尝试寻找数据的相关性,看看我们是否可以预测哪类南瓜价格最佳。

            从上一篇文章中,你可能已经看到不同月份的平均价格如下所示:

    图4 月份-价格直方图

    b70d0ffb928142d08498fe5e4066ba5d.png

    图5 月份-价格散点图

    3b0c87837dfc468abe100036f4657f8a.png

            这表明月份与价格应该有相关性,我们可以进一步尝试查看销售日期-价格之间关系的散点图。输入以下代码:

    import matplotlib.pyplot as plt 
    plt.scatter('DayOfYear','Price',data=new_pumpkins) #DayOfYear为销售日期,绘制销售日期与价格的散点图

    图6 销售日期-价格散点图

    fa9fb3e5297242709a7470f57b1a841b.png

            看起来似乎有不同的价格群对应于不同的南瓜品种。为了证实这一假设,我们使用不同的颜色绘制每个南瓜类别。输入以下代码并查看结果:

    ax=None 
    colors = ['red','blue','green','yellow'] 
    for i,var in enumerate(new_pumpkins['Variety'].unique()): 
        df = new_pumpkins[new_pumpkins['Variety']==var] 
        ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)

    图7 销售日期-价格按不同南瓜种类分色散点图

    6aafe4685e7e4f18a5a3bd23c94c955d.png

            根据图7,我们可以看到品种对整体价格的影响比销售日期更大。因此,让我们暂时只关注一种南瓜品种,看看日期对价格有什么影响,以下代码用以取出南瓜类型为‘PIE TYPE’的数据并绘制销售日期-价格散点图:

    pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE'] 
    pie_pumpkins.plot.scatter('DayOfYear','Price')

    图8 销售日期-价格‘PIE’南瓜散点图

    9b7b45b106044f6ca1eb024dabdec8f4.png

            如果我们现在利用模型计算相关系数,我们将得到类似的结果 。这意味着训练预测模型是有意义的。

            在训练线性回归模型之前,确保数据是清理过的,这很重要!线性回归不能很好地处理缺失值,因此需要删除缺失值,下面代码用以删去缺失值所在数据以及查看新数据组织结构:

    pie_pumpkins.dropna(inplace=True) 
    

            另一种方法是用相应列中的平均值填充这些空值,类似插值。

     

    6.分类特征变量的处理

            我们希望能够使用相同的模型预测不同南瓜品种的价格。但是,南瓜类型列与其他特征略有不同,因为它的值是字符串而非数值。此类列我们称为分类列。

            为了方便训练,我们首先需要将其转换为数值形式,对其进行编码:

            get_dummies()函数将用 4 个不同的列替换原有列,每个列对应一个品种。每列将包含相应的行是否属于给定的种类,这意味着线性回归中将有四个系数,每个南瓜品种一个,负责该特定品种的“起始价格”。

            下面的代码将对各种南瓜进行一键编码,查看编码后南瓜数据的结构:

    X = pd.get_dummies(new_pumpkins['Variety']) 
    print(X.info())

    图9 按南瓜类型编码

    d7e195cf1fa842bdb6e5e215f9f114ea.png

            我们可以看出南瓜数据被分为四类,各包含415个样本。

            按照不同南瓜类型绘制的回归线并无意义,其横轴值表示类别而非回归值。因此无需进行绘制。

     

    6.简单线性回归

            为了训练我们的线性回归模型,我们将使用 Scikit-learn 库分别尝试单一变量的简单线性回归与多元简单线性回归。

     

    ①调用Python库

            首先,输入以下代码,调用我们需要的python第三方库:

    from sklearn.linear_model import LinearRegression 
    from sklearn.metrics import mean_squared_error 
    from sklearn.model_selection import train_test_split

     

    ②数据格式转换

            接着,我们将输入值(特征变量)和预期的输出值(预测标签)分离到单独的 numpy 数组中,输入以下代码:

    X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1) 
    Y = pie_pumpkins['Price']

            请注意,我们必须对输入数据执行操作,以便线性回归库正确理解它。线性回归需要一个二维数组作为输入,其中数组的每一行都对应于输入要素的向量。在我们的例子中,由于我们只有一个输入 -,因此我们需要一个形状为N×1的数组,其中N是数据集大小。

     

    ③划分数据集

            然后,我们需要将数据集拆分为训练集和测试集,以便在训练后验证模型:

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    
    

     

    ④训练模型

            最后,训练线性回归模型只需要两行代码。我们实例化一个LinearRegression()对象lin_reg,并输入以下代码用训练集拟合出我们的线性回归模型:

    lin_reg = LinearRegression() #实例化对象 
    lin_reg.fit(X_train,y_train) #训练线性回归模型

            经过训练的LinearRegression()对象包含回归的所有系数,我们可以使用对象属性访问这些系数。本次案例中只有相关系数。

     

    ⑤模型评估

            为了评估模型的精度,我们在测试数据集上预测价格,然后计算预测价格与实际价格的误差。这可以使用均方误差 (RMSE) 指标来完成,它是预期值和预测值之间所有平方差的平均值(数学期望)的平方根,它的本质是在MSE上做了一个开根号,这样做是为了将评估值的量纲和原值的量纲保持一致。

    439deefe41564abea397eb6e5f1ac472.png

            下面是RMSE指标的计算代码:

    pred = lin_reg.predict(X_test) 
    mse = np.sqrt(mean_squared_error(y_test,pred)) #mean_squared_error用于计算MSE 
    print(f'RMSE指标: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')

            评估模型质量的另一个指标是相关系数,利用score()函数获得。相关系数计算代码如下:

    score = lin_reg.score(X_train,Y_train) 
    print('相关系数: ', score) 
    plt.scatter(X_test,Y_test) 
    plt.plot(X_test,pred)

            如果相关系数值为 0,则表示模型不考虑输入数据,预测的效果最差。值 1 意味着我们可以完美地预测所有预期的输出。我们还可以将测试数据与回归线一起绘制。输出结果为:

    RMSE指标: 2.77 (17.2%)
    
    相关系数: 0.04460606335028361

    图10 简单线性回归图

    03b2344803e5499ab0bc8956b48ae50d.png

            在我们的例子中,我们的误差似乎在3点左右,约为17%。并不是很好。相关系数约为0.04,这是相当低的。

     

    ⑥南瓜种类回归

            根据图7的结果与分类特征变量的预处理我们可以尝试用不同的南瓜类型来检验南瓜类型与价格的相关性,输入代码,查看结果:

    X = pd.get_dummies(new_pumpkins['Variety']) #以南瓜的类别作为特征变量,并转化数据类型 
    Y = new_pumpkins['Price'] #以价格为预测标签 
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)#以8:2的比例划分数据集与训练集 
    lin_reg = LinearRegression()#构建线性回归模型对象 
    lin_reg.fit(X_train,Y_train)#训练模型 
    pred = lin_reg.predict(X_test)#将测试集上的预测值存储在pred中 
    rmse = np.sqrt(mean_squared_error(Y_test,pred))#计算均方误差 
    print(f'RMSE指标: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')#输出均方误差的值以及错误率 
    score = lin_reg.score(X_train,Y_train)#计算回归系数 
    print('相关系数: ', score)#输出回归系数的值

            结果如下:

    RMSE指标: 5.24 (19.7%) 
    相关系数: 0.774085281105197

            我们可以看到,虽然RMSE指标变化不大,但数据间的相关性提升到了0.77,这与我们猜想的一样,南瓜价格与南瓜品种的相关性高于销售日期

            再看一下销售日期和价格之间的关系。这个散点图必须用一条直线来拟合吗?价格不能波动吗?在这种情况下,我们可以尝试多项式回归。

    354dedd5b6024b6f8ae5893eba38ccda.png

     

    7.多项式回归

    ①销售日期-南瓜价格

            多项式回归前期数据准备工作与简单线性回归并无区别,关键在于对输入特征变量进行多项式。利用我们了解的多项式回归理论及工具构建流程化工具pipeline,在我们的例子中,我们使用输入数据中的二阶多项式X,X^2来构建回归模型。如果需要,我们也可以使用更高阶多项式。输出以下代码查看图像与精度:

    from sklearn.preprocessing import PolynomialFeatures 
    from sklearn.pipeline import make_pipeline 
    pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())#构建自动化流程 
    pipeline.fit(X_train,Y_train)#训练模型 
    pred = pipeline.predict(X_test)#在测试集上预测结果并保存在pred变量中 
    rmse = np.sqrt(mean_squared_error(Y_test,pred))#计算RMSE 
    print(f'RMSE指标: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)') 
    score = pipeline.score(X_train,Y_train)#计算相关系数 
    print('相关系数: ', score) 
    plt.scatter(X_test,Y_test)#绘制散点图 
    plt.plot(X_test,pred)#绘制回归线,若多条回归线是因为X_test是随机未排序的,排序后可尝试解决
    RMSE指标: 2.73 (17.0%) 
    相关系数: 0.07639977655280128

    图11 多项式回归

    36aff3d6510743aab1448c77ee78f606.png

            使用多项式回归,我们可以获得略低的MSE和更高的确定性,但依旧很低。我们需要考虑其他特征!

            你可以看到,最小的南瓜价格是在万圣节前后观察到的。如何解释这一点?

     

    ②南瓜种类-南瓜价格

            同理,将南瓜类别代入多项式回归,输入以下代码,我们可以得到其相关性高达0.76。

    X = pd.get_dummies(new_pumpkins['Variety']) 
    Y = new_pumpkins['Price'] 
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)#以8:2的比例划分数据集与训练集 # setup and train the pipeline 
    pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())#构建流程化工具,其中PolynomialFeatures(2)是对输入数据进行2次多项式拟合,后者为构建线性回归模型 
    pipeline.fit(X_train,Y_train) 
    pred = pipeline.predict(X_test) 
    rmse = np.sqrt(mean_squared_error(Y_test,pred)) 
    print(f'RMSE指标: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)') 
    score = pipeline.score(X_train,Y_train)
    print('相关系数: ', score)

            结果为:

    RMSE指标: 5.2 (19.5%) 
    相关系数: 0.7590049364934423

     

    8.多元线性回归

            在了解多项式回归以后,我们理解多元线性回归就简单的多。多元,即多个特征,多项式是基于输入特征生成特征,而多元既可以表示1-n个生成的特征,也表示输入的特征,在本次练习中,多元表示考虑到多个因素,如:销售日期、销售地区、南瓜种类等等因素。基于多种特征变量回归的特征曲线拟合出来的机器学习模型更加适用于实际操作

    ①数据准备

            代码的其余部分与我们上面用于训练线性回归的代码相同。为了获得更准确的预测,我们需要考虑更多的分类特征,代码如下:

    X = pd.get_dummies(new_pumpkins['Variety']) \ 
        .join(new_pumpkins['Month']) \ 
        .join(pd.get_dummies(new_pumpkins['City'])) \ 
        .join(pd.get_dummies(new_pumpkins['Package'])) 
    Y = new_pumpkins['Price']

     

    ②划分数据集

    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

     

    ③训练模型

          

    lin_reg = LinearRegression()#构建线性回归模型对象 
    lin_reg.fit(X_train,Y_train)#训练模型

     

    ④评估模型

    pred = lin_reg.predict(X_test)#将测试集上的预测值存储在pred中 
    rmse = np.sqrt(mean_squared_error(Y_test,pred))#计算均方误差 
    print(f'Mean error: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)')#输出均方误差的值以及错误率 score = lin_reg.score(X_train,Y_train)#计算回归系数 
    print('Model determination: ', score)#输出回归系数的值

            输出结果为:

    RMSE指标: 2.85 (10.6%) 
    相关系数: 0.9399208232885795

            😲😲😲效果很好!相关性已经达到了0.94!!!

     

    ⑤多元线性回归(多项式)

            为了制作最佳模型,我们可以将上述示例中的组合数据与多项式回归一起使用。为方便起见,以下是完整的代码:

    X = pd.get_dummies(new_pumpkins['Variety']) \ 
        .join(new_pumpkins['Month']) \ 
        .join(pd.get_dummies(new_pumpkins['City'])) \                     
        .join(pd.get_dummies(new_pumpkins['Package'])) 
    Y = new_pumpkins['Price']  
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)  
    pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression()) 
    pipeline.fit(X_train,Y_train) 
    pred = pipeline.predict(X_test)  
    rmse = np.sqrt(mean_squared_error(Y_test,pred)) 
    print(f'RMSE指标: {rmse:3.3} ({rmse/np.mean(pred)*100:3.3}%)') 
    score = pipeline.score(X_train,Y_train) 
    print('相关系数: ', score)

            输出结果为:

    RMSE指标: 2.23 (8.26%) 
    相关系数: 0.9642424355544598

            我们得到了接近97%的最佳相关系数,RMSE=2.23(~8%的预测误差)。

    009aa641fe0d4b3eb97f864f20f1969c.png

            下面是我们今天创建的不同线性回归模型的性能列表:

    线性回归类型

    RMSE

    相关系数

    DayOfYear简单线性回归

    2.77 (17.2%)

    0.04

    DayOfYear多项式回归

    2.73 (17.0%)

    0.08

    Variety简单线性回归

    5.24 (19.7%)

    0.77

    Variety多项式回归

    5.2(19.5%)

    0.76

    多元简单线性回归

    2.84 (10.5%)

    0.94

    多元多项式线性回归

    2.23 (8.25%)

    0.97

            🏆干的好!我们在练习中创建了六个回归模型,并将模型质量提高到 97%。

     

    三、内容总结

            在本文中,我们学到了三种类型的线性回归概念及其数学原理。并以南瓜销售为例,完整的讲解了问题思考,数据准备,模型构建及评估流程,并将精度提高到97%。在下一篇文章中我将介绍逻辑回归的原理及代码实践。

     

    🚀挑战

               在此练习中测试几个不同的特征变量,查看其相关性。

    课后测验

    构建模型
     

    1786c9e20c2040f6a77ade37c40f08d5.png


     如果觉得我的文章对您有帮助,三连+关注便是对我创作的最大鼓励!

     “本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_45590504/category_11752103.html?spm=1001.2014.3001.5482百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。”

     

     

    展开全文
  • 利用matlab自带工具箱对二分类数据进行逻辑回归预测1和0的概率
  • 逻辑回归(Logistic Regression)详解

    万次阅读 多人点赞 2022-04-13 09:58:50
    逻辑回归也称作logistic回归分析,是一种广义的线性回归分析模型,属于机器学习中的监督学习。其推导过程与计算方式类似于回归的过程,但实际上主要是用来解决二分类问题(也可以解决多分类问题)。通过给定的n组...
  • 多元线性回归分析

    千次阅读 2021-10-21 09:24:41
    小鹿一、概念二、EXCEL进行多元线性回归三、sklearn3.1 不进行数据处理3.2 进行数据处理3.3 分析四、总结五、参考 一、概念 在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。事实上,一种现象常常是...
  • 机器学习 之 线性回归 选择题总结

    千次阅读 2021-12-25 00:44:49
    线性回归 多元线性回归中的“线性”是指什么是线性的 A.因变量 B.系数 C.因变量 D.误差 答案:A 欠拟合的产生原因有 A学习到数据的特征过少 B学习到数据的特征过多 C学习到错误数据 D机器运算错误 答案:A 线性回归...
  • 回归分析为许多机器学习算法提供了坚实的基础。在这篇文章中,我们将总结 10 个重要的回归问题和5个重要的回归问题的评价指标。线性回归有四个假设残差是指预测值与观测值之间的误差。它测量数据点与回归线的距离。...
  • Logistic 回归模型类似于线性回归模型,不同之处在于 Logistic 回归使用更复杂的成本函数,称为“Sigmoid 函数”或“逻辑函数”而不是线性函数。 很多人可能会有一个疑问,Logistic Regression 是分类还是回归范畴...
  • logistic回归模型

    万次阅读 多人点赞 2020-04-13 17:44:45
    logistic回归模型 从这一期开始,我们准备介绍一系列机器学习算法模型,主要包括logistic回归,决策树,随机森林,关联规则,朴素贝叶斯,支持向量机模型,隐式马尔可夫模型,因子分析,主成分分析,聚类,多元线性...
  • 时间序列回归

    千次阅读 2020-12-29 23:31:34
    时序预测模型与回归预测模型是不同的。时序预测模型依赖于数值在时间上的先后顺序,是回归模型中的一部分。
  • 线性回归、lasso回归、岭回归以及弹性网络的系统解释声明背景介绍概述线性回归模型函数及损失函数线性回归算法多项式回归(线性回归的推广)广义线性回归(线性回归的推广)岭回归(Ridge回归)lasso回归为什么lasso...
  • 八种常见回归算法解析及代码

    千次阅读 2022-03-31 15:33:55
    一、线性回归 1、最小二乘法-导数/偏导为0求参数 最小二乘法求解参数​优缺点 2、迭代求解参数​-梯度下降、坐标轴下降、最小角回归 2.1使用梯度下降-对回归系数中w的每个元素分别求偏导并乘以学习率,迭代更新w...
  • logistic回归详解

    万次阅读 2020-12-02 15:57:04
    逻辑斯谛回归(logistic regression)是统计学习中的经典分类方法,虽然带有回归的字眼,但是该模型是一种分类算法,逻辑斯谛回归是一种线性分类器,针对的是线性可分问题。利用logistic回归进行分类的主要思想是:...
  • 线性回归分析步骤总结

    千次阅读 2022-04-02 16:16:23
    线性回归分析研究影响关系情况,回归分析实质上就是研究X(自变量)对Y(因变量,定量数据)的影响关系情况。当自变量为1个时,是一元线性回归,又称作简单线性回归;自变量为2个及以上时,称为多元线性回归。线性回归广泛...
  • C++实现最小二乘法一元回归和多项式拟合

    千次下载 热门讨论 2014-03-23 20:50:32
    在进行曲线拟合时用的最多的是最小二乘法,其中以一元函数(线性)和多元函数(多项式)居多,...此类在拟合完后还能计算拟合之后的误差:SSE(剩余平方和),SSR(回归平方和),RMSE(均方根误差),R-square(确定系数)。
  • 回归问题-Lasso回归

    万次阅读 多人点赞 2019-07-21 23:44:33
    Lasso(Least absolute shrinkage and ...它通过构造一个惩罚函数,可以将变量的系数进行压缩并使某些回归系数变为0,进而达到变量选择的目的。 正则化 正则化(Regularizaiton)是一种防止过拟合的方法。 ...
  • 回归,Lasso回归及弹性网络回归原理及R实现

    千次阅读 多人点赞 2020-10-24 09:53:48
    Table of Contents 收缩方法 岭回归 Lasso回归 弹性网络回归 加载R包 准备数据 计算惩戒线性回归 准备数据 R函数 计算岭回归 计算lasso回归 计算弹性网络回归 模型比较 收缩方法 岭回归回归缩小了回归系数,因此...
  • Excel做多元线性回归

    万次阅读 2021-10-26 13:09:36
    一、EXCEL进行多元线性回归 1.首先需要下载一个数据分析的插件: 点击左上角文件->选项->加载项->分析工具库->转到-数据分析库->确定 下载好插件之后就可以看到这里多了一个数据分析 点击...
  • Logistic回归结果的回归系数和OR值解读。Logistic回归虽然名字叫”回归”,但却是一种分类学习方法。使用场景大概有两个:第一用来预测,第二寻找因变量的影响因素。一 从线性回归到Logistic回归线性回归和Logistic...
  • 回归(Ridge)和Lasso 回归(笔记)

    千次阅读 2021-12-13 20:27:08
    最近在自学图灵教材《Python机器学习基础教程》,在csdn以博客的形式做些笔记。...岭回归也是一种用于回归的线性模型,因此它的预测公式与普通最小二乘法相同。但在岭 回归中,对系数(w)的选择不仅要在.
  • 多元输出回归模型

    千次阅读 多人点赞 2021-07-23 22:11:29
    多元输出回归模型 定义 多元输出回归是指在给出输入示例的情况下涉及预测两个或多个目标变量的回归问题。 回归是指涉及预测数值的预测建模问题。 例如,预测大小,重量,数量,销售数量和点击次数是回归问题。通常,...
  • 逻辑回归(logistics regression)

    万次阅读 多人点赞 2018-11-10 22:39:17
    逻辑回归(logistics regression)  前几章分别讲了多元线性回归的推理思路和求解过程(解析解求解和梯度下降求解),文章并不以代码和公式推导过程为重点,目的是跟大家一起理解算法.前两章的内容是学习算法的基础,所以...
  • 另外还有两种特殊的回归方式,一种在回归过程中可以调整变量数的回归方法,称为逐步回归,另一种是以指数结构函数作为回归模型的回归方法,称为 Logistic 回归。本讲将逐一介绍这几个回归方法。 1. 一元回归 ...
  • 基于lingo的线性回归和非线性回归

    千次阅读 2022-03-16 18:47:27
    线性回归和非线性回归的lingo编程实现 目录 1.lingo求解回归方程的特点 2.线性回归 3.非线性回归 1.lingo求解回归方程的特点 lingo作为一款求解线性和非线性方程方程组功能非常强大的软件,是求解优化模型...
  • Python—线性回归

    千次阅读 2021-11-22 22:58:53
    多元线性回归模型2.1 应用F检验法完成模型的显著性检验2.2应用t检验法完成回归系数的显著性检验 3.基于回归模型识别异常点4.含有离散变量的回归模型 前言: 线性回归模型属于经典的统计学模型,该模型的应用场景...
  • 多元回归分析(线性回归

    万次阅读 多人点赞 2020-08-13 18:14:30
    多元线性回归分析一、回归的基本理解(1)回归的基本任务(2)回归里的关键词(3)回归里的数据类型(4)回归方程中的系数解释(5)核心解释变量和控制变量(6)特殊的自变量:虚拟变量X二、例题:电商平台的奶粉...
  • lasso回归-回归实操

    千次阅读 2021-01-22 14:48:24
    python lasso回归算法之回归实操 基本概念 正则化 正则化是指对模型做显式约束,以避免过拟合。本文用到的lasso回归就是L1正则化。(从数学的观点来看,lasso惩罚了系数向量的L1范数,换句话说,就是系数的绝对值之...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 579,358
精华内容 231,743
关键字:

回归

友情链接: download.rar