"""E8 humidity: train at mid humidity, test at low and high humidity (1x concentration). python experiments/e8_humidity.py data/demo_calibration Metal-oxide sensors react to water vapour, and bananas give off moisture, so this is the main real-life disturbance besides concentration (E3). labels.csv needs rh_level (low / mid / high). The "蕈狀體(無增益控制)" row is the ablation. """ from __future__ import annotations import argparse import sys from pathlib import Path import numpy as np import pandas as pd from sklearn.base import clone from sklearn.metrics import accuracy_score sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from enose.common import load_table, output_dir, plt, save_figure # noqa: E402 from enose.methods import make_methods # noqa: E402 def main() -> None: parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("folder", type=Path) parser.add_argument("--concentration", type=float, default=1.0) arguments = parser.parse_args() table, features, labels, names = load_table(arguments.folder / "features.csv") at_concentration = (table["concentration"] == arguments.concentration).to_numpy() train = at_concentration & (table["rh_level"] == "mid").to_numpy() methods = make_methods(names, len(np.unique(labels))) rows = [] for name, method in methods.items(): model = clone(method).fit(features[train], labels[train]) for rh_level in ("low", "high"): test = at_concentration & (table["rh_level"] == rh_level).to_numpy() if test.any(): rows.append({"method": name, "rh_level": rh_level, "n": int(test.sum()), "accuracy": accuracy_score(labels[test], model.predict(features[test]))}) result = pd.DataFrame(rows) results = output_dir(arguments.folder / "results") result.to_csv(results / "e8_humidity.csv", index=False) pivot = result.pivot(index="method", columns="rh_level", values="accuracy").reindex(list(methods)) print("用中濕度訓練,換濕度測試的準確率:") print(pivot.round(3).to_string()) figure, axis = plt.subplots(figsize=(8, 4)) pivot.plot.bar(ax=axis, rot=30) axis.set_ylabel("準確率") axis.set_ylim(0, 1.05) axis.set_title("濕度改變時的準確率(訓練:中濕度)") save_figure(figure, results / "e8_humidity.png") if __name__ == "__main__": main()