赛题背景
火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋转,然后汽轮机带动发电机旋转,产生电能。 在这一系列的能量转化中,影响发电效率的核心是锅炉的燃烧效率,即燃料燃烧加热水产生高温高压蒸汽。锅炉的燃烧效率的影响因素很多,包括锅炉的可调参数,如燃烧给量,一二次风,引风,返料风,给水水量;以及锅炉的工况,比如锅炉床温、床压,炉膛温度、压力,过热器的温度等。
赛题描述
经脱敏后的锅炉传感器采集的数据(采集频率是分钟级别),根据锅炉的工况,预测产生的蒸汽量。
zhengqi_train.txt
zhengqi_test.txt
import numpy as np
import pandas as pd
df_train=pd.read_csv(r'.\zhengqi_train.txt',sep='\t')
df_test=pd.read_csv(r'.\zhengqi_test.txt',sep='\t')
# 使用head查看训练集和测试集前5条数据的情况
df_train.head()
df_test.head()
# non-null代表数据中没有缺失值,因此不需要对于数据进行缺失值填充
df_train.info()
df_test.info()
import matplotlib.pyplot as plt
import seaborn as sns
#提取df_train中的特征标签,并将起转换成列表形式
feature_list=list(df_train.columns)
#为方便之后使用,去掉列表中被一并提取出来的target标签,确保仅留特征标签
feature_list.remove('target')
#显示特征标签列表
feature_list
#对于特征标签列表feature_list中的特征标签进行操作,逐个绘制单变量数据分布图,训练集和测试集的相同特征分布情况绘制在同一张图上以方便比对
for i in feature_list:
sns.distplot(df_train[{i}])
sns.distplot(df_test[{i}])
plt.title(i)
plt.show()
# 去除数据特征分布不一致的数据列
df_train=df_train[['V0','V1','V3','V4','V8','V10','V12','V15','V16','V18','V24','V25','V26','V28','V29','V30','V31','V32','V33','V34','V36','target']]
df_test=df_test[['V0','V1','V3','V4','V8','V10','V12','V15','V16','V18','V24','V25','V26','V28','V29','V30','V31','V32','V33','V34','V36']]
#提取df_train中的特征标签,并将起转换成列表形式
feature_list=list(df_train.columns)
#为方便之后使用,去掉列表中被一并提取出来的target标签,确保仅留特征标签
feature_list.remove('target')
#显示特征标签列表
feature_list
# 相关性分析
# corr的方法,默认的相关系数计算方式就是皮尔逊相关系数
df_train.corr()
# 只分析各特征标签与预测标签(target)之间的相关性,查看上表的最后一列相关系数计算结果,相关系数的绝对值大于0.5的为强相关性,
# 小于0.5的为弱相关性,0附近的为没有相关性,系数为正代表正相关,系数为负代表负相关。
# 绘制特征标签与预测标签(target)的散点图,与相关系数的计算结果进行相互校对
for i in feature_list:
sns.scatterplot(df_train[f'{i}'],df_train['target'])
plt.show()
# 以0.5为界限,同时在训练集和测试集中去除相关系数绝对值低于0.5的特征,确保被输入模型进行训练的特征与预测目标值有较强的相关性。
df_train=df_train[['V0','V1','V3','V4','V8','V12','V16','V31','target']]
df_test=df_test[['V0','V1','V3','V4','V8','V12','V16','V31']]
#提取df_train中的特征标签,并将起转换成列表形式
feature_list=list(df_train.columns)
#为方便之后使用,去掉列表中被一并提取出来的target标签,确保仅留特征标签
feature_list.remove('target')
#显示特征标签列表
feature_list
# 正态分布检验
# 检验各个特征中数据的偏度,偏度定义中包括正态分布(偏度=0),右偏分布(也叫正偏分布,其偏度>0),左偏分布(也叫负偏分布,其偏度<0)
from scipy import stats
for i in feature_list:
skew = stats.skew(df_train[f'{i}'])
print(f'the skew value of feture {i} is {skew}')
# 检验各个特征中数据的峰度。若峰度≈0,分布的峰态服从正态分布;若峰度>0,分布的峰态陡峭(高尖);若峰度<0,分布的峰态平缓(矮胖)
for i in feature_list:
kurtosis = stats.kurtosis(df_train[f'{i}'])
print(f'the kurtosis value of feture {i} is {kurtosis}')
# 绘制偏度分布图
for feature in feature_list:
skew_value = df_train[feature].skew()
sns.distplot(df_train[feature], kde=True)
plt.show()
# 各特征数据基本符合正态分布
# 数据集拆分
from sklearn.model_selection import train_test_split
df_train_value = df_train.drop('target', axis=1)
df_train_target = df_train['target']
df_train_value, df_vali_value, df_train_target, df_vali_target=train_test_split(df_train_value, df_train_target, test_size=0.25,random_state=1)
# df_train_value:训练集特征数据集(总数据的75%)
# df_train_target:训练集的预测目标数据(总数据的75%)
# df_vali_value:交叉验证集特征数据集(总数据的25%)
# df_vali_target:交叉验证集的预测目标数据(总数据的25%)
# 对于df_train_value,df_train_target,df_vali_value,df_vali_target的index进行重置,确保所有数据都从第0条开始排序
df_train_value=df_train_value.reset_index(drop=True)
df_vali_value=df_vali_value.reset_index(drop=True)
df_train_target=df_train_target.reset_index(drop=True)
df_vali_target=df_vali_target.reset_index(drop=True)
# 转换为np矩阵形式
df_train_value=np.array(df_train_value)
df_vali_value=np.array(df_vali_value)
df_train_target=np.array(df_train_target)
df_vali_target=np.array(df_vali_target)
# 验证指标MSE
from sklearn.metrics import mean_squared_error
# 随机森林算法
from sklearn.ensemble import RandomForestRegressor
# 建立模型
model_RF=RandomForestRegressor(n_estimators=200, random_state=0)
# 训练模型
model_RF.fit(df_train_value,df_train_target)
# 对于交叉验证集特征数据集df_vali_value进行预测
predict_RF=model_RF.predict(df_vali_value)
mean_squared_error(df_vali_target,predict_RF)
# 抽取交叉验证集的100组数据采用可视化手段直观检验预测效果
plt.plot(df_vali_target[0:101])
plt.plot(predict_RF[0:101])
df_test=df_test.reset_index(drop=True)
df_test=np.array(df_test)
# 对测试数据df_test进行预测
predict_RF=model_RF.predict(df_test)
# 抽取test数据集中100条可视化
plt.plot(predict_RF[0:101])
# XGBoost
import xgboost as xgb
model_xgb=xgb.XGBRegressor(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='reg:linear')
model_xgb.fit(df_train_value,df_train_target)
predict_xgb=model_xgb.predict(df_vali_value)
print(mean_squared_error(df_vali_target,predict_BR))
plt.plot(df_vali_target[0:101])
plt.plot(predict_xgb[0:101])
# 线性回归
from sklearn.linear_model import LinearRegression
model_LR=LinearRegression()
model_LR.fit(df_train_value,df_train_target)
predict_LR=model_LR.predict(df_vali_value)
print(mean_squared_error(df_vali_target,predict_BR))
plt.plot(df_vali_target[0:101])
plt.plot(predict_LR[0:101])
# 贝叶斯
from sklearn import linear_model
model_BR=linear_model.BayesianRidge()
model_BR.fit(df_train_value,df_train_target)
predict_BR=model_BR.predict(df_vali_value)
print(mean_squared_error(df_vali_target,predict_BR))
plt.plot(df_vali_target[0:101])
plt.plot(predict_BR[0:101])