精华内容
下载资源
问答
  • 多元线性回归分析预测 多元线性回归分析预测法概述 多元线性回归的计算模型 多元线性回归模型的检验 多元线性回归分析预测法案例分析
  • Python实现多元线性回归

    万次阅读 多人点赞 2018-04-12 21:39:25
    Python实现多元线性回归 线性回归介绍 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的...

    Python实现多元线性回归

     

     

    线性回归介绍

     

    线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w'x+e,e为误差服从均值为0的正态分布。回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
    线性回归属于回归问题。对于回归问题,解决流程为: 
    给定数据集中每个样本及其正确答案,选择一个模型函数h(hypothesis,假设),并为h找到适应数据的(未必是全局)最优解,即找出最优解下的h的参数。这里给定的数据集取名叫训练集(Training Set)。不能所有数据都拿来训练,要留一部分验证模型好不好使,这点以后说。先列举几个几个典型的模型:
    ● 最基本的单变量线性回归: 
    形如h(x)=theta0+theta1*x1
    ● 多变量线性回归: 
    形如h(x)=theta0+theta1*x1+theta2*x2+theta3*x3
    ● 多项式回归(Polynomial Regression): 
    形如h(x)=theta0+theta1*x1+theta2*(x2^2)+theta3*(x3^3) 
    或者h(x)=ttheta0+theta1*x1+theta2*sqr(x2) 
    但是可以令x2=x2^2,x3=x3^3,于是又将其转化为了线性回归模型。虽然不能说多项式回归问题属于线性回归问题,但是一般我们就是这么做的。
    ● 所以最终通用表达式就是: 
    这里写图片描述

     

     

    数据导入与清洗

     

    对于数据导入来说,可以利用pandas内的read_csv的函数来对数据进行导入操作,在进行多元线性回归之间通过简单线性回归来展现线性回归的特性和结果之后再延伸至多元线性回归。

     

    在进行数据导入之间需要导入进行线性回归的包:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from pandas import DataFrame,Series
    from sklearn.cross_validation import train_test_split
    from sklearn.linear_model import LinearRegression

    我们利用pandas和numpy对数据进行操作,使用matplotlib进行图像化,使用sklearn进行数据集训练与模型导入。

     

    简单线性回归

     

    对于学生来说,所学习的时间和考试的成绩挂钩,所学习的时间与考试的成绩也是呈线性相关。创建一个数据集来描述学生学习时间与成绩的关系并且做简单的线性回归。

     

    in:

    #创建数据集
    examDict  = {'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,
                         2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
                 '分数':[10,22,13,43,20,22,33,50,62,
                       48,55,75,62,73,81,76,64,82,90,93]}
    
    #转换为DataFrame的数据格式
    examDf = DataFrame(examDict)

     

    通过DataFrame的函数将字典转化为所需要的数据集,也就是学生成绩与考试成绩的数据集。且关于pandas的数据内容Series与DataFrame可以查看关于pandas的博客了解点击打开链接

     

    out:

      分数  学习时间
    0   10  0.50
    1   22  0.75
    2   13  1.00
    3   43  1.25
    4   20  1.50
    5   22  1.75
    6   33  1.75
    7   50  2.00
    8   62  2.25
    9   48  2.50
    10  55  2.75
    11  75  3.00
    12  62  3.25
    13  73  3.50
    14  81  4.00
    15  76  4.25
    16  64  4.50
    17  82  4.75
    18  90  5.00
    19  93  5.50

     

    从上面的数据可以看到数据的特征值与其标签,学生所学习的时间就是所需要的特征值,而成绩就是通过特征值所反应的标签。在这个案例中要对数据进行观测来反应学习时间与成绩的情况,将利用散点图来实现简单的观测。

     

    in:

    #绘制散点图
    plt.scatter(examDf.分数,examDf.学习时间,color = 'b',label = "Exam Data")
    
    #添加图的标签(x轴,y轴)
    plt.xlabel("Hours")
    plt.ylabel("Score")
    #显示图像
    plt.show()

    out:

     

    从上图可以看到对于分数和时间来说存在相应的线性关系,且俩数据间相关性较强。

    在此可以通过相关性来衡量两个变量因素的相关密切程度。

    相关系数是用以反映变量之间相关关系密切程度的统计指标。

    r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy(即person系数)

    对于相关性强度来说的化有以下的关系:

    0~0.3 弱相关

    0.3~0.6  中等程度相关

    0.6~1  强相关

     

    in:

    rDf = examDf.corr()
    print(rDf)

    out:

    分数      学习时间
    分数    1.000000  0.923985
    学习时间  0.923985  1.000000

     

    pandas中的数学统计函数D.corr()可以反应数据间的相关性关系,可从表值中反应出学习时间与分数之间的相关性为强相关(0.6~1)。对于简单线性回归来来说,简单回归方程为: y = a + b*x (模型建立最佳拟合线)最佳拟合线也是需要通过最小二乘法来实现其作用。对于OLS即最小二乘法我们需要知道的一个关系为点误差,点误差 = 实际值 - 预测值,而误差平方和(Sum of square error) SSE = Σ(实际值-预测值)^2,最小二乘法就是基于SSE实现,最小二乘法 : 使得误差平方和最小(最佳拟合)。解释完简单线性回归后进行对训练集和测试集的创建,将会使用train_test_split函数来创建(train_test_split是存在与sklearn中的函数)

     

    in:

    #将原数据集拆分训练集和测试集
    X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=.8)
    #X_train为训练数据标签,X_test为测试数据标签,exam_X为样本特征,exam_y为样本标签,train_size 训练数据占比
    
    print("原始数据特征:",exam_X.shape,
          ",训练数据特征:",X_train.shape,
          ",测试数据特征:",X_test.shape)
    
    print("原始数据标签:",exam_Y.shape,
          ",训练数据标签:",Y_train.shape,
          ",测试数据标签:",Y_test.shape)
    
    #散点图
    plt.scatter(X_train, Y_train, color="blue", label="train data")
    plt.scatter(X_test, Y_test, color="red", label="test data")
    
    #添加图标标签
    plt.legend(loc=2)
    plt.xlabel("Hours")
    plt.ylabel("Pass")
    #显示图像
    plt.savefig("tests.jpg")
    plt.show()

    out:

    原始数据特征: (20,) ,训练数据特征: (16,) ,测试数据特征: (4,)
    原始数据标签: (20,) ,训练数据标签: (16,) ,测试数据标签: (4,)

     

    tips:由于训练集随机分配的原因每一次运行的结果(点的分布情况,训练集内的情况,测试集内的情况)不都相同在创建数据集之后我们需要将训练集放入skleran中的线性回归模型(LinearRegression())进行训练,使用函数种的.fit函数进行模型的训练操作。

     

    in:

    model = LinearRegression()
    
    #对于模型错误我们需要把我们的训练集进行reshape操作来达到函数所需要的要求
    # model.fit(X_train,Y_train)
    
    #reshape如果行数=-1的话可以使我们的数组所改的列数自动按照数组的大小形成新的数组
    #因为model需要二维的数组来进行拟合但是这里只有一个特征所以需要reshape来转换为二维数组
    X_train = X_train.values.reshape(-1,1)
    X_test = X_test.values.reshape(-1,1)
    
    model.fit(X_train,Y_train)

     

    在模型训练完成之后会得到所对应的方程式(线性回归方程式)需要利用函数中的intercept_与coef_来得到

     

    a  = model.intercept_#截距
    
    b = model.coef_#回归系数
    
    print("最佳拟合线:截距",a,",回归系数:",b)

     

    out:

     

    最佳拟合线:截距 7.5580754557 ,回归系数: [ 16.28401865]

     

    由上述的最佳拟合线的截距和回归系数可以算出其线性回归线方程:y = 7.56 + 16.28*x

    接下来需要对模型进行预测和对模型进行评价,在进行评价之间将会引入一个决定系数r平方的概念。

    对于决定系数R平方常用于评估模型的精确度。

    下列为R平方的计算公式:

    ● y误差平方和 = Σ(y实际值 - y预测值)^2

    ● y的总波动 = Σ(y实际值 - y平均值)^2

    ● 有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动

    ● 有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方

    对于决定系数R平方来说

    (1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)

    (2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合对于预测来说我们需要运用函数中的model.predict()来得到预测值

     

    in:

    #训练数据的预测值
    y_train_pred = model.predict(X_train)
    #绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
    plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
    
    #测试数据散点图
    plt.scatter(X_test, Y_test, color='red', label="test data")
    
    #添加图标标签
    plt.legend(loc=2)
    plt.xlabel("Hours")
    plt.ylabel("Score")
    #显示图像
    plt.savefig("lines.jpg")
    plt.show()
    
    
    score = model.score(X_test,Y_test)
    
    print(score)

     

    out:

    score : 0.834706696876

     

    多元线性回归

     

    在间单线性回归的例子中可以得到与线性回归相关的分析流程,接下来对多元线性回归进行分析对于多元线性回归前面已经提到,形如h(x)=theta0+theta1*x1+theta2*x2+theta3*x3http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv(已经失效)来下载数据集 Advertising.csv,其数据描述了一个产品的销量与广告媒体的投入之间影响。将会利用pandas的pd.read()来读取数据。

     

     

    in:

    #通过read_csv来读取我们的目的数据集
    adv_data = pd.read_csv("C:/Users/Administrator/Desktop/Advertising.csv")
    #清洗不需要的数据
    new_adv_data = adv_data.ix[:,1:]
    #得到我们所需要的数据集且查看其前几列以及数据形状
    print('head:',new_adv_data.head(),'\nShape:',new_adv_data.shape)

    out:

    head:       TV  radio  newspaper  sales
           0  230.1   37.8       69.2   22.1
           1   44.5   39.3       45.1   10.4
           2   17.2   45.9       69.3    9.3
           3  151.5   41.3       58.5   18.5
           4  180.8   10.8       58.4   12.9 
    Shape:  (200, 4)

     

    对于上述的数据可以得到数据中

    标签值(sales):

    • Sales:对应产品的销量

    特征值(TV,Radio,Newspaper):

    • TV:对于一个给定市场中单一产品,用于电视上的广告费用(以千为单位)
    • Radio:在广播媒体上投资的广告费用
    • Newspaper:用于报纸媒体的广告费用

    在这个案例中,通过不同的广告投入,预测产品销量。因为响应变量是一个连续的值,所以这个问题是一个回归问题。数据集一共有200个观测值,每一组观测对应一个市场的情况。接下里对数据进行描述性统计,以及寻找缺失值(缺失值对模型的影响较大,如发现缺失值应替换或删除),且利用箱图来从可视化方面来查看数据集,在描述统计之后对数据进行相关性分析,以此来查找数据中特征值与标签值之间的关系。

     

    in:

    #数据描述
    print(new_adv_data.describe())
    #缺失值检验
    print(new_adv_data[new_adv_data.isnull()==True].count())
    
    new_adv_data.boxplot()
    plt.savefig("boxplot.jpg")
    plt.show()
    ##相关系数矩阵 r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy
    #相关系数0~0.3弱相关0.3~0.6中等程度相关0.6~1强相关
    print(new_adv_data.corr())

     

    out:

                   TV       radio   newspaper       sales
    count  200.000000  200.000000  200.000000  200.000000
    mean   147.042500   23.264000   30.554000   14.022500
    std     85.854236   14.846809   21.778621    5.217457
    min      0.700000    0.000000    0.300000    1.600000
    25%     74.375000    9.975000   12.750000   10.375000
    50%    149.750000   22.900000   25.750000   12.900000
    75%    218.825000   36.525000   45.100000   17.400000
    max    296.400000   49.600000  114.000000   27.000000
    TV           0
    radio        0
    newspaper    0
    sales        0
    dtype: int64
                     TV     radio  newspaper     sales
    TV         1.000000  0.054809   0.056648  0.782224
    radio      0.054809  1.000000   0.354104  0.576223
    newspaper  0.056648  0.354104   1.000000  0.228299
    sales      0.782224  0.576223   0.228299  1.000000

     

     

     

     

    可以从corr表中看出,TV特征和销量是有比较强的线性关系的,而Radio和Sales线性关系弱一些但是也是属于强相关的,Newspaper和Sales线性关系更弱。接下来建立散点图来查看数据里的数据分析情况以及对相对应的线性情况,将使用seaborn的pairplot来绘画3种不同的因素对标签值的影响

     

    in:

    # 通过加入一个参数kind='reg',seaborn可以添加一条最佳拟合直线和95%的置信带。
    sns.pairplot(new_adv_data, x_vars=['TV','radio','newspaper'], y_vars='sales', size=7, aspect=0.8,kind = 'reg')
    plt.savefig("pairplot.jpg")
    plt.show()

    out:

     

    上如图种所示,可以了解到不同的因素对销量的预测线(置信度= 95 %),也可可以大致看出不同特征对于标签值的影响与相关关系在了解了数据的各种情况后需要对数据集建立模型,在建立模型的第一步我们将建立训练集与测试集同样的将会使用train_test_split函数来创建(train_test_split是存在与sklearn中的函数)

     

    in:

    X_train,X_test,Y_train,Y_test = train_test_split(new_adv_data.ix[:,:3],new_adv_data.sales,train_size=.80)
    
    print("原始数据特征:",new_adv_data.ix[:,:3].shape,
          ",训练数据特征:",X_train.shape,
          ",测试数据特征:",X_test.shape)
    
    print("原始数据标签:",new_adv_data.sales.shape,
          ",训练数据标签:",Y_train.shape,
          ",测试数据标签:",Y_test.shape)

    out:

    原始数据特征: (200, 3) ,训练数据特征: (160, 3) ,测试数据特征: (40, 3)
    原始数据标签: (200,) ,训练数据标签: (160,) ,测试数据标签: (40,)

     

    建立初步的数据集模型之后将训练集中的特征值与标签值放入LinearRegression()模型中且使用fit函数进行训练,在模型训练完成之后会得到所对应的方程式(线性回归方程式)需要利用函数中的intercept_与coef_。

     

    in:

    model = LinearRegression()
    
    model.fit(X_train,Y_train)
    
    a  = model.intercept_#截距
    
    b = model.coef_#回归系数
    
    print("最佳拟合线:截距",a,",回归系数:",b)

     

    out:

    最佳拟合线:截距 2.79361553401 ,回归系数: [ 0.04711495  0.18719875 -0.00185999]

     

    即所得的多元线性回归模型的函数为 : y = 2.79 + 0.04 * TV + 0.187 * Radio - 0.002 * Newspaper,对于给定了Radio和Newspaper的广告投入,如果在TV广告上每多投入1个单位,对应销量将增加0.04711个单位。就是加入其它两个媒体投入固定,在TV广告上每增加1000美元(因为单位是1000美元),销量将增加47.11(因为单位是1000)。但是大家注意这里的newspaper的系数居然是负数,所以我们可以考虑不使用newspaper这个特征。接下来对数据集进行预测与模型测评。同样使用predict与score函数来获取所需要的预测值与得分。

     

    in:

    #R方检测
    #决定系数r平方
    #对于评估模型的精确度
    #y误差平方和 = Σ(y实际值 - y预测值)^2
    #y的总波动 = Σ(y实际值 - y平均值)^2
    #有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动
    #有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方
    #对于决定系数R平方来说1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)
    #2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合
    score = model.score(X_test,Y_test)
    
    print(score)
    
    #对线性回归进行预测
    
    Y_pred = model.predict(X_test)
    
    print(Y_pred)
    
    plt.plot(range(len(Y_pred)),Y_pred,'b',label="predict")
    #显示图像
    plt.savefig("predict.jpg")
    plt.show()

     

    out:

    score : 0.871755480886
    predict :[ 14.17217173  17.42866884  16.81933374  18.16079802   7.64784604
      17.8670496   16.66488531  14.98782916   9.41023763  16.21679696
      19.32696651   7.76788593  23.34231219   3.59006148  13.15777984
      24.26609169  15.47571902  15.39542342  13.98430709  12.65446708
       7.59818691  13.85179898  12.16325619  10.34902817  11.9813427
      11.05726513   8.13405159  21.94038306  16.4388483   14.06506403
       4.36052153   6.45326681   7.55083036  24.25987365  17.13603444
      14.04814117   7.28664465  17.24163581  20.42745536   6.55512244]

    预测集与源数据集的对比如下:

     

    模型的检测方法-ROC曲线:

     ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。传统的诊断试验评价方法有一个共同的特点,必须将试验结果分为两类,再进行统计分析。ROC曲线的评价方法与传统的评价方法不同,无须此限制,而是根据实际情况,允许有中间状态,可以把试验结果划分为多个有序分类,如正常、大致正常、可疑、大致异常和异常五个等级再进行统计分析。因此,ROC曲线评价方法适用的范围更为广泛。

    1.ROC曲线能很容易地查出任意界限值时的对疾病的识别能力。

    2.选择最佳的诊断界限值。ROC曲线越靠近左上角,试验的准确性就越高。最靠近左上角的ROC曲线的点是错误最少的最好阈值,其假阳性和假阴性的总数最少。

    3.两种或两种以上不同诊断试验对疾病识别能力的比较。在对同一种疾病的两种或两种以上诊断方法进行比较时,可将各试验的ROC曲线绘制到同一坐标中,以直观地鉴别优劣,靠近左上角的ROC曲线所代表的受试者工作最准确。亦可通过分别计算各个试验的ROC曲线下的面积(AUC)进行比较,哪一种试验的 AUC最大,则哪一种试验的诊断价值最佳(百度百科)

    模型提升:

    对于提升模型准确度的方法很多,在这个模型下,可以利用异常值替换,将Newspaper中的异常值进行拉格朗日法插补,朗格朗日插补法(from scipy.interpolate import lagrange即scipy中的函数)可以间接提高模型的准确度,如果不需要插补异常值或缺失值的话可以将Newspaper不列为特征值考虑,在不考虑Newspaper为特征值的情况下,新的模型的准确率将超过旧模型,也可以从模型的准确度来反证Newspaper不适合作为特征值。

     

    整体代码如下,数据集再上面链接中可直接下载。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from pandas import DataFrame,Series
    from sklearn.cross_validation import train_test_split
    from sklearn.linear_model import LinearRegression
    #创建数据集
    examDict  = {'学习时间':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,
                         2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],
                 '分数':[10,22,13,43,20,22,33,50,62,
                       48,55,75,62,73,81,76,64,82,90,93]}
    
    #转换为DataFrame的数据格式
    examDf = DataFrame(examDict)
    
    #绘制散点图
    plt.scatter(examDf.分数,examDf.学习时间,color = 'b',label = "Exam Data")
    
    #添加图的标签(x轴,y轴)
    plt.xlabel("Hours")
    plt.ylabel("Score")
    #显示图像
    plt.savefig("examDf.jpg")
    plt.show()
    
    
    #相关系数矩阵 r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy
    #相关系数0~0.3弱相关0.3~0.6中等程度相关0.6~1强相关
    rDf = examDf.corr()
    print(rDf)
    
    #回归方程 y = a + b*x (模型建立最佳拟合线)
    #点误差 = 实际值 - 拟合值
    #误差平方和(Sum of square error) SSE = Σ(实际值-预测值)^2
    #最小二乘法 : 使得误差平方和最小(最佳拟合)
    exam_X  =  examDf.loc[:,'学习时间']
    exam_Y  =  examDf.loc[:,'分数']
    
    #将原数据集拆分训练集和测试集
    X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=.8)
    #X_train为训练数据标签,X_test为测试数据标签,exam_X为样本特征,exam_y为样本标签,train_size 训练数据占比
    
    print("原始数据特征:",exam_X.shape,
          ",训练数据特征:",X_train.shape,
          ",测试数据特征:",X_test.shape)
    
    print("原始数据标签:",exam_Y.shape,
          ",训练数据标签:",Y_train.shape,
          ",测试数据标签:",Y_test.shape)
    
    #散点图
    plt.scatter(X_train, Y_train, color="blue", label="train data")
    plt.scatter(X_test, Y_test, color="red", label="test data")
    
    #添加图标标签
    plt.legend(loc=2)
    plt.xlabel("Hours")
    plt.ylabel("Pass")
    #显示图像
    plt.savefig("tests.jpg")
    plt.show()
    
    
    
    model = LinearRegression()
    
    #对于下面的模型错误我们需要把我们的训练集进行reshape操作来达到函数所需要的要求
    # model.fit(X_train,Y_train)
    
    #reshape如果行数=-1的话可以使我们的数组所改的列数自动按照数组的大小形成新的数组
    #因为model需要二维的数组来进行拟合但是这里只有一个特征所以需要reshape来转换为二维数组
    X_train = X_train.values.reshape(-1,1)
    X_test = X_test.values.reshape(-1,1)
    
    model.fit(X_train,Y_train)
    
    a  = model.intercept_#截距
    
    b = model.coef_#回归系数
    
    print("最佳拟合线:截距",a,",回归系数:",b)
    
    #决定系数r平方
    #对于评估模型的精确度
    #y误差平方和 = Σ(y实际值 - y预测值)^2
    #y的总波动 = Σ(y实际值 - y平均值)^2
    #有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动
    #有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方
    #对于决定系数R平方来说1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)
    #2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合
    
    plt.scatter(X_train, Y_train, color='blue', label="train data")
    
    #训练数据的预测值
    y_train_pred = model.predict(X_train)
    #绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
    plt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")
    
    #测试数据散点图
    plt.scatter(X_test, Y_test, color='red', label="test data")
    
    #添加图标标签
    plt.legend(loc=2)
    plt.xlabel("Hours")
    plt.ylabel("Score")
    #显示图像
    plt.savefig("lines.jpg")
    plt.show()
    
    
    score = model.score(X_test,Y_test)
    
    print(score)
    import pandas as pd
    import seaborn as sns
    from sklearn.linear_model import LinearRegression
    import matplotlib.pyplot as plt
    from sklearn.cross_validation import train_test_split
    
    #通过read_csv来读取我们的目的数据集
    adv_data = pd.read_csv("C:/Users/Administrator/Desktop/Advertising.csv")
    #清洗不需要的数据
    new_adv_data = adv_data.ix[:,1:]
    #得到我们所需要的数据集且查看其前几列以及数据形状
    print('head:',new_adv_data.head(),'\nShape:',new_adv_data.shape)
    
    #数据描述
    print(new_adv_data.describe())
    #缺失值检验
    print(new_adv_data[new_adv_data.isnull()==True].count())
    
    new_adv_data.boxplot()
    plt.savefig("boxplot.jpg")
    plt.show()
    ##相关系数矩阵 r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy
    #相关系数0~0.3弱相关0.3~0.6中等程度相关0.6~1强相关
    print(new_adv_data.corr())
    
    #建立散点图来查看数据集里的数据分布
    #seaborn的pairplot函数绘制X的每一维度和对应Y的散点图。通过设置size和aspect参数来调节显示的大小和比例。
    # 可以从图中看出,TV特征和销量是有比较强的线性关系的,而Radio和Sales线性关系弱一些,Newspaper和Sales线性关系更弱。
    # 通过加入一个参数kind='reg',seaborn可以添加一条最佳拟合直线和95%的置信带。
    sns.pairplot(new_adv_data, x_vars=['TV','radio','newspaper'], y_vars='sales', size=7, aspect=0.8,kind = 'reg')
    plt.savefig("pairplot.jpg")
    plt.show()
    
    #利用sklearn里面的包来对数据集进行划分,以此来创建训练集和测试集
    #train_size表示训练集所占总数据集的比例
    X_train,X_test,Y_train,Y_test = train_test_split(new_adv_data.ix[:,:3],new_adv_data.sales,train_size=.80)
    
    print("原始数据特征:",new_adv_data.ix[:,:3].shape,
          ",训练数据特征:",X_train.shape,
          ",测试数据特征:",X_test.shape)
    
    print("原始数据标签:",new_adv_data.sales.shape,
          ",训练数据标签:",Y_train.shape,
          ",测试数据标签:",Y_test.shape)
    
    model = LinearRegression()
    
    model.fit(X_train,Y_train)
    
    a  = model.intercept_#截距
    
    b = model.coef_#回归系数
    
    print("最佳拟合线:截距",a,",回归系数:",b)
    #y=2.668+0.0448∗TV+0.187∗Radio-0.00242∗Newspaper
    
    #R方检测
    #决定系数r平方
    #对于评估模型的精确度
    #y误差平方和 = Σ(y实际值 - y预测值)^2
    #y的总波动 = Σ(y实际值 - y平均值)^2
    #有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动
    #有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方
    #对于决定系数R平方来说1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)
    #2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合
    score = model.score(X_test,Y_test)
    
    print(score)
    
    #对线性回归进行预测
    
    Y_pred = model.predict(X_test)
    
    print(Y_pred)
    
    
    plt.plot(range(len(Y_pred)),Y_pred,'b',label="predict")
    #显示图像
    # plt.savefig("predict.jpg")
    plt.show()
    
    plt.figure()
    plt.plot(range(len(Y_pred)),Y_pred,'b',label="predict")
    plt.plot(range(len(Y_pred)),Y_test,'r',label="test")
    plt.legend(loc="upper right") #显示图中的标签
    plt.xlabel("the number of sales")
    plt.ylabel('value of sales')
    plt.savefig("ROC.jpg")
    plt.show()
    
    
    
    
    

    Advertising.csv的连接已经失效,以下是补充的数据,可复制粘贴到CSV进行保存

    TV radio newspaper sales
    230.1 37.8 69.2 22.1
    44.5 39.3 45.1 10.4
    17.2 45.9 69.3 9.3
    151.5 41.3 58.5 18.5
    180.8 10.8 58.4 12.9
    8.7 48.9 75 7.2
    57.5 32.8 23.5 11.8
    120.2 19.6 11.6 13.2
    8.6 2.1 1 4.8
    199.8 2.6 21.2 10.6
    66.1 5.8 24.2 8.6
    214.7 24 4 17.4
    23.8 35.1 65.9 9.2
    97.5 7.6 7.2 9.7
    204.1 32.9 46 19
    195.4 47.7 52.9 22.4
    67.8 36.6 114 12.5
    281.4 39.6 55.8 24.4
    69.2 20.5 18.3 11.3
    147.3 23.9 19.1 14.6
    218.4 27.7 53.4 18
    237.4 5.1 23.5 12.5
    13.2 15.9 49.6 5.6
    228.3 16.9 26.2 15.5
    62.3 12.6 18.3 9.7
    262.9 3.5 19.5 12
    142.9 29.3 12.6 15
    240.1 16.7 22.9 15.9
    248.8 27.1 22.9 18.9
    70.6 16 40.8 10.5
    292.9 28.3 43.2 21.4
    112.9 17.4 38.6 11.9
    97.2 1.5 30 9.6
    265.6 20 0.3 17.4
    95.7 1.4 7.4 9.5
    290.7 4.1 8.5 12.8
    266.9 43.8 5 25.4
    74.7 49.4 45.7 14.7
    43.1 26.7 35.1 10.1
    228 37.7 32 21.5
    202.5 22.3 31.6 16.6
    177 33.4 38.7 17.1
    293.6 27.7 1.8 20.7
    206.9 8.4 26.4 12.9
    25.1 25.7 43.3 8.5
    175.1 22.5 31.5 14.9
    89.7 9.9 35.7 10.6
    239.9 41.5 18.5 23.2
    227.2 15.8 49.9 14.8
    66.9 11.7 36.8 9.7
    199.8 3.1 34.6 11.4
    100.4 9.6 3.6 10.7
    216.4 41.7 39.6 22.6
    182.6 46.2 58.7 21.2
    262.7 28.8 15.9 20.2
    198.9 49.4 60 23.7
    7.3 28.1 41.4 5.5
    136.2 19.2 16.6 13.2
    210.8 49.6 37.7 23.8
    210.7 29.5 9.3 18.4
    53.5 2 21.4 8.1
    261.3 42.7 54.7 24.2
    239.3 15.5 27.3 15.7
    102.7 29.6 8.4 14
    131.1 42.8 28.9 18
    69 9.3 0.9 9.3
    31.5 24.6 2.2 9.5
    139.3 14.5 10.2 13.4
    237.4 27.5 11 18.9
    216.8 43.9 27.2 22.3
    199.1 30.6 38.7 18.3
    109.8 14.3 31.7 12.4
    26.8 33 19.3 8.8
    129.4 5.7 31.3 11
    213.4 24.6 13.1 17
    16.9 43.7 89.4 8.7
    27.5 1.6 20.7 6.9
    120.5 28.5 14.2 14.2
    5.4 29.9 9.4 5.3
    116 7.7 23.1 11
    76.4 26.7 22.3 11.8
    239.8 4.1 36.9 12.3
    75.3 20.3 32.5 11.3
    68.4 44.5 35.6 13.6
    213.5 43 33.8 21.7
    193.2 18.4 65.7 15.2
    76.3 27.5 16 12
    110.7 40.6 63.2 16
    88.3 25.5 73.4 12.9
    109.8 47.8 51.4 16.7
    134.3 4.9 9.3 11.2
    28.6 1.5 33 7.3
    217.7 33.5 59 19.4
    250.9 36.5 72.3 22.2
    107.4 14 10.9 11.5
    163.3 31.6 52.9 16.9
    197.6 3.5 5.9 11.7
    184.9 21 22 15.5
    289.7 42.3 51.2 25.4
    135.2 41.7 45.9 17.2
    222.4 4.3 49.8 11.7
    296.4 36.3 100.9 23.8
    280.2 10.1 21.4 14.8
    187.9 17.2 17.9 14.7
    238.2 34.3 5.3 20.7
    137.9 46.4 59 19.2
    25 11 29.7 7.2
    90.4 0.3 23.2 8.7
    13.1 0.4 25.6 5.3
    255.4 26.9 5.5 19.8
    225.8 8.2 56.5 13.4
    241.7 38 23.2 21.8
    175.7 15.4 2.4 14.1
    209.6 20.6 10.7 15.9
    78.2 46.8 34.5 14.6
    75.1 35 52.7 12.6
    139.2 14.3 25.6 12.2
    76.4 0.8 14.8 9.4
    125.7 36.9 79.2 15.9
    19.4 16 22.3 6.6
    141.3 26.8 46.2 15.5
    18.8 21.7 50.4 7
    224 2.4 15.6 11.6
    123.1 34.6 12.4 15.2
    229.5 32.3 74.2 19.7
    87.2 11.8 25.9 10.6
    7.8 38.9 50.6 6.6
    80.2 0 9.2 8.8
    220.3 49 3.2 24.7
    59.6 12 43.1 9.7
    0.7 39.6 8.7 1.6
    265.2 2.9 43 12.7
    8.4 27.2 2.1 5.7
    219.8 33.5 45.1 19.6
    36.9 38.6 65.6 10.8
    48.3 47 8.5 11.6
    25.6 39 9.3 9.5
    273.7 28.9 59.7 20.8
    43 25.9 20.5 9.6
    184.9 43.9 1.7 20.7
    73.4 17 12.9 10.9
    193.7 35.4 75.6 19.2
    220.5 33.2 37.9 20.1
    104.6 5.7 34.4 10.4
    96.2 14.8 38.9 11.4
    140.3 1.9 9 10.3
    240.1 7.3 8.7 13.2
    243.2 49 44.3 25.4
    38 40.3 11.9 10.9
    44.7 25.8 20.6 10.1
    280.7 13.9 37 16.1
    121 8.4 48.7 11.6
    197.6 23.3 14.2 16.6
    171.3 39.7 37.7 19
    187.8 21.1 9.5 15.6
    4.1 11.6 5.7 3.2
    93.9 43.5 50.5 15.3
    149.8 1.3 24.3 10.1
    11.7 36.9 45.2 7.3
    131.7 18.4 34.6 12.9
    172.5 18.1 30.7 14.4
    85.7 35.8 49.3 13.3
    188.4 18.1 25.6 14.9
    163.5 36.8 7.4 18
    117.2 14.7 5.4 11.9
    234.5 3.4 84.8 11.9
    17.9 37.6 21.6 8
    206.8 5.2 19.4 12.2
    215.4 23.6 57.6 17.1
    284.3 10.6 6.4 15
    50 11.6 18.4 8.4
    164.5 20.9 47.4 14.5
    19.6 20.1 17 7.6
    168.4 7.1 12.8 11.7
    222.4 3.4 13.1 11.5
    276.9 48.9 41.8 27
    248.4 30.2 20.3 20.2
    170.2 7.8 35.2 11.7
    276.7 2.3 23.7 11.8
    165.6 10 17.6 12.6
    156.6 2.6 8.3 10.5
    218.5 5.4 27.4 12.2
    56.2 5.7 29.7 8.7
    287.6 43 71.8 26.2
    253.8 21.3 30 17.6
    205 45.1 19.6 22.6
    139.5 2.1 26.6 10.3
    191.1 28.7 18.2 17.3
    286 13.9 3.7 15.9
    18.7 12.1 23.4 6.7
    39.5 41.1 5.8 10.8
    75.5 10.8 6 9.9
    17.2 4.1 31.6 5.9
    166.8 42 3.6 19.6
    149.7 35.6 6 17.3
    38.2 3.7 13.8 7.6
    94.2 4.9 8.1 9.7
    177 9.3 6.4 12.8
    283.6 42 66.2 25.5
    232.1 8.6 8.7 13.4
    展开全文
  • 原始数据在这里 1.观察数据 首先,用Pandas打开数据,并进行观察... 以上这篇关于多元线性回归分析——Python&SPSS就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。 时间: 2020-02-23

    原始数据在这里

    1.观察数据

    首先,用Pandas打开数据,并进行观察。

    import numpy

    import pandas as pd

    import matplotlib.pyplot as plt

    %matplotlib inline

    data = pd.read_csv('Folds5x2_pp.csv')

    data.head()

    会看到数据如下所示:

    blank.gif

    这份数据代表了一个循环发电厂,每个数据有5列,分别是:AT(温度), V(压力), AP(湿度), RH(压强), PE(输出电力)。我们不用纠结于每项具体的意思。

    我们的问题是得到一个线性的关系,对应PE是样本输出,而AT/V/AP/RH这4个是样本特征, 机器学习的目的就是得到一个线性回归模型,即: PE=θ0+θ1∗AT+θ2∗V+θ3∗AP+θ4∗RH 而需要学习的,就是θ0,θ1,θ2,θ3,θ4这5个参数。

    接下来对数据进行归一化处理:

    data = (data - data.mean())/data.std()

    因为回归线的截距θ0是不受样本特征影响的,因此我们在此可以设立一个X0=1,使得回归模型为:

    PE=θ0*X0+θ1∗AT+θ2∗V+θ3∗AP+θ4∗RH

    将方程向量化可得:

    PE = hθ(x) = θx (θ应转置)

    2.线性回归

    在线性回归中,首先应建立 cost function,当 cost function 的值最小时所取得θ值为所求的θ。

    在线性回归中,Cost function如下所示:

    blank.gif

    因此,可以在Python中建立函数求损失方程:

    def CostFunction(X,y,theta):

    inner = np.power((X*theta.T)-y,2)

    return np.sum(inner)/(2*len(X))

    然后,设初始θ为=[0,0,0,0,0],可得到最初的J(θ)值为0.49994774247491858,代码如下所示

    col = data.shape[1]

    X = data.iloc[:,0:col-1]

    y = data.iloc[:,col-1:col]

    X = np.matrix(X.values)

    y = np.matrix(y.values)

    theta = np.matrix(np.array([0,0,0,0,0]))

    temp = np.matrix(np.zeros(theta.shape))

    CostFunction(X,y,theta)

    接下来,有两种方法可以使用。1.梯度下降法(gradient descent)和 2.最小二乘法(normal equation)。在此我们使用梯度下降法来求解。

    梯度下降法是求得J对θ的偏导数,通过设置步长,迭代使J(θ)逐步下降,从而求得局部最优解。

    公式如下所示:

    blank.gif

    j:特征编号

    m:样本编号

    我们可以在Python中写出计算迭代后的θ和J(θ)

    def gradientDescent(X,y,theta,alpha,iters):

    temp = np.matrix(np.zeros(theta.shape))

    parameters = int(theta.ravel().shape[1])

    cost = np.zeros(iters)

    for i in range(iters):

    error = (X*theta.T)-y

    for j in range(parameters):

    term = np.multiply(error,X[:,j])

    temp[0,j] = theta[0,j] - (alpha/len(X))*np.sum(term)

    theta = temp

    cost[i] = CostFunction(X,y,theta)

    return theta,cost

    在此,我设置初始的α为0.1,可求得迭代1000次后θ0,θ1,θ2,θ3,θ4的值分别是:

    -5.22080706e-14,-8.63485491e-01,-1.74182863e-01,2.16058120e-02,-1.35205248e-01

    此时 J(θ)的值为0.0379648。

    通过,可视化J(θ)和迭代次数可以发现,J(θ)收敛的非常快。

    blank.gif

    画图观察预测值和损失值,距离直线约近说明损失越小:

    predicted = X*g.T

    predicted = predicted.flatten().A[0]

    y_f= y.flatten().A[0]

    fig, ax = plt.subplots()

    ax.scatter(y_f,predicted)

    ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)

    ax.set_xlabel('Measured')

    ax.set_ylabel('Predicted')

    plt.show()

    blank.gif

    3.sckit-learn

    因为J(θ)收敛的太快了…所以我又用sckit-learn和SPSS验证了一下。

    先看sckit-learn,在sklearn中,线性回归是使用的最小二乘法而不是梯度下降法,用起来也十分的简单。

    代码如下:

    from sklearn import linear_model

    model = linear_model.LinearRegression()

    model.fit(X, y)

    打印出θ值后发现和梯度下降法算出来的相差无几,θ0,θ1,θ2,θ3,θ4的值分别是:

    0,-0.86350078,-0.17417154,0.02160293,-0.13521023

    4.SPSS

    在看看SPSS

    同样先将数据标准化后进行线

    blank.gif

    然后进行线性回归分析得到结果:

    blank.gif

    嘛…和前面两种方法的结果也差不多…就这样吧。

    以上这篇关于多元线性回归分析——Python&SPSS就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

    时间: 2020-02-23

    展开全文
  • 利用矩阵的形式对多元线性回归模型的进行估计、检验并分析了实现的具体步骤。结合实例建立了回归模型,利用该模型给出了回归系数的置信区间、因变量平均值的置信区间、因变量个别值的预测区间及多元线性估计回归模型...
  • 线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量)。例如,餐厅根据每天的营业数据(包括菜谱价格、就餐人数、预定人数、特价菜折扣等)预测就餐...

    线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量)。例如,餐厅根据每天的营业数据(包括菜谱价格、就餐人数、预定人数、特价菜折扣等)预测就餐规模或营业额;网站根据访问的历史数据(包括新用户的注册量、老用户分活跃度、网页内容的更新频率等)预测用户的支付转化率。

    在开始多元线性模型前介绍下一元线性模型。数学公式可以表示为:

    一个因变量,一个自变量。参数求解公式为:

    多元线性回归模型与一元线性回归模型的区别就是,自变量的增加。其数学表达式为:

    可以简写为:

    β代表多元线性回归模型的偏回归系数,e代表了模型拟合后每一个样本的误差项。利用最小二乘法求解β,可以得到:

    将相应的x值,y值代入公式即可求得β。

    我们构建模型的目的是为了预测,即根据已知的自变量X值预测未知的因变量y的值。本文是利用Python 实现这一目标。

    这里以某产品的利润数据集为例,该数据集包含5个变量,分别是产品的研发成本、管理成本、市场营销成本、销售市场和销售利润。其中销售利润Profit为因变量,其他变量为自变量。

    回归模型的建模和预测

    将导入数据的数据进行切割,训练集用来训练模型,测试集用来预测。

    测试集删除因变量Profit,剩下的自变量进行预测,结果用来跟删除的因变量进行对比,比较模型的预测能力。

    数据集中的State变量为字符型的离散变量,需要进行哑变量处理。将State套在C()中,表示将其当作分类(Category)变量处理。以上默认State(California)为对照组。

    接下来通过pandas中的get_dummies函数生成哑变量,以New York作为对照组。

    如上结果所示,从离散变量State中衍生出来的哑变量在回归系数的结果里只保留了Florida和California,而New York作为了参照组。得到的结果表示该模型公式为:

    Profit=58068.05+0.80RD_Spend-0.06Administation+0.01Marketing_Spend+1440.86Florida+513.47California

    如何解释该模型呢,以RD_Spend和Florida为例,在其他变量不变的情况下,研发成本每增加2美元,利润会增加0.80美元;在其他变量不变的情况下,以New York为基准线,如果在Florida销售产品,利润会增加1440.86美元。

    虽然模型已经建成,但是模型的好坏还需要模型的显著性检验和回归系数的显著性检验。

    回归模型的假设检验

    模型的显著性检验使用F检验。

    手工计算F值和模型自带的F统计值计算完全一致。,接下俩将计算得出的F统计值和理论F分布的值进行比较。

    计算出的F统计值远远大于理论F值,这里可以拒绝原假设,即认为多元线性回归是显著的,也就是回归模型的偏回归系数不全为0。

    回归系数的显著性检验t检验

    如上结果所示,模型的概览信息包含三个部分,第一部分主要是有关模型的信息,例如模型的判决系数R2,用来衡量自变量对因变量的解释程度,模型的F统计值,用来检验模型的显著性;第二部分主要包含偏回归系数的信息,例如回归系数的Coef、t统计量值、回归系数的置信区间等;第三部分主要涉及模型的误差项e的有关信息。

    在第二部分的内容中,含有每个偏回归系数的t统计量值,它的计算就是由估计值coef和标准差std err的商所得的,同时也有t统计量值对应的概率值p,用来判别统计量是否显著的直接办法,通常概率值p小于0.05时表示拒绝原假设。从返回的结果可知,只有截距项Intercept和研发成本RD_Spend对应的值小于0.05,才说明其余变量都没有通过系数的显著性检验,即在模型中这些变量不是影响利润的重要因素。

    回归模型的诊断

    当回归模型建好之后,并不意味着建模过程的结束,还需要进一步对模型进行诊断。由统计学知识可知,线性回归模型需要满足一些假设前提,只有满足了这些假设,模型才是合理的。需满足:误差e服从正态分布,无多重共线性,线性相关性,误差项e的独立性,方差齐性。

    正态性检验,由y=Xβ+e来说,等式右边的自变量属于已知变量,而等式左边的因变量服从正态分布,要求残差项要求正态分布,但其实质就是要求因变量服从正态分布。关于正态性检验通常运用两类方法,分别是定性的图形法(直方图、PP图或QQ图)和定量的非参数法(Shapiro检验和K-S检验),以下是直方图法,

    从图中看,和密度曲线和正态分布密度曲线的趋势比较吻合,故直观上可以认为利润变量服从正态分布。以下是PP图和QQ图法,

    PP图思想是对比正态分布的累计概率值和实际分布的累计概率值,而QQ图则比正态分布的分位数和实际分布的分位数。判断变量是否近似服从正态分布的标准是:如果散点都比较均匀地散落在直线上,就说明近似服从正态分布,否则就认为数据不服从正态分布。如图所知,不管是PP图还是QQ图,绘制的散点均落在直线的附近,没有较大的偏离,故认为利润变量近似服从正态分布。

    多重共线性检验

    多重共线性是指模型中的自变量之间存在较高的线性相关关系,它的存在给模型带来严重的后果。可以使用方差膨胀因子VIF来鉴定,如果VIF大于10,则说明变量间存在多重共线性;如果如果VIF大于100,则表明变量之间存在严重的多重共线性。VIF的计算公式为:

    如上计算所示,两个自变量对应的方差膨胀因子均小于10,说明构建模型的数据并不存在多重共线性。

    线性相关性检验

    线性相关性即用于建模的因变量和自变量之间存在线性相关关系,可以使用Pearson相关系数和可视化方法进行识别,皮尔逊计算公式为:

    如上图结果所示,自变量中只有研发成本和市场营销成本与利润之间存在较高的相关系数,相关系数分别达到0.978和0.739,而其他变量与利润之间几乎没有线性相关性可言。以管理成本Administration为例,与利润之间的相关系数只有0.2,被认定为不相关,但是能说明两者不具有线性相关关系,当存在非线性相关关系时,皮尔逊系数也会很小,因此需要可视化的方法观测因变量和自变量之间的散点关系。可以使用seaborn模块中的pairplot函数。

    从图中结果可知,研发成本和利润之间的散点图几乎为一条向上倾斜的直线(左下角),说明这两种变量之间确实存在很强的线性相关;市场营销成本与利润之间的散点图同样向上倾斜,但也有很多点的分布还是比较分散的(见第一列第三行);管理成本和利润之间的散点图呈水平趋势,而且分布也比较宽,说明两者之间确实没有任何关系(第一列第二行)。

    以重构的model2为例,综合考虑相关系数,散点图矩阵和t检验的结果,最终确定只保留model2中的RDSpend和Marketing_Spend两个自变量,下面重新对该模型做修正。

    异常值检验

    由于多元线性回归模型容易受到极端值的影响,故需要利用统计方法对观测样本进行异常点检测。如果在建模过程发现异常数据,需要对数据集进行整改,如删除异常值或衍生出是否为异常值的哑变量。对于线性回归模型,通常利用帽子矩阵,DFFITS准则,学生化残差或cook距离进行异常点检测。基于get_influence方法获得四种统计量的值。

    以上合并了四种统计量的值,这里使用标准化残差法将异常值查询出来,当标准化残差大于2时,即可认为对应的数据点为异常值。

    异常比例为2.5%,比较小,故考虑将其删除。

    新的模型公式为:Profit=51827.42+0.80RD_Spend+0.02Marketing_Spend

    独立性检验

    残差e的独立性检验也就是因变量y的独立性检验。通常使用Durbin-Watson统计值来测试,如果DW值在2 左右,则表明残差之间时不相关的;如果与2偏离的教员,则说明不满足残差的独立性假设。

    DW统计量的值为2.065,比较接近于2,故可以认为模型的残差项之间是满足独立性这个假设前提的。

    方差齐性检验

    方差齐性是要求模型残差项的方差不随自变量的变动而呈现某种趋势,否则,残差的趋势就可以被自变量刻画。关于方差齐性的检验,一般可以使用两种方法,即图形法(散点图)和统计检验法(BP检验)。

    如图所示,标准化残差没有随自变量的变动而呈现喇叭性,所有的散点几乎均匀的分布在参考线y=0的附近。所以,可以说明模型的残差项满足方差齐性的前提假设。

    经过前文的模型构造、假设检验和模型诊断,最新红确定合理的模型model4。接下来就是利用测试集完成预测。

    如上图所示,绘制了有关模型在测试集上的预测值和实际值的散点图。两者非常接近,散点在直线附近波动,说明模型的预测效果还是不错的。

    展开全文
  • 通过具体的案例讲解时间序列下多元线性回归在eviews里的操作
  • 多元线性回归多元线性回归模型实际中有很多问题是一个因变量与多个自变量成线性相关,我们可以用一个多元线性回归方程来表示。为了方便计算,我们将上式写成矩阵形式:Y = XW假设自变量维度为NW为自变量的系数,下标0...

    多元线性回归

    多元线性回归模型

    实际中有很多问题是一个因变量与多个自变量成线性相关,我们可以用一个多元线性回归方程来表示。

    e5475f71a41ffb2e728942d06072792d.png

    为了方便计算,我们将上式写成矩阵形式:

    Y = XW

    假设自变量维度为N

    W为自变量的系数,下标0 - N

    X为自变量向量或矩阵,X维度为N,为了能和W0对应,X需要在第一行插入一个全是1的列。

    Y为因变量

    那么问题就转变成,已知样本X矩阵以及对应的因变量Y的值,求出满足方程的W,一般不存在一个W是整个样本都能满足方程,毕竟现实中的样本有很多噪声。最一般的求解W的方式是最小二乘法。

    最小二乘法

    我们希望求出的W是最接近线性方程的解的,最接近我们定义为残差平方和最小,残差的公式和残差平方和的公式如下:

    2c063db03549f8c716fc63b50e07f65e.png

    上面的公式用最小残差平方和的方式导出的,还有一种思路用最大似然的方式也能推导出和这个一样的公式,首先对模型进行一些假设:

    误差等方差不相干假设,即每个样本的误差期望为0,每个样本的误差方差都为相同值假设为σ

    误差密度函数为正态分布 e ~ N(0, σ^2)

    简单推导如下:

    1444e8cb56166ddffaa505c856fc492e.png

    由此利用最大似然原理导出了和最小二乘一样的公式。

    最小二乘法求解

    二次函数是个凸函数,极值点就是最小点。只需要求导数=0解出W即可。

    a47c7d433a9df0489e77fd61baa1f6fb.png

    模拟数据

    我们这里用R语言模拟实践一下,由于我们使用的矩阵运算,这个公式一元和多元都是兼容的,我们为了可视化方便一点,我们就用R语言自带的women数据做一元线性回归,和多元线性回归的方式基本一样。

    women数据如下

    > women

    height weight

    1 58 115

    2 59 117

    3 60 120

    4 61 123

    5 62 126

    6 63 129

    7 64 132

    8 65 135

    9 66 139

    10 67 142

    11 68 146

    12 69 150

    13 70 154

    14 71 159

    15 72 164

    体重和身高具有线性关系,我们做一个散点图可以看出来:

    8d54a32c776a471d362d9e118cb38ec6.png

    我们用最小二乘推导出来的公式计算w如下

    X

    X.T

    Y

    w

    > w

    [,1]

    [1,] -87.51667

    [2,] 3.45000

    > lm.result

    > lm.result

    Call:

    lm(formula = women$weight ~ women$height)

    Coefficients:

    (Intercept) women$height

    -87.52 3.45

    上面的R代码w使我们利用公式计算出来的,下边是R语言集成的线性回归函数拟合出来的,可以看出我们的计算结果是正确的,lm的只是小数点取了两位而已,将回归出来的函数画到图中看下回归的效果。

    9baa0c6379d431d847862ffb3d8eac8e.png

    画图对应的R代码如下,用R的感觉.....太飘逸了。

    > png(file="chart2.png")

    > plot(women$height, women$weight)

    > lines(women$height, X %*% w)

    > dev.off()

    梯度下降法

    除了用正规方程方式求解W,也可以用最常见的梯度下降法求得W,因为最小二乘是个凸函数,所以这里找到的极小点就是最小点。下面这段代码用R写还是非常容易的,但是刚开始step步长参数调的太大了,导致一直不收敛,我还

    以为是程序错误,后来怎么看也没写错,就把参数调了个很小值,结果就收敛了。step的这个取值其实应该是变化的,先大后下比较科学,我这个调的很小,需要接近500万次才能收敛。

    初始化W 为全0向量,也可以随机一个向量

    设置最大迭代次数,本例为了收敛设置了一个很大的数

    设置步长step,小了收敛很慢,大了不收敛.......

    求损失函数的梯度

    W(k+1) 为 W(k) + 损失函数负梯度 * 步长step

    循环,直到梯度接近0

    0e9f394c68b7fee55f59a0c2e2db1d5f.png

    X

    Y

    maxIterNum

    step

    W

    for (i in 1:maxIterNum){

    grad

    if (sqrt(as.numeric(t(grad) %*% grad)) < 1e-3){

    print(sprintf('iter times=%d', i));

    break;

    }

    W

    }

    print(W);

    输出

    [1] "iter times=4376771"

    print(W);

    [,1]

    [1,] -87.501509

    [2,] 3.449768

    归一化

    上面的批量梯度下降为什么收敛如此之慢呢?原因很简单,没有做归一化,做了归一化,收敛速度快了非常非常多!!!!

    正确代码如下:

    XScale = scale(women$height)

    Ux = attr(XScale, "scaled:center")

    Dx = attr(XScale, "scaled:scale")

    YScale = scale(women$weight)

    Uy = attr(YScale, "scaled:center")

    Dy = attr(YScale, "scaled:scale")

    X

    Y

    maxIterNum

    step

    W

    for (i in 1:maxIterNum){

    grad

    if (sqrt(as.numeric(t(grad) %*% grad)) < 1e-6){

    print(sprintf('iter times=%d', i));

    break;

    }

    W

    }

    print(W);

    W0 = W[1]

    Wn = W[2:length(W)]

    Wn = Dy * Wn / Dx

    W0 = Uy + Dy * W0 - Dy * Ux / Dx

    W = c(W0, Wn)

    print(W);

    输出

    [1] "iter times=1168"

    print(W);

    -88.53154 3.45000

    logistic逻辑回归公式推导及R语言实现

    Logistic逻辑回归 Logistic逻辑回归模型 线性回归模型简单,对于一些线性可分的场景还是简单易用的.Logistic逻辑回归也可以看成线性回归的变种,虽然名字带回归二字但实际上他主要用来二 ...

    机器学习-线性回归(基于R语言)

    基本概念 利用线性的方法,模拟因变量与一个或多个自变量之间的关系.自变量是模型输入值,因变量是模型基于自变量的输出值. 因变量是自变量线性叠加和的结果. 线性回归模型背后的逻辑——最小二乘法计算线性系 ...

    R语言与概率统计&lpar;二&rpar; 假设检验

    > ####################5.2 > X

    R语言解读多元线性回归模型

    转载:http://blog.fens.me/r-multi-linear-regression/ 前言 本文接上一篇R语言解读一元线性回归模型.在许多生活和工作的实际问题中,影响因变量的因素可能不止 ...

    R 语言中的多元线性回归

    示例 sessionInfo() # 查询版本及系统和库等信息 # 工作目录设置 getwd() path

    【R】多元线性回归

    R中的线性回归函数比较简单,就是lm(),比较复杂的是对线性模型的诊断和调整.这里结合Statistical Learning和杜克大学的Data Analysis and Statistical I ...

    R语言解读一元线性回归模型

    转载自:http://blog.fens.me/r-linear-regression/ 前言 在我们的日常生活中,存在大量的具有相关性的事件,比如大气压和海拔高度,海拔越高大气压强越小:人的身高和体 ...

    机器学习(一) 从一个R语言案例学线性回归

    写在前面的话 按照正常的顺序,本文应该先讲一些线性回归的基本概念,比如什么叫线性回归,线性回规的常用解法等.但既然本文名为,那就更重视如何使用R语言去解决线 ...

    【数据分析】线性回归与逻辑回归(R语言实现)

    文章来源:公众号-智能化IT系统. 回归模型有多种,一般在数据分析中用的比较常用的有线性回归和逻辑回归.其描述的是一组因变量和自变量之间的关系,通过特定的方程来模拟.这么做的目的也是为了预测,但有时也 ...

    随机推荐

    在LaTeX文档中插入图片的几种常用的方法

    LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片 ...

    android离线安装adt

    打开Eclipse, 在菜单栏上选择help->Install New SoftWare 出现如下界面: 点击 Add按钮,出现如下界面 在Name这而随意输入一个名字:ADT15:点击打开Ar ...

    【HDU】4923 Room and Moor&lpar;2014多校第六场1003&rpar;

    Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

    XX秘籍

    第一课 一个男人在他妻子洗完澡后准备进浴室洗澡.这时,门铃响了. 妻子迅速用浴巾裹住自己冲到门口. 当她打开门时,邻居鲍勃站在那儿. 在她开口前,鲍勃说,“你如果把浴巾拿掉,我给你800美元.” 想了 ...

    浅谈this那些事

    一直以来,对this的讨论都是热门话题.有人说掌握了this就掌握了JavaScript的80%,说法有点夸张,但可见this的重要性.本人至今也是记录了很多关于this的零碎笔记,今天就来个小结. ...

    Ionic APP-Web SPA开发进阶&lpar;二&rpar;Ionic进阶之路由去哪了

    Ionic进阶之路由去哪了 项目需求 在查看药品时,从药品列表中可以通过点击药品列表获取某一药品详情.提交订单时,同样可以查看药品详情.两种情形下,从药品详情返回后,应分别返回至原来的页面.如下图所示 ...

    HTML&plus;Css让网页自动适应电脑手机屏幕

    Word Ladder&lpar;双向BFS&rpar;

    2018-10-02 23:46:38 问题描述: 问题求解: 显然是个解空间遍历问题,每次修改其中一位,由于步长是1,所以可以使用BFS进行解空间的遍历.

    天梯赛2016-L2

    L2-001. 紧急救援 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在 ...

    展开全文
  • matlab多元线性回归及显著性分析给各位高手:小弟有一些数据需要回归分析(非线性)及显著性检验(回归模型,次要项,误差及失拟项纯误差,F值和P值),求大侠帮助,给出程序,不胜感激。模型:DA TA=... %DA TA前三列...
  • 一种多元线性回归模型在医学中的应用,徐云龙,李剑英,本文是关于通过化验人体内各种元素含量来判别肾炎病人与健康人的方法研究的问题。首先把肾炎患者和健康人各个元素含量的数据信息
  • 多元线性回归--案例分析及python实践

    千次阅读 2020-02-03 18:06:55
    本篇主要是针对回归分析过程中所使用到的统计量进行汇总,并通过案例,结合python语言实现。适用于一元线性回归和多元线性回归。代码可直接使用。
  • 多元线性回归分析的原理出发,利用最小二乘法准则,将回归分析归结为用Seidel迭代法求矩阵方程组解,确定待定系数的过程.利用mathematica实现精度可调节式的多元线性回归.结合实例,通过方差分析表,进行F检验,...
  • 多元线性回归模型

    2021-04-08 16:05:00
    多元线性回归一. 基础1. 参数定义2. 参数学习算法① 最小二乘法② 梯度下降法③ 共轭梯度法 一. 基础 线性回归(Linear Regression)通过学习标记数据学得一多元线性模型能够尽可能准确地预测实值输出标记。本篇将以...
  • 线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量)。例如,餐厅根据每天的营业数据(包括菜谱价格、就餐人数、预定人数、特价菜折扣等)预测就餐...
  • R语言与多元线性回归分析计算实例

    千次阅读 多人点赞 2019-11-16 12:37:33
    6.3.7 计算实例 例 6.9 某大型牙膏制造企业为了更好地拓展产品市场,有效地管理库存,公司董事会要求销售部门根据市场调查,找出公司生产的牙膏销售量与销售价格,广告投入等之间的关系,从而预测出在不同价格和...
  • SPSS--回归-多元线性回归模型案例解析!(一)

    万次阅读 多人点赞 2014-03-19 17:56:40
    SPSS--回归-多元线性回归模型案例解析!(一)  多元线性回归,主要是研究一个因变量与多个自变量之间的相关关系,跟一元回归原理差不多,区别在于影响因素(自变量)更多些而已,例如:一元线性回归方程 为: ...
  • 利用多元线性回归和BP神经网络理论,分别对矿井瓦斯涌出量进行了预测,最后建立了多元线性回归与BP神经网络的组合预测模型。该模型兼顾了多元回归分析的非线性特性和神经网络的时序特性,通过具体的实例研究,对比了各种...
  • 多元线性回归,主要是研究一个因变量与多个自变量之间的相关关系,跟一元回归原理差不多,区别在于影响因素(自变量)更多些而已,例如:一元线性回归方程 为: 毫无疑问,多元线性回归方程应该为: 上图中的 x1,...
  • 基于spss的一元线性回归与多元线性回归案例,个人整理出的,包含了部分案例、实验报告、题目,及部分题目答案,适合作为spss、MATLAB等软件数据分析题目联系
  • 导语:现在大多数人入门机器学习的第一个案例多元线性回归模型,其中多元共线性这个问题将贯穿所有的机器学习模型。这里选用的经典房价预测用到的精度优化方法效果拔群,能提供比较好的参考价值,将会带大家讲解...
  • 在前面的博客已经介绍过多元回归模型,现在这里粗略介绍如下python 实现案例1、选取数据#!usr/bin/env python#_*_ coding:utf-8 _*_import pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltimport...
  • 多元线性回归分析理论详解及SPSS结果分析

    万次阅读 多人点赞 2017-05-17 16:23:23
    当影响因变量的因素是多个时候,这种一个变量同时与多个变量的回归问题就是多元回归,分为:多元线性回归和多元非线性回归。这里直说多元线性回归。对比一元线性回归: 1.1多元回归模型: y=β0+β1x1+β2x2+…+β...
  • 多元线性回归程序示例 类似的,我们也可以实现多元线性回归。这里,我们需要创建多个特征(x),我们也可以像之前程序那样,随机生成多个特征,不过,这里,我们使用sklearn库提供的更方面的方法。 from sklearn....
  • 一、多元线性回归1.多元线性回归的基本表达式在多元线性回归中会有多个解释变量:预测解释变量的估计方程如下:注:额外的假设条件①解释变量之间不能存在太强的线性相关关系(一般ρ<0.7)②其他条件与一元线性...
  • 以某次多元线性回归为例介绍多元线性回归模型常见的检验方法,其中Farming为被解释变量,其他的所有变量为解释变量。此处要求进行:多重共线性检验、随机误差项正态分布检验、异方差检验、模型结构稳定性检验。 0. ...
  • 机器学习算法(8)之多元线性回归分析理论详解

    万次阅读 多人点赞 2018-08-29 16:28:27
    前言:当影响因变量的因素是多个时候,这种一个变量同时与多个变量的回归问题就是多元回归,分为:多元线性回归和多元非线性回归。线性回归(Linear regressions)和逻辑回归(Logistic regressions)是人们学习算法的第...
  • 2.0多元线性回归

    2020-05-16 08:34:13
    多元线性回归模型 多元线性回归模型的参数估计 最小二乘估计 最大似然估计 多元线性回归模型的显著性检验 回归方程是否显著: F 检验 回归系数是否显著:t 检验 多元线性回归模型的相关系数 自变量的标准化 简单相关...
  • 我将介绍线性回归的概念,但主要讨论Python的实现。线性回归是一种统计模型,用于检查两个(简单线性回归)或更多(多线性回归)变量(一个因变量和一个或多个自变量)...我会将重点放在Python中回归模型的实现,所...
  • 多元线性回归 pythonLinear regression is a standard statistical data analysis technique. We use linear regression to determine the direct relationship between a dependent variable and one or more ...
  • 多元线性回归

    2021-07-12 14:30:07
    利用多元线性回归模型可以根据多个因素来预测客户价值,当模型搭建完成后,便可对不同价值的客户采用不同的业务策略。 这里以信用卡客户的客户价值为例来解释客户价值预测的具体含义:客户价值
  • matlab实现一元线性回归和多元线性回归

    万次阅读 多人点赞 2018-01-30 10:58:46
    在回归分析中,如果有两个或两个以上的自变量,就称为多元回归。...例如,家庭消费支出,除了受家庭可支配收入的影响外,还受诸如家庭所有财富、物价水平、金融机构存款利息等多种因素的影响,表现在线性回归模型中的解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,419
精华内容 2,967
关键字:

多元线性回归模型的应用案例