《Python数据挖掘与机器学习实战》—3.4.3 线性回归模型

举报
华章计算机 发表于 2019/06/17 14:04:03 2019/06/17
【摘要】 本节书摘来自华章计算机《Python数据挖掘与机器学习实战》一书中的第3章,第3.4.3节,作者是方巍 。

3.4.3  线性回归模型

  线性回归模型具有如下优缺点。

  •  优点:快速;没有调节参数;可轻易解释;可理解。

  •  缺点:相比其他复杂一些的模型,其预测准确率不高,因为它假设特征和响应之间存在确定的线性关系,这种假设对于非线性的关系,线性回归模型显然不能很好地进行数据建模。

  1.使用pandas构建X(特征向量)和y(标签列)

  scikit-learn要求X是一个特征矩阵,y是一个NumPy向量。pandas构建在NumPy之上。因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解这种结构。

 

  #创建特征列表

  feature_cols = ['TV', 'Radio', 'Newspaper']

  #使用列表选择原始DataFrame的子集

  X = data[feature_cols]

  X = data[['TV', 'Radio', 'Newspaper']]

  # 输出前5项数据

  print (X.head())

 

  检查X类型及维度,代码如下:

 

  print (type(X))

  print (X.shape)

 

  输出结果如下:

 

        TV      Radio    Newspaper

  0    230.1     37.8       69.2

  1    44.5      39.3       45.1

  2    17.2      45.9       69.3

  3    151.5     41.3       58.5

  4    180.8     10.8       58.4

  <class 'pandas.core.frame.DataFrame'>

  (200, 3)

 

  查看数据集中的数据,代码如下:

 

  #从DataFrame中选择一个Series

  y = data['Sales']

  y = data.Sales

  #输出前5项数据

  print (y.head())

 

  输出的结果如下:

 

  0    22.1

  1    10.4

  2     9.3

  3    18.5

  4    12.9

  Name: Sales

  2.构建训练集与测试集

  构建训练集和测试集,分别保存在X_train、y_train、Xtest和y_test中。

 

  <pre name="code"><span style="font-size:14px;">##构造训练

    集和测试集

  from sklearn.cross_validation import train_test_split       #这里是引用交叉验证

  X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1)

  # 75%用于训练,25% 用于测试

  print (X_train.shape)

  print (y_train.shape)

  print (X_test.shape)

  print (y_test.shape)

 

  查看构建的训练集和测试集,输出结果如下:

 

  (150,3)

  (150,)

  (50,3)

  (50,)

  3.sklearn的线性回归

  使用sklearn做线性回归,首先导入相关的线性回归模型,然后做线性回归模拟。

 

  from sklearn.linear_model import LinearRegression

  linreg = LinearRegression()

  model=linreg.fit(X_train, y_train)                                #线性回归

  print (model)

  print (linreg.intercept_)                 #输出结果

  print (linreg.coef_)

 

  输出的结果如下:

 

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

  2.66816623043

  [ 0.04641001  0.19272538 -0.00349015]

 

  输出变量的回归系数:

 

  # 将特征名称与系数对应

  zip(feature_cols, linreg.coef_)

 

  输出如下:

 

  [('TV', 0.046410010869663267),

   ('Radio', 0.19272538367491721),

   ('Newspaper', -0.0034901506098328305)]

 

  线性回归的结果如下:

         y=2.668+0.0464×TV+0.192×Radio-0.00349×Newspaper       (3-8)

  如何解释各个特征对应的系数的意义呢?

  对于给定了Radio和Newspaper的广告投入,如果在TV广告上每多投入1个单位,对应销量将增加0.0466个单位。也就是其他两个媒体的广告投入固定,在TV广告上每增加1000美元(因为单位是1000美元),销量将增加46.6(因为单位是1000)。但是大家注意,这里的Newspaper的系数是负数,所以可以考虑不使用Newspaper这个特征。

  4.预测

  通过线性模拟求出回归模型之后,可通过模型预测数据,通过predict函数即可求出预测结果。

 

  y_pred = linreg.predict(X_test)

  print (y_pred)

  print (type(y_pred))

 

  输出结果如下:

 

  [ 14.58678373   7.92397999   16.9497993   19.35791038  7.36360284

    7.35359269   16.08342325  9.16533046   20.35507374  12.63160058

    22.83356472  9.66291461   4.18055603   13.70368584  11.4533557

    4.16940565   10.31271413  23.06786868  17.80464565  14.53070132

    15.19656684  14.22969609  7.54691167   13.47210324  15.00625898

    19.28532444  20.7319878   19.70408833  18.21640853  8.50112687

    9.8493781    9.51425763   9.73270043   18.13782015  15.41731544

    5.07416787   12.20575251  14.05507493  10.6699926   7.16006245

    11.80728836  24.79748121  10.40809168  24.05228404  18.44737314

    20.80572631  9.45424805   17.00481708  5.78634105   5.10594849]

  <type 'numpy.ndarray'>

  5.评价测度

  对于分类问题,评价测度是准确率,但其不适用于回归问题,因此使用针对连续数值的评价测度(evaluation metrics)。

  这里介绍3种常用的针对线性回归的评价测度。

  •  平均绝对误差(Mean Absolute Error,MAE);

  •  均方误差(Mean Squared Error,MSE);

  •  均方根误差(Root Mean Squared Error,RMSE)。

  这里使用RMES进行评价测度。

 

  #计算Sales预测的RMSE

  print (type(y_pred),type(y_test))

  print (len(y_pred),len(y_test))

  print (y_pred.shape,y_test.shape)

  from sklearn import metrics

  import numpy as np

  sum_mean=0

  for i in range(len(y_pred)):

      sum_mean+=(y_pred[i]-y_test.values[i])**2

  sum_erro=np.sqrt(sum_mean/50)

  # 计算RMSE的大小

  print ("RMSE by hand:",sum_erro)

 

  最后的结果如下:

 

  <type 'numpy.ndarray'><class 'pandas.core.series.Series'>

  50 50

  (50,) (50,)

  RMSE by hand: 1.42998147691

 

  接下来绘制ROC曲线,代码如下:

 

  import matplotlib.pyplot as plt

  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.show()#显示结果

 

  运行程序,显示结果如图3-4所示(上面的曲线是真实值曲线,下面的曲线是预测值曲线)。

  至此,整个一次多元线性回归的预测就结束了。

  image.png

图3-4模拟效果比对图


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。