1.获取数据,定义问题
2.整理数据
数据的预处理和归一化问题.这部分数据已经被整理好了.所以就跳过了.
3.导入模块,读取数据
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import pandas as pd
from sklearn import datasets,linear_model
#该数据是2006年到2010年五年的数据.我读取了其中一年的数据
data = pd.read_excel("Folds5x2_pp.xlsx",sheet_name="Sheet1") #jupyter notebook工作目录下
4.准备运行算法的数据
data.head() #读取前五行数据
data.shape #查看数据的维度
x_data = data.iloc[:,:-1] #设置自变量
y_data = data.PE #设置因变量
#查看一下自变量和因变量的维度
y_data.shape
x_data.shape
这里发现y_data是Series,后面建模时,导入的数据集必须是多维数组,所以要对y_data添加一个维度
y_data = y_data[:,np.newaxis]
y_data.shape
5.划分训练集和测试集
from sklearn.cross_validation import train_test_split #导入拆分数据集的模块
x_train,x_test,y_train,y_test = train_test_split(x_data,y_data,test_size=0.2,random_state=1) #80%的训练集,20%的测试集,并设置随机种子
6.运行scikit_learn的线性模型
from sklearn.linear_model import LinearRegression #导入回归模型的包
lr = LinearRegression() #初始化模型
lr.fit(x_train,y_train) #训练模型
lr.coef_ #回归参数
lr.intercept_ #截距
7.模型评价
skleran中的模型评价指标有很多,本例用均方误差来做模型拟合评价.
数理统计中均方误差是指参数估计值与参数真值之差平方的期望值,记为MSE。
MSE是衡量“平均误差”的一种较方便的方法,MSE可以评价数据的变化程度。
MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
y_pred = lr.predict(x_test) #测试模型,从测试集中得到预测的因变量
from sklearn import metrics #导入评价模型的模块
均方误差
MSE = metrics.mean_squared_error(y_test,y_pred)
均方根差
RMSE = np.sqrt(metrics.mean_squared_error(y_test,y_pred))
8.交叉验证
可以通过交叉验证来优化模型,使模型更稳定.
from sklearn.model_selection import cross_val_predict #导入交叉验证的模块
predicted = cross_val_predict(lr,x_data,y_data,cv=10) #10折交叉验证,优化预测的因变量
10折交叉验证: 将数据集分成十份,轮流将其中9份做训练1份做验证,10次的结果的均值作为对算法精度的估计.
#均方误差
MSE = metrics.mean_squared_error(y_data,predicted)
#均方根差
RMSE = np.sqrt(metrics.mean_squared_error(y_data,predicted))
这里得到的结果比之前模型评价中MSE和RMSE的要大。
原因是两次的样本量不一样,交叉验证中是对所有样本做测试集对应的预测值的MSE,而第七节中只是对20%的测试集做了MSE.
9.画图观察结果
fit,axes = plt.subplots() #画图的布局设置
axes.scatter(y_data,predicted) #画真实值与预测值的散点图
axes.plot([y_data.min(),y_data.max()],[y_data.min(),y_data.max()],'k--',lw=4) #画一条y=x的虚线
axes.set_xlabel('Measured') #横轴标签
axes.set_ylabel('predicted') #纵轴标签
plt.show() #显示图形