22-T67/keras_multi-attention_multi...

6.5 MiB
Raw Permalink Blame History

In [1]:
import os
os.environ['CUDA_DEVICE_ORDER'] = 'PCB_BUS_ID'
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
In [2]:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
#新增加的两行
from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]

mpl.rcParams["axes.unicode_minus"] = False
In [3]:
data = pd.read_csv('./new_train_data.csv', index_col='date')
# data.drop(columns=['wd'], inplace=True) # 风向还没想好怎么处理
data.head()
Out[3]:
24_PM2.5 24_PM10 24_SO2 24_NO2 24_O3 24_CO 23_PM2.5 23_PM10 23_SO2 23_NO2 ... NH3_resdient NH3_agricultural VOC_industrial VOC_transportation VOC_resdient VOC_power PM2.5_industrial PM2.5_transportation PM2.5_resdient PM2.5_power
date
2015-01-03 01:00:00 136.0 214.0 317.0 38.0 8.0 3.71 114.0 176.0 305.0 38.0 ... 0.033910 0.359273 1.177423 1.084925 0.937173 0.037724 0.926851 0.077715 0.827110 0.436028
2015-01-03 02:00:00 114.0 176.0 305.0 38.0 8.0 3.55 97.0 154.0 306.0 37.0 ... 0.033910 0.359273 1.177423 1.134240 0.937173 0.036215 0.926851 0.081248 0.827110 0.418587
2015-01-03 03:00:00 97.0 154.0 306.0 37.0 7.0 3.51 87.0 141.0 316.0 38.0 ... 0.033910 0.327791 1.177423 1.232869 0.937173 0.035712 0.926851 0.088313 0.827110 0.412773
2015-01-03 04:00:00 87.0 141.0 316.0 38.0 7.0 3.55 85.0 139.0 292.0 37.0 ... 0.033910 0.350014 1.177423 1.273965 0.937173 0.036718 0.926851 0.091256 0.827110 0.424400
2015-01-03 05:00:00 85.0 139.0 292.0 37.0 7.0 3.62 106.0 167.0 316.0 37.0 ... 0.071588 0.388904 1.177423 1.290403 1.978475 0.039736 0.926851 0.092434 1.746121 0.459282

5 rows × 187 columns

In [4]:
import seaborn as sns
In [9]:
out_cols = ['PM2.5', 'PM10', 'SO2', 'NO2', 'O3', 'CO']
feature_cols = [x for x in data.columns if x not in out_cols and x != 'date']
len(feature_cols), len(out_cols)
Out[9]:
(37, 6)
In [6]:
# for col in data.columns:
#     data[col] = data[col].astype(float)
#     if data[col].max() > 1:
#         data[col] = np.log1p(data[col])
In [10]:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import tensorflow.keras.backend as K
2023-03-29 17:14:45.550871: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
In [11]:
class TransformerBlock(layers.Layer):
    def __init__(self, embed_dim, num_heads, ff_dim, name, rate=0.1):
        super().__init__()
        self.att = layers.MultiHeadAttention(num_heads=num_heads, key_dim=embed_dim, name=name)
        self.ffn = keras.Sequential(
            [layers.Dense(ff_dim, activation="relu"), layers.Dense(embed_dim),]
        )
        self.layernorm1 = layers.LayerNormalization(epsilon=1e-6)
        self.layernorm2 = layers.LayerNormalization(epsilon=1e-6)
        self.dropout1 = layers.Dropout(rate)
        self.dropout2 = layers.Dropout(rate)

    def call(self, inputs, training):
        attn_output = self.att(inputs, inputs)
        attn_output = self.dropout1(attn_output, training=training)
        out1 = self.layernorm1(inputs + attn_output)
        ffn_output = self.ffn(out1)
        ffn_output = self.dropout2(ffn_output, training=training)
        return self.layernorm2(out1 + ffn_output)
In [12]:
from tensorflow.keras import Model
In [13]:
from tensorflow.keras.initializers import Constant
In [14]:
# def build_multi_task(num_heads, ff_dim):
#     def build_output(lstm_out, out_name):
#         transformer_block = TransformerBlock(128, num_heads, ff_dim, name='first_attn')
#         out = transformer_block(lstm_out)
#         out = layers.GlobalAveragePooling1D()(out)
#         out = layers.Dropout(0.1)(out)
#         out = layers.Dense(32, activation="relu")(out)
        # out = layers.Dense(1, name=out_name, activation="sigmoid")(out)
#         return out
#     inputs = layers.Input(shape=(1,len(feature_cols)), name='input')
#     x = layers.Conv1D(filters=64, kernel_size=1, activation='relu')(inputs)
#     # x = layers.Dropout(rate=0.1)(x)
#     lstm_out = layers.Bidirectional(layers.LSTM(units=64, return_sequences=True))(x)

#     pm25 = build_output(lstm_out, 'pm25')
#     pm10 = build_output(lstm_out, 'pm10')
#     so2 = build_output(lstm_out, 'so2')
#     no2 = build_output(lstm_out, 'no2')
#     o3 = build_output(lstm_out, 'o3')
#     co = build_output(lstm_out, 'co')

#     model = Model(inputs=[inputs], outputs=[pm25, pm10, so2, no2, o3, co])
#     model.summary()
#     return model
In [12]:
# def build_multi_task(num_heads, ff_dim):
#     def build_output(out, out_name):
#         self_block = TransformerBlock(64, num_heads, ff_dim, name='first_attn')
#         out = self_block(out)
#         out = layers.GlobalAveragePooling1D()(out)
#         out = layers.Dropout(0.1)(out)
#         out = layers.Dense(32, activation="relu")(out)
#         out = layers.Dense(1, name=out_name, activation="sigmoid")(out)
#         return out
#     inputs = layers.Input(shape=(1,len(feature_cols)), name='input')
#     x = layers.Conv1D(filters=64, kernel_size=1, activation='relu')(inputs)
#     # x = layers.Dropout(rate=0.1)(x)
#     lstm_out = layers.Bidirectional(layers.LSTM(units=64, return_sequences=True))(x)
#     lstm_out = layers.Dense(128, activation='relu')(lstm_out)
#     transformer_block = TransformerBlock(128, num_heads, ff_dim)
#     out = transformer_block(lstm_out)
#     out = layers.GlobalAveragePooling1D()(out)
#     out = layers.Dropout(0.1)(out)
#     out = layers.Dense(64, activation='relu')(out)
#     out = K.expand_dims(out, axis=1)

#     pm25 = build_output(out, 'pm25')
#     pm10 = build_output(out, 'pm10')
#     so2 = build_output(out, 'so2')
#     no2 = build_output(out, 'no2')
#     o3 = build_output(out, 'o3')
#     co = build_output(out, 'co')

#     model = Model(inputs=[inputs], outputs=[pm25, pm10, so2, no2, o3, co])
#     model.summary()
#     return model
In [16]:
def build_multi_task(num_heads, ff_dim):
    def build_output(out, out_name):
        self_block = TransformerBlock(64, num_heads, ff_dim, name=f'{out_name}_attn')
        out = self_block(out)
        out = layers.GlobalAveragePooling1D()(out)
        out = layers.Dropout(0.1)(out)
        out = layers.Dense(32, activation="relu")(out)
        # out = layers.Dense(1, name=out_name, activation="sigmoid")(out)
        return out
    inputs = layers.Input(shape=(1,len(feature_cols)), name='input')
    x = layers.Conv1D(filters=64, kernel_size=1, activation='relu')(inputs)
    # x = layers.Dropout(rate=0.1)(x)
    lstm_out = layers.Bidirectional(layers.LSTM(units=64, return_sequences=True))(x)
    lstm_out = layers.Dense(128, activation='relu')(lstm_out)
    transformer_block = TransformerBlock(128, num_heads, ff_dim, name='first_attn')
    out = transformer_block(lstm_out)
    out = layers.GlobalAveragePooling1D()(out)
    out = layers.Dropout(0.1)(out)
    out = layers.Dense(64, activation='relu')(out)
    out = K.expand_dims(out, axis=1)

    pm25 = build_output(out, 'pm25')
    pm10 = build_output(out, 'pm10')
    so2 = build_output(out, 'so2')
    no2 = build_output(out, 'no2')
    o3 = build_output(out, 'o3')
    co = build_output(out, 'co')

    merge = layers.Concatenate(axis=1)([pm25, pm10, so2, no2, o3, co])
    merge = K.expand_dims(merge, axis=1)
    merge_attn = TransformerBlock(32*6, 3, 16, name='last_attn')

    out = merge_attn(merge)
    out = layers.GlobalAveragePooling1D()(out)
    out = layers.Dropout(0.1)(out)

    pm25 = layers.Dense(32, activation='relu')(out)
    pm10 = layers.Dense(32, activation='relu')(out)
    so2 = layers.Dense(32, activation='relu')(out)
    no2 = layers.Dense(32, activation='relu')(out)
    o3 = layers.Dense(32, activation='relu')(out)
    co = layers.Dense(32, activation='relu')(out)

    pm25 = layers.Dense(1, activation='sigmoid', name='pm25')(pm25)
    pm10 = layers.Dense(1, activation='sigmoid', name='pm10')(pm10)
    so2 = layers.Dense(1, activation='sigmoid', name='so2')(so2)
    no2 = layers.Dense(1, activation='sigmoid', name='no2')(no2)
    o3 = layers.Dense(1, activation='sigmoid', name='o3')(o3)
    co = layers.Dense(1, activation='sigmoid', name='co')(co)

    model = Model(inputs=[inputs], outputs=[pm25, pm10, so2, no2, o3, co])
    model.summary()
    return model
In [17]:
from tensorflow.python.keras.utils.vis_utils import plot_model
from tensorflow.keras import optimizers
In [19]:
use_cols = feature_cols + out_cols
use_data = data[use_cols].dropna()
In [20]:
for col in use_cols:
    use_data[col] = use_data[col].astype('float32')
In [21]:
maxs = use_data.max()
mins = use_data.min()
use_cols = use_data.columns
In [22]:
for col in use_cols:
    # use_data[col] = use_data[col].apply(lambda x: 0 if x < 0 else x)
    # use_data[col] = np.log1p(use_data[col])
    use_data[col] = (use_data[col] - mins[col]) / (maxs[col] - mins[col])
In [23]:
train_data, valid = train_test_split(use_data[use_cols], test_size=0.1, random_state=42, shuffle=True)
valid_data, test_data = train_test_split(valid, test_size=0.5, random_state=42, shuffle=True)
In [24]:
opt = optimizers.Adam(learning_rate=5e-5)
In [23]:
def compile_multitask_model(model, gamma):
      w = 1 / gamma
      model.compile(optimizer=opt,
                  loss={'pm25': 'mae', 
                        'pm10': 'mae', 
                        'so2': 'mae', 
                        'no2': 'mae', 
                        'o3': 'mae', 
                        'co': 'mae'},
                  metrics=['mse'])
      return model
In [24]:
model = compile_multitask_model(model, gamma=6)
In [25]:
train_cols = [x for x in out_cols if x not in out_cols]
In [26]:
train_data
Out[26]:
24_PM2.5 24_PM10 24_SO2 24_NO2 24_O3 24_CO 23_PM2.5 23_PM10 23_SO2 23_NO2 ... PM2.5_industrial PM2.5_transportation PM2.5_resdient PM2.5_power PM2.5 PM10 SO2 NO2 O3 CO
date
2017-04-21 07:00:00 0.130977 0.163872 0.142349 0.331325 0.015873 0.175287 0.151767 0.176067 0.172598 0.355422 ... 0.259570 0.821789 0.130550 0.558376 0.051975 0.069360 0.030645 0.295181 0.073016 0.103448
2020-12-18 13:00:00 0.162162 0.104421 0.103203 0.349398 0.073016 0.204023 0.178794 0.114329 0.101423 0.361446 ... 0.581076 0.619134 0.280542 0.390375 0.056133 0.038872 0.032258 0.162651 0.155556 0.125000
2015-07-28 07:00:00 0.166320 0.106707 0.039146 0.150602 0.107937 0.181034 0.170478 0.109756 0.039146 0.186747 ... 0.338909 0.661377 0.164996 0.722157 0.153846 0.099085 0.037097 0.156627 0.085714 0.145115
2016-09-27 21:00:00 0.141372 0.096799 0.033808 0.451807 0.028571 0.222701 0.143451 0.101372 0.028470 0.457831 ... 0.422103 0.447063 0.098317 0.545690 0.041580 0.042683 0.027419 0.216867 0.142857 0.099138
2019-09-08 23:00:00 0.081081 0.088415 0.014235 0.656627 0.088889 0.090517 0.081081 0.096037 0.016014 0.728916 ... 0.331071 0.135968 0.005011 0.112853 0.051975 0.051829 0.012903 0.403614 0.219048 0.070402
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2016-05-05 17:00:00 0.097713 0.087652 0.090747 0.114458 0.453968 0.107759 0.099792 0.090701 0.092527 0.144578 ... 0.712507 0.655019 0.146814 0.788907 0.064449 0.086128 0.014516 0.054217 0.266667 0.057471
2020-07-01 10:00:00 0.033264 0.022104 0.019573 0.084337 0.371429 0.077586 0.027027 0.019055 0.014235 0.048193 ... 0.554177 0.626956 0.018196 0.388151 0.085239 0.064024 0.024194 0.246988 0.260317 0.142241
2019-09-27 09:00:00 0.064449 0.056402 0.037367 0.337349 0.088889 0.106322 0.060291 0.052591 0.055160 0.283133 ... 0.658467 0.681554 0.040906 0.254681 0.064449 0.051067 0.022581 0.253012 0.098413 0.089080
2015-02-08 22:00:00 0.054054 0.035823 0.113879 0.174699 0.098413 0.218391 0.054054 0.034299 0.113879 0.120482 ... 0.475407 0.329360 0.219197 0.546827 0.141372 0.079268 0.298387 0.367470 0.028571 0.350575
2016-12-03 03:00:00 0.284823 0.160061 0.343416 0.373494 0.012698 0.372126 0.228690 0.131860 0.316726 0.373494 ... 0.025917 0.038973 0.195944 0.309794 0.611227 0.292683 0.566129 0.560241 0.015873 0.636494

44112 rows × 187 columns

In [28]:
model_history = model.fit(
    {'input': np.expand_dims(train_data[feature_cols].values, axis=1)},
    {
        'pm25': train_data['PM2.5'], 
        'pm10':train_data['PM10'],
        'so2': train_data['SO2'], 
        'no2': train_data['NO2'], 
        'o3': train_data['O3'], 
        'co': train_data['CO'],
    },
    validation_data=(np.expand_dims(valid_data[feature_cols].values, axis=1), valid_data[out_cols].values),
    epochs=50, batch_size=64, verbose=1)
Epoch 1/50
690/690 [==============================] - 13s 19ms/step - loss: 0.2332 - pm25_loss: 0.0390 - pm10_loss: 0.0279 - so2_loss: 0.0278 - no2_loss: 0.0548 - o3_loss: 0.0448 - co_loss: 0.0388 - pm25_mse: 0.0031 - pm10_mse: 0.0016 - so2_mse: 0.0023 - no2_mse: 0.0054 - o3_mse: 0.0041 - co_mse: 0.0028 - val_loss: 0.6660 - val_pm25_loss: 0.0833 - val_pm10_loss: 0.0885 - val_so2_loss: 0.1071 - val_no2_loss: 0.1400 - val_o3_loss: 0.1600 - val_co_loss: 0.0871 - val_pm25_mse: 0.0168 - val_pm10_mse: 0.0188 - val_so2_mse: 0.0248 - val_no2_mse: 0.0340 - val_o3_mse: 0.0483 - val_co_mse: 0.0170
Epoch 2/50
690/690 [==============================] - 12s 17ms/step - loss: 0.2003 - pm25_loss: 0.0326 - pm10_loss: 0.0244 - so2_loss: 0.0248 - no2_loss: 0.0470 - o3_loss: 0.0376 - co_loss: 0.0339 - pm25_mse: 0.0022 - pm10_mse: 0.0013 - so2_mse: 0.0018 - no2_mse: 0.0040 - o3_mse: 0.0028 - co_mse: 0.0021 - val_loss: 0.6676 - val_pm25_loss: 0.0836 - val_pm10_loss: 0.0868 - val_so2_loss: 0.1035 - val_no2_loss: 0.1513 - val_o3_loss: 0.1520 - val_co_loss: 0.0905 - val_pm25_mse: 0.0169 - val_pm10_mse: 0.0182 - val_so2_mse: 0.0238 - val_no2_mse: 0.0398 - val_o3_mse: 0.0442 - val_co_mse: 0.0179
Epoch 3/50
690/690 [==============================] - 11s 17ms/step - loss: 0.1805 - pm25_loss: 0.0290 - pm10_loss: 0.0223 - so2_loss: 0.0225 - no2_loss: 0.0425 - o3_loss: 0.0334 - co_loss: 0.0308 - pm25_mse: 0.0018 - pm10_mse: 0.0011 - so2_mse: 0.0015 - no2_mse: 0.0033 - o3_mse: 0.0022 - co_mse: 0.0018 - val_loss: 0.6681 - val_pm25_loss: 0.0839 - val_pm10_loss: 0.0857 - val_so2_loss: 0.1027 - val_no2_loss: 0.1514 - val_o3_loss: 0.1545 - val_co_loss: 0.0899 - val_pm25_mse: 0.0169 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0237 - val_no2_mse: 0.0400 - val_o3_mse: 0.0461 - val_co_mse: 0.0175
Epoch 4/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1671 - pm25_loss: 0.0267 - pm10_loss: 0.0206 - so2_loss: 0.0213 - no2_loss: 0.0398 - o3_loss: 0.0303 - co_loss: 0.0284 - pm25_mse: 0.0015 - pm10_mse: 9.8021e-04 - so2_mse: 0.0013 - no2_mse: 0.0029 - o3_mse: 0.0018 - co_mse: 0.0015 - val_loss: 0.6596 - val_pm25_loss: 0.0856 - val_pm10_loss: 0.0833 - val_so2_loss: 0.1020 - val_no2_loss: 0.1457 - val_o3_loss: 0.1520 - val_co_loss: 0.0911 - val_pm25_mse: 0.0171 - val_pm10_mse: 0.0171 - val_so2_mse: 0.0234 - val_no2_mse: 0.0373 - val_o3_mse: 0.0455 - val_co_mse: 0.0176
Epoch 5/50
690/690 [==============================] - 11s 17ms/step - loss: 0.1573 - pm25_loss: 0.0252 - pm10_loss: 0.0192 - so2_loss: 0.0201 - no2_loss: 0.0378 - o3_loss: 0.0286 - co_loss: 0.0264 - pm25_mse: 0.0014 - pm10_mse: 8.6174e-04 - so2_mse: 0.0012 - no2_mse: 0.0026 - o3_mse: 0.0016 - co_mse: 0.0013 - val_loss: 0.6741 - val_pm25_loss: 0.0834 - val_pm10_loss: 0.0846 - val_so2_loss: 0.1018 - val_no2_loss: 0.1565 - val_o3_loss: 0.1564 - val_co_loss: 0.0914 - val_pm25_mse: 0.0171 - val_pm10_mse: 0.0177 - val_so2_mse: 0.0233 - val_no2_mse: 0.0424 - val_o3_mse: 0.0469 - val_co_mse: 0.0181
Epoch 6/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1500 - pm25_loss: 0.0238 - pm10_loss: 0.0182 - so2_loss: 0.0192 - no2_loss: 0.0363 - o3_loss: 0.0274 - co_loss: 0.0251 - pm25_mse: 0.0012 - pm10_mse: 7.8217e-04 - so2_mse: 0.0011 - no2_mse: 0.0024 - o3_mse: 0.0015 - co_mse: 0.0012 - val_loss: 0.6692 - val_pm25_loss: 0.0851 - val_pm10_loss: 0.0845 - val_so2_loss: 0.1007 - val_no2_loss: 0.1507 - val_o3_loss: 0.1572 - val_co_loss: 0.0910 - val_pm25_mse: 0.0176 - val_pm10_mse: 0.0176 - val_so2_mse: 0.0231 - val_no2_mse: 0.0404 - val_o3_mse: 0.0482 - val_co_mse: 0.0181
Epoch 7/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1438 - pm25_loss: 0.0229 - pm10_loss: 0.0174 - so2_loss: 0.0186 - no2_loss: 0.0350 - o3_loss: 0.0260 - co_loss: 0.0240 - pm25_mse: 0.0011 - pm10_mse: 7.0840e-04 - so2_mse: 0.0010 - no2_mse: 0.0022 - o3_mse: 0.0013 - co_mse: 0.0011 - val_loss: 0.6538 - val_pm25_loss: 0.0840 - val_pm10_loss: 0.0852 - val_so2_loss: 0.1031 - val_no2_loss: 0.1435 - val_o3_loss: 0.1489 - val_co_loss: 0.0892 - val_pm25_mse: 0.0175 - val_pm10_mse: 0.0179 - val_so2_mse: 0.0238 - val_no2_mse: 0.0376 - val_o3_mse: 0.0431 - val_co_mse: 0.0179
Epoch 8/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1385 - pm25_loss: 0.0221 - pm10_loss: 0.0166 - so2_loss: 0.0178 - no2_loss: 0.0337 - o3_loss: 0.0251 - co_loss: 0.0232 - pm25_mse: 0.0011 - pm10_mse: 6.5187e-04 - so2_mse: 9.3330e-04 - no2_mse: 0.0021 - o3_mse: 0.0012 - co_mse: 0.0010 - val_loss: 0.6569 - val_pm25_loss: 0.0827 - val_pm10_loss: 0.0854 - val_so2_loss: 0.1016 - val_no2_loss: 0.1436 - val_o3_loss: 0.1552 - val_co_loss: 0.0884 - val_pm25_mse: 0.0171 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0235 - val_no2_mse: 0.0376 - val_o3_mse: 0.0472 - val_co_mse: 0.0176
Epoch 9/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1349 - pm25_loss: 0.0212 - pm10_loss: 0.0161 - so2_loss: 0.0175 - no2_loss: 0.0330 - o3_loss: 0.0246 - co_loss: 0.0225 - pm25_mse: 9.9345e-04 - pm10_mse: 6.0136e-04 - so2_mse: 8.9766e-04 - no2_mse: 0.0020 - o3_mse: 0.0012 - co_mse: 9.6550e-04 - val_loss: 0.6593 - val_pm25_loss: 0.0825 - val_pm10_loss: 0.0868 - val_so2_loss: 0.1005 - val_no2_loss: 0.1525 - val_o3_loss: 0.1500 - val_co_loss: 0.0870 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0184 - val_so2_mse: 0.0232 - val_no2_mse: 0.0405 - val_o3_mse: 0.0446 - val_co_mse: 0.0173
Epoch 10/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1309 - pm25_loss: 0.0207 - pm10_loss: 0.0155 - so2_loss: 0.0171 - no2_loss: 0.0321 - o3_loss: 0.0236 - co_loss: 0.0219 - pm25_mse: 9.3529e-04 - pm10_mse: 5.6009e-04 - so2_mse: 8.5888e-04 - no2_mse: 0.0019 - o3_mse: 0.0011 - co_mse: 9.0392e-04 - val_loss: 0.6582 - val_pm25_loss: 0.0830 - val_pm10_loss: 0.0843 - val_so2_loss: 0.1017 - val_no2_loss: 0.1429 - val_o3_loss: 0.1571 - val_co_loss: 0.0892 - val_pm25_mse: 0.0170 - val_pm10_mse: 0.0176 - val_so2_mse: 0.0235 - val_no2_mse: 0.0375 - val_o3_mse: 0.0485 - val_co_mse: 0.0179
Epoch 11/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1283 - pm25_loss: 0.0203 - pm10_loss: 0.0152 - so2_loss: 0.0167 - no2_loss: 0.0314 - o3_loss: 0.0232 - co_loss: 0.0215 - pm25_mse: 9.1349e-04 - pm10_mse: 5.3300e-04 - so2_mse: 8.1375e-04 - no2_mse: 0.0018 - o3_mse: 0.0010 - co_mse: 8.8792e-04 - val_loss: 0.6643 - val_pm25_loss: 0.0828 - val_pm10_loss: 0.0846 - val_so2_loss: 0.1023 - val_no2_loss: 0.1540 - val_o3_loss: 0.1519 - val_co_loss: 0.0886 - val_pm25_mse: 0.0170 - val_pm10_mse: 0.0177 - val_so2_mse: 0.0237 - val_no2_mse: 0.0417 - val_o3_mse: 0.0457 - val_co_mse: 0.0176
Epoch 12/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1259 - pm25_loss: 0.0198 - pm10_loss: 0.0150 - so2_loss: 0.0165 - no2_loss: 0.0309 - o3_loss: 0.0226 - co_loss: 0.0211 - pm25_mse: 8.6479e-04 - pm10_mse: 5.1626e-04 - so2_mse: 8.0258e-04 - no2_mse: 0.0018 - o3_mse: 9.9486e-04 - co_mse: 8.5558e-04 - val_loss: 0.6619 - val_pm25_loss: 0.0837 - val_pm10_loss: 0.0858 - val_so2_loss: 0.1036 - val_no2_loss: 0.1451 - val_o3_loss: 0.1550 - val_co_loss: 0.0887 - val_pm25_mse: 0.0176 - val_pm10_mse: 0.0181 - val_so2_mse: 0.0240 - val_no2_mse: 0.0388 - val_o3_mse: 0.0471 - val_co_mse: 0.0180
Epoch 13/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1235 - pm25_loss: 0.0196 - pm10_loss: 0.0146 - so2_loss: 0.0162 - no2_loss: 0.0303 - o3_loss: 0.0222 - co_loss: 0.0206 - pm25_mse: 8.5601e-04 - pm10_mse: 4.9180e-04 - so2_mse: 7.6929e-04 - no2_mse: 0.0017 - o3_mse: 9.6504e-04 - co_mse: 8.1659e-04 - val_loss: 0.6584 - val_pm25_loss: 0.0828 - val_pm10_loss: 0.0853 - val_so2_loss: 0.1023 - val_no2_loss: 0.1457 - val_o3_loss: 0.1557 - val_co_loss: 0.0867 - val_pm25_mse: 0.0174 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0236 - val_no2_mse: 0.0387 - val_o3_mse: 0.0477 - val_co_mse: 0.0174
Epoch 14/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1210 - pm25_loss: 0.0191 - pm10_loss: 0.0143 - so2_loss: 0.0158 - no2_loss: 0.0299 - o3_loss: 0.0217 - co_loss: 0.0203 - pm25_mse: 8.1625e-04 - pm10_mse: 4.6297e-04 - so2_mse: 7.2483e-04 - no2_mse: 0.0017 - o3_mse: 9.1613e-04 - co_mse: 7.8936e-04 - val_loss: 0.6591 - val_pm25_loss: 0.0826 - val_pm10_loss: 0.0869 - val_so2_loss: 0.1019 - val_no2_loss: 0.1494 - val_o3_loss: 0.1498 - val_co_loss: 0.0885 - val_pm25_mse: 0.0173 - val_pm10_mse: 0.0185 - val_so2_mse: 0.0235 - val_no2_mse: 0.0403 - val_o3_mse: 0.0441 - val_co_mse: 0.0180
Epoch 15/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1196 - pm25_loss: 0.0190 - pm10_loss: 0.0140 - so2_loss: 0.0158 - no2_loss: 0.0294 - o3_loss: 0.0213 - co_loss: 0.0200 - pm25_mse: 8.0990e-04 - pm10_mse: 4.4497e-04 - so2_mse: 7.2605e-04 - no2_mse: 0.0016 - o3_mse: 8.9130e-04 - co_mse: 7.7173e-04 - val_loss: 0.6597 - val_pm25_loss: 0.0829 - val_pm10_loss: 0.0857 - val_so2_loss: 0.1023 - val_no2_loss: 0.1473 - val_o3_loss: 0.1530 - val_co_loss: 0.0884 - val_pm25_mse: 0.0173 - val_pm10_mse: 0.0181 - val_so2_mse: 0.0237 - val_no2_mse: 0.0398 - val_o3_mse: 0.0462 - val_co_mse: 0.0179
Epoch 16/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1177 - pm25_loss: 0.0185 - pm10_loss: 0.0138 - so2_loss: 0.0154 - no2_loss: 0.0291 - o3_loss: 0.0211 - co_loss: 0.0197 - pm25_mse: 7.7055e-04 - pm10_mse: 4.3773e-04 - so2_mse: 6.9458e-04 - no2_mse: 0.0016 - o3_mse: 8.6953e-04 - co_mse: 7.4449e-04 - val_loss: 0.6606 - val_pm25_loss: 0.0818 - val_pm10_loss: 0.0847 - val_so2_loss: 0.1006 - val_no2_loss: 0.1530 - val_o3_loss: 0.1511 - val_co_loss: 0.0894 - val_pm25_mse: 0.0168 - val_pm10_mse: 0.0178 - val_so2_mse: 0.0232 - val_no2_mse: 0.0413 - val_o3_mse: 0.0455 - val_co_mse: 0.0176
Epoch 17/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1163 - pm25_loss: 0.0185 - pm10_loss: 0.0137 - so2_loss: 0.0152 - no2_loss: 0.0288 - o3_loss: 0.0207 - co_loss: 0.0195 - pm25_mse: 7.7383e-04 - pm10_mse: 4.2540e-04 - so2_mse: 6.6704e-04 - no2_mse: 0.0016 - o3_mse: 8.3579e-04 - co_mse: 7.3199e-04 - val_loss: 0.6612 - val_pm25_loss: 0.0831 - val_pm10_loss: 0.0843 - val_so2_loss: 0.1018 - val_no2_loss: 0.1472 - val_o3_loss: 0.1559 - val_co_loss: 0.0889 - val_pm25_mse: 0.0174 - val_pm10_mse: 0.0177 - val_so2_mse: 0.0236 - val_no2_mse: 0.0395 - val_o3_mse: 0.0481 - val_co_mse: 0.0179
Epoch 18/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1147 - pm25_loss: 0.0181 - pm10_loss: 0.0135 - so2_loss: 0.0150 - no2_loss: 0.0284 - o3_loss: 0.0204 - co_loss: 0.0192 - pm25_mse: 7.2693e-04 - pm10_mse: 4.1564e-04 - so2_mse: 6.4517e-04 - no2_mse: 0.0015 - o3_mse: 8.1594e-04 - co_mse: 7.0265e-04 - val_loss: 0.6583 - val_pm25_loss: 0.0828 - val_pm10_loss: 0.0841 - val_so2_loss: 0.1002 - val_no2_loss: 0.1490 - val_o3_loss: 0.1546 - val_co_loss: 0.0875 - val_pm25_mse: 0.0170 - val_pm10_mse: 0.0176 - val_so2_mse: 0.0231 - val_no2_mse: 0.0400 - val_o3_mse: 0.0475 - val_co_mse: 0.0173
Epoch 19/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1139 - pm25_loss: 0.0180 - pm10_loss: 0.0133 - so2_loss: 0.0150 - no2_loss: 0.0284 - o3_loss: 0.0203 - co_loss: 0.0191 - pm25_mse: 7.2973e-04 - pm10_mse: 3.9422e-04 - so2_mse: 6.5502e-04 - no2_mse: 0.0015 - o3_mse: 8.0642e-04 - co_mse: 6.9577e-04 - val_loss: 0.6550 - val_pm25_loss: 0.0823 - val_pm10_loss: 0.0854 - val_so2_loss: 0.1022 - val_no2_loss: 0.1446 - val_o3_loss: 0.1525 - val_co_loss: 0.0880 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0181 - val_so2_mse: 0.0237 - val_no2_mse: 0.0380 - val_o3_mse: 0.0457 - val_co_mse: 0.0178
Epoch 20/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1125 - pm25_loss: 0.0177 - pm10_loss: 0.0132 - so2_loss: 0.0148 - no2_loss: 0.0280 - o3_loss: 0.0200 - co_loss: 0.0188 - pm25_mse: 7.0545e-04 - pm10_mse: 3.9227e-04 - so2_mse: 6.3487e-04 - no2_mse: 0.0015 - o3_mse: 7.8305e-04 - co_mse: 6.7808e-04 - val_loss: 0.6481 - val_pm25_loss: 0.0813 - val_pm10_loss: 0.0851 - val_so2_loss: 0.1032 - val_no2_loss: 0.1401 - val_o3_loss: 0.1514 - val_co_loss: 0.0870 - val_pm25_mse: 0.0167 - val_pm10_mse: 0.0181 - val_so2_mse: 0.0239 - val_no2_mse: 0.0358 - val_o3_mse: 0.0450 - val_co_mse: 0.0174
Epoch 21/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1119 - pm25_loss: 0.0177 - pm10_loss: 0.0131 - so2_loss: 0.0146 - no2_loss: 0.0279 - o3_loss: 0.0199 - co_loss: 0.0187 - pm25_mse: 7.0314e-04 - pm10_mse: 3.8956e-04 - so2_mse: 6.1240e-04 - no2_mse: 0.0015 - o3_mse: 7.7719e-04 - co_mse: 6.7488e-04 - val_loss: 0.6602 - val_pm25_loss: 0.0825 - val_pm10_loss: 0.0851 - val_so2_loss: 0.1020 - val_no2_loss: 0.1498 - val_o3_loss: 0.1531 - val_co_loss: 0.0876 - val_pm25_mse: 0.0171 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0237 - val_no2_mse: 0.0403 - val_o3_mse: 0.0468 - val_co_mse: 0.0177
Epoch 22/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1100 - pm25_loss: 0.0173 - pm10_loss: 0.0128 - so2_loss: 0.0143 - no2_loss: 0.0275 - o3_loss: 0.0195 - co_loss: 0.0185 - pm25_mse: 6.6950e-04 - pm10_mse: 3.7277e-04 - so2_mse: 5.8999e-04 - no2_mse: 0.0014 - o3_mse: 7.4992e-04 - co_mse: 6.5288e-04 - val_loss: 0.6713 - val_pm25_loss: 0.0840 - val_pm10_loss: 0.0854 - val_so2_loss: 0.1017 - val_no2_loss: 0.1527 - val_o3_loss: 0.1566 - val_co_loss: 0.0910 - val_pm25_mse: 0.0179 - val_pm10_mse: 0.0181 - val_so2_mse: 0.0237 - val_no2_mse: 0.0427 - val_o3_mse: 0.0487 - val_co_mse: 0.0187
Epoch 23/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1097 - pm25_loss: 0.0173 - pm10_loss: 0.0128 - so2_loss: 0.0143 - no2_loss: 0.0275 - o3_loss: 0.0194 - co_loss: 0.0185 - pm25_mse: 6.7541e-04 - pm10_mse: 3.6521e-04 - so2_mse: 5.8931e-04 - no2_mse: 0.0014 - o3_mse: 7.4037e-04 - co_mse: 6.6391e-04 - val_loss: 0.6614 - val_pm25_loss: 0.0829 - val_pm10_loss: 0.0846 - val_so2_loss: 0.1011 - val_no2_loss: 0.1520 - val_o3_loss: 0.1504 - val_co_loss: 0.0903 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0178 - val_so2_mse: 0.0234 - val_no2_mse: 0.0412 - val_o3_mse: 0.0449 - val_co_mse: 0.0181
Epoch 24/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1084 - pm25_loss: 0.0171 - pm10_loss: 0.0126 - so2_loss: 0.0142 - no2_loss: 0.0272 - o3_loss: 0.0192 - co_loss: 0.0182 - pm25_mse: 6.5768e-04 - pm10_mse: 3.5788e-04 - so2_mse: 5.7106e-04 - no2_mse: 0.0014 - o3_mse: 7.2528e-04 - co_mse: 6.3424e-04 - val_loss: 0.6572 - val_pm25_loss: 0.0836 - val_pm10_loss: 0.0853 - val_so2_loss: 0.1021 - val_no2_loss: 0.1426 - val_o3_loss: 0.1561 - val_co_loss: 0.0874 - val_pm25_mse: 0.0176 - val_pm10_mse: 0.0181 - val_so2_mse: 0.0236 - val_no2_mse: 0.0380 - val_o3_mse: 0.0482 - val_co_mse: 0.0178
Epoch 25/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1078 - pm25_loss: 0.0170 - pm10_loss: 0.0125 - so2_loss: 0.0140 - no2_loss: 0.0272 - o3_loss: 0.0190 - co_loss: 0.0181 - pm25_mse: 6.5638e-04 - pm10_mse: 3.4962e-04 - so2_mse: 5.6850e-04 - no2_mse: 0.0014 - o3_mse: 7.0940e-04 - co_mse: 6.3257e-04 - val_loss: 0.6582 - val_pm25_loss: 0.0826 - val_pm10_loss: 0.0857 - val_so2_loss: 0.1022 - val_no2_loss: 0.1497 - val_o3_loss: 0.1503 - val_co_loss: 0.0876 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0182 - val_so2_mse: 0.0237 - val_no2_mse: 0.0408 - val_o3_mse: 0.0448 - val_co_mse: 0.0177
Epoch 26/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1067 - pm25_loss: 0.0168 - pm10_loss: 0.0124 - so2_loss: 0.0139 - no2_loss: 0.0269 - o3_loss: 0.0188 - co_loss: 0.0180 - pm25_mse: 6.3574e-04 - pm10_mse: 3.4226e-04 - so2_mse: 5.5284e-04 - no2_mse: 0.0014 - o3_mse: 6.9490e-04 - co_mse: 6.2231e-04 - val_loss: 0.6668 - val_pm25_loss: 0.0838 - val_pm10_loss: 0.0848 - val_so2_loss: 0.1002 - val_no2_loss: 0.1538 - val_o3_loss: 0.1555 - val_co_loss: 0.0887 - val_pm25_mse: 0.0176 - val_pm10_mse: 0.0179 - val_so2_mse: 0.0231 - val_no2_mse: 0.0426 - val_o3_mse: 0.0479 - val_co_mse: 0.0180
Epoch 27/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1060 - pm25_loss: 0.0167 - pm10_loss: 0.0122 - so2_loss: 0.0138 - no2_loss: 0.0268 - o3_loss: 0.0186 - co_loss: 0.0179 - pm25_mse: 6.2988e-04 - pm10_mse: 3.3928e-04 - so2_mse: 5.4696e-04 - no2_mse: 0.0014 - o3_mse: 6.8858e-04 - co_mse: 6.1392e-04 - val_loss: 0.6545 - val_pm25_loss: 0.0829 - val_pm10_loss: 0.0849 - val_so2_loss: 0.1032 - val_no2_loss: 0.1422 - val_o3_loss: 0.1550 - val_co_loss: 0.0863 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0179 - val_so2_mse: 0.0239 - val_no2_mse: 0.0374 - val_o3_mse: 0.0476 - val_co_mse: 0.0176
Epoch 28/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1055 - pm25_loss: 0.0165 - pm10_loss: 0.0122 - so2_loss: 0.0137 - no2_loss: 0.0267 - o3_loss: 0.0187 - co_loss: 0.0177 - pm25_mse: 6.1787e-04 - pm10_mse: 3.3690e-04 - so2_mse: 5.3732e-04 - no2_mse: 0.0014 - o3_mse: 6.8977e-04 - co_mse: 6.0403e-04 - val_loss: 0.6602 - val_pm25_loss: 0.0831 - val_pm10_loss: 0.0852 - val_so2_loss: 0.1013 - val_no2_loss: 0.1478 - val_o3_loss: 0.1541 - val_co_loss: 0.0887 - val_pm25_mse: 0.0174 - val_pm10_mse: 0.0181 - val_so2_mse: 0.0234 - val_no2_mse: 0.0401 - val_o3_mse: 0.0472 - val_co_mse: 0.0179
Epoch 29/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1051 - pm25_loss: 0.0165 - pm10_loss: 0.0121 - so2_loss: 0.0136 - no2_loss: 0.0266 - o3_loss: 0.0186 - co_loss: 0.0177 - pm25_mse: 6.2427e-04 - pm10_mse: 3.3626e-04 - so2_mse: 5.2777e-04 - no2_mse: 0.0014 - o3_mse: 6.8583e-04 - co_mse: 5.9979e-04 - val_loss: 0.6590 - val_pm25_loss: 0.0832 - val_pm10_loss: 0.0868 - val_so2_loss: 0.1012 - val_no2_loss: 0.1461 - val_o3_loss: 0.1534 - val_co_loss: 0.0882 - val_pm25_mse: 0.0177 - val_pm10_mse: 0.0186 - val_so2_mse: 0.0235 - val_no2_mse: 0.0392 - val_o3_mse: 0.0470 - val_co_mse: 0.0181
Epoch 30/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1042 - pm25_loss: 0.0164 - pm10_loss: 0.0121 - so2_loss: 0.0135 - no2_loss: 0.0264 - o3_loss: 0.0183 - co_loss: 0.0175 - pm25_mse: 6.1534e-04 - pm10_mse: 3.2614e-04 - so2_mse: 5.3001e-04 - no2_mse: 0.0014 - o3_mse: 6.6255e-04 - co_mse: 5.9483e-04 - val_loss: 0.6618 - val_pm25_loss: 0.0831 - val_pm10_loss: 0.0846 - val_so2_loss: 0.1023 - val_no2_loss: 0.1482 - val_o3_loss: 0.1549 - val_co_loss: 0.0886 - val_pm25_mse: 0.0175 - val_pm10_mse: 0.0178 - val_so2_mse: 0.0238 - val_no2_mse: 0.0405 - val_o3_mse: 0.0475 - val_co_mse: 0.0181
Epoch 31/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1035 - pm25_loss: 0.0162 - pm10_loss: 0.0119 - so2_loss: 0.0134 - no2_loss: 0.0264 - o3_loss: 0.0181 - co_loss: 0.0175 - pm25_mse: 5.9792e-04 - pm10_mse: 3.1864e-04 - so2_mse: 5.2179e-04 - no2_mse: 0.0013 - o3_mse: 6.4994e-04 - co_mse: 5.8687e-04 - val_loss: 0.6585 - val_pm25_loss: 0.0826 - val_pm10_loss: 0.0848 - val_so2_loss: 0.0991 - val_no2_loss: 0.1517 - val_o3_loss: 0.1508 - val_co_loss: 0.0894 - val_pm25_mse: 0.0171 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0228 - val_no2_mse: 0.0414 - val_o3_mse: 0.0456 - val_co_mse: 0.0180
Epoch 32/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1028 - pm25_loss: 0.0161 - pm10_loss: 0.0118 - so2_loss: 0.0132 - no2_loss: 0.0263 - o3_loss: 0.0180 - co_loss: 0.0174 - pm25_mse: 5.9557e-04 - pm10_mse: 3.1492e-04 - so2_mse: 4.9868e-04 - no2_mse: 0.0013 - o3_mse: 6.4688e-04 - co_mse: 5.7651e-04 - val_loss: 0.6626 - val_pm25_loss: 0.0828 - val_pm10_loss: 0.0844 - val_so2_loss: 0.1020 - val_no2_loss: 0.1491 - val_o3_loss: 0.1566 - val_co_loss: 0.0877 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0178 - val_so2_mse: 0.0237 - val_no2_mse: 0.0410 - val_o3_mse: 0.0484 - val_co_mse: 0.0179
Epoch 33/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1023 - pm25_loss: 0.0161 - pm10_loss: 0.0117 - so2_loss: 0.0133 - no2_loss: 0.0261 - o3_loss: 0.0180 - co_loss: 0.0172 - pm25_mse: 5.9043e-04 - pm10_mse: 3.0794e-04 - so2_mse: 5.0748e-04 - no2_mse: 0.0013 - o3_mse: 6.4401e-04 - co_mse: 5.7312e-04 - val_loss: 0.6591 - val_pm25_loss: 0.0831 - val_pm10_loss: 0.0845 - val_so2_loss: 0.1015 - val_no2_loss: 0.1461 - val_o3_loss: 0.1533 - val_co_loss: 0.0906 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0178 - val_so2_mse: 0.0236 - val_no2_mse: 0.0391 - val_o3_mse: 0.0469 - val_co_mse: 0.0184
Epoch 34/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1019 - pm25_loss: 0.0160 - pm10_loss: 0.0117 - so2_loss: 0.0131 - no2_loss: 0.0261 - o3_loss: 0.0179 - co_loss: 0.0171 - pm25_mse: 5.8674e-04 - pm10_mse: 3.1048e-04 - so2_mse: 4.9479e-04 - no2_mse: 0.0013 - o3_mse: 6.3890e-04 - co_mse: 5.7154e-04 - val_loss: 0.6655 - val_pm25_loss: 0.0831 - val_pm10_loss: 0.0850 - val_so2_loss: 0.1017 - val_no2_loss: 0.1480 - val_o3_loss: 0.1576 - val_co_loss: 0.0901 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0236 - val_no2_mse: 0.0404 - val_o3_mse: 0.0495 - val_co_mse: 0.0183
Epoch 35/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1011 - pm25_loss: 0.0159 - pm10_loss: 0.0117 - so2_loss: 0.0131 - no2_loss: 0.0258 - o3_loss: 0.0177 - co_loss: 0.0170 - pm25_mse: 5.8263e-04 - pm10_mse: 3.0657e-04 - so2_mse: 4.9633e-04 - no2_mse: 0.0013 - o3_mse: 6.2868e-04 - co_mse: 5.5694e-04 - val_loss: 0.6539 - val_pm25_loss: 0.0825 - val_pm10_loss: 0.0839 - val_so2_loss: 0.1018 - val_no2_loss: 0.1436 - val_o3_loss: 0.1540 - val_co_loss: 0.0880 - val_pm25_mse: 0.0169 - val_pm10_mse: 0.0177 - val_so2_mse: 0.0236 - val_no2_mse: 0.0381 - val_o3_mse: 0.0473 - val_co_mse: 0.0175
Epoch 36/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1007 - pm25_loss: 0.0158 - pm10_loss: 0.0115 - so2_loss: 0.0129 - no2_loss: 0.0258 - o3_loss: 0.0177 - co_loss: 0.0169 - pm25_mse: 5.7141e-04 - pm10_mse: 3.0444e-04 - so2_mse: 4.7820e-04 - no2_mse: 0.0013 - o3_mse: 6.2529e-04 - co_mse: 5.5519e-04 - val_loss: 0.6573 - val_pm25_loss: 0.0825 - val_pm10_loss: 0.0848 - val_so2_loss: 0.1033 - val_no2_loss: 0.1448 - val_o3_loss: 0.1542 - val_co_loss: 0.0876 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0241 - val_no2_mse: 0.0388 - val_o3_mse: 0.0473 - val_co_mse: 0.0178
Epoch 37/50
690/690 [==============================] - 12s 17ms/step - loss: 0.1006 - pm25_loss: 0.0158 - pm10_loss: 0.0115 - so2_loss: 0.0129 - no2_loss: 0.0258 - o3_loss: 0.0176 - co_loss: 0.0169 - pm25_mse: 5.7186e-04 - pm10_mse: 2.9683e-04 - so2_mse: 4.8355e-04 - no2_mse: 0.0013 - o3_mse: 6.2410e-04 - co_mse: 5.5257e-04 - val_loss: 0.6605 - val_pm25_loss: 0.0830 - val_pm10_loss: 0.0850 - val_so2_loss: 0.1005 - val_no2_loss: 0.1450 - val_o3_loss: 0.1586 - val_co_loss: 0.0884 - val_pm25_mse: 0.0174 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0232 - val_no2_mse: 0.0394 - val_o3_mse: 0.0500 - val_co_mse: 0.0178
Epoch 38/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0998 - pm25_loss: 0.0156 - pm10_loss: 0.0114 - so2_loss: 0.0129 - no2_loss: 0.0256 - o3_loss: 0.0174 - co_loss: 0.0169 - pm25_mse: 5.5708e-04 - pm10_mse: 2.9609e-04 - so2_mse: 4.8605e-04 - no2_mse: 0.0013 - o3_mse: 6.0751e-04 - co_mse: 5.5119e-04 - val_loss: 0.6543 - val_pm25_loss: 0.0828 - val_pm10_loss: 0.0851 - val_so2_loss: 0.1004 - val_no2_loss: 0.1472 - val_o3_loss: 0.1509 - val_co_loss: 0.0879 - val_pm25_mse: 0.0173 - val_pm10_mse: 0.0181 - val_so2_mse: 0.0233 - val_no2_mse: 0.0401 - val_o3_mse: 0.0453 - val_co_mse: 0.0177
Epoch 39/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0996 - pm25_loss: 0.0156 - pm10_loss: 0.0113 - so2_loss: 0.0128 - no2_loss: 0.0257 - o3_loss: 0.0174 - co_loss: 0.0168 - pm25_mse: 5.6576e-04 - pm10_mse: 2.9270e-04 - so2_mse: 4.7426e-04 - no2_mse: 0.0013 - o3_mse: 6.0135e-04 - co_mse: 5.4368e-04 - val_loss: 0.6670 - val_pm25_loss: 0.0826 - val_pm10_loss: 0.0842 - val_so2_loss: 0.1003 - val_no2_loss: 0.1550 - val_o3_loss: 0.1559 - val_co_loss: 0.0891 - val_pm25_mse: 0.0173 - val_pm10_mse: 0.0177 - val_so2_mse: 0.0233 - val_no2_mse: 0.0431 - val_o3_mse: 0.0483 - val_co_mse: 0.0181
Epoch 40/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0989 - pm25_loss: 0.0154 - pm10_loss: 0.0112 - so2_loss: 0.0127 - no2_loss: 0.0255 - o3_loss: 0.0173 - co_loss: 0.0167 - pm25_mse: 5.5163e-04 - pm10_mse: 2.8335e-04 - so2_mse: 4.5740e-04 - no2_mse: 0.0013 - o3_mse: 6.0434e-04 - co_mse: 5.3955e-04 - val_loss: 0.6561 - val_pm25_loss: 0.0830 - val_pm10_loss: 0.0844 - val_so2_loss: 0.1002 - val_no2_loss: 0.1470 - val_o3_loss: 0.1537 - val_co_loss: 0.0879 - val_pm25_mse: 0.0173 - val_pm10_mse: 0.0178 - val_so2_mse: 0.0232 - val_no2_mse: 0.0394 - val_o3_mse: 0.0472 - val_co_mse: 0.0176
Epoch 41/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0984 - pm25_loss: 0.0154 - pm10_loss: 0.0112 - so2_loss: 0.0126 - no2_loss: 0.0254 - o3_loss: 0.0172 - co_loss: 0.0166 - pm25_mse: 5.4599e-04 - pm10_mse: 2.8575e-04 - so2_mse: 4.6223e-04 - no2_mse: 0.0013 - o3_mse: 5.9550e-04 - co_mse: 5.3020e-04 - val_loss: 0.6543 - val_pm25_loss: 0.0826 - val_pm10_loss: 0.0849 - val_so2_loss: 0.1017 - val_no2_loss: 0.1467 - val_o3_loss: 0.1512 - val_co_loss: 0.0872 - val_pm25_mse: 0.0173 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0237 - val_no2_mse: 0.0391 - val_o3_mse: 0.0457 - val_co_mse: 0.0176
Epoch 42/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0984 - pm25_loss: 0.0154 - pm10_loss: 0.0112 - so2_loss: 0.0125 - no2_loss: 0.0254 - o3_loss: 0.0173 - co_loss: 0.0165 - pm25_mse: 5.5078e-04 - pm10_mse: 2.8158e-04 - so2_mse: 4.5397e-04 - no2_mse: 0.0013 - o3_mse: 5.9908e-04 - co_mse: 5.2796e-04 - val_loss: 0.6594 - val_pm25_loss: 0.0825 - val_pm10_loss: 0.0842 - val_so2_loss: 0.1007 - val_no2_loss: 0.1482 - val_o3_loss: 0.1552 - val_co_loss: 0.0885 - val_pm25_mse: 0.0171 - val_pm10_mse: 0.0177 - val_so2_mse: 0.0234 - val_no2_mse: 0.0404 - val_o3_mse: 0.0478 - val_co_mse: 0.0180
Epoch 43/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0978 - pm25_loss: 0.0152 - pm10_loss: 0.0111 - so2_loss: 0.0125 - no2_loss: 0.0254 - o3_loss: 0.0171 - co_loss: 0.0165 - pm25_mse: 5.4125e-04 - pm10_mse: 2.8138e-04 - so2_mse: 4.5162e-04 - no2_mse: 0.0013 - o3_mse: 5.8738e-04 - co_mse: 5.3130e-04 - val_loss: 0.6612 - val_pm25_loss: 0.0834 - val_pm10_loss: 0.0843 - val_so2_loss: 0.1005 - val_no2_loss: 0.1519 - val_o3_loss: 0.1522 - val_co_loss: 0.0889 - val_pm25_mse: 0.0176 - val_pm10_mse: 0.0178 - val_so2_mse: 0.0233 - val_no2_mse: 0.0419 - val_o3_mse: 0.0466 - val_co_mse: 0.0181
Epoch 44/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0975 - pm25_loss: 0.0152 - pm10_loss: 0.0111 - so2_loss: 0.0125 - no2_loss: 0.0253 - o3_loss: 0.0171 - co_loss: 0.0165 - pm25_mse: 5.3677e-04 - pm10_mse: 2.7633e-04 - so2_mse: 4.5067e-04 - no2_mse: 0.0013 - o3_mse: 5.8541e-04 - co_mse: 5.2256e-04 - val_loss: 0.6570 - val_pm25_loss: 0.0839 - val_pm10_loss: 0.0841 - val_so2_loss: 0.1006 - val_no2_loss: 0.1469 - val_o3_loss: 0.1518 - val_co_loss: 0.0899 - val_pm25_mse: 0.0176 - val_pm10_mse: 0.0178 - val_so2_mse: 0.0234 - val_no2_mse: 0.0394 - val_o3_mse: 0.0462 - val_co_mse: 0.0181
Epoch 45/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0973 - pm25_loss: 0.0152 - pm10_loss: 0.0110 - so2_loss: 0.0124 - no2_loss: 0.0252 - o3_loss: 0.0171 - co_loss: 0.0164 - pm25_mse: 5.3606e-04 - pm10_mse: 2.7196e-04 - so2_mse: 4.4353e-04 - no2_mse: 0.0012 - o3_mse: 5.8985e-04 - co_mse: 5.2791e-04 - val_loss: 0.6557 - val_pm25_loss: 0.0816 - val_pm10_loss: 0.0843 - val_so2_loss: 0.0979 - val_no2_loss: 0.1528 - val_o3_loss: 0.1484 - val_co_loss: 0.0907 - val_pm25_mse: 0.0167 - val_pm10_mse: 0.0179 - val_so2_mse: 0.0226 - val_no2_mse: 0.0410 - val_o3_mse: 0.0441 - val_co_mse: 0.0180
Epoch 46/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0973 - pm25_loss: 0.0153 - pm10_loss: 0.0110 - so2_loss: 0.0123 - no2_loss: 0.0252 - o3_loss: 0.0170 - co_loss: 0.0164 - pm25_mse: 5.4535e-04 - pm10_mse: 2.7624e-04 - so2_mse: 4.4083e-04 - no2_mse: 0.0012 - o3_mse: 5.7941e-04 - co_mse: 5.2028e-04 - val_loss: 0.6552 - val_pm25_loss: 0.0823 - val_pm10_loss: 0.0839 - val_so2_loss: 0.0989 - val_no2_loss: 0.1488 - val_o3_loss: 0.1520 - val_co_loss: 0.0893 - val_pm25_mse: 0.0170 - val_pm10_mse: 0.0176 - val_so2_mse: 0.0228 - val_no2_mse: 0.0401 - val_o3_mse: 0.0463 - val_co_mse: 0.0180
Epoch 47/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0962 - pm25_loss: 0.0151 - pm10_loss: 0.0108 - so2_loss: 0.0123 - no2_loss: 0.0249 - o3_loss: 0.0170 - co_loss: 0.0162 - pm25_mse: 5.2758e-04 - pm10_mse: 2.6199e-04 - so2_mse: 4.3608e-04 - no2_mse: 0.0012 - o3_mse: 5.7838e-04 - co_mse: 5.0790e-04 - val_loss: 0.6524 - val_pm25_loss: 0.0818 - val_pm10_loss: 0.0847 - val_so2_loss: 0.1009 - val_no2_loss: 0.1477 - val_o3_loss: 0.1507 - val_co_loss: 0.0866 - val_pm25_mse: 0.0170 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0234 - val_no2_mse: 0.0396 - val_o3_mse: 0.0455 - val_co_mse: 0.0174
Epoch 48/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0965 - pm25_loss: 0.0150 - pm10_loss: 0.0109 - so2_loss: 0.0123 - no2_loss: 0.0252 - o3_loss: 0.0168 - co_loss: 0.0164 - pm25_mse: 5.2843e-04 - pm10_mse: 2.6876e-04 - so2_mse: 4.3716e-04 - no2_mse: 0.0013 - o3_mse: 5.7539e-04 - co_mse: 5.1675e-04 - val_loss: 0.6573 - val_pm25_loss: 0.0820 - val_pm10_loss: 0.0839 - val_so2_loss: 0.1001 - val_no2_loss: 0.1474 - val_o3_loss: 0.1548 - val_co_loss: 0.0891 - val_pm25_mse: 0.0171 - val_pm10_mse: 0.0176 - val_so2_mse: 0.0232 - val_no2_mse: 0.0398 - val_o3_mse: 0.0478 - val_co_mse: 0.0180
Epoch 49/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0961 - pm25_loss: 0.0150 - pm10_loss: 0.0108 - so2_loss: 0.0122 - no2_loss: 0.0251 - o3_loss: 0.0169 - co_loss: 0.0162 - pm25_mse: 5.2412e-04 - pm10_mse: 2.6725e-04 - so2_mse: 4.2533e-04 - no2_mse: 0.0012 - o3_mse: 5.7784e-04 - co_mse: 5.0353e-04 - val_loss: 0.6569 - val_pm25_loss: 0.0825 - val_pm10_loss: 0.0847 - val_so2_loss: 0.0997 - val_no2_loss: 0.1492 - val_o3_loss: 0.1517 - val_co_loss: 0.0892 - val_pm25_mse: 0.0172 - val_pm10_mse: 0.0180 - val_so2_mse: 0.0230 - val_no2_mse: 0.0406 - val_o3_mse: 0.0459 - val_co_mse: 0.0178
Epoch 50/50
690/690 [==============================] - 12s 17ms/step - loss: 0.0956 - pm25_loss: 0.0149 - pm10_loss: 0.0107 - so2_loss: 0.0122 - no2_loss: 0.0250 - o3_loss: 0.0167 - co_loss: 0.0161 - pm25_mse: 5.1678e-04 - pm10_mse: 2.6319e-04 - so2_mse: 4.3059e-04 - no2_mse: 0.0012 - o3_mse: 5.6103e-04 - co_mse: 5.0597e-04 - val_loss: 0.6567 - val_pm25_loss: 0.0831 - val_pm10_loss: 0.0838 - val_so2_loss: 0.1020 - val_no2_loss: 0.1449 - val_o3_loss: 0.1542 - val_co_loss: 0.0887 - val_pm25_mse: 0.0174 - val_pm10_mse: 0.0175 - val_so2_mse: 0.0238 - val_no2_mse: 0.0390 - val_o3_mse: 0.0477 - val_co_mse: 0.0182
In [29]:
rst = model.predict(np.expand_dims(test_data[feature_cols], axis=1))
rst
Out[29]:
[array([[0.02576166],
        [0.17945182],
        [0.06094658],
        ...,
        [0.05389276],
        [0.09377471],
        [0.13254392]], dtype=float32),
 array([[0.03676841],
        [0.12384248],
        [0.04926959],
        ...,
        [0.08627176],
        [0.08261123],
        [0.07822514]], dtype=float32),
 array([[0.00334924],
        [0.03361022],
        [0.00760874],
        ...,
        [0.01287785],
        [0.0179143 ],
        [0.01522398]], dtype=float32),
 array([[0.02466571],
        [0.24751806],
        [0.28095278],
        ...,
        [0.45145005],
        [0.08254912],
        [0.4848558 ]], dtype=float32),
 array([[0.27359694],
        [0.32201412],
        [0.11083704],
        ...,
        [0.02645177],
        [0.5149532 ],
        [0.04898548]], dtype=float32),
 array([[0.0195317 ],
        [0.18470812],
        [0.07515424],
        ...,
        [0.0780178 ],
        [0.06473574],
        [0.12362501]], dtype=float32)]
In [30]:
pred_rst = pd.DataFrame.from_records(np.squeeze(np.asarray(rst), axis=2).T, columns=out_cols)
In [31]:
real_rst = test_data[out_cols].copy()
In [32]:
for col in out_cols:
    pred_rst[col] = pred_rst[col] * (maxs[col] - mins[col]) + mins[col]
    real_rst[col] = real_rst[col] * (maxs[col] - mins[col]) + mins[col]
In [33]:
y_pred_pm25 = pred_rst['PM2.5'].values.reshape(-1,)
y_pred_pm10 = pred_rst['PM10'].values.reshape(-1,)
y_pred_so2 = pred_rst['SO2'].values.reshape(-1,)
y_pred_no2 = pred_rst['NO2'].values.reshape(-1,)
y_pred_o3 = pred_rst['O3'].values.reshape(-1,)
y_pred_co = pred_rst['CO'].values.reshape(-1,)
y_true_pm25 = real_rst['PM2.5'].values.reshape(-1,)
y_true_pm10 = real_rst['PM10'].values.reshape(-1,)
y_true_so2 = real_rst['SO2'].values.reshape(-1,)
y_true_no2 = real_rst['NO2'].values.reshape(-1,)
y_true_o3 = real_rst['O3'].values.reshape(-1,)
y_true_co = real_rst['CO'].values.reshape(-1,)
In [34]:
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, mean_absolute_percentage_error
In [59]:
def print_eva(y_true, y_pred, tp):
    MSE = mean_squared_error(y_true, y_pred)
    RMSE = np.sqrt(MSE)
    MAE = mean_absolute_error(y_true, y_pred)
    MAPE = mean_absolute_percentage_error(y_true, y_pred)
    R_2 = r2_score(y_true, y_pred)
    print(f"COL: {tp}, MSE: {format(MSE, '.2E')}", end=',')
    print(f'RMSE: {round(RMSE, 4)}', end=',')
    print(f'MAPE: {round(MAPE, 4) * 100} %', end=',')
    print(f'MAE: {round(MAE, 4)}', end=',')
    print(f'R_2: {round(R_2, 4)}')
    return [MSE, RMSE, MAE, MAPE, R_2]
In [62]:
pm25_eva = print_eva(y_true_pm25, y_pred_pm25, tp='pm25')
pm10_eva = print_eva(y_true_pm10, y_pred_pm10, tp='pm10')
so2_eva = print_eva(y_true_so2, y_pred_so2, tp='so2')
nox_eva = print_eva(y_true_no2, y_pred_no2, tp='no2')
o3_eva = print_eva(y_true_o3, y_pred_o3, tp='o3')
co_eva = print_eva(y_true_co, y_pred_co, tp='co')
COL: pm25, MSE: 1.09E+02,RMSE: 10.422200202941895,MAPE: 12.559999525547028 %,MAE: 6.230599880218506,R_2: 0.9559
COL: pm10, MSE: 3.40E+02,RMSE: 18.428300857543945,MAPE: 11.68999969959259 %,MAE: 12.01930046081543,R_2: 0.9395
COL: so2, MSE: 1.35E+02,RMSE: 11.639599800109863,MAPE: 20.329999923706055 %,MAE: 6.62060022354126,R_2: 0.9567
COL: no2, MSE: 2.97E+01,RMSE: 5.448800086975098,MAPE: 10.360000282526016 %,MAE: 3.8643999099731445,R_2: 0.9526
COL: o3, MSE: 4.93E+01,RMSE: 7.019100189208984,MAPE: 15.330000221729279 %,MAE: 4.6255998611450195,R_2: 0.9802
COL: co, MSE: 1.92E-02,RMSE: 0.1386999934911728,MAPE: 8.969999849796295 %,MAE: 0.0982000008225441,R_2: 0.9616
In [64]:
pd.DataFrame.from_records([pm25_eva, pm10_eva, so2_eva, nox_eva, o3_eva,co_eva], columns=['MSE', 'RMSE', 'MAE', 'MAPE', 'R_2'], index=['PM25', 'PM10', 'SO2', 'NO2', 'O3', 'CO'])
Out[64]:
MSE RMSE MAE MAPE R_2
PM25 108.621880 10.422182 6.230620 0.125599 0.955881
PM10 339.600830 18.428261 12.019309 0.116882 0.939480
SO2 135.480988 11.639630 6.620558 0.203316 0.956686
NO2 29.689177 5.448778 3.864434 0.103608 0.952610
O3 49.268276 7.019136 4.625617 0.153265 0.980247
CO 0.019225 0.138656 0.098185 0.089745 0.961569
In [58]:
plt.figure(figsize=(16, 9))
plt.plot(pred_rst['PM10'].values[50:150], 'o-', label='pred')
plt.plot(real_rst['PM10'].values[50:150], '*-', label='real')
plt.legend(loc='best')
Out[58]:
<matplotlib.legend.Legend at 0x7fe5c01bc6d0>
No description has been provided for this image
In [74]:
model.get_weights()[-2].shape
Out[74]:
(32, 1)
In [39]:
real_rst
Out[39]:
PM2.5 PM10 SO2 NO2 O3 CO
date
2020-02-21 17:00:00 15.0 51.000000 3.0 8.000000 87.000008 0.370
2017-07-08 03:00:00 90.0 166.000000 32.0 49.000000 99.000000 1.560
2020-07-21 05:00:00 33.0 71.000000 10.0 56.000000 32.000000 0.790
2018-06-25 15:00:00 70.0 121.999992 16.0 24.000000 165.000015 1.070
2018-02-27 12:00:00 205.0 303.000000 66.0 62.000000 92.000008 1.990
... ... ... ... ... ... ...
2016-03-21 04:00:00 131.0 218.999985 47.0 52.999996 29.000000 1.510
2016-11-16 13:00:00 251.0 382.500000 234.0 105.000000 23.500002 2.915
2018-06-13 06:00:00 30.0 123.000008 18.0 76.000000 14.000000 0.890
2020-05-15 15:00:00 36.0 94.000000 14.0 22.000000 144.000000 0.500
2020-10-15 21:00:00 67.0 103.000008 15.0 92.000000 12.000001 1.200

2451 rows × 6 columns

In [40]:
from statistics import mean
import matplotlib.pyplot as plt
from sklearn.metrics import explained_variance_score,r2_score, median_absolute_error, mean_squared_error, mean_absolute_error
from scipy import stats
import numpy as np
from matplotlib import rcParams
config = {"font.size": 32,"mathtext.fontset":'stix'}
rcParams.update(config)
In [41]:
config = {"font.size": 32,"mathtext.fontset":'stix'}
rcParams.update(config)
In [42]:
def scatter_out_1(x, y, label, name): ## x,y为两个需要做对比分析的两个量。
    # ==========计算评价指标==========
    BIAS = mean(x - y)
    MSE = mean_squared_error(x, y)
    RMSE = np.power(MSE, 0.5)
    R2 = r2_score(x, y)
    MAE = mean_absolute_error(x, y)
    EV = explained_variance_score(x, y)
    print('==========算法评价指标==========')
    print('Explained Variance(EV):', '%.3f' % (EV))
    print('Mean Absolute Error(MAE):', '%.3f' % (MAE))
    print('Mean squared error(MSE):', '%.3f' % (MSE))
    print('Root Mean Squard Error(RMSE):', '%.3f' % (RMSE))
    print('R_squared:', '%.3f' % (R2))
    # ===========Calculate the point density==========
    xy = np.vstack([x, y])
    z = stats.gaussian_kde(xy)(xy)
    # ===========Sort the points by density, so that the densest points are plotted last===========
    idx = z.argsort()
    x, y, z = x[idx], y[idx], z[idx]
    def best_fit_slope_and_intercept(xs, ys):
        m = (((mean(xs) * mean(ys)) - mean(xs * ys)) / ((mean(xs) * mean(xs)) - mean(xs * xs)))
        b = mean(ys) - m * mean(xs)
        return m, b
    m, b = best_fit_slope_and_intercept(x, y)
    regression_line = []
    for a in x:
        regression_line.append((m * a) + b)
    fig,ax=plt.subplots(figsize=(12,9),dpi=400)
    scatter=ax.scatter(x,y,marker='o',c=z*100,s=15,label='LST',cmap='Spectral_r')
    cbar=plt.colorbar(scatter,shrink=1,orientation='vertical',extend='both',pad=0.015,aspect=30,label='Frequency')
    min_value = min(min(x), min(y))
    max_value = max(max(x), max(y))

    plt.plot([min_value-5,max_value+5],[min_value-5,max_value+5],'black',lw=1.5)  # 画的1:1线线的颜色为black线宽为0.8
    plt.plot(x,regression_line,'red',lw=1.5)      # 预测与实测数据之间的回归线
    plt.axis([min_value-5,max_value+5,min_value-5,max_value+5])  # 设置线的范围
    plt.xlabel('Measured %s' % label)
    plt.ylabel('Retrived %s' % label)
    # plt.xticks(fontproperties='Times New Roman')
    # plt.yticks(fontproperties='Times New Roman')


    plt.text(min_value-5 + (max_value-min_value) * 0.05, int(max_value * 0.95), '$N=%.f$' % len(y)) # text的位置需要根据x,y的大小范围进行调整。
    plt.text(min_value-5 + (max_value-min_value) * 0.05, int(max_value * 0.88), '$R^2=%.2f$' % R2)
    plt.text(min_value-5 + (max_value-min_value) * 0.05, int(max_value * 0.81), '$RMSE=%.2f$' % RMSE)
    plt.xlim(min_value-5,max_value+5)                                  # 设置x坐标轴的显示范围
    plt.ylim(min_value-5,max_value+5)                                  # 设置y坐标轴的显示范围
    # file_name = name.split('(')[0].strip()
    plt.savefig(f'./figure/{name}.png',dpi=800,bbox_inches='tight',pad_inches=0)
    plt.show()
In [50]:
scatter_out_1(real_rst['PM10'].values, pred_rst['PM10'].values, label='$PM_{10}\ (\mu g/m^3$)', name='PM10')
==========算法评价指标==========
Explained Variance(EV): 0.941
Mean Absolute Error(MAE): 12.019
Mean squared error(MSE): 339.601
Root Mean Squard Error(RMSE): 18.428
R_squared: 0.939
No description has been provided for this image
In [51]:
scatter_out_1(real_rst['PM2.5'].values, pred_rst['PM2.5'].values, label='$PM_{2.5} (\mu g/m^3$)', name='PM25')
==========算法评价指标==========
Explained Variance(EV): 0.956
Mean Absolute Error(MAE): 6.231
Mean squared error(MSE): 108.622
Root Mean Squard Error(RMSE): 10.422
R_squared: 0.956
No description has been provided for this image
In [52]:
scatter_out_1(real_rst['SO2'].values, pred_rst['SO2'].values, label='$SO_2\ (\mu g/m^3)$', name='SO2')
==========算法评价指标==========
Explained Variance(EV): 0.957
Mean Absolute Error(MAE): 6.621
Mean squared error(MSE): 135.481
Root Mean Squard Error(RMSE): 11.640
R_squared: 0.957
No description has been provided for this image
In [53]:
scatter_out_1(real_rst['NO2'].values, pred_rst['NO2'].values, label='$NO_2\ (\mu g/m^3)$', name='NO2')
==========算法评价指标==========
Explained Variance(EV): 0.956
Mean Absolute Error(MAE): 3.864
Mean squared error(MSE): 29.689
Root Mean Squard Error(RMSE): 5.449
R_squared: 0.953
No description has been provided for this image
In [54]:
scatter_out_1(real_rst['O3'], pred_rst['O3'], label='$O_3 \ (\mu g/m^3)$', name='O3')
==========算法评价指标==========
Explained Variance(EV): 0.981
Mean Absolute Error(MAE): 4.626
Mean squared error(MSE): 49.268
Root Mean Squard Error(RMSE): 7.019
R_squared: 0.980
No description has been provided for this image
In [48]:
def scatter_out_2(x, y, name): ## x,y为两个需要做对比分析的两个量。
    # ==========计算评价指标==========
    BIAS = mean(x - y)
    MSE = mean_squared_error(x, y)
    RMSE = np.power(MSE, 0.5)
    R2 = r2_score(x, y)
    MAE = mean_absolute_error(x, y)
    EV = explained_variance_score(x, y)
    print('==========算法评价指标==========')
    print('Explained Variance(EV):', '%.3f' % (EV))
    print('Mean Absolute Error(MAE):', '%.3f' % (MAE))
    print('Mean squared error(MSE):', '%.3f' % (MSE))
    print('Root Mean Squard Error(RMSE):', '%.3f' % (RMSE))
    print('R_squared:', '%.3f' % (R2))
    # ===========Calculate the point density==========
    xy = np.vstack([x, y])
    z = stats.gaussian_kde(xy)(xy)
    # ===========Sort the points by density, so that the densest points are plotted last===========
    idx = z.argsort()
    x, y, z = x[idx], y[idx], z[idx]
    def best_fit_slope_and_intercept(xs, ys):
        m = (((mean(xs) * mean(ys)) - mean(xs * ys)) / ((mean(xs) * mean(xs)) - mean(xs * xs)))
        b = mean(ys) - m * mean(xs)
        return m, b
    m, b = best_fit_slope_and_intercept(x, y)
    regression_line = []
    for a in x:
        regression_line.append((m * a) + b)
    fig,ax=plt.subplots(figsize=(12,9),dpi=400)
    scatter=ax.scatter(x,y,marker='o',c=z*100,s=15,label='LST',cmap='Spectral_r')
    cbar=plt.colorbar(scatter,shrink=1,orientation='vertical',extend='both',pad=0.015,aspect=30,label='frequency')

    plt.plot([0, 6], [0, 6],'black',lw=1.5)  # 画的1:1线线的颜色为black线宽为0.8
    plt.plot(x,regression_line,'red',lw=1.5)      # 预测与实测数据之间的回归线
    plt.axis([0,6,0,6])  # 设置线的范围
    plt.xlabel(f'Measured {name}')
    plt.ylabel(f'Retrived {name}')
    # plt.xticks(fontproperties='Times New Roman')
    # plt.yticks(fontproperties='Times New Roman')


    plt.text(0.3, 5.5, '$N=%.f$' % len(y)) # text的位置需要根据x,y的大小范围进行调整。
    plt.text(0.3, 5.0, '$R^2=%.2f$' % R2)
    plt.text(0.3, 4.5, '$RMSE=%.2f$' % RMSE)
    plt.xlim(0, 6)                                  # 设置x坐标轴的显示范围
    plt.ylim(0, 6)                                  # 设置y坐标轴的显示范围
    file_name = name.split('(')[0].strip()
    plt.savefig(f'./figure/CO.png',dpi=800,bbox_inches='tight',pad_inches=0)
    plt.show()
In [49]:
scatter_out_2(np.expm1(real_rst['CO'].values), np.expm1(pred_rst['CO'].values), name='$CO \ (mg/m^3)$')
==========算法评价指标==========
Explained Variance(EV): 0.902
Mean Absolute Error(MAE): 0.700
Mean squared error(MSE): 7.938
Root Mean Squard Error(RMSE): 2.818
R_squared: 0.902
findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
No description has been provided for this image
In [ ]: