1、赛题介绍
赛题背景
火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋转,然后汽轮机带动发电机旋转,产生电能。在这一系列的能量转化中,影响发电效率的核心是锅炉的燃烧效率,即燃料燃烧加热水产生高温高压蒸汽。锅炉的燃烧效率的影响因素很多,包括锅炉的可调参数,如燃烧给量,一二次风,引风,返料风,给水水量;以及锅炉的工况,比如锅炉床温、床压,炉膛温度、压力,过热器的温度等。
赛题描述
经脱敏后的锅炉传感器采集的数据(采集频率是分钟级别),根据锅炉的工况,预测产生的蒸汽量。
数据说明
数据分成训练数据(train.txt)和测试数据(test.txt),其中字段”V0”-“V37”,这38个字段是作为特征变量,”target”作为目标变量。选手利用训练数据训练出模型,预测测试数据的目标变量,排名结果依据预测结果的MSE(mean square error)。
结果提交
选手需要提交测试数据的预测结果(txt格式,只有1列预测结果)。
结果评估
预测结果以mean square error作为评判标准。
赛题数据
https://tianchi.aliyun.com/competition/entrance/231693/information
2、数据梳理
官方页面提供了两个 txt 格式的数据,一个作为训练集’zhengqi_train.txt’是我们建模的依据,另一个为最后评分的‘zhengqi_test.txt’。
现在我们查看数据具体情况:
其中 train 数据包含从 V0-V37 的 38 个特征,以及目标值 target;test 则只包含从 V0-V37 的 38 个特征;
很明显这是一个回归问题,我们将采取各类回归模型来进行建模;
此次数据建模中,我们的核心思想是,采用多种建模方式来一一测试 MSE 值,最后选取 MSE 值较小的几类模型,通过平均的方式获得最后的目标值;
3、建模过程
导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LinearRegression,Lasso,Ridge,ElasticNet
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import RandomForestRegressor,GradientBoostingRegressor,AdaBoostRegressor,ExtraTreesRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler,StandardScaler,PolynomialFeatures
import warnings
warnings.filterwarnings('ignore')
导入数据
test=pd.read_csv('zhengqi_test.txt',sep='\t')
train=pd.read_csv('zhengqi_train.txt',sep='\t')
构建数据标签、数据合并
train['origin']='train'
test['origin']='test'
data=pd.concat([train,test])
特征探索
绘制出训练集与测试集中各个特征的核密度分布;
将训练集特征与测试集特征绘制在一个图表中的好处是,可以看出测试集与训练集的特征分布对比情况,且可以迅速挑选出特征不明显的予以剔除;
plt.figure(figsize=(10,38*6))
for i,col in enumerate(data.columns[:-2]):
cond=data['origin']=='train'
train_col=data[col][cond]
cond=data['origin']=='test'
test_col=data[col][cond]
axes = plt.subplot(38,1,i+1)
ax=sns.kdeplot(train_col,shade=True)
sns.kdeplot(test_col,shade=True,ax=ax)
删除特征
由上图可知,V5、V11、V17、V22四个特征,测试集与训练集中数据分布有较大差异,为了避免影响最后的训练模型,将其予以剔除;
rop_lables=['V5','V11','V17','V22']
data.drop(drop_lables,axis=1,inplace=True)
相关性系数
通过相关性系数,获取训练集中与目标值target相关性不高的特征,并予以剔除;
train_corr=train.corr()
cond=abs(train_corr['target'])<0.1
drop_lables=train_corr.loc['target'].index[cond]
#查看分布 分布良好的特征暂时不删除
drop_lables=['V14','V21']
data.drop(drop_lables,axis=1,inplace=True)
绘制相关性系数热力图
plt.figure(figsize=(20,18))
mask = np.zeros_like(train_corr, dtype=np.bool) # 构造与mcorr同维数矩阵 为bool型