精华内容
下载资源
问答
  • 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
    展开全文
  • 多元线性回归分析 [外链图片转存失败(img-L7t2lXVf-1565617592237)(G:[4]学习资料\知识管理\深度学习总结\多元线性回归\liner.png)] 什么是线性回归? 线性回归,如上图所示(这里用二维的例子比较好理解),我们...

    多元线性回归分析

    在这里插入图片描述

    什么是线性回归?

    线性回归,如上图所示(这里用二维的例子比较好理解),我们知道许多的 (x1,y1),(x2,y2),...,(xn,yn)(x_1, y_1), (x_2, y_2), ..., (x_n, y_n),即图中红色的点,通过某种方法,得到图中蓝色的线(y=w×x+by = w\times x + b),即求 wbw, b的值;然后可以使得未知数据 xnewx_{new} 输入方程,使得结果 ynewy_{new} 尽可能的接近真实值。

    具体的关于线性回归的定义,这里是引用西瓜书上定义

    定义:

    ​ 给定由 dd 个属性描述的示例 x=(x1;x1;...;xd)x = (x_1; x_1; ... ; x_d),其中 xix_ix\textbf{x} 在第 ii 个属性上的取值,线性模型(linear model)试图学得一个通过属性的组合来进行预测的函数,即
    f(x)=w1x1+w2x2+...+wdxd+b f(x) = w_1x_1 + w_2x_2 + ... + w_dx_d + b
    一般用向量形式写成
    f(x)=wTx+b f(x) = w^Tx + b
    其中 w=(w1;w2;...;w1;)w = (w_1;w_2;...;w_1;)wwbb学习到以后,模型就得以确定

    通常回归分为线性回归分析和非线性回归分析,判读二者最好的方法是看每一个变量的指数,如都是1次的就是线性,否则是非线性。

    基于矩阵求解(解析解法或者公式法)

    推导过程

    假如我们的多元线性方程有n项,目标方程为
    f(xi)=w1x1+w2x2++wnxn+b f\left( {{x_i}} \right) = {w_1}{x_1} + {w_2}{x_2} + \cdots + {w_n}{x_n} + b
    有对应的关于数据D((x1,x2,...,xn,y)(x_1,x_2,...,x_n,y)),需要根据输入的数据来求解(wi,bw_i,b)。这里对于最后的偏置项bb,可以认为是w0x0w_0x_0,其中x0x_0是一个恒为1的数,求解w0w_0相当于求解bb,即
    f(xi)=w0x0+w1x1+w2x2++wnxn f\left( {{x_i}} \right) = {w_0}{x_0} + {w_1}{x_1} + {w_2}{x_2} + \cdots + {w_n}{x_n}
    这样写成矩阵的形式为
    f(x)=wTx f\left( x \right) = {w^T}{x}
    其中xx是一个列向量,ww是一个列向量

    在数据D中有多组数据,就可以写出矩阵的形式

    wT[x1,x2,,xn]=[y1,y2,,yn] {w^T}{ \left[ \begin{array}{c} {{x^1}} ,{{x^2}},\dots ,{{x^n}} \end{array} \right ]} ={ \left[ \begin{array}{ccc} {{y^1}},{{y^2}}, \dots ,{{y^n}} \end{array} \right ]}

    如何确定ww,就是在于如何可以使得yiy^i(目标值)和y^i{{\hat y}^i}(预测值)直接最小,这里使用均方差来使得误差最小化,即定义下面的目标方程
    w=argminwi=1m(yiy^i)2=argminwi=1m(yiwTxi)2 \begin{array}{l} {w^*} &= \mathop {\arg \min }\limits_w \sum\limits_{i = 1}^m {({y^i} - } {{\hat y}^i}{)^2} \\ &= \mathop {\arg \min }\limits_w \sum\limits_{i = 1}^m {({y^i} - } {w^T}{x^i}{)^2} \end{array}
    其中w{w^*}就是我们要找的最优的参数,mm表示有m组数据。根据上式可以知道,目标函数是一个关于ww的凸函数,对于凸函数而言,一阶导数等于零对应的ww就是目标函数的最优值;为了求导方便,我们再把式子变换一下,式子中xix^i是一个列向量,如果有多组数据的话就可以把他写成一个矩阵X=(x1,x2,...,xm)X=(x^1,x^2,...,x^m),相应的真实值y=(y1,y2,...,yn)Ty=({y}^1,{y}^2,...,{y}^n)^T是一个列向量,然后目标函数就可以转换为
    E=(yXTw)T(yXTw) E = {(y - {X^T}w)^T}(y - {X^T}w)
    ww求导
    Ew=2X(XTwy) \frac{{\partial E}}{{\partial w}} = 2X({X^T}w - y)
    Ew=0\frac{{\partial E}}{{\partial w}} =0,就可以求的
    w=(XXT)1Xy w = {(X{X^T})^{ - 1}}{X}y

    代码实现

    import numpy as np
    
    def getParams(x, y):
        n = len(y)
        x_0 = np.ones(n)
        x = np.matrix(np.vstack([x_0, x]).T)
        y = np.matrix(y)
        params = ((x.T*x).I*x.T*(y.T))
        b = params[0]
        w = params[1:]
        return w, b
        
        
    if __name__ == "__main__":
        n_samples = 10000
        x_1, x_2 = np.random.random(n_samples),np.random.random(n_samples)
        theta_1, theta_2, b = map(float, input().split())
        
        x, y= np.vstack([x_1, x_2]), theta_1*x_1 + theta_2*x_2 + b
        params = getParams(x, y)
    

    梯度下降逼近法

    线性回归梯度下降法,这里的梯度下降是指计算损失函数(loss function)的梯度;这个损失函数通常是均方差函数
    E(w)=12mi=1m(y^iyi)2=12mi=1m(wTxi+byi)2 \begin{array}{l} E(w) &= \frac{1}{{2m}}\sum\limits_{i = 1}^m {({{\hat y}^i} - {y^i}} {)^2}\\ &= \frac{1}{{2m}}\sum\limits_{i = 1}^m {({w^T}{x^i} + b - {y^i}} {)^2} \end{array}
    然后通过求解目标函数对于ww的梯度和对于bb的梯度,来不断的迭代更新他们的值,使得结果更加逼近真实值
    Ew=1mi=1m(wTxi+byi)xi=1mi=1m(y^iyi)xiEb=1mi=1m(wTxi+byi)xi=1mi=1m(y^iyi) \begin{array}{l} \frac{{\partial E}}{{\partial w}} &= \frac{1}{m}\sum\limits_{i = 1}^m {({w^T}{x^i} + b - {y^i}} ){x^i}\\ &= \frac{1}{m}\sum\limits_{i = 1}^m {({{\hat y}^i} - {y^i}} ){x^i} \end{array} \\ \begin{array}{l} \frac{{\partial E}}{{\partial b}}& = \frac{1}{m}\sum\limits_{i = 1}^m {({w^T}{x^i} + b - {y^i}} ){x^i}\\ &= \frac{1}{m}\sum\limits_{i = 1}^m {({{\hat y}^i} - {y^i}} ) \end{array}
    迭代更新:
    w=wαEwb=bαEb \begin{array}{l} w{\rm{ = }}w{\rm{ - }}\alpha \frac{{\partial E}}{{\partial w}}\\ \\ b = b - \alpha \frac{{\partial E}}{{\partial b}} \end{array}
    其中α\alpha表示学习率(learning rate),用于控制每一步下降的步长(步长要选择适中,步长太小下降的速度比较慢,太大则可能造成不收敛;通常也可以选择动态步长的方法,即前期使用大步长用于快速下降,后期采用小步长使用收敛精度),这里由于使用的是逼近的方法,所以我们可以设置通过循环的次数来结束求解过程,也可以使用设置阈值的方法结束求解。

    代码实现

    这里代码实现,分为使用numpy的方法和使用机器学习框架(pytorch)的方法

    使用numpy

    
    import numpy as np
    
    def gradient_descent(X, y, lr=0.01, threshold=1e-3):
        y = y[:, np.newaxis]
        
        W =np.ones(shape=(1,X.shape[1]))
        b =np.array([[1]])
        n = y.shape[0]
        
        while True:
            pred_y = np.dot(X, W.T) + b
            loss = np.dot((y-pred_y).T, (y-pred_y))/(2*n)
            if np.abs(loss) < threshold:
                break
            
            w_gradient = -(1.0/n)*np.dot((y-pred_y).T, X)
            b_gradient = -(1.0/n)*np.dot((y-pred_y).T, np.ones(shape=[n, 1]))
    
            W = W - w_gradient
            b = b - b_gradient
            print(loss)
        
        return W[0][0], W[0][1], b[0][0]
    
    
        
    if __name__ == "__main__":
        n_samples = 10000
        x_0 = np.ones(n_samples)
        x_1, x_2 = np.random.random(n_samples),np.random.random(n_samples)
        theta_1, theta_2, b = map(float, input().split())
        X, y= np.vstack([x_1, x_2]).T, theta_1*x_1 + theta_2*x_2 + b
        
        params = gradient_descent(X, y)
        result = []
        for param in params:
            result.append('{:.02f}'.format(param))
        print(' '.join(result))
    
    

    使用pytorch

    import torch
    import torch.nn as nn
    import numpy as np
    
    # 线性回归
    class LinerRegression(nn.Module):
        def __init__(self):
            super(LinerRegression, self).__init__()
            self.pred = torch.nn.Linear(2, 1)
        
        def forward(self, x):
            x = self.pred(x)
            return x
    
    # 产生10000个数据
    n_samples = 10000
    x_1, x_2 = np.random.random(n_samples),np.random.random(n_samples)
    x_train = np.vstack([x_1, x_2]).T
    # 设置想要的权重,产生y
    theta_1, theta_2, b = 8.69, -20.66, 76.12
    y_train = theta_1*x_1 + theta_2*x_2 + b
    
    # 把numpy array转为为tensor
    x_train = torch.from_numpy(x_train)
    y_train = torch.from_numpy(y_train)
    # 为数据添加一个维度,和预测结果相匹配
    y_train = y_train.unsqueeze(1)
    
    # 调用网络
    net = LinerRegression().double()
    
    # 采用随机梯度下降法优化函数
    optimizer = torch.optim.SGD(net.parameters(), lr = 0.01)
    # 使用均方差作为 loss function
    criterion = nn.MSELoss()
    
    # 迭代循环,当loss小于一定的值时,结束
    num = 0
    while True:
        pred_y = net(x_train)
        loss = criterion(pred_y, y_train)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        if (num +1)%20==0:
            print('Loss: {:.6f}'.format(loss.data))
        
        if loss < 1e-3:
            break
        num += 1
    
    # 保存参数
    torch.save(net.state_dict(), 'params.pth')
    
    # 加载参数
    net.load_state_dict(torch.load('params.pth'))
    # 输出每一个参数的值
    for name, param in net.named_parameters():
        if name == 'pred.weight':
            print('W1:{:.02f}, W2:{:.02f}'.format(param.data[0][0].numpy(), param.data[0][1].numpy()))
        else:
            print('b:{:.02f}'.format(param.data[0].numpy()))
    
    

    欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
    在这里插入图片描述

    注: 文中有写错的地方,欢迎大家不吝指正!!!

    作者:黑暗主宰

    邮箱:shengzhanhe@gmail.com

    展开全文
  • 简单线性回归程序三、回归模型评估1.MSE2.RMSE3.MAE4.R方四、多元线性回归模型代码实现五、作业 前言 本节知识点:学习线性回归模型,实现连续变量类型的预测。 1、掌握线性回归的原理; 2、能够实用线性回归进行...

    前言

    本节知识点:学习线性回归模型,实现连续变量类型的预测。
    1、掌握线性回归的原理;
    2、能够实用线性回归进行预测;
    3、能够对线性回归模型进行预测;

    一、重要概念

    1.模型

    2.回归分析

    3.简单线性回归

    4.拟合

    5.多元线性回归

    6.损失函数

    用来衡量误差,检验预测值与真实值之间的差异,也叫目标函数或代价函数;
    在这里插入图片描述

    7.参数求解

    二、一元线性回归模型代码实现

    1.简单线性回归程序

    以鸢尾花数据集中花瓣长度和宽度为例,通过程序实现线性回归模型;

    import numpy as np 
    #线性回归需要的类;
    from sklearn.linear_model import LinearRegression
    #用来切分训练集和测试集
    from sklearn.model_selection import train_test_split
    from sklearn.datasets import load_iris
    #设置输出的精度,默认为8.
    np.set_printoptions(precision=2)
    iris=load_iris()
    #获取花瓣长度作为x,花瓣宽度作为y
    X,y=iris.data[:,2].reshape(-1,1),iris.data[:,3]
    lr=LinearRegression()
    #将数据集分为训练集和测试集
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)#test_size:表示测试集大小;random_state表示随机种子用来产生相同的随机数序列。
    
    lr.fit(X_train,y_train)
    print("权重:",lr.coef_)
    print("截距:",lr.intercept_)
    #从训练集中学习到了模型的参数(w与b),确定方程,就可以进行预测;
    y_hat=lr.predict(X_test)
    print("实际值:",y_test[:5])
    print("预测值:",y_hat[:5])
    
    输出:
    权重: [0.42]
    截距: -0.37058412021766785
    实际值: [2.4 1.  0.2 1.8 0.2]
    预测值: [1.77 1.31 0.22 2.27 0.26]
    

    可视化

    import matplotlib.pyplot as plt
    plt.rcParams["font.family"]="SimHei"
    plt.rcParams["axes.unicode_minus"]=False
    plt.rcParams["font.size"]=15 
    plt.figure(figsize=(10,6))
    plt.scatter(X_train,y_train,c="orange",label="训练集")
    plt.scatter(X_test,y_test,c="g",label="测试集")
    plt.plot(X,lr.predict(X),"r-")
    plt.legend()
    plt.xlabel("花瓣长度")
    plt.ylabel("花瓣宽度")
    
    输出:Text(0, 0.5, '花瓣宽度')
    

    可视化效果:
    在这里插入图片描述

    plt.figure(figsize=(15,6))
    plt.plot(y_test,label="真实值",color="r",marker="o")
    plt.plot(y_hat,label="预测值",ls="--",color="g",marker="o")
    plt.xlabel("测试集数据序号")
    plt.ylabel("数据值")
    plt.legend()
    

    在这里插入图片描述

    三、回归模型评估

    1.MSE

    平均平方误差,为所有样本数据误差(真实值与预测值之差)的平方和,然后取均值。

    2.RMSE

    在平均平方误差的基础上,取其平方根。
    两者公式如下:

    在这里插入图片描述

    3.MAE

    平均绝对值误差,为所有样本数据误差的绝对值和。
    公式如下:
    在这里插入图片描述

    4.R方

    R方为决定系数,用来表示模型拟合的分值,值越高表示模型拟合的越好。在训练集中,r方的取值范围为【0,1】,在测试集中这样的未知数据中,其取值范围为【-无穷大,1】。
    公式如下:
    在这里插入图片描述
    对比几个模型评估方法看一下值

    from sklearn.metrics import mean_squared_error,mean_absolute_error,r2_score 
    print("均方误差(MSE):",mean_squared_error(y_test,y_hat))
    print("根均方误差(RMSE):",np.sqrt(mean_squared_error(y_test,y_hat)))
    print("平均绝对值误差(MAE):",mean_absolute_error(y_test,y_hat))
    print("训练集R^2:",r2_score(y_train,lr.predict(X_train)))
    print("测试集R^2:",r2_score(y_test,y_hat))
    
    #score求解的其实就是r^2的值,但r2_score与score方法传递的参数的内容是不同的。
    print("训练集R^2:",lr.score(X_train,y_train))
    print("训练集R^2:",lr.score(X_test,y_test))
    
    输出:
    均方误差(MSE): 0.0521286207919386
    根均方误差(RMSE): 0.2283169305854005
    平均绝对值误差(MAE): 0.1673599103556632
    训练集R^2: 0.9358824215964661
    测试集R^2: 0.8931453922584154
    训练集R^2: 0.9358824215964661
    训练集R^2: 0.8931453922584154
    

    四、多元线性回归模型代码实现

    上面是再用一元线性回归来计算模型,在实际场景中多因素影响才是常见的,我们以波士顿房价为例进行学习:
    在这里插入图片描述
    首先导入数据和各种计算的库,对数据集有个大概的预览:

    from sklearn.linear_model import LinearRegression
    from sklearn.model_selection import train_test_split
    from sklearn.datasets import load_boston
    import pandas as pd
    boston=load_boston()
    X,y=boston.data,boston.target
    df=pd.DataFrame(np.concatenate([X,y.reshape(-1,1)],axis=1),columns=boston.feature_names.tolist()+["MEDV"])
    df.head()
    

    在这里插入图片描述

    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=0)
    lr=LinearRegression()
    lr.fit(X_train, y_train)
    print("模型权重:",lr.coef_)
    print("截距:",lr.intercept_)
    y_hat=lr.predict(X_test)
    print("训练集R^2:",lr.score(X_train,y_train))
    print("测试集R^2:",lr.score(X_test,y_test))
    
    输出:
    模型权重: [-1.18e-01  4.40e-02 -5.77e-03  2.39e+00 -1.56e+01  3.77e+00 -7.04e-03  -1.43e+00  2.40e-01 -1.13e-02 -9.86e-01  8.44e-03 -4.99e-01]
    截距: 36.933255457118676
    训练集R^2: 0.7697699488741149
    测试集R^2: 0.6354638433202129
    

    五、作业

    1、使用投放广告(X)与收入(y)的数据集,进行线性回归

    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    import numpy as np 
    import pandas as pd 
    
    df=pd.read_csv("./Advertising.csv",index_col=0) #index_col=0表示自动指定某列为索引
    x=df.iloc[:,0:-1]
    y=df.iloc[:,-1]
    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
    lr=LinearRegression()
    lr.fit(x_train,y_train)
    lr.predict(x_test)
    #使用R方对模型效果进行评估
    print("训练集R^2:",lr.score(x_train,y_train))
    print("测试集R^2:",lr.score(x_test,y_test))
    
    lr.predict(x_test)
    
    输出:
    
    训练集R^2: 0.9067114990146383
    测试集R^2: 0.8601145185017869
    
    array([10.05739563,  7.4522807 ,  7.0197076 , 24.08029725, 12.01786259,
            6.53793858, 12.78286918, 15.10974587, 10.76974013, 16.34357951,
           22.88297477,  9.12924467, 10.46455672, 15.48743552, 11.58555633,
           12.17296914, 18.76551502, 10.78318566, 15.90515992, 17.30651279,
           24.06692057,  9.59834224, 15.13512211, 12.38591525,  5.71360885,
           15.24749314, 12.29402334, 20.9421167 , 13.40991558,  9.04348832,
           12.89239415, 21.40272028, 18.13802209, 21.17320803,  6.56974433,
            6.14114206,  7.89018394, 13.01541434, 14.68953791, 6.18835143])
    

    2、我们使用线性回归类,当模型调用fit方法拟合数据后,如果不调用模型的predict方法,我们该怎么对未知的数据进行预测呢?

    #我们可以通过获取权重值,与我们的测试数据 按照线性回归的公式 y=wx+b进行y值得预测
    #lr.coef_   权重列表W
    #intercept_ 截距项b
    lr.coef_.dot(x_test.T)+lr.intercept_
    
    输出:可以看到,结果是一样的。
    array([10.05739563,  7.4522807 ,  7.0197076 , 24.08029725, 12.01786259,
            6.53793858, 12.78286918, 15.10974587, 10.76974013, 16.34357951,
           22.88297477,  9.12924467, 10.46455672, 15.48743552, 11.58555633,
           12.17296914, 18.76551502, 10.78318566, 15.90515992, 17.30651279,
           24.06692057,  9.59834224, 15.13512211, 12.38591525,  5.71360885,
           15.24749314, 12.29402334, 20.9421167 , 13.40991558,  9.04348832,
           12.89239415, 21.40272028, 18.13802209, 21.17320803,  6.56974433,
            6.14114206,  7.89018394, 13.01541434, 14.68953791, 6.18835143])
    
    展开全文
  • 原标题和地址:一元(多元线性回归分析Python语言实现 https://blog.csdn.net/r3ee9y2oefcu40/article/details/82885192 OLS模型可以直接输出p值

    原标题和地址:一元(多元)线性回归分析之Python语言实现
    https://blog.csdn.net/r3ee9y2oefcu40/article/details/82885192

    OLS模型可以直接输出p值

    展开全文
  • 原标题:一元(多元线性回归分析Python语言实现欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!对商业智能BI、大数据分析挖掘、机器学习...
  •  在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。一个带有一个自变量的线性回归...
  • 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tsaiedu,并注明消息来源,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。 618狂欢,天善学院全场课程6.18折等你来! 投资...
  • 方法:使用多元线性回归进行房价预测 知识点:matplotlib绘图,相关系数,数据标准化处理 ##载入所需要的模块 from __future__ import print_function import numpy as np import pandas as pd ##matplotlib ...
  • 本文主要运用Python进行简单的线性回归,首先是介绍了线性回归的基本理论,然后是运用一些网络爬虫数据进行回归分析。12一、线性回归的理论1)线性回归的基本概念线性回归是一种有监督的学习算法,它介绍的自变量的和...
  • 回归分析简介Happy Halloween在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量...按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。下面是回归分析中最基础的简单线...
  • 导读 上一期介绍了多元线性回归分析的基本原理、前提条件和分析步骤,今天我们介绍多元线性回归分析的SAS实现。四、多元线性回归SAS实现分析例题:研究血红素(HAEM)与4种微量元素钙(CA)、铁(FE)、铜(CU)、锌(ZN)的...
  • 编者注:本文包含了使用Python2.X读取数据、数据处理、作图,构建梯度下降法函数...另外,本文还巧妙地进行了一个设计,这使得本文Python代码也可用于多元线性回归,这是区别与现有网络上大多数梯度下降法求解线性回...
  • 多元线性回归是解决此类问题的一种可行解决方案。在本文中,我将讨论多元(多种功能)线性回归,从头开始的Python实现,在实际问题上的应用和性能分析。由于它是一种“线性”回归技术,因此在假设的框架中将仅采用每个...
  • python实现一元和多元线性回归

    千次阅读 2019-07-01 16:11:06
    确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,分为单变量线性回归和多变量线性回归,即一元和多元。 一元线性回归 1.一元线性回归公式 (1)y=θ0+θ1x+ε y = \theta_{0}+\theta_{1}x + \var...
  • 线性回归,前面用Python从底层一步一个脚印用两种方法实现了回归拟合。在这个高级语言层出不穷的年代,这样做显然不明智,所以我考虑用优秀的数据分析工具——R语言(不敢说最优秀,虽然心里是这么想的,我怕有人要骂...
  •  在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。一个带有一个自变量的线性回归...
  • python多元线性回归简单实现

    千次阅读 2019-06-03 15:43:23
    继上次对成都房租进行可视化后,这次简单的做一个成都房租与面积、所属区的多元回归分析。 数据集一共有3w数据,每一组观测值对应一个房租情况,其中: 价钱:一个月房租,单位人民币。 面积:租房的面积,单位平方米。...
  • 实现功能: 对多个参数进行回归分析,得出回归方程,回归统计量P值等 创建statsmodels_test.py 将下面代码复制到该py文件 from pandas import DataFrame import statsmodels.api as sm #import statsmodels....
  • 多元线性回归--案例分析python实践

    千次阅读 2020-02-03 18:06:55
    本篇主要是针对回归分析过程中所使用到的统计量进行汇总,并通过案例,结合python语言实现。适用于一元线性回归和多元线性回归。代码可直接使用。
  • 0x00 前言 在线性回归的前3篇中,我们介绍了简单线性回归这种样本只有一个特征值的特殊形式,并且了解了一类机器学习的建模推导思想,即:通过分析问题,确定问题的损失函数或者效用函数;然后通过最优化损失函数...
  • 关注一下~,更多商业数据分析案例等你来撩前言构建多元线性回归模型时,如果能够充分的使用已有变量,或将其改造成另一种形式的可供使用的变量,将在一定程度上提高模型精度及其泛化能力。因为数据集中的名义变量(或...
  • 编者注:本文包含了使用Python2.X读取数据、数据处理、作图,构建梯度下降法函数求解...另外,本文还巧妙地进行了一个设计,这使得本文Python代码也可用于多元线性回归,这是区别与现有网络上大多数梯度下降法求解线...
  • 0 前言 在线性回归的前3篇中,我们介绍了简单线性回归这种样本只有一个特征值的特殊形式,并且了解了一类机器学习的建模推导思想,即:通过分析问题,确定问题的损失函数或者效用函数;然后通过最优化损失函数或者...
  • 回归分析简介Happy Halloween在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量...按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。下面是回归分析中最基础的简单线...

空空如也

空空如也

1 2 3 4 5
收藏数 91
精华内容 36
关键字:

多元线性回归分析python实现

python 订阅