{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "6b84fefd-5936-4da4-ab6b-5b944329ad1d", "metadata": {}, "outputs": [], "source": [ "import os\n", "os.environ['CUDA_DEVICE_ORDER'] = 'PCB_BUS_ID'\n", "os.environ['CUDA_VISIBLE_DEVICES'] = '0, 1'" ] }, { "cell_type": "code", "execution_count": 2, "id": "9cf130e3-62ef-46e0-bbdc-b13d9d29318d", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "from sklearn.model_selection import train_test_split\n", "import matplotlib.pyplot as plt\n", "#新增加的两行\n", "from pylab import mpl\n", "# 设置显示中文字体\n", "mpl.rcParams[\"font.sans-serif\"] = [\"SimHei\"]\n", "\n", "mpl.rcParams[\"axes.unicode_minus\"] = False" ] }, { "cell_type": "code", "execution_count": 3, "id": "752381a5-0aeb-4c54-bc48-f9c3f8fc5d17", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0_level_0弹筒发热量挥发分固定炭
化验编号HadCadNadOadQb,adVadFcad
Unnamed: 0_level_2(%)(%)(%)(%)MJ/kg(%)(%)
027201105293.9370.180.8125.07927.82032.0655.68
127200968833.7868.930.7726.51227.40429.9654.71
227201090843.4869.600.7626.14827.57829.3155.99
327200847083.4766.710.7629.05526.33828.5853.87
427200627213.8768.780.8026.54227.28029.9754.78
...........................
22327200304904.1268.850.9726.05527.86432.9451.89
22427200286333.9767.040.9428.04327.36831.8851.38
22527200286344.1268.420.9626.49327.88633.1652.00
22627200176833.8867.420.9427.76026.61631.6550.56
22727200176783.8166.740.9228.53026.68831.0250.82
\n", "

228 rows × 8 columns

\n", "
" ], "text/plain": [ " Unnamed: 0_level_0 氢 碳 氮 氧 弹筒发热量 挥发分 固定炭\n", " 化验编号 Had Cad Nad Oad Qb,ad Vad Fcad\n", " Unnamed: 0_level_2 (%) (%) (%) (%) MJ/kg (%) (%)\n", "0 2720110529 3.93 70.18 0.81 25.079 27.820 32.06 55.68\n", "1 2720096883 3.78 68.93 0.77 26.512 27.404 29.96 54.71\n", "2 2720109084 3.48 69.60 0.76 26.148 27.578 29.31 55.99\n", "3 2720084708 3.47 66.71 0.76 29.055 26.338 28.58 53.87\n", "4 2720062721 3.87 68.78 0.80 26.542 27.280 29.97 54.78\n", ".. ... ... ... ... ... ... ... ...\n", "223 2720030490 4.12 68.85 0.97 26.055 27.864 32.94 51.89\n", "224 2720028633 3.97 67.04 0.94 28.043 27.368 31.88 51.38\n", "225 2720028634 4.12 68.42 0.96 26.493 27.886 33.16 52.00\n", "226 2720017683 3.88 67.42 0.94 27.760 26.616 31.65 50.56\n", "227 2720017678 3.81 66.74 0.92 28.530 26.688 31.02 50.82\n", "\n", "[228 rows x 8 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_0102 = pd.read_excel('./data/20240102/20240102.xlsx', header=[0,1,2])\n", "data_0102" ] }, { "cell_type": "code", "execution_count": 4, "id": "972f1e9c-3ebc-45cf-8d1f-7611645e5238", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['化验编号',\n", " '氢Had(%)',\n", " '碳Cad(%)',\n", " '氮Nad(%)',\n", " '氧Oad(%)',\n", " '弹筒发热量Qb,adMJ/kg',\n", " '挥发分Vad(%)',\n", " '固定炭Fcad(%)']" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cols = [''.join([y for y in x if 'Unnamed' not in y]) for x in data_0102.columns]\n", "cols" ] }, { "cell_type": "code", "execution_count": 5, "id": "c95f1106-b3a4-43c6-88ec-3cdebf91d79a", "metadata": {}, "outputs": [], "source": [ "data_0102.columns = cols" ] }, { "cell_type": "code", "execution_count": 6, "id": "2e96af0a-feda-4a1f-a13e-9c8861c6f4d4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
化验编号氢Had(%)碳Cad(%)氮Nad(%)氧Oad(%)弹筒发热量Qb,adMJ/kg挥发分Vad(%)固定炭Fcad(%)
027201105293.9370.180.8125.07927.82032.0655.68
127200968833.7868.930.7726.51227.40429.9654.71
227201090843.4869.600.7626.14827.57829.3155.99
327200847083.4766.710.7629.05526.33828.5853.87
427200627213.8768.780.8026.54227.28029.9754.78
...........................
22327200304904.1268.850.9726.05527.86432.9451.89
22427200286333.9767.040.9428.04327.36831.8851.38
22527200286344.1268.420.9626.49327.88633.1652.00
22627200176833.8867.420.9427.76026.61631.6550.56
22727200176783.8166.740.9228.53026.68831.0250.82
\n", "

228 rows × 8 columns

\n", "
" ], "text/plain": [ " 化验编号 氢Had(%) 碳Cad(%) 氮Nad(%) 氧Oad(%) 弹筒发热量Qb,adMJ/kg \\\n", "0 2720110529 3.93 70.18 0.81 25.079 27.820 \n", "1 2720096883 3.78 68.93 0.77 26.512 27.404 \n", "2 2720109084 3.48 69.60 0.76 26.148 27.578 \n", "3 2720084708 3.47 66.71 0.76 29.055 26.338 \n", "4 2720062721 3.87 68.78 0.80 26.542 27.280 \n", ".. ... ... ... ... ... ... \n", "223 2720030490 4.12 68.85 0.97 26.055 27.864 \n", "224 2720028633 3.97 67.04 0.94 28.043 27.368 \n", "225 2720028634 4.12 68.42 0.96 26.493 27.886 \n", "226 2720017683 3.88 67.42 0.94 27.760 26.616 \n", "227 2720017678 3.81 66.74 0.92 28.530 26.688 \n", "\n", " 挥发分Vad(%) 固定炭Fcad(%) \n", "0 32.06 55.68 \n", "1 29.96 54.71 \n", "2 29.31 55.99 \n", "3 28.58 53.87 \n", "4 29.97 54.78 \n", ".. ... ... \n", "223 32.94 51.89 \n", "224 31.88 51.38 \n", "225 33.16 52.00 \n", "226 31.65 50.56 \n", "227 31.02 50.82 \n", "\n", "[228 rows x 8 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_0102" ] }, { "cell_type": "code", "execution_count": 7, "id": "04b177a7-2f02-4e23-8ea9-29f34cf3eafc", "metadata": {}, "outputs": [], "source": [ "out_cols = ['挥发分Vad(%)', '固定炭Fcad(%)']" ] }, { "cell_type": "code", "execution_count": 8, "id": "31169fbf-d78e-42f7-87f3-71ba3dd0979d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['挥发分Vad(%)', '固定炭Fcad(%)']" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "out_cols" ] }, { "cell_type": "code", "execution_count": 9, "id": "feaedd50-f999-45bf-b465-3d359b0c0110", "metadata": {}, "outputs": [], "source": [ "data = data_0102.copy()" ] }, { "cell_type": "code", "execution_count": 10, "id": "a40bee0f-011a-4edb-80f8-4e2f40e755fd", "metadata": {}, "outputs": [], "source": [ "train_data = data.dropna(subset=out_cols).fillna(0)" ] }, { "cell_type": "code", "execution_count": 11, "id": "535d37b6-b9de-4025-ac8f-62f5bdbe2451", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-01-08 18:28:46.594783: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0\n" ] } ], "source": [ "import tensorflow as tf\n", "from tensorflow import keras\n", "from tensorflow.keras import layers\n", "import tensorflow.keras.backend as K" ] }, { "cell_type": "code", "execution_count": 12, "id": "1c85d462-f248-4ffb-908f-eb4b20eab179", "metadata": {}, "outputs": [], "source": [ "class TransformerBlock(layers.Layer):\n", " def __init__(self, embed_dim, num_heads, ff_dim, name, rate=0.1):\n", " super().__init__()\n", " self.att = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim, name=name)\n", " self.ffn = keras.Sequential(\n", " [layers.Dense(ff_dim, activation=\"relu\"), layers.Dense(embed_dim),]\n", " )\n", " self.layernorm1 = layers.LayerNormalization(epsilon=1e-6)\n", " self.layernorm2 = layers.LayerNormalization(epsilon=1e-6)\n", " self.dropout1 = layers.Dropout(rate)\n", " self.dropout2 = layers.Dropout(rate)\n", "\n", " def call(self, inputs, training):\n", " attn_output = self.att(inputs, inputs)\n", " attn_output = self.dropout1(attn_output, training=training)\n", " out1 = self.layernorm1(inputs + attn_output)\n", " ffn_output = self.ffn(out1)\n", " ffn_output = self.dropout2(ffn_output, training=training)\n", " return self.layernorm2(out1 + ffn_output)" ] }, { "cell_type": "code", "execution_count": 13, "id": "790284a3-b9d3-4144-b481-38a7c3ecb4b9", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras import Model" ] }, { "cell_type": "code", "execution_count": 14, "id": "cd9a1ca1-d0ca-4cb5-9ef5-fd5d63576cd2", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.initializers import Constant" ] }, { "cell_type": "code", "execution_count": 15, "id": "9bc02f29-0fb7-420d-99a8-435eadc06e29", "metadata": {}, "outputs": [], "source": [ "# Custom loss layer\n", "class CustomMultiLossLayer(layers.Layer):\n", " def __init__(self, nb_outputs=2, **kwargs):\n", " self.nb_outputs = nb_outputs\n", " self.is_placeholder = True\n", " super(CustomMultiLossLayer, self).__init__(**kwargs)\n", " \n", " def build(self, input_shape=None):\n", " # initialise log_vars\n", " self.log_vars = []\n", " for i in range(self.nb_outputs):\n", " self.log_vars += [self.add_weight(name='log_var' + str(i), shape=(1,),\n", " initializer=tf.initializers.he_normal(), trainable=True)]\n", " super(CustomMultiLossLayer, self).build(input_shape)\n", "\n", " def multi_loss(self, ys_true, ys_pred):\n", " assert len(ys_true) == self.nb_outputs and len(ys_pred) == self.nb_outputs\n", " loss = 0\n", " for y_true, y_pred, log_var in zip(ys_true, ys_pred, self.log_vars):\n", " mse = (y_true - y_pred) ** 2.\n", " pre = K.exp(-log_var[0])\n", " loss += tf.abs(tf.reduce_logsumexp(pre * mse + log_var[0], axis=-1))\n", " return K.mean(loss)\n", "\n", " def call(self, inputs):\n", " ys_true = inputs[:self.nb_outputs]\n", " ys_pred = inputs[self.nb_outputs:]\n", " loss = self.multi_loss(ys_true, ys_pred)\n", " self.add_loss(loss, inputs=inputs)\n", " # We won't actually use the output.\n", " return K.concatenate(inputs, -1)" ] }, { "cell_type": "code", "execution_count": 16, "id": "a190207e-5a59-4813-9660-758760cf1b73", "metadata": {}, "outputs": [], "source": [ "num_heads, ff_dim = 3, 16" ] }, { "cell_type": "code", "execution_count": 17, "id": "80f32155-e71f-4615-8d0c-01dfd04988fe", "metadata": {}, "outputs": [], "source": [ "def get_prediction_model():\n", " def build_output(out, out_name):\n", " self_block = TransformerBlock(64, num_heads, ff_dim, name=f'{out_name}_attn')\n", " out = self_block(out)\n", " out = layers.GlobalAveragePooling1D()(out)\n", " out = layers.Dropout(0.1)(out)\n", " out = layers.Dense(32, activation=\"relu\")(out)\n", " # out = layers.Dense(1, name=out_name, activation=\"sigmoid\")(out)\n", " return out\n", " inputs = layers.Input(shape=(1,len(feature_cols)), name='input')\n", " x = layers.Conv1D(filters=64, kernel_size=1, activation='relu')(inputs)\n", " # x = layers.Dropout(rate=0.1)(x)\n", " lstm_out = layers.Bidirectional(layers.LSTM(units=64, return_sequences=True))(x)\n", " lstm_out = layers.Dense(128, activation='relu')(lstm_out)\n", " transformer_block = TransformerBlock(128, num_heads, ff_dim, name='first_attn')\n", " out = transformer_block(lstm_out)\n", " out = layers.GlobalAveragePooling1D()(out)\n", " out = layers.Dropout(0.1)(out)\n", " out = layers.Dense(64, activation='relu')(out)\n", " out = K.expand_dims(out, axis=1)\n", "\n", " # bet = layers.Dense(32, activation=\"relu\")(out)\n", " # mesco = layers.Dense(32, activation=\"relu\")(out)\n", " bet = build_output(out, 'bet')\n", " mesco = build_output(out, 'mesco')\n", "\n", " bet = layers.Dense(1, activation='sigmoid', name='vad')(bet)\n", " mesco = layers.Dense(1, activation='sigmoid', name='fcad')(mesco)\n", "\n", " model = Model(inputs=[inputs], outputs=[bet, mesco])\n", " return model\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "264001b1-5e4a-4786-96fd-2b5c70ab3212", "metadata": {}, "outputs": [], "source": [ "def get_trainable_model(prediction_model):\n", " inputs = layers.Input(shape=(1,len(feature_cols)), name='input')\n", " bet, mesco = prediction_model(inputs)\n", " bet_real = layers.Input(shape=(1,), name='vad_real')\n", " mesco_real = layers.Input(shape=(1,), name='fcad_real')\n", " out = CustomMultiLossLayer(nb_outputs=2)([bet_real, mesco_real, bet, mesco])\n", " return Model([inputs, bet_real, mesco_real], out)" ] }, { "cell_type": "code", "execution_count": 19, "id": "372011ea-9876-41eb-a4e6-83ccd6c71559", "metadata": {}, "outputs": [], "source": [ "from tensorflow.python.keras.utils.vis_utils import plot_model" ] }, { "cell_type": "code", "execution_count": 20, "id": "1eebdab3-1f88-48a1-b5e0-bc8787528c1b", "metadata": {}, "outputs": [], "source": [ "maxs = train_data.max()\n", "mins = train_data.min()\n", "for col in train_data.columns:\n", " if maxs[col] - mins[col] == 0:\n", " continue\n", " train_data[col] = (train_data[col] - mins[col]) / (maxs[col] - mins[col])" ] }, { "cell_type": "code", "execution_count": 21, "id": "7f27bd56-4f6b-4242-9f79-c7d6b3ee2f13", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
化验编号氢Had(%)碳Cad(%)氮Nad(%)氧Oad(%)弹筒发热量Qb,adMJ/kg挥发分Vad(%)固定炭Fcad(%)
00.9965470.7739730.8354140.4565220.1714630.8112490.8477370.828147
10.8511180.6712330.7999430.3695650.2102540.7820380.6748970.794606
20.9811470.4657530.8189560.3478260.2004010.7942560.6213990.838866
30.7213670.4589040.7369470.3478260.2790940.7071830.5613170.765560
40.4870460.7328770.7956870.4347830.2110660.7733310.6757200.797026
...........................
2230.1435530.9041100.7976730.8043480.1978830.8143390.9201650.697095
2240.1237620.8013700.7463110.7391300.2516990.7795100.8329220.679461
2250.1237730.9041100.7854710.7826090.2097400.8158840.9382720.700899
2260.0070660.7397260.7570940.7391300.2440380.7267050.8139920.651107
2270.0070120.6917810.7377980.6956520.2648820.7317600.7621400.660097
\n", "

228 rows × 8 columns

\n", "
" ], "text/plain": [ " 化验编号 氢Had(%) 碳Cad(%) 氮Nad(%) 氧Oad(%) 弹筒发热量Qb,adMJ/kg \\\n", "0 0.996547 0.773973 0.835414 0.456522 0.171463 0.811249 \n", "1 0.851118 0.671233 0.799943 0.369565 0.210254 0.782038 \n", "2 0.981147 0.465753 0.818956 0.347826 0.200401 0.794256 \n", "3 0.721367 0.458904 0.736947 0.347826 0.279094 0.707183 \n", "4 0.487046 0.732877 0.795687 0.434783 0.211066 0.773331 \n", ".. ... ... ... ... ... ... \n", "223 0.143553 0.904110 0.797673 0.804348 0.197883 0.814339 \n", "224 0.123762 0.801370 0.746311 0.739130 0.251699 0.779510 \n", "225 0.123773 0.904110 0.785471 0.782609 0.209740 0.815884 \n", "226 0.007066 0.739726 0.757094 0.739130 0.244038 0.726705 \n", "227 0.007012 0.691781 0.737798 0.695652 0.264882 0.731760 \n", "\n", " 挥发分Vad(%) 固定炭Fcad(%) \n", "0 0.847737 0.828147 \n", "1 0.674897 0.794606 \n", "2 0.621399 0.838866 \n", "3 0.561317 0.765560 \n", "4 0.675720 0.797026 \n", ".. ... ... \n", "223 0.920165 0.697095 \n", "224 0.832922 0.679461 \n", "225 0.938272 0.700899 \n", "226 0.813992 0.651107 \n", "227 0.762140 0.660097 \n", "\n", "[228 rows x 8 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train_data" ] }, { "cell_type": "code", "execution_count": 22, "id": "baf45a3d-dc01-44fc-9f0b-456964ac2cdb", "metadata": {}, "outputs": [], "source": [ "# feature_cols = [x for x in train_data.columns if x not in out_cols and '第二次' not in x]\n", "feature_cols = [x for x in train_data.columns if x not in out_cols and '编号' not in x]\n", "use_cols = feature_cols + out_cols" ] }, { "cell_type": "code", "execution_count": 23, "id": "f2d27538-d2bc-4202-b0cf-d3e0949b4686", "metadata": {}, "outputs": [], "source": [ "use_data = train_data.copy()\n", "for col in use_cols:\n", " use_data[col] = use_data[col].astype('float32')" ] }, { "cell_type": "code", "execution_count": 24, "id": "50daf170-efec-49e5-8f8e-9a45938cacfc", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import KFold, train_test_split\n", "kf = KFold(n_splits=6, shuffle=True, random_state=42)" ] }, { "cell_type": "code", "execution_count": 25, "id": "0f863423-be12-478b-a08d-e3c6f5dfb8ee", "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras import optimizers\n", "from tensorflow.python.keras.utils.vis_utils import plot_model\n", "from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, mean_absolute_percentage_error" ] }, { "cell_type": "code", "execution_count": 26, "id": "2c89b32a-017c-4d05-ab78-8b9b8eb0dcbb", "metadata": {}, "outputs": [], "source": [ "from keras.callbacks import ReduceLROnPlateau\n", "reduce_lr = ReduceLROnPlateau(monitor='val_loss', patience=10, mode='auto')" ] }, { "cell_type": "code", "execution_count": 27, "id": "ca6ce434-80b6-4609-9596-9a5120680462", "metadata": {}, "outputs": [], "source": [ "def print_eva(y_true, y_pred, tp):\n", " MSE = mean_squared_error(y_true, y_pred)\n", " RMSE = np.sqrt(MSE)\n", " MAE = mean_absolute_error(y_true, y_pred)\n", " MAPE = mean_absolute_percentage_error(y_true, y_pred)\n", " R_2 = r2_score(y_true, y_pred)\n", " print(f\"COL: {tp}, MSE: {format(MSE, '.2E')}\", end=',')\n", " print(f'RMSE: {round(RMSE, 3)}', end=',')\n", " print(f'MAPE: {round(MAPE * 100, 3)} %', end=',')\n", " print(f'MAE: {round(MAE, 3)}', end=',')\n", " print(f'R_2: {round(R_2, 3)}')\n", " return [MSE, RMSE, MAE, MAPE, R_2]" ] }, { "cell_type": "code", "execution_count": 28, "id": "10213bc5-bf13-46ed-9ce9-b1dbc5af72ee", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-01-08 18:28:48.712096: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcuda.so.1\n", "2024-01-08 18:28:48.770197: E tensorflow/stream_executor/cuda/cuda_driver.cc:328] failed call to cuInit: CUDA_ERROR_INVALID_DEVICE: invalid device ordinal\n", "2024-01-08 18:28:48.770270: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: zhaojh-yv621\n", "2024-01-08 18:28:48.770284: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: zhaojh-yv621\n", "2024-01-08 18:28:48.770578: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:200] libcuda reported version is: 520.61.5\n", "2024-01-08 18:28:48.770639: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 520.61.5\n", "2024-01-08 18:28:48.770650: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:310] kernel version seems to match DSO: 520.61.5\n", "2024-01-08 18:28:48.771267: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 AVX512F FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n" ] } ], "source": [ "prediction_model = get_prediction_model()\n", "trainable_model = get_trainable_model(prediction_model)\n", "trainable_model.compile(optimizer='adam', loss=None)" ] }, { "cell_type": "code", "execution_count": 29, "id": "4a1be90d-b8f1-4fe1-9952-1cdcc489fab5", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot_model(prediction_model)" ] }, { "cell_type": "code", "execution_count": null, "id": "6308b1dc-8e2e-4bf9-9b28-3b81979bf7e0", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2024-01-08 18:28:51.289876: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:176] None of the MLIR Optimization Passes are enabled (registered 2)\n", "2024-01-08 18:28:51.306804: I tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 2200000000 Hz\n" ] } ], "source": [ "vad_eva_list = list()\n", "fcad_eva_list = list()\n", "train_data = use_data[use_cols].copy()\n", "for (train_index, test_index) in kf.split(train_data):\n", " train = train_data.loc[train_index]\n", " valid = train_data.loc[test_index]\n", " X = np.expand_dims(train[feature_cols].values, axis=1)\n", " Y = [x for x in train[out_cols].values.T]\n", " X_valid = np.expand_dims(valid[feature_cols].values, axis=1)\n", " Y_valid = [x for x in valid[out_cols].values.T]\n", " prediction_model = get_prediction_model()\n", " trainable_model = get_trainable_model(prediction_model)\n", " trainable_model.compile(optimizer='adam', loss=None)\n", " hist = trainable_model.fit([X, Y[0], Y[1]], epochs=120, batch_size=8, verbose=0, \n", " validation_data=[X_valid, Y_valid[0], Y_valid[1]],\n", " callbacks=[reduce_lr]\n", " )\n", " rst = prediction_model.predict(X_valid)\n", " pred_rst = pd.DataFrame.from_records(np.squeeze(np.asarray(rst), axis=2).T, columns=out_cols)\n", " real_rst = valid[out_cols].copy()\n", " for col in out_cols:\n", " pred_rst[col] = pred_rst[col] * (maxs[col] - mins[col]) + mins[col]\n", " real_rst[col] = real_rst[col] * (maxs[col] - mins[col]) + mins[col]\n", " y_pred_vad = pred_rst['挥发分Vad(%)'].values.reshape(-1,)\n", " y_pred_fcad = pred_rst['固定炭Fcad(%)'].values.reshape(-1,)\n", " y_true_vad = real_rst['挥发分Vad(%)'].values.reshape(-1,)\n", " y_true_fcad = real_rst['固定炭Fcad(%)'].values.reshape(-1,)\n", " vad_eva = print_eva(y_true_vad, y_pred_vad, tp='挥发分Vad')\n", " fcad_eva = print_eva(y_true_fcad, y_pred_fcad, tp='固定炭Fcad')\n", " vad_eva_list.append(vad_eva)\n", " fcad_eva_list.append(fcad_eva)\n", " del trainable_model\n", " del prediction_model" ] }, { "cell_type": "code", "execution_count": null, "id": "27e0abf7-aa29-467f-bc5e-b66a1adf6165", "metadata": {}, "outputs": [], "source": [ "vad_df = pd.DataFrame.from_records(vad_eva_list, columns=['MSE', 'RMSE', 'MAE', 'MAPE', 'R_2'])\n", "vad_df.sort_values(by='R_2')[1:].mean()" ] }, { "cell_type": "code", "execution_count": 32, "id": "070cdb94-6e7b-4028-b6d5-ba8570c902ba", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MSE 0.820345\n", "RMSE 0.899216\n", "MAE 0.723321\n", "MAPE 0.013728\n", "R_2 0.967491\n", "dtype: float64" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fcad_df = pd.DataFrame.from_records(fcad_eva_list, columns=['MSE', 'RMSE', 'MAE', 'MAPE', 'R_2'])\n", "fcad_df.sort_values(by='R_2')[1:].mean()" ] }, { "cell_type": "code", "execution_count": null, "id": "54c1df2c-c297-4b8d-be8a-3a99cff22545", "metadata": {}, "outputs": [], "source": [ "train, valid = train_test_split(use_data[use_cols], test_size=0.3, random_state=42, shuffle=True)\n", "valid, test = train_test_split(valid, test_size=0.3, random_state=42, shuffle=True)" ] }, { "cell_type": "code", "execution_count": 31, "id": "e7a914da-b9c2-40d9-96e0-459b0888adba", "metadata": {}, "outputs": [], "source": [ "prediction_model = get_prediction_model()\n", "trainable_model = get_trainable_model(prediction_model)" ] }, { "cell_type": "code", "execution_count": 34, "id": "2494ef5a-5b2b-4f11-b6cd-dc39503c9106", "metadata": {}, "outputs": [], "source": [ "X = np.expand_dims(train[feature_cols].values, axis=1)\n", "Y = [x for x in train[out_cols].values.T]\n", "Y_valid = [x for x in valid[out_cols].values.T]" ] }, { "cell_type": "code", "execution_count": null, "id": "cf869e4d-0fce-45a2-afff-46fd9b30fd1c", "metadata": {}, "outputs": [], "source": [ "trainable_model.compile(optimizer='adam', loss=None)\n", "hist = trainable_model.fit([X, Y[0], Y[1]], epochs=120, batch_size=8, verbose=1, \n", " validation_data=[np.expand_dims(valid[feature_cols].values, axis=1), Y_valid[0], Y_valid[1]],\n", " callbacks=[reduce_lr]\n", " )" ] }, { "cell_type": "code", "execution_count": 41, "id": "67bfbe88-5f2c-4659-b2dc-eb9f1b824d04", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[array([[0.73740077],\n", " [0.89292204],\n", " [0.7599046 ],\n", " [0.67802393],\n", " [0.6815233 ],\n", " [0.88627005],\n", " [0.6121343 ],\n", " [0.7072234 ],\n", " [0.8561135 ],\n", " [0.52762157],\n", " [0.8325021 ],\n", " [0.50241977],\n", " [0.8242289 ],\n", " [0.68957335],\n", " [0.6980361 ],\n", " [0.82116604],\n", " [0.8566438 ],\n", " [0.53687835],\n", " [0.56832707],\n", " [0.78476715],\n", " [0.85638577]], dtype=float32),\n", " array([[0.68600863],\n", " [0.78454906],\n", " [0.8179163 ],\n", " [0.94351083],\n", " [0.86383885],\n", " [0.69705516],\n", " [0.6913491 ],\n", " [0.80277354],\n", " [0.93557894],\n", " [0.82278305],\n", " [0.82674253],\n", " [0.93518937],\n", " [0.8094449 ],\n", " [0.9206344 ],\n", " [0.7747319 ],\n", " [0.9137207 ],\n", " [0.9491073 ],\n", " [0.93225 ],\n", " [0.6185102 ],\n", " [0.8867341 ],\n", " [0.82890105]], dtype=float32)]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rst = prediction_model.predict(np.expand_dims(test[feature_cols], axis=1))\n", "rst" ] }, { "cell_type": "code", "execution_count": 42, "id": "7de501e9-05a2-424c-a5f4-85d43ad37592", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0.9991559102070927, 0.9998196796918477]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[np.exp(K.get_value(log_var[0]))**0.5 for log_var in trainable_model.layers[-1].log_vars]" ] }, { "cell_type": "code", "execution_count": 46, "id": "5c69d03b-34fd-4dbf-aec6-c15093bb22ab", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['挥发分Vad(%)', '固定炭Fcad(%)'], dtype='object')" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "real_rst.columns" ] }, { "cell_type": "code", "execution_count": null, "id": "294813b8-90be-4007-9fd6-c26ee7bb9652", "metadata": {}, "outputs": [], "source": [ "for col in out_cols:\n", " pred_rst[col] = pred_rst[col] * (maxs[col] - mins[col]) + mins[col]\n", " real_rst[col] = real_rst[col] * (maxs[col] - mins[col]) + mins[col]" ] }, { "cell_type": "code", "execution_count": 47, "id": "21739f82-d82a-4bde-8537-9504b68a96d5", "metadata": {}, "outputs": [], "source": [ "y_pred_vad = pred_rst['挥发分Vad(%)'].values.reshape(-1,)\n", "y_pred_fcad = pred_rst['固定炭Fcad(%)'].values.reshape(-1,)\n", "y_true_vad = real_rst['挥发分Vad(%)'].values.reshape(-1,)\n", "y_true_fcad = real_rst['固定炭Fcad(%)'].values.reshape(-1,)" ] }, { "cell_type": "code", "execution_count": 56, "id": "4ec4caa9-7c46-4fc8-a94b-cb659e924304", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "COL: 挥发分Vad, MSE: 3.35E-01,RMSE: 0.579,MAPE: 1.639 %,MAE: 0.504,R_2: 0.87\n", "COL: 固定炭Fcad, MSE: 1.11E+00,RMSE: 1.055,MAPE: 1.497 %,MAE: 0.814,R_2: 0.876\n" ] } ], "source": [ "pm25_eva = print_eva(y_true_vad, y_pred_vad, tp='挥发分Vad')\n", "pm10_eva = print_eva(y_true_fcad, y_pred_fcad, tp='固定炭Fcad')" ] }, { "cell_type": "code", "execution_count": null, "id": "ac4a4339-ec7d-4266-8197-5276c2395288", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f15cbb91-1ce7-4fb0-979a-a4bdc452a1ec", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.16" } }, "nbformat": 4, "nbformat_minor": 5 }