有监督学习之多元线性回归
【实验目的】
掌握Python编程实现多元线性回归,因变量与单个自变量散点图、拟合效果图制作,模型评价指标、计时功能、保存模型。
【实验要求】
- 理解Python在回归分析中的评价指标等细节操作;
- 掌握本章讲授的多元线性回归的Python编程操作。
【实验过程】(必要的实验步骤、绘图、代码注释、数据分析)
实验步骤
- 1、读入数据
- 2、数据预处理
- 3、数据分析方法介绍
- 4、编程实现数据分析方法,含代码注释
- 5、重要结果的图表绘制
- 6、必要的结果解释
【实验题目】
1. 利用多元线性回归算法探讨下列问题,要求画出散点图、拟合效果图,增加模型评价指标、计时功能、保存模型。数据见 data_ex_2.xls
2. 随机抽取的15家大型商场销售的同类产品,计算销售价格y与购进价格x1、销售费用x2之间的关系,并预测当购进价格为779、销售费用为503时销售价格是多少?
代码:
# -*- coding: utf-8 -*-
'''step1 调用包'''
import time
start_time=time.time()
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from pandas import DataFrame
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
'''step2 导入数据'''
data0 = pd.read_excel('data_ex_2.xls')
data1 = DataFrame(data0)
'''step3 数据预处理'''
#数据清洗,比如第一列有可能是日期或序号,
#这样的话我们就只需要从第二列开始的数据,
#这个情况下,把下面中括号中的0改为1就好。
data = data1.iloc[1:,1:]
#绘制Y与每个xi的散点图
#通过seaborn添加一条最佳拟合直线和95%的置信区间,
#直观判断相关关系
plt.figure(1)
sns.pairplot(data, x_vars=['购进价格(元)','销售费用(元)']
, y_vars='销售价格(元)', height=7,
aspect=0.8, kind='reg')
plt.show()
'''step4 划分数据集'''
#(将带类标号数据#划分为训练集(80%)和检验集(20%)
#将类别列和特征列拆分,
#便于下面调用划分函数
X = data.iloc[:,1:]
y = data.iloc[:,0]
#调用sklearn中的函数划分上述数据
X_train,X_test,Y_train,Y_test = train_test_split(
X,y,train_size=0.8,random_state=0)
'''step5 模型计算(训练、检验、评价)'''
#step5.1 训练模型
#调用线性规划包
model = LinearRegression()
model.fit(X_train,Y_train) #线性回归训练
a = model.coef_#回归系数
b = model.intercept_#截距
print('\n 判别函数系数:xi系数:\n',np.round(a,3))
print('\n判别函数系数:截距:\n' ,np.round(b,2))
#step5.2 检验模型
Y_pred = model.predict(X_test)
#对测试集数据,用predict函数预测
#step5.3 模型评价(准确率)
#这里Y_test为真实检验集的y值
#Y_pred为模型预测的检验集的y值
#比较二者误差即可得到模型准确程度
plt.figure(2)
plt.plot(range(len(Y_pred)),Y_pred,'red',
linewidth=2.5,label="预测值")
plt.plot(range(len(Y_test)),Y_test,'blue',
label="真实值")
plt.legend(loc=2)
plt.show()#显示预测值与测试值曲线
#计算相关模型评价指标
from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import r2_score #R square
mse = mean_squared_error(Y_test,Y_pred)
rmse = np.sqrt(mse)
r_squared = r2_score(Y_test,Y_pred)
#显示结果
print("\n 均方误差(MSE):",np.round(mse,4))
print("\n 均方根误差(RMSE):",np.round(rmse,4))
print("\n 调整的R方(拟合优度,R Squared):"
,np.round(r_squared,4))
end_time=time.time()
print('time comsuming: ',np.round(end_time-start_time,2))
'''Step6 储存模型'''
# from sklearn.externals import joblib
import joblib
joblib.dump(model,'model_multiregress1.m') #保存模型
'''Step7 应用--预测'''
Y_pred2 = model.predict([[779,503]])
#对明年销量数据,用predict函数预测
print('明年销量为:',np.round(Y_pred2,2))
结果: