目录

  • 0.赛题介绍
  • 1.数据分析知识
  • 2.代码实现

0.赛题介绍

火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋转,然后汽轮机带动发电机旋转,产生电能。在这一系列的能量转化中,影响发电效率的核心是锅炉的燃烧效率,即燃料燃烧加热水产生高温高压蒸汽。锅炉的燃烧效率的影响因素很多,包括锅炉的可调参数,如燃烧给量,一二次风,引风,返料风,给水水量;以及锅炉的工况,比如锅炉床温、床压,炉膛温度、压力,过热器的温度等。

赛题描述经脱敏后的锅炉传感器采集的数据(采集频率是分钟级别),根据锅炉的工况,预测产生的蒸汽量。数据说明

数据分成训练数据(train.txt)和测试数据(test.txt),其中字段”V0”-“V37”,这38个字段是作为特征变量,”target”作为目标变量。选手利用训练数据训练出模型,预测测试数据的目标变量,排名结果依据预测结果的MSE(mean square error)。
结果提交选手需要提交测试数据的预测结果(txt格式,只有1列预测结果)。结果评估预测结果以mean square error作为评判标准。

1.数据分析知识

1. 变量识别
一般包括输入输出、数据类型(字符串,数值型、连续、类别型)
2. 变量分析
2.1 单变量:数据的分布趋势、均值、众数、中值……

2.2 双变量
连续与连续:散点图、相关性分析
连续与类别:小提琴图
类别与类别:双向表,堆叠柱状图,卡方检验

2.3 缺失值处理
删除
均值,模型,中值填充
预测模型填充

2.4 异常值处理
先检测 箱线图、直方图、散点图
后操作 删除、填充、转换、区别对待

2.5 变量转换
方法:

缩放比例或者标准化
非线性关系转位线性关系
使倾斜分布对称
变量分组

具体操作:

对数转换
取平方根或立方根
变量分组

2.6 变量生成
创建派生变量
创建哑变量

2.代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import warningswarnings.filterwarnings("ignore")train_data_file = "./zhengqi_train.txt"
test_data_file = "./zhengqi_test.txt"train_data=pd.read_csv(train_data_file,sep='\t',encoding='utf-8')
test_data=pd.read_csv(test_data_file,sep='\t',encoding='utf-8')train_data.info()
test_data.info()train_data.describe()
test_data.describe()train_data.head()
test_data.head()# #箱型图
# fig=plt.figure(figsize=(4,6)) #指定箱型图的宽度和高度
# sns.boxplot(train_data['V0'],orient="v",width=0.5)
# sns.despine(bottom=True)
# plt.show()#绘制训练集中的V0-V37所有的箱型图
column=train_data.columns.tolist()[:39]    #列表头
fig=plt.figure(figsize=(20,10),dpi=75)     #指定绘图对象的宽度和高度
for i in range(38):fig.add_subplot(5,8,i+1)     #5行8列的子图sns.boxplot(train_data[column[i]],orient="v",width=0.5)     #箱型图plt.ylabel(column[i],fontsize=36)
plt.show()#直方图和qq图
plt.figure(figsize=(10,5))
ax=plt.subplot(1,2,1)
sns.distplot(train_data['V0'],fit=stats.norm)
ax=plt.subplot(1,2,2)
res=stats.probplot(train_data['V0'],plot=plt)
plt.show()#查看所有的直方图和qq图
train_cols=12
train_rows=len(train_data.columns)
plt.figure(figsize=(2*train_cols,2*train_rows))
i=0
for col in train_data.columns:i+=1ax=plt.subplot(train_rows,train_cols,i)sns.distplot(train_data[col],fit=stats.norm)i+=1ax=plt.subplot(train_rows,train_cols,i)res=stats.probplot(train_data[col],plot=plt)
# plt.tight_layout()
plt.show()#KDE分布图    对比训练集和测试集的数据分布是否分布一致
plt.figure(figsize=(8,4),dpi=75)
ax=sns.kdeplot(train_data['V0'],color="Red",shade=True)
ax=sns.kdeplot(test_data['V0'],color="Green",shade=True)
ax.set_xlabel('V0')
ax.set_ylabel("Frequency")
ax=ax.legend(["train","test"])
plt.show()#查看所有的KDE   测试集与训练集分布不太一样的需要删除
dist_cols=6
dist_rows=len(test_data.columns)
plt.figure(figsize=(2*train_cols,2*train_rows))
i=1
for col in test_data.columns:ax=plt.subplot(dist_rows,dist_cols,i)ax = sns.kdeplot(train_data[col], color="Red", shade=True)ax = sns.kdeplot(test_data[col], color="Green", shade=True)ax.set_xlabel(col)ax.set_ylabel("Frequency")ax=ax.legend(["train","test"])i+=1
plt.show()#线性回归关系   查看所有的自变量与因变量的关系
fcols=2
frows=1
plt.figure(figsize=(8,4),dpi=150)
ax=plt.subplot(1,2,1)
sns.regplot(x='V0',y='target',data=train_data,ax=ax,\scatter_kws={'marker':'.','s':3,'alpha':0.3},\line_kws={'color':'k'});
plt.xlabel('V0')
plt.ylabel('target')
ax=plt.subplot(1,2,2)
sns.distplot(train_data['V0'].dropna())
plt.xlabel('V0')
plt.show()#查看所有的线性关系
fcols=6
frows=len(test_data.columns)
plt.figure(figsize=(2*fcols,2*frows))
i=0
for col in test_data.columns:i+=1ax=plt.subplot(frows,fcols,i)sns.regplot(x=col,y='target',data=train_data,ax=ax,\scatter_kws={'marker':'.','s':3,'alpha':0.3},\line_kws={'color':'k'});plt.xlabel('V0')plt.ylabel('target')i+=1ax=plt.subplot(frows,fcols,i)sns.distplot(train_data[col].dropna())plt.xlabel(col)
plt.show()#将特征变量与目标变量相关性不大的删除
pd.set_option('display.max_columns',10)
pd.set_option('display.max_rows',10)
data_train1=train_data.drop(['V5','V9','V11','V17','V22','V28'],axis=1)#相关性系数
train_corr=data_train1.corr()
print(train_corr)#热力图
ax=plt.subplots(figsize=(20,16))#设置画布大小
ax=sns.heatmap(train_corr,vmax=.8,square=True,annot=True)
plt.show()#根据相关系数筛选特征变量(找10个与目标相关性大的特征)
k=10
cols=train_corr.nlargest(k,'target')['target'].index
cm=np.corrcoef(train_data[cols].values.T)
hm=plt.subplots(figsize=(10,10))   #调整画布大小
hm=sns.heatmap(train_data[cols].corr(),annot=True,square=True)
plt.show()#找出相关性大与0.5的特征变量
threshold=0.5
corrmat=train_data.corr()
top_corr_features=corrmat.index[abs(corrmat['target'])>threshold]
plt.figure(figsize=(10,10))
g=sns.heatmap(train_data[top_corr_features].corr(),annot=True,cmap="RdYlGn")#将相关性小于0.5的特征去掉
corr_matrix=data_train1.corr().abs()
drop_col=corr_matrix[corr_matrix['target']<threshold].index
#data_all.drop(drop_col,axis=1,inplace=True)#box-cox变换
#在有些时候。数据不满足正态分布,这时候就要将其进行转换,转换后的数据保持原始信息,但是转换之前需要进行归一化处理
drop_columns=['V5','V9','V11','V17','V22','V28']#合并数据集
train_x=train_data.drop(['target'],axis=1)
#data_all=pd.concat([train_data,test_data],axis=0,ignor_index=True)
data_all=pd.concat([train_data,test_data])
data_all.drop(drop_columns,axis=1,inplace=True)
print(data_all.head())#归一化
cols_numeric=list(data_all.columns)
def scale_minmax(col):return (col-col.min())/(col.max()-col.min())
data_all[cols_numeric]=data_all[cols_numeric].apply(scale_minmax,axis=0)
print(data_all[cols_numeric].describe())
train_data_process=train_data[cols_numeric]
train_data_process=train_data_process[cols_numeric].apply(scale_minmax,axis=0)
# test_data_process=test_data[cols_numeric]
# test_data_process=test_data_process[cols_numeric].apply(scale_minmax,axis=0)#在对特征进行box-cox变换后,计算分为数并画图展示(基于正态分布),显示特征变量与target的线性关系
cols_numeric_left=cols_numeric[0:13]
cols_numeric_right=cols_numeric[13:]
train_data_process=pd.concat([train_data_process,train_data['target']],axis=1)
fcols=6
frows=len(cols_numeric_left)
plt.figure(figsize=(2*fcols,2*frows))
i=0
for var in cols_numeric_left:dat=train_data_process[[var,'target']].dropna()i+=1plt.subplot(frows, fcols, i)sns.distplot(dat[var], fit=stats.norm)plt.title(var + 'Original')plt.xlabel('')i+=1plt.subplot(frows, fcols, i)_=stats.probplot(dat[var], plot=plt)plt.title('skew=' + '{:.4f}'.format(stats.skew(dat[var])))plt.xlabel('')plt.ylabel('')i+=1plt.subplot(frows, fcols, i)plt.plot(dat[var], dat['target'],'.', alpha=0.5)plt.title('corr=' +'{:.2f}'.format(np.corrcoef(dat[var],dat['target'])[0][1]))i+=1plt.subplot(frows,fcols,i)trans_var, lambda_var = stats.boxcox(dat[var].dropna() + 1)trans_var = scale_minmax(trans_var)sns.distplot(trans_var, fit=stats.norm)plt.title(var +'Tramsformed')plt.xlabel('')i+=1plt.subplot(frows, fcols, i)stats.probplot (trans_var, plot=plt)plt.title('skew='+'{:.4f}'.format(stats.skew(trans_var)))plt.xlabel('')plt.ylabel ('')i+=1plt.subplot(frows, fcols, i)plt.plot(trans_var, dat['target'],'.', alpha=0.5)plt.title('corr='+'{:.2f}'.format(np.corrcoef(trans_var, dat['target'])[0][1]))
plt.show()

可视化效果:











下一篇《天池学习赛:工业蒸汽量预测2——特征工程》

天池学习赛:工业蒸汽量预测1——数据探索相关推荐

  1. 阿里天池工业蒸汽量预测baseline-数据探索篇

    赛题介绍 本题是很经典的特征预测题,网上有很多大佬的baseline,但是我觉得还是看官方出的赛题书好一些,这一节,总结了该题中如何去分析原始数据的思路与常用方法 赛题数据与代码在文末我的github ...

  2. 天池大赛之工业蒸汽量预测(有史以来最全面)

    目录 1.导包与数据挖掘 1.1导包 1.2 数据载入 1.3 数据合并 1.4 数据分布 1.5 特征清洗 1.6 特征可视化 1.7 相关性系数 1.8 归一化 1.9 Box-Cox变换对连续变 ...

  3. 天池比赛:工业蒸汽量预测

    https://tianchi.aliyun.com/competition/entrance/231693/introduction 偶然看到一句话:最重要的是提特征,特征决定上限,模型只是无限逼近 ...

  4. 天池学习赛:工业蒸汽量预测2——特征工程

    上一篇<天池学习赛:工业蒸汽量预测1--数据探索> 目录 1.特征工程 1.1 预处理 1.2 特征处理 1.3 特征降维 1.3.1 特征选择 1.3.2 线性降维 2.赛题代码 3 结 ...

  5. 【机器学习】阿里云天池竞赛——工业蒸汽量预测(1)

    机器学习经典赛题:工业蒸汽量预测(1) 1. 赛题理解 1.1 背景 1.2 目标 1.3 数据概览 1. 数据描述 2. 数据说明 1.4 评估指标 1.5 赛题模型 1. 回归预测模型 2. 分类 ...

  6. python建模大赛算法_Python数据分析kaggle-Titanic+天池-工业蒸汽量预测建模算法

    做数据分析许久了, 简单写写比赛的数据分析项目思路 一 使用逻辑回归/随机森林等对kaggle比赛项目 "给出泰坦尼克号上的乘客的信息, 预测乘客是否幸存"进行简单的数据分析过程, ...

  7. 天池学习赛:工业蒸汽量预测4——模型验证

    上一篇<天池学习赛:工业蒸汽量预测3--模型训练>中已经是使用了几种机器学习的模型,接下来将介绍一些模型的评价方法. 目录 1 模型评估的方法 2 模型调参 3 赛题模型验证与调参 3.1 ...

  8. 天池学习赛:工业蒸汽量预测3——模型训练

    接上一篇<天池学习赛:工业蒸汽量预测2--特征工程> 数据划分: from sklearn.model_selection import train_test_split #切分数据new ...

  9. 天池学习赛:工业蒸汽量预测5——特征优化

    上一篇<天池学习赛:工业蒸汽量预测4--模型验证> 目录 1 特征优化的方法 1.1 合成特征 1.2 特征变换 1.3 用决策树创造新特征 1.4 特征组合 2 赛题特征优化代码 1 特 ...

最新文章

  1. Elasticsearch-06 Spring Boot 2.0.9整合ElasticSearch5.6.16
  2. 区块链BaaS云服务(8)京东 智臻链
  3. [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
  4. 桶排序+基数排序+计数排序
  5. 【转】Android编程点滴(14) -- Android中资源文件夹res/raw和assets的使用
  6. 模仿JavaAppArguments.java示例
  7. Java孩子父母类_父母和子女复选框
  8. Atitit.c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结
  9. 边缘计算中高效ML的EEoI
  10. (数据结构)约瑟夫环问题——C语言实现
  11. 服务器操作系统套什么定额,数据库服务器套什么定额
  12. 论文阅读:Unprocessing Images for Learned Raw Denoising
  13. 行走在拉萨、林芝的路上
  14. 周集中团队Nature子刊中网络图布局的R语言可视化复现
  15. Android Framework启动流程
  16. 再逼自己一把,把项目做出来....
  17. 天涯论坛为什么不能删除或修改自己发表的贴子
  18. ubuntu安装水星MW150US无线网卡8188eu驱动
  19. Android 模拟点击
  20. 【风马一族_Android】Android学习

热门文章

  1. lisp 里在特定图层写字_有温度的“城市客厅”——从景观设计角度感受天目里...
  2. Python 实现视频爬取下载及断点续传优化、异步下载
  3. C源程序括号匹配检查(C语言)
  4. End-to-end目标检测算法的学习笔记
  5. DB2数据库对现有表格字段修改
  6. Lesson 1 A puma at large
  7. 20172331 《Java程序设计》第3周学习总结
  8. javascript中级--运动二
  9. ActiveMQ安装配置
  10. 怎么升级iOS10教程