天池大赛:工业蒸汽量预测baseline
本文是对阿里云天池官网的工业蒸汽数据的建模分析,数据来自天池官网,本文仅供学习使用。
https://tianchi.aliyun.com/competition/entrance/231693/information
赛题背景
火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋转,然后汽轮机带动发电机旋转,产生电能。在这一系列的能量转化中,影响发电效率的核心是锅炉的燃烧效率,即燃料燃烧加热水产生高温高压蒸汽。
锅炉的燃烧效率的影响因素很多,包括锅炉的可调参数,如燃烧给量,一二次风,引风,返料风,给水水量;以及锅炉的工况,比如锅炉床温、床压,炉膛温度、压力,过热器的温度等。
常见回归模型
常见的回归预测模型使用的算法包括:
- 线性回归(Linear Regression)
- 岭回归(Ridge Regression)
- LASSO (Least Absolute Shrinkage and Selection Operator)回归
- 决策树回归(Decision TreeRegressor)
- 梯度提升树回归(Gradient Boosting Decison Tree Regressor)
导入库
主要是用于数据处理、可视化、建模等
1 | import pandas as pd |
导入数据
导入训练集和测试集
数据来自阿里天池官网,两个txt的文件:
In [2]:
1 | train = pd.read_table("zhengqi_train.txt") |
Out[2]:
数据说明
数据分成训练数据(train.txt)和测试数据(test.txt),其中字段”V0”-“V37”,这38个字段是作为特征变量,”target”作为目标变量。
利用训练数据训练出模型,预测测试数据的目标变量,排名结果依据预测结果的均方误差MSE(mean square error)为评判标准。评价指标为:
$$\mathrm{MSE}=\frac{S S E}{n}=\frac{1}{n} \sum_{i=1}^{n} w_{i}\left(y_{i}-\hat{y}_{i}\right)^{2}$$
在scikit-learn中如何实现指标的验证?
1 | from sklearn.metrics import mean_squared_error |
数据EDA
基本信息
主要是针对训练集train的基本信息探索:
In [3]:
1 | train.shape |
Out[3]:
1 | (2888, 39) |
In [4]:
1 |
|
Out[4]:
数据比较完美,没有任何缺失值
1 | V0 0 |
In [5]:
1 | train.info() |
In [6]:
描述统计信息主要是查看数值型字段的统计指标,比如:数量、均值、方差、最值、分位数等
1 |
|
Out[6]:
数据可视化-箱型图
箱型图主要是查看特征变量的分布,检验是否有异常值:
In [7]:
1 | parameters = train.columns.tolist()[:-1] |
In [8]:
1 | # 两个基本参数:设置行、列 |
从上面的图形箱型图中能够观察到:很多字段是存在异常值的(圆点部分),可以考虑进行删除
获取异常数据
通过建模的方法来检查数据中的异常值:
In [9]:
1 | def find_outliers(model,X,y,sigma=3): |
岭回归
通过岭回归来找到异常值,并且绘制出分布图形:
In [10]:
1 | from sklearn.linear_model import Ridge |
Out[10]:
1 | Int64Index([ 321, 348, 376, 777, 884, 1145, 1164, 1310, 1458, 1466, 1484, |
下面的散点图中能够观察到异常值:
随机森林回归
In [11]:
1 | from sklearn import ensemble |
Out[11]:
1 | Int64Index([ 344, 348, 376, 419, 693, 771, 776, 777, 847, 848, 1036, |
直方图和QQ图
QQ图:数据的分位数和正态分布的分位数的对比参照图。如果数据符合正态分布,则所有的图都会落在直线上。以变量V0为例:
In [12]:
1 | plt.figure(figsize=(10,5)) |
可以看到V0的分布不是正态分布。下面绘制全部变量的QQ图:
In [13]:
1 | V_list = train.columns[:-1] |
部分截图展示:
KDE图
KDE(Kernel Density Estimation,核密度图),可以认为是对直方图的加窗平滑。通过KDE分布图,可以查看训练集和测试集中特征变量的分布情况。
对比V0在训练集和测试集中的分布情况:
In [14]:
1 | plt.figure(figsize=(6,3), dpi=150) |
结果显示:V0变量在训练集和测试集上分布基本是一致的。
线性回归关系图
单个变量
线性回归关系图主要是用于分析变量之间的线性回归关系:
In [15]:
1 | plt.figure(figsize=(6,3), dpi=150) |
1 | plt.figure(figsize=(6,3), dpi=150) |
所有变量
1 | # fcols = 6 |
相关性分析
讨论特征变量和目标变量间的关系,为特征工程的提取做好准备工作。
计算相关系数
删除在训练集和测试集中分布不一致的特征变量,如V5、V9、V11等
In [18]:
1 | train1 = train.drop(["V5","V9","V11","V17","V22","V28"],axis=1) |
相关性热力图
In [19]:
1 | ax = plt.subplots(figsize=(20,16)) |
上图结果展示的是特征变量和目标变量target之间的相关性系数。数值越大,相关性越强。
对角线上数值为1,指的是本身的相关性,因此为1.
根据相关性筛选变量
寻找K=10个与target变量最相关的特征变量。
In [20]:
1 | k = 10 |
Out[20]:
1 | Index(['target', 'V0', 'V1', 'V8', 'V27', 'V31', 'V2', 'V4', 'V12', 'V16'], dtype='object') |
In [21]:
1 | # train1_corr.nlargest(k,"target") # 表示根据target列进行降序排列,取出前k个 |
In [22]:
1 | cm = np.corrcoef(train[cols].values.T) |
找出与target的相关系数的绝对值大于0.5的特征变量:
In [23]:
1 | threshold = 0.5 |
筛选出True的特征:
In [25]:
1 | corrmat.index[abs(corrmat["target"]) > threshold] # 2、筛选出为True的特征 |
Out[25]:
1 | Index(['V0', 'V1', 'V2', 'V3', 'V4', 'V8', 'V12', 'V16', 'V27', 'V31', 'V37', |
删除相关特征
删除相关系数低于给定阈值的特征:
In [26]:
1 | threshold = 0.5 |
相关系数特点
相关系数主要是用于判断线性相关的大小;如果存在非线性相关的关系,则可以使用树模型的特征重要性来进行选择。
Box-Cox变换
特点
线性回归是基于正态分布的,因此在进行统计的时候需要先转换数据,使其符合正态分布.
- 在连续变量不满足正态则可使用Box-Cox使其符合正态分布
- 转换之前需要对数据进行归一化处理
- 转换之后可以在一定的程度上减小不可观察测的误差和预测变量的相关性,有利于线性模型的拟合以及分析出特正的相关性
需要注意的是:
- 线下:在归一化的时候,对数据进行合并操作,可以使训练集和测试集一致
- 线上:线上部署只对训练集进行归一化即可,不能改变测试集的数据分布
数据合并
In [27]:
1 | drop_columns = ["V5","V9","V11","V17","V22","V28"] |
归一化操作
In [28]:
1 | columns_all = data.columns.tolist() |
In [29]:
1 | data[columns_all] = data[columns_all].apply(scale_minmax, axis=0) |
Out[29]:
1 | # 训练集和测试集单独归一化操作 |
可视化展示
将进行转换后的数据进行展示:
In [31]:
1 | cols_left = columns_all[:13] |
Out[31]:
1 | fcols = 6 |
特征工程
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
特征工程一般包括:
- 特征使用
- 特征获取
- 特征处理
- 特征选择
- 特征监控
主要的处理流程:
- 先去掉无用特征
- 接着去除冗余特征
- 可以考虑生成新的有用特征
- 特征转换(数值化、类型转换、归一化等)
- 特征处理以及符合模型的使用