Python学习资料整理和大叔走大数据应用之路

Python 机器学习——回归(线性回归)

2019-06-17  本文已影响58人  Bocchi

1 儿童体表面积预测

(本节介绍如何利用线性回归模型进行预测分析)
  下表所示为某医院医师测得的10名4岁儿童的身高(cm)、体重(kg)与体表面积(m^2)数据,下面试用线性回归方法确定以身高、体重为自变量,以体表面积为因变量的回归方程:\text{体表面积}=\beta_0+\beta_1\times\text{身高}+\beta_2\times\text{体重}

身高/cm 体重/kg 体表面积/m^2
88 11 5.382
87 11 5.299
88 12 5.358
89 12 5.292
87 13 5.602
89 13 6.014
88 14 5.830
90 14 6.102
90 15 6.075
91 16 6.414

  首先导入 Numpy 库:

    import numpy as np

  利用 Python 中的数组创造一个 Numpy 对象:

# 分别输入第1到第10名儿童的两个特征:
x_train = np.array([[88,11],
                    [87,11],
                    [88,12],
                    [89,12],
                    [87,13],
                    [89,13],
                    [88,14],
                    [90,14],
                    [90,15]])
# 对应输入儿童的体表面积
y_train=np.array([5.382,5.299,5.358,5.292,5.602,6.014,5.830,6.102,6.075])
# 输入测试集
x_test=np.array([[89,11],
                 [91,16]])
y_test=np.array([5.547,6.414])

  导入 sklearn 中的 linear_model 模块,创建一个学习器对象,载入训练集,该对象学习训练集的数据训练模型,调用 predict 方法对测试集进行预测。

    from sklearn import linear_model
    reg=linear_model.LinearRegression()     # 创建学习器对象
    reg.fit(x_train,y_train)                # 训练模型
    reg.predict(x_test)                     # 对测试集进行预测

  创建学习器对象学习训练集,训练模型进行预测,这是 sklearn 库中回归/分类常用的一种模型使用方法。
  由于是线性回归,可以利用 reg.coef_reg.intercept_ 属性,其中coef_ 表示 \beta_1,\beta_2intercept_ 代表\beta_0,则:

    reg.predict(x_text)

等价于:

    weight=reg.coef_.reshape(-1,1)
    reg.intercept_+x_text.dot(weight)      # 利用向量点乘获得加权和

  由前面获得的系数可知,体表面积与身高、体重的回归方程为:\text{体表面积}=-2.2249+0.0623\times\text{身高}+0.1855\times\text{体重}  为更加直观地分析结果,使用下面的代码导入 可视化 ,且 加入中文 支持:

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    # 中文支持
    mpl.rcParams['font.sans-serif']=[u'SimHei']    # 其他的字体有:Fangsong/Heiti/KaiTi
    mpl.rcParams['axes.unicode_minus']=False
    # 下面进行可视化
    y=reg.predict(x_train)
    x=np.linspace(5.2,6.4,100)
    plt.plot(y,y_train,'ro',x,x,'b--')
    plt.xlabel("预测的因变量")
    plt.ylabel("实际的因变量")
    plt.legend(("预测值x,实际值y","全部吻合的曲线"))
    plt.show()
图1 线性回归的可视化结果
  图中,x轴上的数值是预测值,y轴上的数值是实际值,显然若预测值等于实际值,原点将出现在虚线上。也就是说,圆点离虚线越近,说明这个点的预测效果越理想。由图可以看出,大部分圆点都在虚线附近,说明训练结果较为理想。
  为了对训练效果进行定量分析,下面利用 sklearn 中的 score() 函数对结果进行打分:
    reg.score(x_train,y_train)
    reg.score(x_test,y_test)
  • 若需要对模型预测准确度进行分析,需对未进入训练集的数据组成测试集进行评判。
  • 测试集的打分一般小于训练集的打分。这里数据量较小,因此不具有代表性。

  在该方法中国,使用了 残差的评分 概念,公式为1-\frac{\sum\limits_{i=1}^m{(y_i-\hat{y_i})^2}}{\sum\limits_{i=1}^m{(y_i-\overline{y})^2}}  其中,\hat{y_i}是第i个样本的预测值,\overline{y}是样本的平均值,y_i是第i个样本的实际值。
  该公式的数学意义是,希望预测值与实际值越接近越好,也就是\sum\limits_{i=1}^m{(y_i-\hat{y_i})^2}越小越好,然而这和样本方差有关,若除以样本的方差\sum\limits_{i=1}^m{(y_i-\overline{y})^2},就可以 统一量纲,以便在不同样本上生成的模型进行比较。


2 影响房价的预测及因素分析

(本节介绍如何利用线性回归模型依据回归系数量化分析特征的影响力)
  假设你有一个美国华盛顿地区的朋友向你寻求帮助,要你帮忙挑选房子。你的朋友综合考虑了许多因素,并试图对这些因素进行打分,找出房价影响最大的因素
  波士顿房价数据集来源于 kaggle 比赛数据,包括一些房屋及其所在的区域的信息。建立这些信息与房价的回归方程,并根据训练得到的方程系数找到对房价影响最大的那些特征。

  由于该数据集十分经典,已被 sklearn 库收录,因此这里采用其中的 datasets 模块导入数据。并查看数据的相关信息:

    from sklearn import datasets

    boston=datasets.load_boston()                              #载入数据
    print(boston.data)                                         #数据特征
    print(boston.target)                                       #类标结果
    print(u'总行数: ', len(boston.data), len(boston.target))   #数据总行数
    print(u'特征数: ', len(boston.data[0]))                    #每行数据集维数
    print(u'数据大小: ', boston.data.shape)                    #数据大小
    print(type(boston.data),type(boston.target))               #数据集类型

  这里,bostondatasets 的对象 ,其中的 data 属性为特征空间,target 属性为结果

  由于各个特征的取值范围不一样,需要将样本数据进行归一化处理(也称为 无量纲化 ),这样才能通过观察回归系数解释特征和结果的相关性:

    from sklearn import preprocessing

    min_max_scaler=preprocessing.MinMaxScaler()
    boston.data=min_max_scaler.fit_transform(boston.data)

  建立训练集与测试集

    from sklearn.model_selection import train_test_split

    x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=0)

  观察数据的最佳方法之一就是将其可视化。其中一种可视化方法就是 散点图。对于多个特征的数据集可视化,我们采用绘制 散点图矩阵 来进行,其中斜对角线上为每个特征的直方图。

    # 创建散点图矩阵
    import mglearn
    import pandas as pd
    import matplotlib.pyplot as plt

    df=pd.DataFrame(boston.data,columns=boston.feature_names)
    grr=pd.plotting.scatter_matrix(df,c=boston['target'],figsize=(15,15),marker='0',hist_kwds={'bins':20},s=60,alpha=.8,cmap=mglearn.cm3)
    plt.show()
波士顿房价数据集散点图矩阵

  由图我们可以发现,变量之间存在一定的相关关系,因此采用线性回归模型未必能够获得很好的预测结果。不过我们这里主要讨论变量的回归系数解释特征和结果的相关性强弱关系,仍具有一定的可行性。

  创建一个学习器并对样本进行学习:

    from sklearn import linear_model

    reg=linear_model.LinearRegression()     # 创建学习器对象
    reg.fit(x_train,y_train)                # 训练模型
    reg.predict(x_test)                     # 对测试集进行预测

  预测结果的可视化分析:

    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import numpy as np

    # 中文支持
    mpl.rcParams['font.sans-serif']=[u'SimHei']
    mpl.rcParams['axes.unicode_minus']=False
    # 下面进行可视化
    y=reg.predict(x_train)
    x=np.linspace(5.2,6.4,100)
    plt.plot(y,y_train,'ro',x,x,'b--')
    plt.xlabel("预测的因变量")
    plt.ylabel("实际的因变量")
    plt.legend(("预测值x,实际值y","全部吻合的曲线"))
    plt.show()
图2 线性回归的可视化结果

  由图可以看出,大部分圆点都在虚线附近,说明训练结果较为理想。同时我们可以发现,模型存在一些异常点,这些应该进行剔除(这里暂不进行这一步,大家可以自行思考)。

  利用 sklearn 中的 score() 函数对结果进行打分:

    In[29]:  reg.score(x_train, y_train)
    Out[29]:  0.7697699488741149
    In[29]:  reg.score(x_test, y_test)
    Out[30]:  0.6354638433202122

  为了量化每个特征的影响力,打印每个特征的回归系数:

    In[31]:  np.set_printoptions(suppress=True,precision=4)      #设置打印格式
       ...:  print(reg.coef_)
    Out[31]:  [-10.4749   4.4017  -0.1574   2.3934  -7.5765  19.6702  -0.6831 -15.7801
               5.5219  -5.9198  -9.2641   3.3489 -18.088 ]

  系数的绝对值大小,可以说明他们对房价影响大小。且系数为正是正相关,系数为负是负相关。


3 练习题

diabetes数据集是一个糖尿病的数据集,主要包括442行数据,10个属性值,分别是:Age(年龄)、性别(Sex)、Body mass index(体质指数)、Average Blood Pressure(平均血压)、S1~S6一年后疾病级数指标。Target为一年后患疾病的定量指标。

上一篇下一篇

猜你喜欢

热点阅读