《Python数据挖掘与机器学习实战》—3.3 用Python实现一元线性回归
3.3 用Python实现一元线性回归
一个简单的线性回归的例子就是房子价值预测问题。一般来说,房子越大,房屋的价值越高。于是可以推断出,房子的价值是与房屋面积有关的,如图3-1所示,获取的数据集如表3-1所示。
图3-1 通过房屋面积预测房子的价格
表3-1 预测房屋面积数据集示例
(1)在线性回归中,必须在数据中找出一种线性关系,以使我们可以得到a和b。假设方程式如下:
(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所示。从图中可以看到直线基本可以拟合所有的数据点。
图3-2 一元线性回归拟合效果图
- 点赞
- 收藏
- 关注作者
评论(0)