基于机器学习的工业蒸汽量预测

引言

        火力发电的基本工作原理是通过燃料燃烧加热水来产生蒸汽,利用蒸汽压力推动汽轮机旋转。随后,汽轮机的旋转驱动发电机,最终生成电能。在这一系列能量转化的过程中,锅炉的燃烧效率是影响发电效率的关键因素,锅炉的燃烧效率受多种因素影响,包括锅炉可调参数,如燃烧给量、一二次风、引风,以及锅炉的工作状态,如锅炉床温、床压,炉膛温度等。基于以上原理,研究锅炉的可调参数在何种情况下产生的蒸汽量最大对提高火力发电的工业效率意义重大。

        本文使用的数据集是经脱敏后的锅炉传感器采集的数据,数据分成训练数据(train.txt)和测试数据(test.txt),其中字段”V0”-“V37”,这38个字段是作为特征变量,”target”作为目标变量。本文将通过实验,对数据进行预处理、提取特征和使用机器学习的模型进行建模,最终使用模型预测蒸汽量,采用均方根误差的方法评估不同的模型的精确性。

 实验数据来源:工业蒸汽量预测_学习赛_天池大赛-阿里云天池的赛制 (aliyun.com)

实验流程

1.数据预处理

1.1查看数据整体情况

利用箱线图看数据分布情况

#查看数据的整体情况
total_data= pd.concat([train_data, test_data], ignore_index=True, sort=False)
plt.figure(figsize=(18,8),dpi=100)
total_data.boxplot(sym='g^', patch_artist=True, notch=True)
plt.title('DATA overall situation')

·该数据集包括38个预测特征和一个目标输出

·所有特征和目标输出都是连续的数值。

·所有数据的值都接近于0,并且没有显著的数量级差异。

1.2查看数据缺失情况

可以看到数据是没有缺失值的

1.3剔除变量

对比训练集和测试集数据分布情况,通过分布图对特征进行去除无关变量

#对比训练集和测试集数据分布情况,通过分布图对特征进行去除无关变量
plt.figure(figsize=(30, 30))
i = 1
for col in test_data.columns:
    plt.subplot(5, 8, i)
    sns.distplot(train_data_X[col], color='green')
    sns.distplot(test_data[col], color='purple')
    plt.legend(['Train', 'Test'])
    i += 1

针对38个特征变量画训练数据和测试数据特征分布直方图

结果如下:

通过直方图的对比删除差异值较大的量:

可以从途中观察得出'V5','V9','V11','V14','V17','V19','V20','V21','V22','V27','V35'这几个特征值的训练集和测试集数据差异较大,予以剔除。

1.4查看特征与目标变量间的线性关系强弱

查看特征与目标变量相关系数,剔除相关系数绝对值小于等于0.1的无关变量

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 读取txt文件,假设文件名为data.txt,分隔符为制表符


# 获取特征列(V0到V37)和目标列(target)
features = train_data.iloc[:, :-1]
target = train_data['target']

# 设置图形大小
plt.figure(figsize=(16, 8))

# 遍历每个特征,使用regplot画出特征与目标变量的关系图
for i in range(features.shape[1]):
    plt.subplot(5, 8, i + 1)  # 5行8列的子图布局,根据实际情况调整
    sns.regplot(x=features.iloc[:, i], y=target, scatter_kws={'s': 2}, line_kws={'color': 'red'})
    correlation_coefficient = np.corrcoef(features.iloc[:, i], target)[0, 1]
    plt.title(f'V{i} (Corr: {correlation_coefficient:.2f})')

# 调整子图布局
plt.tight_layout()

# 显示图形
plt.show()

结果如下:

可以看到 特征值’V14’,’V17’,’V21’,’V25’,’V26’,’V28’,’V32’,’V33’,’V34’均为相关系数绝对值小于等于0.1的无关变量,予以剔除。 

1.5数据剔除

#删除差异值较大的量
train_data_X_new = train_data_X.drop(['V5','V9','V11','V14','V17','V19','V20','V21','V22','V25','V26','V27','V28','V32','V33','V34','V35'], axis = 1)
test_data_new = test_data.drop(['V5','V9','V11','V14','V17','V19','V20','V21','V22','V25','V26','V27','V28','V32','V33','V34','V35'], axis = 1)
all_data_X = pd.concat([train_data_X_new,test_data_new])

2.数据集切分

#对数据集进行切割
# train_test_split
X_train, X_test, y_train, y_test = train_test_split(train_data_X_new, train_data_y, test_size = 0.2, random_state = 42)

将数据集中的训练集以82的比例分为训练数据和验证数据

3.模型训练

3.1线性回归模型

# 线性回归

from sklearn.model_selection import cross_val_score

# 创建线性回归模型
LR_model = LinearRegression()

# 训练模型并进行交叉验证
cross_val_scores = cross_val_score(LR_model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')
# 注意:这里使用负的均方误差,因为cross_val_score的scoring参数期望得到一个需要最大化的分数,而均方误差需要最小化。

# 打印交叉验证的结果
print('交叉验证均方误差得分:', -cross_val_scores)
print('交叉验证均方误差平均得分:', -cross_val_scores.mean())

# 使用模型进行训练
LR_model.fit(X_train, y_train)

#得到模型的predict值
LR_model_predict = LR_model.predict(X_test)

# 计算测试集MSE
LR_mse = mean_squared_error(y_test, LR_model.predict(X_test))

# 打印结果
print('Linear Regression的训练集得分:{}'.format(LR_model.score(X_train, y_train)))
print('Linear Regression的验证集得分:{}'.format(LR_model.score(X_test, y_test)))
print('Linear Regression的验证集的MSE得分为:{}'.format(LR_mse))



3.2SVR模型

from sklearn.model_selection import cross_val_score
from sklearn.svm import LinearSVR
from sklearn.metrics import mean_squared_error


    # 创建线性SVR模型
LinearSVR_model = LinearSVR()

    # 训练模型并进行交叉验证
cross_val_scores = cross_val_score(LinearSVR_model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')

    # 打印交叉验证的结果
print('交叉验证均方误差得分:', -cross_val_scores)
print('交叉验证均方误差平均得分:', -cross_val_scores.mean())

    # 使用模型进行训练
LinearSVR_model.fit(X_train, y_train)

#得到模型的predict值
LinearSVR_model_predict = LinearSVR_model.predict(X_test)



    # 计算测试集MSE
mse = mean_squared_error(y_test, LinearSVR_model.predict(X_test))

    # 打印结果
print('Linear SVR的训练集得分:{}'.format(LinearSVR_model.score(X_train, y_train)))
print('Linear SVR的验证集得分:{}'.format(LinearSVR_model.score(X_test, y_test)))
print('Linear SVR的验证集的MSE得分为:{}'.format(mse))



3.3随机森林模型

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_squared_error


# 创建随机森林模型
RandomForest_model = RandomForestRegressor(n_estimators= 70)

# 训练模型并进行交叉验证
cross_val_scores = cross_val_score(RandomForest_model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')

# 打印交叉验证的结果
print('交叉验证均方误差得分:', -cross_val_scores)
print('交叉验证均方误差平均得分:', -cross_val_scores.mean())

# 使用模型进行训练
RandomForest_model.fit(X_train, y_train)

#得到模型的predict值
RandomForest_model_predict = RandomForest_model.predict(X_test)

# 计算测试集MSE
mse = mean_squared_error(y_test, RandomForest_model.predict(X_test))

# 打印结果
print('RandomForest Regressor的训练集得分:{}'.format(RandomForest_model.score(X_train, y_train)))
print('RandomForest Regressor的验证集得分:{}'.format(RandomForest_model.score(X_test, y_test)))
print('RandomForest Regressor的验证集的MSE得分为:{}'.format(mse))


4.模型调优

4.1使用网格搜索的方式对随机森林模型进行调参


from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error

# 网格搜索,参数调优
param_grid = {
    'n_estimators': [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 125, 150, 200],
    'max_features': ['auto', 'sqrt', 'log2']
}

# 使用GridSearchCV时,可以通过cv参数指定交叉验证的折数
m = GridSearchCV(RandomForestRegressor(random_state=827), param_grid, cv=5)
m.fit(X_train, y_train)

# 直接在GridSearchCV对象上调用predict方法,避免再次使用测试集
mse = mean_squared_error(y_test, m.predict(X_test))

print("该参数下得到的MSE值为:{}".format(mse))
print("该参数下得到的最佳得分为:{}".format(m.best_score_))
print("最佳参数为:{}".format(m.best_params_))








  


5.结果评估

5.1评估训练集的方法:

5.1.1. K折交叉验证

K-fold cross-validation K折交叉验证,初始采样分割成K个子样本,一个单独的子样本被保留作为验证模型的数据,其他K-1个样本用来训练。 交叉验证重复K次,每个 子样本 验证一次,平均K次的结果或者使用其它结合方式,最终得到一个单一估测。

5.1.2. 均方根误差(RMSE)

回归问题的典型性能指标(Performance Measure)是均方根误差(RMSE):

m是要在其上测量RMSE的数据集中的实例数。

 是数据集中第i个实例的所有特征值(不包括标签)的向量

 是其标签(该实例的期望输出值)。

h是系统的预测函数,也称为假设。当给系统输入一个实例的特征向量时,它会为该实例输出一个预测值

5.1.3 R²(R-squared,可决系数)

可决系数是用于衡量回归模型拟合优度的统计指标之一。它表示模型对目标变量方差的解释程度,即模型能够解释目标变量变化的比例。R² 分数的取值范围在 0 到 1 之间,越接近 1 表示模型对目标变量的解释能力越好。

在本文中训练集与测试集的得分项即是使用R²来进行评估的。

5.2实验结果

5.2.1 验证集可决系数得分

结论:验证集精确率近似。

5.2.2 验证集MSE得分

结论:验证集MSE最小的是线性SVR模型,最大的是随机森林模型。

5.2.3 交叉验证

结论:交叉验证均方误差最小的是线性回归模型,最大的是随机森林模型。

6.结论

        通过监测锅炉的运行状态以预测产生的蒸汽量,对于实时了解工业生产过程至关重要。通过对采集到的锅炉工作数据进行预处理和特征工程,提取出关键特征。这些特结论:交叉验证均方误差最小的是线性回归模型,最大的是随机森林模型。

        对这些模型的准确性进行评估和分析,结果显示融合后的模型相较于其他模型更能准确地实时预测蒸汽量。这为工业生产过程提供了更为科学有效的实时参考数据。

        使用均方根误差mse进行评估,结果显示线性回归模型以及SVR模型的准确率比随机森林模型的高,模型调优后的随机森林模型准确率有提高。mse值最小模型是SVR模型,数值为0.11030。

7.完整代码

# 导库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import accuracy_score, recall_score, f1_score, confusion_matrix
from sklearn.model_selection import train_test_split, learning_curve
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
from sklearn.svm import LinearSVR
from sklearn.ensemble import RandomForestRegressor

import warnings

warnings.filterwarnings("ignore")

#  数据读取
train_data = pd.read_table('zhengqi_train.txt')
test_data = pd.read_table('zhengqi_test.txt')
#print(train_data.describe())

#数据预处理

#检查数据是否有缺失值
print(train_data.info())

#查看数据的整体情况
total_data= pd.concat([train_data, test_data], ignore_index=True, sort=False)
plt.figure(figsize=(18,8),dpi=100)
total_data.boxplot(sym='g^', patch_artist=True, notch=True)
plt.title('DATA overall situation')

#数据划分
train_data_X = train_data.drop(['target'], axis = 1)
train_data_y = train_data['target']


#对比训练集和测试集数据分布情况,通过分布图对特征进行去除无关变量

plt.figure(figsize=(30, 30))
i = 1
for col in test_data.columns:
    plt.subplot(8, 5, i)
    sns.distplot(train_data_X[col], color='green')
    sns.distplot(test_data[col], color='red')
    plt.legend(['Train', 'Test'])
    i += 1



# 获取特征列(V0到V37)和目标列(target)
features = train_data.iloc[:, :-1]
target = train_data['target']

# 设置图形大小
plt.figure(figsize=(16, 8))

# 遍历每个特征,使用regplot画出特征与目标变量的关系图
for i in range(features.shape[1]):
    plt.subplot(5, 8, i + 1)  # 5行8列的子图布局,根据实际情况调整
    sns.regplot(x=features.iloc[:, i], y=target, scatter_kws={'s': 2}, line_kws={'color': 'red'})
    correlation_coefficient = np.corrcoef(features.iloc[:, i], target)[0, 1]
    plt.title(f'V{i} (Corr: {correlation_coefficient:.2f})')

# 调整子图布局
plt.tight_layout()

# 显示图形
plt.show()

#删除差异值较大的量
train_data_X_new = train_data_X.drop(['V5','V9','V11','V14','V17','V19','V20','V21','V22','V25','V26','V27','V28','V32','V33','V34','V35'], axis = 1)
test_data_new = test_data.drop(['V5','V9','V11','V14','V17','V19','V20','V21','V22','V25','V26','V27','V28','V32','V33','V34','V35'], axis = 1)
all_data_X = pd.concat([train_data_X_new,test_data_new])


#对数据集进行切割
# train_test_split
X_train, X_test, y_train, y_test = train_test_split(train_data_X_new, train_data_y, test_size = 0.2, random_state = 42)

# 线性回归

from sklearn.model_selection import cross_val_score

# 创建线性回归模型
LR_model = LinearRegression()

# 训练模型并进行交叉验证
cross_val_scores = cross_val_score(LR_model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')
# 注意:这里使用负的均方误差,因为cross_val_score的scoring参数期望得到一个需要最大化的分数,而均方误差需要最小化。

# 打印交叉验证的结果
print('交叉验证均方误差得分:', -cross_val_scores)
print('交叉验证均方误差平均得分:', -cross_val_scores.mean())

# 使用模型进行训练
LR_model.fit(X_train, y_train)

#得到模型的predict值
LR_model_predict = LR_model.predict(X_test)

# 计算测试集MSE
LR_mse = mean_squared_error(y_test, LR_model.predict(X_test))

# 打印结果
print('Linear Regression的训练集得分:{}'.format(LR_model.score(X_train, y_train)))
print('Linear Regression的验证集得分:{}'.format(LR_model.score(X_test, y_test)))
print('Linear Regression的验证集的MSE得分为:{}'.format(LR_mse))


from sklearn.model_selection import cross_val_score
from sklearn.svm import LinearSVR
from sklearn.metrics import mean_squared_error


    # 创建线性SVR模型
LinearSVR_model = LinearSVR()

    # 训练模型并进行交叉验证
cross_val_scores = cross_val_score(LinearSVR_model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')

    # 打印交叉验证的结果
print('交叉验证均方误差得分:', -cross_val_scores)
print('交叉验证均方误差平均得分:', -cross_val_scores.mean())

    # 使用模型进行训练
LinearSVR_model.fit(X_train, y_train)

#得到模型的predict值
LinearSVR_model_predict = LinearSVR_model.predict(X_test)



    # 计算测试集MSE
mse = mean_squared_error(y_test, LinearSVR_model.predict(X_test))

    # 打印结果
print('Linear SVR的训练集得分:{}'.format(LinearSVR_model.score(X_train, y_train)))
print('Linear SVR的验证集得分:{}'.format(LinearSVR_model.score(X_test, y_test)))
print('Linear SVR的验证集的MSE得分为:{}'.format(mse))



from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_squared_error


# 创建随机森林模型
RandomForest_model = RandomForestRegressor(n_estimators= 70)

# 训练模型并进行交叉验证
cross_val_scores = cross_val_score(RandomForest_model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')

# 打印交叉验证的结果
print('交叉验证均方误差得分:', -cross_val_scores)
print('交叉验证均方误差平均得分:', -cross_val_scores.mean())

# 使用模型进行训练
RandomForest_model.fit(X_train, y_train)

#得到模型的predict值
RandomForest_model_predict = RandomForest_model.predict(X_test)

# 计算测试集MSE
mse = mean_squared_error(y_test, RandomForest_model.predict(X_test))

# 打印结果
print('RandomForest Regressor的训练集得分:{}'.format(RandomForest_model.score(X_train, y_train)))
print('RandomForest Regressor的验证集得分:{}'.format(RandomForest_model.score(X_test, y_test)))
print('RandomForest Regressor的验证集的MSE得分为:{}'.format(mse))





from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error

# 网格搜索,参数调优
param_grid = {
    'n_estimators': [1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 125, 150, 200],
    'max_features': ['auto', 'sqrt', 'log2']
}

# 使用GridSearchCV时,可以通过cv参数指定交叉验证的折数
m = GridSearchCV(RandomForestRegressor(random_state=827), param_grid, cv=5)
m.fit(X_train, y_train)

# 直接在GridSearchCV对象上调用predict方法,避免再次使用测试集
mse = mean_squared_error(y_test, m.predict(X_test))

print("该参数下得到的MSE值为:{}".format(mse))
print("该参数下得到的最佳得分为:{}".format(m.best_score_))
print("最佳参数为:{}".format(m.best_params_))






# 使用网格搜索找到的最佳参数
RandomForest_Regressor_params = m.best_params_


RF_model = RandomForestRegressor(**RandomForest_Regressor_params)
RF_model.fit(X_train, y_train)

#得到模型的predict值
RF_model_predict = RF_model.predict(X_test)

mse = mean_squared_error(y_test, RF_model.predict(X_test))

print('调参后的RandomForest_Regressor的训练集得分:{}'.format(RF_model.score(X_train, y_train)))
print('调参后的RandomForest_Regressor的验证集得分:{}'.format(RF_model.score(X_test, y_test)))
print('调参后的RandomForest_Regressor的验证集的MSE得分为:{}'.format(mse))



  








  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值