单因子、多因子线性回归模型

1. 线性回归实战准备

1.1 scikit-learn介绍

sklearn (scikit-learn) 是基于 Python 语言的机器学习工具,是专门针对机器学习应用发展起来的一款开源框架(算法库),可以实现数据预处理、分类、回归、降维、模型选择等常用的机器学习算法。

  • 简单高效的数据挖掘和数据分析工具
  • 可供大家在各种环境中重复使用
  • 建立在 NumPy ,SciPy 和 matplotlib 上
  • 开源,可商业使用 - BSD许可证

Scikit-learn集成了很多机器学习中成熟的算法,容易安装和使用,官方文档也非常详细,但是需要注意的是它不支持Python之外的语言,不支持深度学习与强化学习。

1.2 sklearn求解线性回归

对于线性回归问题的求解,主要目标是寻找到合适的a和b,创建线性回归模型:y = ax + b

from sklearn.linear_model import LinearRegression
lr_model = LinearRegression()
lr_model.fit(x,y)

得到a、b的值

a = lr_model.coef_
b = lr_model.intercept_

对新数据做出预测

predictions = lr_model.predict(x_new)

1.3 模型表现评估

y与y_predict的均方误差 (MSE):
MSE
这里的MSE的值越小越好
R方值
R方值
R方值越接近1,模型的拟合效果越好

代码的引入:

from sklearn.metrics import mean_squared_error,r2_score
MSE = mean_squared_error(y,y_predict)
R2 = r2_score(y,y_predict)

画图对比y与y_predict,可视化模型表现 (集中度越高越接近直线分布效果越好),代码如下:

from matplotlib import pyplot as plt
plt.scatter(y,y_predict)

1.4 matplotlib可视化模型

我们可以使用matplotlib画出数据的散点图,将与多个因子有关的散点图同时展示出来,代码举例如下:

# 画散点图
import matplotlib.pyplot as plt
plt.scatter(x,y)
# 多张图同时展示
fig1 = plt.subplot(211)
plt.scatter(x1,y1)
fig2 = plt.subplot(212)
plt.scatter(x2,y2)

2. 单因子线性回归模型

2.1 Jupyter Notebook的使用

anaconda这里用我们之前创建的AI环境(图中箭头已标示出来),然后在这个环境下登录我们的Jupyter Notebook,登陆之后会自动打开我们设置的浏览器,如下图:
Google浏览器创建一个Python文件,操作如下:
创建Python文件

2.2 数据的加载

现在我们基于数据generated_data.csv,
单因子模型数据
任务:建立线性回归模型,预测x=3.5对应的y值,评估模型表现

# load the data
import pandas as pd
data = pd.read_csv('generated_data.csv')
data.head()

运行结果(以下省略该提示):
在这里插入图片描述

print(type(data),data.shape)

2.3 数据的赋值

# data赋值
x = data.loc[:,'x']
y = data.loc[:,'y']
print(x,y)

2.4 数据的可视化

# visual the data
from matplotlib import pyplot as plt
# figsize=(x,y)设置图的尺寸
# plt.figure(figsize=(20,20))
plt.figure()
plt.scatter(x,y)
plt.show()

2.5 单因子模型的建立

# set up a linear regression model
from sklearn.linear_model import LinearRegression
lr_model = LinearRegression()
import numpy as np
x = np.array(x)
x = x.reshape(-1,1)
y = np.array(y)
y = y.reshape(-1,1)
print(type(x),x.shape,type(y),y.shape)

print(type(x),x.shape)

lr_model.fit(x,y)

y_predict = lr_model.predict(x)
print(y_predict)

y_3 = lr_model.predict([[3.5]])
print(y_3)

print(y)

# a\b打印
a = lr_model.coef_
b = lr_model.intercept_
print(a,b)

from sklearn.metrics import mean_squared_error,r2_score
MSE = mean_squared_error(y,y_predict)
R2 = r2_score(y,y_predict)
print(MSE,R2)

plt.figure()
plt.plot(y,y_predict)
plt.show()


可以看到拟合的效果非常好,但是现实生活中这种理想的数据往往是不存在的,因为现实生活中数据量往往是巨大的,且影响y值的因素有很多,往往受到多因子的影响。这个简单的单因子模型只是为了让我们能更好地了解数据的加载、数据的处理、模型的建立、评估等一系列流程,下面的多因子线性回归模型才是我们要理解和掌握的重点。

3. 多因子线性回归模型

3.1 数据的加载

现在我们基于房价数据usa_housing_price.csv进行多因子线性回归模型的建立,首先加载数据
数据的一部分

# 数据加载
import pandas as pd
import numpy as np
data = pd.read_csv('usa_housing_price.csv')
data.head()

3.2 单因子数据可视化集

# 单因子数据可视化
%matplotlib inline
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(10,10))
fig1 = plt.subplot(231)
plt.scatter(data.loc[:,'Avg. Area Income'],data.loc[:,'Price'])
plt.title('Price VS Income')

fig2 = plt.subplot(232)
plt.scatter(data.loc[:,'Avg. Area House Age'],data.loc[:,'Price'])
plt.title('Price VS House Age')

fig3 = plt.subplot(233)
plt.scatter(data.loc[:,'Avg. Area Number of Rooms'],data.loc[:,'Price'])
plt.title('Price VS Number of Rooms')

fig4 = plt.subplot(234)
plt.scatter(data.loc[:,'Area Population'],data.loc[:,'Price'])
plt.title('Price VS Area Population')

fig5 = plt.subplot(235)
plt.scatter(data.loc[:,'size'],data.loc[:,'Price'])
plt.title('Price VS size')

在这里插入图片描述

# define x and y
x = data.loc[:,'size']
y = data.loc[:,'Price']
y.head()
x = np.array(x).reshape(-1,1)
print(x,x.shape)

3.3 建立单因子模型

# 建立单因子模型
from sklearn.linear_model import LinearRegression
LR1 = LinearRegression()
# 训练模型
LR1.fit(x,y)

在这里插入图片描述

# 计算单因子site对应的的price
y_predict_1 = LR1.predict(x)
print(y_predict_1)

在这里插入图片描述

3.4 评估单因子模型表现

# 评估模型表现
from sklearn.metrics import mean_squared_error,r2_score
mean_squared_error_1 =  mean_squared_error(y,y_predict_1)
r2_score_1 = r2_score(y,y_predict_1)
print(mean_squared_error_1,r2_score_1)   

在这里插入图片描述

fig6 = plt.figure(figsize=(8,5))
plt.scatter(x,y)
plt.plot(x,y_predict_1,'r')
plt.show()

在这里插入图片描述

3.5 建立多因子模型

# define x_multi
x_multi = data.drop(['Price'],axis=1)
x_multi

在这里插入图片描述

# 多因子线性回归结构模型
LR_multi = LinearRegression()
# 训练模型
LR_multi.fit(x_multi,y)

在这里插入图片描述

# 模型预测
y_predict_multi = LR_multi.predict(x_multi)
print(y_predict_multi)

在这里插入图片描述

3.6 评估多因子模型表现

# 评估模型表现
mean_squared_error_multi =  mean_squared_error(y,y_predict_multi)
r2_score_multi = r2_score(y,y_predict_multi)
print(mean_squared_error_multi,r2_score_multi)  

在这里插入图片描述

print(mean_squared_error_1)

在这里插入图片描述

fig7 = plt.figure(figsize=(8,5))
plt.scatter(y,y_predict_multi)

在这里插入图片描述

fig8 = plt.figure(figsize=(8,5))
plt.scatter(y,y_predict_1)

在这里插入图片描述

3.7 测试数据预测房价

# 用测试数据预测房价
x_test = [86295,4.372543,8.011898,47560.78,231.0471]
print(type(x_test))
x_test = np.array(x_test).reshape(1,-1)
print(x_test)

在这里插入图片描述

y_test_predict = LR_multi.predict(x_test)
print(y_test_predict)

在这里插入图片描述

4. 总结

可以看出,相较于单因子模型,多因子模型达到了更好的预测效果,R方值为0.91,MSE也有了将近10倍的下降,很好地实现了预测结果的可视化,我们可以直观对比预测价格与实际价格的差异。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐