文章目录
- 1. 线性回归实战准备
- 1.1 scikit-learn介绍
- 1.2 sklearn求解线性回归
- 1.3 模型表现评估
- 1.4 matplotlib可视化模型
- 2. 单因子线性回归模型
- 2.1 Jupyter Notebook的使用
- 2.2 数据的加载
- 2.3 数据的赋值
- 2.4 数据的可视化
- 2.5 单因子模型的建立
- 3. 多因子线性回归模型
- 3.1 数据的加载
- 3.2 单因子数据可视化集
- 3.3 建立单因子模型
- 3.4 评估单因子模型表现
- 3.5 建立多因子模型
- 3.6 评估多因子模型表现
- 3.7 测试数据预测房价
- 4. 总结
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的值越小越好
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的使用
这里用我们之前创建的AI环境(图中箭头已标示出来),然后在这个环境下登录我们的Jupyter Notebook,登陆之后会自动打开我们设置的浏览器,如下图:
创建一个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倍的下降,很好地实现了预测结果的可视化,我们可以直观对比预测价格与实际价格的差异。