简介
在上一篇文章中我们已经成功的读取到了外挂的AHT20的湿度和温度数据,那么本章节我们将训练一个简单的分类模型对使用传感器的数据输出作为特征输入到逻辑回归模型中对环境的舒适度进行分类。
这里我们使用的机器学习的库是scikit-learn, scikit-learn 是一款非常流行的机器学习库,被很多数据科学家所青睐。
1- 训练模型,首先我们需要准备训练数据集合和测试数据集。
一共是两个feature,输出是lable一共具有五个类型, 非常冷,冷,中等,热,非常热。
训练数据的散点图如下所示。
其测试数据集和上述的训练数据集相差不大。
然后使用下述代码对模型进行训练
import pandas as pd from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, confusion_matrix # 加载数据集 train_df = pd.read_csv("train_dataset.csv") test_df = pd.read_csv("test_dataset.csv") # 特征和标签 X_train = train_df[["temperature", "humidity"]] y_train = train_df["label"] X_test = test_df[["temperature", "humidity"]] y_test = test_df["label"] # 逻辑回归模型 model = LogisticRegression(solver="lbfgs", max_iter=5000) model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 输出结果 print("\n混淆矩阵:") print(confusion_matrix(y_test, y_pred)) print("\n分类报告:") print(classification_report(y_test, y_pred))
主要是使用的逻辑回归来进行分类,可以看到上述的逻辑回归模型是非常简单的通过SK-learn的代码。就几行就解决了模型的训练问题。
可以从训练的混淆矩阵中看到,其非常冷的数据精度是100%,冷的数据有一个被分类为冷中等。中等的数据有一个被分类成了冷,一个被分类成了热。对于热的数据一个被分类成了非常冷。对于非常热的数据100%分类成功。 从上述的混淆矩阵和对应的分类报告中看出上述模型的精度还是非常不错的。
2- 保存模型并且上传至开发板。
import joblib # 保存训练好的模型 joblib.dump(model, "comfort_model.pkl")
使用上述代码首先将模型保存到本地,然后直接在网页的vscode中拷贝到开发板上。
3- 安装环境。需要注意的是,开发板中使用apt安装的环境,可能无法适配MAC训练的模型的版本,所以最好使用venv重新安装一下依赖文件。
# 创建虚拟环境 python3 -m venv ~/venv_ml # 激活虚拟环境 source ~/venv_ml/bin/activate # 安装所需包 pip install numpy pandas scikit-learn joblib smbus2
4- 将代码整合,AHT20的输出作为模型的输入,进行推理。
from smbus2 import SMBus import time import pandas as pd import joblib I2C_BUS = 2 AHT20_ADDR = 0x38 bus = SMBus(I2C_BUS) # 初始化 AHT20 bus.write_i2c_block_data(AHT20_ADDR, 0xBE, [0x08, 0x00]) time.sleep(0.01) loaded_model = joblib.load("comfort_model.pkl") while True: # 触发一次测量 bus.write_i2c_block_data(AHT20_ADDR, 0xAC, [0x33, 0x00]) time.sleep(0.08) # 读取 6 个字节的数据 data = bus.read_i2c_block_data(AHT20_ADDR, 0x00, 6) # 转换湿度和温度 humidity_raw = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4 temperature_raw = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5] humidity = humidity_raw / (1 << 20) * 100 temperature = temperature_raw / (1 << 20) * 200 - 50 # 构造模型输入 x_predict = pd.DataFrame([[temperature, humidity]], columns=["temperature", "humidity"]) # 模型预测 y_pred = loaded_model.predict(x_predict) print(f"Humidity: {humidity:.2f}%") print(f"Temperature: {temperature:.2f}°C") print(f"Predicted Comfort Level: {y_pred[0]}\n") time.sleep(1)
5- 查看输出。
由于模型训练时候的精度比较高,所以程序的输出也是非常好。非常准备。我对这个模型非常满意。
附件
后续
接下来,我将会把它加入MQTT集成到HA中,来通过HA来进行图形化界面的查看。另外最好再探究一下怎么能开机激活虚拟环境然后运行这个程序,就不需要每次我去手动运行它一次了。还有一点就是我的PCB设计水平不是太行,如果我要是比较在行的话我会设计一个底板。来集成对应的传感器,屏幕等。