6.5 MiB
6.5 MiB
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>
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
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
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
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
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
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
In [ ]: