集成学习案例二 —— 蒸汽量预测
1 研究问题
本案例的主要研究问题是如何根据锅炉的工况,预测其产生的蒸汽量,下面对该问题的背景及该案例的具体数据情况进行简要的介绍。
1.1 背景介绍
火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋转,然后汽轮机带动发电机旋转,产生电能。在这一系列的能量转化中,影响发电效率的核心是锅炉的燃烧效率,即燃料燃烧加热水产生高温高压蒸汽。
锅炉的燃烧效率的影响因素很多,包括锅炉的可调参数,如燃烧给量,一二次风,引风,返料风,给水水量;以及锅炉的工况,比如锅炉床温、床压,炉膛温度、压力,过热器的温度等。
该案例便是基于以上工业指标特征,对锅炉蒸汽量的进行预测,从而得到这个锅炉的发电效率的重要指标信息。由于信息安全等原因,我们使用的是经脱敏后的锅炉传感器采集的数据(采集频率是分钟级别)。
1.2 数据信息
数据分成训练数据和测试数据,其中包括从 V0
到 V37
共 383838 个字段作为特征变量,target
作为目标变量。我们需要利用训练数据训练出模型,预测出测试数据的目标变量。
最终的评价指标为均方误差 MSE ,即:Score=1n∑i=1n(yi−y∗)2\text{Score} = \dfrac{1}{n} \sum\limits_{i=1} ^n (y_i - y ^*)^2Score=n1i=1∑n(yi−y∗)2
2 数据探索性分析
首先需要对数据进行探索性分析( Exploratory Data Analysis, EDA ),以及根据分析结果进行对应的数据预处理。
2.1 加载数据
# 加载数据包
import warnings
warnings.filterwarnings("ignore")
import matplotlib.pyplot as plt
import seaborn as sns
# 模型
import pandas as pd
import numpy as np
from scipy import stats
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV, RepeatedKFold, cross_val_score,cross_val_predict,KFold
from sklearn.metrics import make_scorer,mean_squared_error
from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet
from sklearn.svm import LinearSVR, SVR
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor,AdaBoostRegressor
from xgboost import XGBRegressor
from sklearn.preprocessing import PolynomialFeatures,MinMaxScaler,StandardScaler
# 加载数据
data_train = pd.read_csv('train.txt',sep = '\t')
data_test = pd.read_csv('test.txt',sep = '\t')
#合并训练数据和测试数据
data_train["oringin"]="train"
data_test["oringin"]="test"
data_all=pd.concat([data_train,data_test],axis=0,ignore_index=True)
2.2 探索数据分布
核密度估计( kernel density estimation )是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。
这里使用 kdeplot
绘制核密度估计图进行初步的数据分析,可以比较直观的看出数据样本本身的分布特征:
for column in data_all.columns[0:-2]:
g = sns.kdeplot(data_all[column][(data_all["oringin"] == "train")], color="Red", shade=True)
g = sns.kdeplot(data_all[column][(data_all["oringin"] == "test")], ax=g, color="Blue", shade=True)
g.set_xlabel(column)
g.set_ylabel("Frequency")
g = g.legend(["train","test"])
plt.show()
可以看出特征 V5
,V9
,V11
,V17
,V22
,V28
中训练集数据分布和测试集数据分布不均,所以我们需要删除这些特征数据:
data_all.drop(["V5","V9","V11","V17","V22","V28"], axis=1, inplace=True)
2.3 特征相关性
查看特征之间的相关性(相关程度):
data_train1=data_all[data_all["oringin"]=="train"].drop("oringin",axis=1)
plt.figure(figsize=(20, 16)) # 指定绘图对象宽度和高度
colnm = data_train1.columns.tolist() # 列表头
mcorr = data_train1[colnm].corr(method="spearman") # 相关系数矩阵,即给出了任意两个变量之间的相关系数
mask = np.zeros_like(mcorr, dtype=np.bool) # 构造与mcorr同维数矩阵 为bool型
mask[np.triu_indices_from(mask)] = True # 角分线右侧为True
cmap = sns.diverging_palette(220, 10, as_cmap=True) # 返回matplotlib colormap对象,调色板
g = sns