






Preview text:
Kế hoạch 3 ngày tạo dữ liệu giả lập cảm biến
môi trường (nhãn Tốt/Trung bình/Xấu)
Mục tiêu: Tạo một tập dữ liệu cảm biến môi trường giả lập, bao gồm các
thông số từ cảm biến DHT22 (nhiệt độ, độ ẩm), MQ-135 (chất lượng khí gas
CO₂/VOC tương đương) và GP2Y1010AU0F (bụi mịn), kèm nhãn phân loại Tốt, Trung ,
bình Xấu. Bộ dữ liệu được gán nhãn dựa trên chuẩn chất lượng
không khí (AQI/IAQ) để huấn luyện mô hình AI phân loại môi trường. Dữ liệu
cần tuân theo logic sức khỏe thực tế: ví dụ bụi mịn > 55 µg/m³ hoặc CO₂
> 2000 ppm được gán nhãn "Xấu", bụi < 35 µg/m³ và CO₂ < 1000
ppm gán "Tốt", các trường hợp còn lại là "Trung bình". Cảm biến bụi
GP2Y1010AU0F trả về nồng độ mg/m³, cần quy đổi sang . µg/m³ Kế hoạch sau
đây chia công việc trong 3 ngày, đảm bảo dữ liệu sinh ra chính xác, sát
thực tế và phù hợp làm bài tập AI/IoT trong thời gian ngắn.
Ngày 1: Nghiên cứu chuẩn AQI và thiết kế tiêu chí gán nhãn
1. Tìm hiểu ngưỡng AQI cho bụi mịn (PM2.5): Tìm các tiêu chuẩn
hoặc khuyến nghị về nồng độ bụi mịn PM2.5 ảnh hưởng sức khỏe. Ví
dụ, theo WHO và EPA, nồng độ PM2.5 vượt 35 µg/m³ đã được coi
là không tốt cho nhóm nhạy cảm, và nếu kéo dài trên 55 µg/m³
sẽ gây rủi ro sức khỏe đáng kể[1]. Tại Việt Nam, các bảng phân loại
chất lượng không khí cũng nêu rằng 36–55 µg/m³ PM2.5 được xếp
loại “có hại cho sức khỏe (nhóm nhạy cảm)”, còn từ 56 µg/m³
trở lên là mức “kém/Xấu” cho sức khỏe[2][3]. Dựa vào đó, ta lấy ngưỡng 35
µg/m³ để phân biệt mức Tốt/Trung bình và 55 µg/m³ để phân biệt Trung
bình/Xấu cho bụi mịn PM2.5.
2. Tìm hiểu ngưỡng cho khí CO₂ (MQ-135): Tham khảo các khuyến
cáo về chất lượng không khí trong nhà (IAQ) đối với nồng độ CO₂.
Thông thường, dưới 1000 ppm CO₂ được coi là tốt, trên mức này
con người bắt đầu thấy ngột ngạt, giảm tập trung; đặc biệt vượt
ngưỡng ~1000 ppm, não bộ hoạt động kém hiệu quả, gây mệt
mỏi, đau đầu[4]. Nồng độ trên 2000 ppm CO₂ bị coi là kém, gây rõ
rệt các triệu chứng như đau đầu, buồn ngủ[5]. Bảng phân loại IAQ cho
thấy: 1000–2000 ppm gây khó chịu, 2000+ ppm là chất lượng không
khí kém[5]. Vì vậy, ta đặt ngưỡng 1000 ppm (khí CO₂/VOC thấp tốt) và
2000 ppm (cao xấu) cho chỉ số từ cảm biến MQ-135.
3. Chuyển đổi đơn vị cảm biến bụi: Cảm biến GP2Y1010AU0F đo mật
độ bụi mịn và thường cho kết quả theo đơn vị mg/m³ (miligam trên mét
khối). Cần quy đổi sang µg/m³ (microgam trên mét khối) để so sánh với
chuẩn AQI PM2.5. Quy tắc quy đổi: 1 mg/m³ = 1000 . µg/m³ Ví dụ: giá
trị 0,050 mg/m³ tương đương 50 µg/m³. Do ngưỡng “Tốt” và “Xấu” ở
mức 35 µg/m³ và 55 µg/m³, tương ứng khoảng 0,035 mg/m³ và 0,055
mg/m³. Khi sinh dữ liệu, ta sẽ tạo cột bụi với đơn vị mg/m³ rồi nhân
1000 để có µg/m³ phục vụ gán nhãn.
4. Xác định logic gán nhãn chi tiết: Dựa trên các ngưỡng đã xác định,
thiết lập điều kiện gán nhãn cho từng mẫu dữ liệu. Logic gán nhãn tổng
thể lấy theo mức xấu nhất trong các chỉ số (tương tự cách tính AQI tổng). Cụ thể: 5. Gán nhãn "Xấu" nếu bụi
mịn > 55 µg/m³ HOẶC nồng độ CO₂ > 2000
ppm (chỉ cần một thông số vượt ngưỡng xấu, chất lượng không khí tổng thể coi là xấu). 6. Gán nhãn "Tốt" nếu bụi
mịn < 35 µg/m³
VÀ CO₂ < 1000 ppm (cả hai
thông số đều ở mức tốt).
7. Gán nhãn "Trung bình" cho các trường hợp còn lại – tức là môi trường
không hoàn toàn tốt nhưng cũng chưa đến mức xấu. (Ví dụ: bụi thấp
<35 nhưng CO₂ ~1500 ppm, hoặc bụi ~40 µg/m³ nhưng CO₂ thấp
<1000 ppm, đều xếp Trung bình).
Lưu ý: Nhiệt độ và độ ẩm từ DHT22 không trực tiếp ảnh hưởng
đến nhãn AQI ở đây, nhưng vẫn đưa vào dữ liệu để mô phỏng đầy đủ
bối cảnh môi trường. Hai thông số này có thể hữu ích cho mô hình AI
(ví dụ, nhiệt độ/độ ẩm có thể gián tiếp tương quan đến mức độ ô
nhiễm trong một số trường hợp). Tuy nhiên, ngưỡng phân loại
Tốt/Trung bình/Xấu chủ yếu dựa trên bụi mịn và CO₂ như trên.
Ngày 2: Xây dựng mã Python sinh dữ liệu và gán nhãn
1. Chuẩn bị và xác định cấu trúc dữ liệu: Trước tiên, quyết định số
lượng mẫu dữ liệu cần sinh (ví dụ: 300–1000 mẫu) tùy theo yêu cầu bài
toán. Mỗi mẫu dữ liệu sẽ bao gồm các cột:
2. nhiet_do (Nhiệt độ từ DHT22, đơn vị °C),
3. do_am (Độ ẩm từ DHT22, đơn vị %RH),
4. gas (giá trị cảm biến MQ-135, giả sử đã hiệu chỉnh ra đơn vị tương đương ppm CO₂),
5. bui (giá trị cảm biến bụi GP2Y1010AU0F, đơn vị mg/m³),
6. nhan (Nhãn chất lượng không khí: "Tốt", "Trung bình" hoặc "Xấu").
Các cột nhiet_do và do_am đóng vai trò đặc trưng bổ sung cho mô hình, còn
nhãn quyết định bởi gas và bui như logic đã nêu.
1. Sinh ngẫu nhiên dữ liệu cảm biến hợp lý: Sử dụng Python (có thể
dùng module random hoặc numpy) để tạo giá trị ngẫu nhiên cho từng
cột, trong phạm vi hợp lý với thực tế:
2. Nhiệt độ: Chọn khoảng nhiệt độ môi trường thông thường, ví dụ từ
18°C đến 35°C (nếu môi trường trong nhà hoặc nhiệt đới). Dữ liệu
nhiệt độ có thể lấy ngẫu nhiên phân bố đều trong khoảng này.
3. Độ ẩm: Chọn phạm vi độ ẩm tương ứng, ví dụ 30% đến 90%. Có thể
sinh ngẫu nhiên đều trong khoảng, hoặc dùng phân phối bình thường
quanh một giá trị trung bình (nhưng để đơn giản, dùng phân bố đều).
4. Gas (CO₂ tương đương): Chọn khoảng 400 ppm đến 5000 ppm cho
cảm biến MQ-135 sau hiệu chỉnh. 400 ppm là nồng độ CO₂ nền ngoài
trời, 5000 ppm là mức rất cao nguy hiểm[6]. Đa phần giá trị trong nhà
sẽ nằm ở mức vài trăm đến ~2000 ppm, nhưng ta mở rộng đến 5000
ppm để bao quát trường hợp xấu.
5. Bụi (mg/m³): Chọn khoảng 0 đến 0.100 mg/m³ (tương đương 0–100
µg/m³) để bao phủ từ không khí rất sạch đến ô nhiễm nặng. Thực tế
PM2.5 đô thị hiếm khi vượt 100 µg/m³ trừ sự kiện cực đoan, nên 0.1
mg/m³ làm mức tối đa hợp lý.
Khi sinh dữ liệu ngẫu nhiên, có hai cách: - Cách 1: Sinh hoàn toàn ngẫu
nhiên rồi gán nhãn và kiểm tra phân phối. Với cách này, ta tạo một
lượng điểm dữ liệu lớn và gán nhãn theo hàm phân loại. Sau đó kiểm tra xem
tỷ lệ mẫu Tốt/Trung bình/Xấu có cân bằng không; nếu lệch, có thể lọc hoặc
sinh thêm dữ liệu để cân bằng. - Cách 2: Sinh dữ liệu theo từng lớp để
đảm bảo cân bằng. Cách này chủ động tạo số mẫu xấp xỉ bằng nhau cho
mỗi nhãn. Ví dụ: tạo 100 mẫu "Tốt" bằng cách sinh ngẫu nhiên gas < 1000 và
bui < 0.035; tạo 100 mẫu "Xấu" với gas > 2000 hoặc bui > 0.055; và 100
mẫu "Trung bình" với giá trị nằm giữa hai ngưỡng. Cách này giúp phân bố
nhãn đều hơn ngay từ đầu.
Ở đây chọn cách 2 để dữ liệu huấn luyện cân bằng. Mẫu code Python minh
họa việc sinh ngẫu nhiên dữ liệu cho từng trường hợp nhãn: import random import pandas as pd num_samples = 100 # số mẫ! u mố! i loại
data = {"nhiet_do": [], "do_am": [], "gas": [], "bui": [], "nhan": []}
# Sinh dữ liệu cho lớp "Tốt" for _ in range(num_samples):
temp = random.uniform(18, 35) # nhiet_do 18-35°C
humidity = random.uniform(30, 90) # do_am 30-90%
gas_val = random.uniform(400, 999) # gas < 1000 ppm (tốt)
dust_mg = random.uniform(0.000, 0.034) # bui < 0.035 mg/m³ (tốt)
data["nhiet_do"].append(round(temp, 2))
data["do_am"].append(round(humidity, 2))
data["gas"].append(round(gas_val, 2))
data["bui"].append(round(dust_mg, 3)) data["nhan"].append("Tốt")
# Sinh dữ liệu cho lớp "Xẫu" for _ in range(num_samples): temp = random.uniform(18, 35)
humidity = random.uniform(30, 90) # Tạo ngẫ!
u nhiên một trong hai thống số vư t ngư ng xẫu if random.random() < 0.5:
gas_val = random.uniform(2001, 5000) # gas > 2000 ppm (xẫu)
dust_mg = random.uniform(0.000, 0.100) # bui tùy ý else:
gas_val = random.uniform(400, 5000) # gas tùy ý
dust_mg = random.uniform(0.056, 0.100) # bui > 0.055 mg/m³ (xẫu)
data["nhiet_do"].append(round(temp, 2))
data["do_am"].append(round(humidity, 2))
data["gas"].append(round(gas_val, 2))
data["bui"].append(round(dust_mg, 3)) data["nhan"].append("Xẫu")
# Sinh dữ liệu cho lớp "Trung bình" for _ in range(num_samples): temp = random.uniform(18, 35)
humidity = random.uniform(30, 90) # Trung bình: khống tho Ia mãn ca I điêL u kiện Tốt lẫ! n Xẫu
gas_val = random.uniform(1000, 2000) # gas trung bình
dust_mg = random.uniform(0.035, 0.055) # bui trung bình # Thỉ Inh thoa
Ing trộn trường h p 1 thống số tốt, 1 thống số xẫu nhẹ if random.random() < 0.3:
gas_val = random.uniform(1000, 2000)
dust_mg = random.uniform(0.000, 0.034) # bụi tốt, gas trung bình if random.random() < 0.3:
gas_val = random.uniform(400, 999) # gas tốt, bụi trung bình
dust_mg = random.uniform(0.035, 0.055)
data["nhiet_do"].append(round(temp, 2))
data["do_am"].append(round(humidity, 2))
data["gas"].append(round(gas_val, 2))
data["bui"].append(round(dust_mg, 3))
data["nhan"].append("Trung bình") # ChuyêI n sang DataFrame pandas df = pd.DataFrame(data)
print(df.head()) # xem trước vài dòng dữ liệu
Trong đoạn code trên, ta sử dụng random.uniform(a, b) để sinh số thực ngẫu
nhiên trong khoảng [a, b]. Mỗi mẫu được gán nhãn phù hợp ngay trong quá
trình tạo để đảm bảo điều kiện. Lưu
ý: Việc làm tròn (round()) chỉ để dữ liệu
gọn gàng (nhiệt độ, độ ẩm làm tròn 2 chữ số; bụi làm tròn 3 chữ số mg/m³).
Sau khi sinh đủ mẫu cho ba lớp, ta kết hợp vào một pandas.DataFrame và có
thể in thử vài dòng đầu để kiểm tra.
1. Viết hàm gán nhãn tự động (nếu sinh dữ liệu ngẫu nhiên hoàn
toàn): Nếu chọn cách 1 (sinh hoàn toàn ngẫu nhiên rồi mới gán nhãn),
cần một hàm để gán nhãn cho từng hàng dữ liệu dựa trên ngưỡng đã
đặt. Dù ở đây ta đã tạo dữ liệu theo lớp, ta vẫn nên chuẩn bị hàm này
để kiểm tra logic hoặc tái sử dụng nếu cần. Ví dụ:
def gan_nhan(dust_mg, gas_ppm): """Tra I vêL
nhãn 'Tốt', 'Trung bình' hoặc 'Xẫu' dựa trên giá trị bụi (mg/m³) và gas (ppm)."""
dust_ug = dust_mg * 1000.0 # chuyêI
n bụi từ mg/m³ sang µg/m³
if dust_ug > 55 or gas_ppm > 2000: return "Xẫu"
elif dust_ug < 35 and gas_ppm < 1000: return "Tốt" else: return "Trung bình"
Hàm trên trước tiên chuyển đổi dust_mg sang đơn vị µg/m³, sau đó áp dụng
điều kiện OR / AND như đã đề ra. Có thể viết gọn hơn, nhưng rõ ràng như
trên giúp đối chiếu trực tiếp với định nghĩa ngưỡng. Nếu dữ liệu được sinh
hoàn toàn ngẫu nhiên, ta có thể dùng hàm này để gán nhãn cho từng mẫu,
ví dụ: df["nhan"] = df.apply(lambda row: gan_nhan(row["bui"],
row["gas"]), axis=1) trong pandas.
1. Kiểm tra nhanh dữ liệu mẫu: Sau khi sinh dữ liệu và gán nhãn, kiểm
tra vài điểm để đảm bảo logic đúng. Ví dụ:
2. In một số mẫu nhãn "Xấu" xem có đúng là bụi hoặc gas vượt ngưỡng không.
3. Tương tự với "Tốt" (các giá trị bụi, gas đều thấp dưới ngưỡng).
4. Đảm bảo không có nhãn trùng lặp sai (vd: một mẫu có bụi, gas tốt
nhưng gán "Xấu" do lỗi hàm).
Nếu phát hiện lỗi, chỉnh sửa lại hàm gán nhãn hoặc quy tắc sinh dữ liệu.
Ngày 3: Kiểm tra phân phối nhãn, cân bằng dữ liệu và xuất tập tin
1. Phân tích phân phối nhãn: Tính toán số lượng mẫu thuộc mỗi lớp
Tốt/Trung bình/Xấu để đảm bảo dữ liệu cân bằng tương đối. Có thể
dùng pandas để đếm nhanh, ví dụ:
print(df["nhan"].value_counts()) Hoặc:
from collections import Counter print(Counter(data["nhan"]))
Kết quả cho biết mỗi nhãn có bao nhiêu mẫu. Yêu
cầu là phân bố nên tương
đối đều (ví dụ mỗi loại ~33% dữ liệu) để mô hình học tốt các lớp. Nếu thấy
lệch đáng kể (ví dụ quá nhiều "Xấu" so với "Tốt"), cần điều chỉnh lại bước
sinh dữ liệu (tăng giảm num_samples cho từng lớp hoặc lọc bớt/thêm dữ liệu) để đạt cân bằng.
1. Cân chỉnh dữ liệu (nếu cần): Dựa trên kết quả kiểm tra, thực hiện một số điều chỉnh:
2. Nếu một lớp quá ít mẫu, có thể sinh thêm dữ
liệu cho lớp đó (ví dụ
chạy lại vòng lặp sinh thêm 50 mẫu "Tốt" nếu thiếu).
3. Nếu một lớp quá thừa, có thể lấy ngẫu nhiên bớt một phần (down-
sampling) hoặc đơn giản là chấp nhận miễn tỷ lệ không quá chênh
lệch. Vì đây là dữ liệu giả lập do ta chủ động tạo, nên ưu tiên chủ động
tạo cân bằng hơn là bỏ dữ liệu.
4. Đảm bảo dữ liệu cuối cùng đủ lớn và đa dạng cho cả ba lớp.
5. Xuất dữ liệu ra file CSV: Sử dụng pandas để lưu DataFrame thành
file CSV, phục vụ sử dụng ngoài (ví dụ huấn luyện mô hình bằng các công cụ khác). Mã mẫu:
df.to_csv("synthetic_air_quality_data.csv", index=False)
Dòng lệnh trên sẽ tạo file synthetic_air_quality_data.csv trong thư mục
hiện hành, chứa tất cả các cột (nhiet_do, do_am, gas, bui, nhan). Tham số
index=False để không lưu chỉ số dòng của DataFrame vào file.
1. Hướng dẫn sử dụng dữ liệu cho mô hình AI: Sau khi có CSV, sinh
viên có thể dùng Python (pandas, scikit-learn, v.v.) hoặc công cụ bất kỳ
để huấn luyện mô hình phân loại: 2. Đọc dữ liệu: df = .
pd.read_csv("synthetic_air_quality_data.csv")
3. Tách đặc trưng đầu vào (các cột nhiet_do, do_am, gas, bui) và
nhãn (cột nhan). Ví dụ với pandas:
X = df[["nhiet_do", "do_am", "gas", "bui"]] y = df["nhan"]
4. Chia tập huấn luyện và kiểm thử (nếu cần) để đánh giá mô hình (có thể
dùng train_test_split của scikit-learn).
5. Lựa chọn mô hình: Với bài toán phân loại 3 lớp, có thể thử các mô hình
đơn giản như Decision Tree, Random , Forest KNN, hoặc mô hình
mạng neuron (MLP) nếu quen thuộc. Huấn luyện mô hình trên dữ liệu
X, y và đánh giá độ chính xác.
6. Do dữ liệu đã được gán nhãn theo logic AQI chuẩn, mô hình học được
sẽ dự đoán mức độ Tốt/Trung bình/Xấu cho các mẫu mới dựa trên
giá trị cảm biến. Sinh viên có thể thử tạo một vài mẫu thực tế (ví dụ đo
bằng cảm biến thật hoặc tình huống giả định) để xem mô hình dự đoán đúng logic hay không.
7. Kiểm tra lại tính sát thực tế: Cuối cùng, xem xét nhanh liệu dữ liệu
giả lập có hợp lý so với thực tế:
8. Phạm vi nhiệt độ, độ ẩm có phù hợp môi trường sử dụng (trong nhà, ngoài trời)?
9. Các kết hợp giá trị bụi & CO₂ có tự nhiên không (ví dụ, nếu nhiệt độ cao
+ cửa đóng kín -> CO₂ có thể cao; hoặc sau mưa lớn -> bụi có thể thấp
và độ ẩm cao, v.v.). Mặc dù dữ liệu sinh ngẫu nhiên sẽ không phản ánh
được mọi quan hệ tương quan thực, việc thêm một chút logic (như đã
làm với một vài trường hợp Trung bình ở trên) giúp dữ liệu đỡ phi thực tế hơn. 10.
Nếu cần, có thể tinh chỉnh thêm: ví dụ, có thể ràng buộc bụi rất
cao hiếm khi đi kèm độ ẩm cực cao (mưa nhiều thường giảm bụi), hoặc
CO₂ cao thường trong phòng kín (có thể nhiệt độ tăng do người đông).
Tuy nhiên, với phạm vi bài tập 3 ngày, những tương quan này có thể bỏ
qua hoặc chỉ cần mô tả trong báo cáo.
Kết quả sau 3 ngày: Một file CSV dữ liệu giả lập đã được tạo, gồm hàng
trăm mẫu cảm biến môi trường với nhãn Tốt/Trung bình/Xấu theo chuẩn AQI.
Dữ liệu đã được kiểm tra cân bằng giữa các lớp và các giá trị cảm biến nằm
trong phạm vi hợp lý. Sinh viên có thể dùng ngay tập dữ liệu này để huấn
luyện mô hình AI phân loại chất lượng không khí, hoặc tiếp tục mở rộng tập
dữ liệu nếu cần. Với bộ dữ liệu này, mô hình học máy có thể đạt kết quả
phân loại đúng logic (vd: dự đoán "Xấu" khi đầu vào có bụi hoặc CO₂ cao
vượt ngưỡng, v.v.), hỗ trợ kiểm chứng hiểu biết về AQI/IAQ trong bối cảnh
IoT. Các ngưỡng và logic áp dụng đều dựa trên tiêu chuẩn sức khỏe thực tế,
giúp bài tập sát với thực
tiễn và củng cố kiến thức chuyên môn về cảm biến môi trường.
Tài liệu tham khảo:
Ngưỡng phân loại bụi mịn PM2.5 theo tiêu chuẩn AQI: mức >35 µg/m³
ảnh hưởng xấu đến nhóm nhạy cảm, >55 µg/m³ gây hại sức khỏe rõ rệt[1][2].
Ngưỡng nồng độ CO₂ trong nhà: trên 1000 ppm không khí bắt đầu
kém, trên 2000 ppm chất lượng kém, gây mệt mỏi, nhức đầu[4][5].
[1] Homeowner’s Guide to PM2.5 & PM10 | Indoor Air Quality
https://moldremovalexperts.org/the-homeowners-guide-to-particulate- matter-pm2-5-pm10-pollutants/
[2] [3] Chỉ số bụi mịn PM 2.5, PM1.0 bao nhiêu là an toàn cho sức khỏe?
https://duongkhi.vn/chi-so-bui-min-pm-2-5-pm1-0-bao-nhieu-la-an-toan-cho- suc-khoe
[4] [5] [6] Cách giảm nồng độ CO2 trong phòng kín an toàn, HIỆU QUẢ
https://airdog.vn/tin-tuc/cach-giam-nong-do-co2-trong-phong-kin?
srsltid=AfmBOoppDf-2kSIWiMSAUHIq-aeArCs7H_llhKb5rHmhyS3rWTBLoHjc