目录
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 warnings
warnings.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+=1
ax=plt.subplot(train_rows,train_cols,i)
sns.distplot(train_data[col],fit=stats.norm)
i+=1
ax=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+=1
ax=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+=1
ax=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+=1
plt.subplot(frows, fcols, i)
sns.distplot(dat[var], fit=stats.norm)
plt.title(var + 'Original')
plt.xlabel('')
i+=1
plt.subplot(frows, fcols, i)
_=stats.probplot(dat[var], plot=plt)
plt.title('skew=' + '{:.4f}'.format(stats.skew(dat[var])))
plt.xlabel('')
plt.ylabel('')
i+=1
plt.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+=1
plt.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+=1
plt.subplot(frows, fcols, i)
stats.probplot (trans_var, plot=plt)
plt.title('skew='+'{:.4f}'.format(stats.skew(trans_var)))
plt.xlabel('')
plt.ylabel ('')
i+=1
plt.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()
可视化效果: