《Python数据挖掘与机器学习实战》—3.3 用Python实现一元线性回归

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

3.3  用Python实现一元线性回归

  一个简单的线性回归的例子就是房子价值预测问题。一般来说,房子越大,房屋的价值越高。于是可以推断出,房子的价值是与房屋面积有关的,如图3-1所示,获取的数据集如表3-1所示。

 image.png

图3-1  通过房屋面积预测房子的价格

表3-1  预测房屋面积数据集示例

image.png


  (1)在线性回归中,必须在数据中找出一种线性关系,以使我们可以得到a和b。假设方程式如下:

                image.png(3-6)

  其中:y(x)是关于特定平方英尺的价格值(要预测的值),意思是价格是平方英尺的线性函数。a是一个常数;b是回归系数。那么现在开始编程:

  打开文本编辑器,并命名为predict_house_price.py。在程序中要用到下面的包,将下面代码复制到predict_house_price.py文件中。

 

  #需要的包

  import matplotlib.pyplot as plt

  import numpy as np

  import pandas as pd

  from sklearn import datasets, linear_model

 

  运行代码,如果程序没有报错,步骤(1)完成。如果遇到了某些错误,则意味着丢失了一些包。这时需要安装这些包。

  (2)把数据存储成一个CSV文件,命名为input_data.csv,需要编写一个函数把数据转换为X值(平方英尺)、Y值(价格)。这一步很简单,可以先用Excel来存储数据,记得写上列名。之后保存的时候另存为CSV格式即可。

 

  01    # 读取数据函数

  02    def get_data(file_name):

  03     data = pd.read_csv(file_name)                      #读取cvs文件

  04     X_parameter = []

  05     Y_parameter = []

  06     for single_square_feet ,single_price_value in zip(data['square_feet'],

               data['price']):

  07           #遍历数据

  08           X_parameter.append([float(single_square_feet)])                                                                                                                 #存储在相应的list列表中

  09           Y_parameter.append(float(single_price_value))                                                                                                                   #存储在相应的list列表中

  10     return X_parameter,Y_parameter

 

  代码中,第3行将.csv数据读入Pandas数据帧;第6~10行把Pandas数据帧转换为X_parameter和Y_parameter数据,并返回结果。所以把X_parameter和Y_parameter打印出来:

 

  [[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]]

  [6450.0, 7450.0, 8450.0, 9450.0, 11450.0, 15450.0, 18450.0]

 

  (3)现在把X_parameter和Y_parameter拟合为线性回归模型。需要写一个函数,输入为X_parameters、Y_parameter和要预测的平方英尺值,返回a、b和预测出的价格值。这里使用的是scikit-learn机器学习算法包。该算法包是目前Python实现的机器算法包中最好用的一个。

 

  01    #将数据拟合到线性模型

  02    def linear_model_main(X_parameters,Y_parameters,predict_value):

  03    #创建线性回归对象

  04     regr = linear_model.LinearRegression()

  05     regr.fit(X_parameters, Y_parameters)                          #训练模型

  06     predict_outcome = regr.predict(predict_value)

  07     predictions = {}

  08     predictions['intercept'] = regr.intercept_

  09     predictions['coefficient'] = regr.coef_

  10     predictions['predicted_value'] = predict_outcome

  11     return predictions

 

  代码中,第5行和第6行中首先创建一个线性模型,用X_parameters和Y_parameter训练它;第8~12行中创建一个名称为predictions的字典,存着a、b和预测值,并返回predictions字典为输出。所以调用以下预测函数,得到预测的平方英尺值为700。

 

  X,Y = get_data('input_data.csv')

  predictvalue = 700

  result = linear_model_main(X,Y,predictvalue)

  print ("Intercept value " , result['intercept'])

  print ("coefficient" , result['coefficient'])

  print ("Predicted value: ",result['predicted_value'])

 

  脚本输出如下:

 

  Intercept value 1771.80851064

  coefficient [ 28.77659574]

  Predicted value: [ 21915.42553191]

 

  这里,Intercept value(截距值)就是a的值,coefficient value(系数)就是b的值。得到预测的价格值为21915.4255——这意味着预测房子价格的工作做完了。为了验证,需要看看数据是否拟合线性回归,所以需要写一个函数,输入为X_parameters和Y_parameters,显示数据拟合的直线。

 

  # 显示线性拟合模型的结果

  def show_linear_line(X_parameters,Y_parameters):

  #创建线性回归对象

   regr = linear_model.LinearRegression()

   regr.fit(X_parameters, Y_parameters)

   plt.scatter(X_parameters,Y_parameters,color='blue')

   plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4)

   plt.xticks(())

   plt.yticks(())

   plt.show()

 

  那么调用show_linear_line函数:show_linear_line(X,Y),效果如图3-2所示。从图中可以看到直线基本可以拟合所有的数据点。

image.png

图3-2  一元线性回归拟合效果图


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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