last value

main
ifiguero 2025-04-14 13:01:39 -04:00
parent 9b5211567a
commit 75bae016a2
4 changed files with 121 additions and 36 deletions

6
.gitignore vendored
View File

@ -1,3 +1,9 @@
**bz2
**tar
**pdf
**png
paper*
prese*
*xlsx *xlsx
pics pics
*zip *zip

View File

@ -88,8 +88,10 @@ class GasSensorDataLoader:
self.logger.info(f"Reset requested. Init for {len(self.target_list)} targets => {self.target}") self.logger.info(f"Reset requested. Init for {len(self.target_list)} targets => {self.target}")
delattr(self, "delta_data") if hasattr(self, "delta_data"):
delattr(self, "scaled_data") delattr(self, "delta_data")
if hasattr(self, "scaled_data"):
delattr(self, "scaled_data")
self.init_minmax() self.init_minmax()
self.stats() self.stats()
@ -176,7 +178,7 @@ class GasSensorDataLoader:
plt.plot(data_instance[key]['data'][channel_name]) plt.plot(data_instance[key]['data'][channel_name])
plt.xlabel("Time") plt.xlabel("Time")
plt.ylabel("Sensor Reading") plt.ylabel("Sensor Array Readings")
plt.title(f"{title} Sensor Channel: {channel_name}") plt.title(f"{title} Sensor Channel: {channel_name}")
if save: if save:
@ -192,8 +194,8 @@ class GasSensorDataLoader:
self.logger.debug(f"{title}All sensor readings for measurament: {measurament_name}.") self.logger.debug(f"{title}All sensor readings for measurament: {measurament_name}.")
if measurament_name in data_instance: if measurament_name in data_instance:
data_instance[measurament_name]['data'].plot(figsize=(12, 6), title=f"{title} measurament: {measurament_name}") data_instance[measurament_name]['data'].plot(figsize=(12, 6), title=f"{title} measurament: {measurament_name}")
plt.xlabel("Time") plt.xlabel("sample")
plt.ylabel("Sensor Readings") plt.ylabel(f"{title} value")
plt.legend(bbox_to_anchor=(0.95, 0.5), loc="center left") plt.legend(bbox_to_anchor=(0.95, 0.5), loc="center left")
for xvalue, txtcolor in limits: for xvalue, txtcolor in limits:
plt.vlines(x=xvalue, ymin=0, ymax=1, colors=txtcolor) plt.vlines(x=xvalue, ymin=0, ymax=1, colors=txtcolor)
@ -210,9 +212,9 @@ class GasSensorDataLoader:
def plotRawdata(self, save=True): def plotRawdata(self, save=True):
self.logger.debug("Plotting raw data for all measuraments and channels.") self.logger.debug("Plotting raw data for all measuraments and channels.")
for measurament in self.data: for measurament in self.data:
self.plot_measurament(self.data, measurament, save=save, tag="raw", title="[Original] ") self.plot_measurament(self.data, measurament, save=save, tag="rawv", title="[V]")
for channel in self.data[next(iter(self.data))]['data'].columns: for channel in self.data[next(iter(self.data))]['data'].columns:
self.plot_channel(self.data, channel, save=save, tag="raw", title="[Original] ") self.plot_channel(self.data, channel, save=save, tag="rawv", title="[V]")
def plotDeltadata(self, save=True): def plotDeltadata(self, save=True):
if not hasattr(self, 'delta_data'): if not hasattr(self, 'delta_data'):
@ -220,9 +222,9 @@ class GasSensorDataLoader:
self.logger.debug("Plotting raw data for all measuraments and channels.") self.logger.debug("Plotting raw data for all measuraments and channels.")
for measurament in self.delta_data: for measurament in self.delta_data:
self.plot_measurament(self.delta_data, measurament, save=save, tag="delta", title="[$\Delta V$] ") self.plot_measurament(self.delta_data, measurament, save=save, tag="delta", title="[$\\Delta V$] ")
for channel in self.delta_data[next(iter(self.delta_data))]['data'].columns: for channel in self.delta_data[next(iter(self.delta_data))]['data'].columns:
self.plot_channel(self.delta_data, channel, save=save, tag="delta", title="[$\delta V$] ") self.plot_channel(self.delta_data, channel, save=save, tag="delta", title="[$\\Delta V$] ")
def plotScaleddata(self, save=True): def plotScaleddata(self, save=True):
if not hasattr(self, 'scaled_data'): if not hasattr(self, 'scaled_data'):
@ -230,18 +232,24 @@ class GasSensorDataLoader:
self.logger.debug("Plotting raw data for all measuraments and channels.") self.logger.debug("Plotting raw data for all measuraments and channels.")
for measurament in self.scaled_data: for measurament in self.scaled_data:
self.plot_measurament(self.scaled_data, measurament, save=save, tag="scaled", title="[Scaled] ") self.plot_measurament(self.scaled_data, measurament, save=save, tag="scaled", title="[$\\Delta \\bar{V}$] ")
for channel in self.scaled_data[next(iter(self.scaled_data))]['data'].columns: for channel in self.scaled_data[next(iter(self.scaled_data))]['data'].columns:
self.plot_channel(self.scaled_data, channel, save=save, tag="scaled", title="[Scaled] ") self.plot_channel(self.scaled_data, channel, save=save, tag="scaled", title="[$\\Delta \\bar{V}$] ")
def plotScaledBoundaries(self, save=True): def plotScaledBoundaries(self, save=True):
if not hasattr(self, 'scaled_data'): if not hasattr(self, 'scaled_data'):
self.init_minmax() self.init_minmax()
if self.smooth is None:
tag = "raw"
else:
tag = "denoise"
# tag = self.smooth
self.logger.debug("Plotting raw data for all measuraments and channels.") self.logger.debug("Plotting raw data for all measuraments and channels.")
for measurament in self.scaled_data: for measurament in self.scaled_data:
r, l, m = self.findIndicesAbovethreshold(self.scaled_data[measurament]['data']) r, l, m = self.findIndicesAbovethreshold(self.scaled_data[measurament]['data'])
self.plot_measurament(self.scaled_data, measurament, save=save, tag="train", title=f"[Interval {self.threshold} max] ", limits=[(r, 'blue'), (l, 'blue'), (m, 'red')]) self.plot_measurament(self.scaled_data, measurament, save=save, tag="{}_bound".format(tag), title=f"[$\\Delta \\bar{{V}}_{{{tag}}}$] ", limits=[(r, 'blue'), (l, 'blue'), (m, 'red')])
def findIndicesAbovethreshold(self, df): def findIndicesAbovethreshold(self, df):
if not isinstance(df, pd.DataFrame): if not isinstance(df, pd.DataFrame):

View File

@ -219,6 +219,7 @@ class eNoseTrainer:
return tmse, mse, mae, rmse, optimized_model, model_params return tmse, mse, mae, rmse, optimized_model, model_params
def gen_plots(self, dataset, model_id, target=None): def gen_plots(self, dataset, model_id, target=None):
import re
if isinstance(target, list): if isinstance(target, list):
self.loader.target_list=target self.loader.target_list=target
if isinstance(target, str): if isinstance(target, str):
@ -230,16 +231,38 @@ class eNoseTrainer:
self.loader.smooth = None self.loader.smooth = None
self.loader.reset() self.loader.reset()
if dataset.startswith("Conv1D"):
width = int(m.group(1)) if (m := re.search(r'w(\d+)', dataset)) else 1
self.logger.debug(f'Conv1D: {dataset} of width {width}')
y_padding = np.zeros((width-1, self.loader.target_len))
elif dataset.startswith("Tabular"):
self.logger.debug(f'Tabular: {dataset}')
width = 1
else:
self.logger.error(f'Tipo de dataset desconocido {dataset}')
return
if not self.row_exists(dataset, model_id): if not self.row_exists(dataset, model_id):
self.logger.error(f'No se encuentra la simulacion {dataset}, {model_id}') self.logger.error(f'No se encuentra la simulacion {dataset}, {model_id}')
return return
model_file = '{}/{}/{}/{}'.format(self.name, self.loader.target, dataset, model_id ) model_file = '{}/{}/{}/{}'.format(self.name, self.loader.target, dataset, model_id )
if not os.path.isfile(model_file):
self.logger.error('No se encuentra el modelo')
return
trained_model = joblib.load(model_file) if width > 1:
if not os.path.isfile(f'{model_file}.keras'):
self.logger.debug(f'{model_file}')
self.logger.error('No se encuentra el modelo')
return
trained_model = keras.models.load_model(f"{model_file}.keras")
trained_model.load_weights(f"{model_file}.weights.h5")
else:
if not os.path.isfile(model_file):
self.logger.debug(f'{model_file}')
self.logger.error('No se encuentra el modelo')
return
trained_model = joblib.load(model_file)
pics_folder = '{}/{}/{}/plots'.format(self.name, self.loader.target, dataset) pics_folder = '{}/{}/{}/plots'.format(self.name, self.loader.target, dataset)
os.makedirs(pics_folder, exist_ok=True) os.makedirs(pics_folder, exist_ok=True)
@ -261,8 +284,19 @@ class eNoseTrainer:
for measurament, (r, l) in self.loader.dataset['range'].items(): for measurament, (r, l) in self.loader.dataset['range'].items():
# df[measurament]['data'].plot(figsize=(12, 6), title=f"{measurament} Prediction") # df[measurament]['data'].plot(figsize=(12, 6), title=f"{measurament} Prediction")
plt.figure(figsize=(12, 6)) plt.figure(figsize=(12, 6))
plt.title(f"[{dataset}] {model_id}. Sample {measurament}")
plt.xlabel("Sensor Readings") if dataset.startswith('Conv1D'):
label = dataset.split('-')
model_label = '-'.join(label[:2])
else:
model_label = "XGBRegressor"
if self.loader.smooth is not None:
model_label += " + denoise"
plt.title(f"[{model_label}] Sample {measurament}")
plt.xlabel("Sensor Array Readings")
plt.vlines(x=r, ymin=0, ymax=1, colors='blue', linestyle='dashed') plt.vlines(x=r, ymin=0, ymax=1, colors='blue', linestyle='dashed')
plt.vlines(x=l, ymin=0, ymax=1, colors='blue', linestyle='dashed') plt.vlines(x=l, ymin=0, ymax=1, colors='blue', linestyle='dashed')
@ -278,8 +312,27 @@ class eNoseTrainer:
self.logger.debug(f"Y_scaled.shape: {Y_scaled.shape}") self.logger.debug(f"Y_scaled.shape: {Y_scaled.shape}")
self.logger.debug(f"Y_scaled: {Y_scaled}") self.logger.debug(f"Y_scaled: {Y_scaled}")
y_pred = trained_model.predict(df[measurament]['data'].to_numpy()) if width > 1:
self.logger.debug(f"y_pred.shape: {y_pred.shape}") plt.vlines(x=r+width, ymin=0, ymax=1, colors='cyan', linestyle='dashed')
X_data = self.loader.scaled_data[measurament]['data']
total_samples = X_data.shape[0] - width + 1
x_samples = np.zeros((total_samples, width, self.loader.data_channels))
for i in range(total_samples):
x_samples[i] = X_data.iloc[i:i + width].values
y_pred_w = trained_model.predict(x_samples)
self.logger.debug(f"y_pred_w.shape: {y_pred_w.shape}")
self.logger.debug(f"y_padding.shape: {y_padding.shape}")
self.logger.debug(f"X_data.shape: {X_data.shape}")
y_pred = np.concatenate((y_padding, y_pred_w))
self.logger.debug(f"y_pred.shape: {y_pred.shape}")
else:
y_pred = trained_model.predict(df[measurament]['data'].to_numpy())
self.logger.debug(f"y_pred.shape: {y_pred.shape}")
# self.logger.debug(f"y_pred: {Y_scaled}") # self.logger.debug(f"y_pred: {Y_scaled}")
if y_pred.ndim == 2: if y_pred.ndim == 2:

View File

@ -7,25 +7,43 @@ warnings.filterwarnings("ignore")
source_channels=["MQ 8", "MQ 9", "MQ 135", "TGS 813", "TGS 821", "TGS 2600", "TGS 2602", "TGS 2611-0", "TGS 2612", "TGS 2620"] source_channels=["MQ 8", "MQ 9", "MQ 135", "TGS 813", "TGS 821", "TGS 2600", "TGS 2602", "TGS 2611-0", "TGS 2612", "TGS 2620"]
target_variables=['C2H2', 'CH4', 'C3H6', 'CO', 'C2H6', 'C3H8', 'C2H4', 'H2', 'O2'] target_variables=['C2H2', 'CH4', 'C3H6', 'CO', 'C2H6', 'C3H8', 'C2H4', 'H2', 'O2']
eNoseLoader = GasSensorDataLoader("enose_dataset", threshold=0.85, source_channels=source_channels, target_list=target_variables, debug=False) eNoseLoader = GasSensorDataLoader("enose_dataset", threshold=0.85, source_channels=source_channels, target_list=target_variables, debug=True)
# Mostrar los dataset originales
eNoseLoader.smooth = None
eNoseLoader.reset()
eNoseLoader.plotRawdata()
eNoseLoader.plotScaledBoundaries()
eNoseLoader.smooth = 'conv3'
eNoseLoader.reset()
eNoseLoader.plotScaledBoundaries()
# Carga el Entrenador
eNose = eNoseTrainer(eNoseLoader, test_size=0.2, debug=False) eNose = eNoseTrainer(eNoseLoader, test_size=0.2, debug=False)
eNoseLoader.target_list=['H2', 'C2H2', 'CH4', 'C2H4', 'C2H6',] # Entrenar los modelos
eNose.fit() # eNoseLoader.target_list=['H2', 'C2H2', 'CH4', 'C2H4', 'C2H6',]
eNoseLoader.target_list=['H2',] # eNose.fit()
eNose.fit()
eNoseLoader.target_list=['C2H2',]
eNose.fit()
eNoseLoader.target_list=['CH4',]
eNose.fit()
eNoseLoader.target_list=['C2H4',]
eNose.fit()
eNoseLoader.target_list=['C2H6',]
eNose.fit()
eNose.wrap_and_save()
# eNoseLoader.target_list=['H2',] # eNoseLoader.target_list=['H2',]
# eNose.gen_plots('Tabular-conv3','XGBRegressor_0') # eNose.fit()|
# eNoseLoader.target_list=['C2H2',]
# eNose.fit()
# eNoseLoader.target_list=['CH4',]
# eNose.fit()
# eNoseLoader.target_list=['C2H4',]
# eNose.fit()
# eNoseLoader.target_list=['C2H6',]
# eNose.fit()
# eNose.wrap_and_save()
# Grafica las predicciones
eNose.gen_plots('Tabular','XGBRegressor_3', target=['H2', 'C2H2', 'CH4', 'C2H4', 'C2H6',])
#eNose.gen_plots('Tabular-conv3','XGBRegressor_4', target=['H2',])
eNose.gen_plots('Conv1D-w32-conv3','Conv1D_v1_1', target=['H2','C2H2', 'CH4', 'C2H4', 'C2H6',])
# eNose.gen_plots('Conv1D-w32-conv3','Conv1D_v1_2', target=['H2',])
#eNose.gen_plots('Conv1D-w32','Conv1D_v1_3', target=['H2', 'C2H2', 'CH4', 'C2H4', 'C2H6',])
# eNoseLoader.target_list=['H2', 'C2H2', 'CH4', 'C2H4', 'C2H6',] # eNoseLoader.target_list=['H2', 'C2H2', 'CH4', 'C2H4', 'C2H6',]
# eNose.gen_plots('Tabular','XGBRegressor_1') # eNose.gen_plots('Tabular','XGBRegressor_1')