You are on page 1of 34

ĐẠI HỌC QUỐC GIA HÀ NỘI

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN


KHOA VẬT LÝ

NGUYỄN THỊ HÀ - 200002120


LƯU THẾ TRUNG - 20002170
TRẦN THỊ YẾN VI - 20002179
NGUYỄN TRƯỜNG DANH - 20002110
(NHÓM 13)

ỨNG DỤNG LSTM TRONG DỰ BÁO THỜI TIẾT

Báo cáo Học Máy


Kỹ thuật điện tử và tin học
(Chuẩn)

Giảng viên: TS. Phạm Tiến Lâm


Ths. Đặng Văn Báu

Hà Nội - 2023
Mục lục

Danh sách hình vẽ ii

Danh sách bảng iii

MỞ ĐẦU 1

1 Tổng quan về LSTM 3


1.1 Tổng quan về LSTM . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.1 Kiến trúc của LSTM . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.2 Hoạt động của LSTM . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Ưu điểm của LSTM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2 Dự báo thời tiết với LSTM 8


2.1 Tiền xử lý dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.1 Thu thập dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.2 Chuẩn hóa dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Xây dựng mô hình . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.1 Mô hình dự đoán thời tiết . . . . . . . . . . . . . . . . . . . . . 15
2.2.2 Mô hình dự đoán nhiệt độ . . . . . . . . . . . . . . . . . . . . 16

3 Kết quả và đánh giá 17


3.1 Đánh giá các mô hình . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.1 Mô hình dự đoán nhiệt độ theo giờ . . . . . . . . . . . . . . . . 17
3.1.2 Mô hình dự đoán nhiệt độ theo ngày . . . . . . . . . . . . . . . 19
3.1.3 Mô hình phân loại thời tiết theo giờ . . . . . . . . . . . . . . . 20
3.1.4 Mô hình phân loại thời tiết theo ngày . . . . . . . . . . . . . . 23
3.2 Kết quả . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Kết Luận 29

Tài liệu tham khảo 30

i
Danh sách hình vẽ

1.1 Kiến trúc của một LSTM . . . . . . . . . . . . . . . . . . . . . . . . . 3

2.1 Dữ liệu thu trả về sau khi request . . . . . . . . . . . . . . . . . . . . . 10


2.2 Dữ liệu sau khi chuyển đổi . . . . . . . . . . . . . . . . . . . . . . . . 10

3.1 Đánh giá mô hình dự đoán nhiệt độ theo giờ với hàm kích hoạt tanh . . 18
3.2 Đánh giá mô hình dự đoán nhiệt độ theo giờ với hàm kích hoạt Relu . . 18
3.3 Đánh giá mô hình dự đoán nhiệt độ cao nhất và thấp nhất theo ngày với
hàm kích hoạt tanh . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.4 Loss và accuracy của mô hình phân loại thời tiết theo giờ với hàm kích
hoạt tanh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.5 Đánh giá mô hình phân loại thời tiết theo giờ với hàm kích hoạt tanh . . 22
3.6 Loss và accuracy của mô hình phân loại thời tiết theo ngày với hàm kích
hoạt tanh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.7 Đánh giá mô hình phân loại thời tiết theo ngày với hàm kích hoạt tanh . 25
3.8 Kết quả dự báo thời tiết của mô hình . . . . . . . . . . . . . . . . . . . 27
3.9 Kết quả dự báo thời tiết ngày mai trên web . . . . . . . . . . . . . . . . 27
3.10 Kết quả dự báo thời tiết theo giờ trên web . . . . . . . . . . . . . . . . 28

ii
Danh sách bảng

3.1 Đánh giá mô hình dự đoán nhiệt độ theo giờ với hàm kích hoạt tanh . . 19
3.2 Đánh giá mô hình dự đoán nhiệt độ theo ngày với hàm kích hoạt tanh . . 19
3.3 Độ chính xác của các mô hình phân loại thời tiết theo giờ với hàm kích
hoạt tanh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

iii
MỞ ĐẦU

Dự báo thời tiết là một lĩnh vực quan trọng và được quan tâm rộng rãi trong ngành
khí tượng học và ứng dụng thời tiết. Khả năng dự báo chính xác thời tiết có thể mang lại
nhiều lợi ích, từ việc cung cấp thông tin hữu ích cho công tác quản lý thiên tai đến hỗ
trợ trong kế hoạch hoạt động hàng ngày của con người. Tuy nhiên, dự báo thời tiết vẫn
là một thách thức do tính biến đổi và không chắc chắn của các yếu tố thời tiết.

Trong nhiều năm qua, các phương pháp dự báo thời tiết dựa trên mô hình học máy đã
được nghiên cứu và áp dụng rộng rãi. Một trong những phương pháp thành công đó là
sử dụng mạng nơ-ron hồi quy dài (LSTM) - một dạng đặc biệt của mạng nơ-ron hồi quy
(RNN) - trong việc dự báo chuỗi thời gian, bao gồm cả dự báo thời tiết.

Mục tiêu của báo cáo này là tìm hiểu về việc sử dụng mô hình LSTM trong dự báo
thời tiết. Chúng tôi nhằm tìm hiểu cách LSTM có thể ứng dụng để dự báo các yếu tố thời
tiết như nhiệt độ, độ ẩm, áp suất, và gió. Bằng cách nắm vững nguyên lý hoạt động của
LSTM và thực hiện các bước cần thiết, chúng tôi hy vọng có thể xây dựng một mô hình
LSTM hiệu quả cho dự báo thời tiết.

Các mục tiêu cụ thể của đề tài bao gồm:

• Tìm hiểu cơ bản về mạng LSTM, cách nó hoạt động và ưu điểm của nó trong việc
xử lý chuỗi thời gian.

• Tiền xử lý dữ liệu thời tiết để chuẩn bị cho việc áp dụng mô hình LSTM.

• Xây dựng một mô hình LSTM cho dự báo thời tiết và tinh chỉnh các tham số liên
quan.

• Huấn luyện và đánh giá mô hình LSTM trên tập dữ liệu thời tiết thực tế.

Nhóm hy vọng rằng báo cáo này sẽ cung cấp một cái nhìn toàn diện về việc sử dụng
LSTM trong dự báo thời tiết và mang lại những kiến thức hữu ích về áp dụng mô hình
LSTM cho các bài toán dự báo chuỗi thời gian khác.

1
Báo cáo này được chia thành các phần sau:

• Phần Mở Đầu: Phần bạn đang đọc, giới thiệu về đề tài, mục tiêu nghiên cứu và cấu
trúc của báo cáo.

• Tổng quan về LSTM: Trình bày cơ bản về mạng LSTM, kiến trúc và cách nó hoạt
động.

• Dự báo thời tiết với LSTM: Mô tả cách áp dụng mô hình LSTM vào dự báo thời
tiết, bao gồm tiền xử lý dữ liệu, xây dựng mô hình và quá trình huấn luyện.

• Kết quả và đánh giá: Trình bày kết quả dự báo thời tiết từ mô hình LSTM và đánh
giá về hiệu suất và ưu điểm của phương pháp này.

• Kết luận: Tóm tắt những điểm quan trọng và đưa ra kết luận tổng quan về việc sử
dụng LSTM trong dự báo thời tiết.

2
Chương 1 Tổng quan về LSTM

Mạng nơ-ron Long Short-Term Memory(LSTM) là một loại mạng nơ-ron hồi quy
(RNN) được thiết kế đặc biệt để giải quyết vấn đề biến mất đường hồi quy (vanishing
gradient) trong việc xử lý dữ liệu chuỗi liên tục. Biến mất đường hồi quy là hiện tượng
khi gradient trong quá trình lan truyền ngược giảm đi rất nhanh, gây khó khăn trong việc
học các phụ thuộc xa trong dữ liệu chuỗi. LSTM đã được giới thiệu vào năm 1997 bởi
Sepp Hochreiter và Jürgen Schmidhuber, và từ đó trở thành một trong những mô hình
RNN phổ biến nhất và hiệu quả nhất.

1.1 Tổng quan về LSTM

LSTM khác biệt với các mạng RNN truyền thống bởi việc sử dụng các cổng (gate)
để kiểm soát thông tin được truyền đi và lưu trữ trong quá trình xử lý dữ liệu chuỗi. Các
cổng trong LSTM cho phép mô hình lựa chọn thông tin nào cần được quan tâm và thông
tin nào cần được bỏ qua.

1.1.1 Kiến trúc của LSTM

Hình 1.1: Kiến trúc của một LSTM

3
Như hình 1.1 thể hiện, một LSTM bao gồm các thành phần sau:

Forget Gate

Forget Gate (Cổng quên): Cổng quên quyết định thông tin nào từ trạng thái trước (Cell
State) nên bị xóa đi hoặc giữ lại. Cổng này sử dụng hàm kích hoạt sigmoid để tạo ra một
vector giá trị từ 0 đến 1 cho mỗi phần tử trong trạng thái trước. Giá trị 0 tương ứng với
việc "quên" hoàn toàn thông tin, trong khi giá trị 1 tương ứng với việc "giữ lại" hoàn
toàn thông tin. Vì vậy, cổng quên cho phép mô hình quyết định xem thông tin nào trong
trạng thái trước nên được truyền qua và thông tin nào nên bị loại bỏ.

Công thức tính toán cổng quên như sau:

fit = σ (W f xt +U f ht−1 + b f ) (1.1)

Trong đó:

• fit : giá trị của cổng quên tại thời điểm t

• σ : hàm sigmoid

• W f : ma trận trọng số liên kết giữa đầu vào xt và cổng quên fit

• U f : ma trận trọng số liên kết giữa trạng thái ẩn t-1 (ht−1 ) và cổng quên fit

• b f : vector bias của cổng quên

Cell State

Cell State (Ô trạng thái): Cell State là trạng thái lưu trữ thông tin quan trọng từ quá
khứ. Nó chạy xuyên suốt toàn bộ chuỗi dữ liệu và cho phép thông tin truyền qua các thời
điểm mà không bị ảnh hưởng bởi cổng.

Công thức tính toán trạng thái hiện tại như sau:

Sti = fit st−1


i + gti σ (Wi xt +Ui ht−1 + bi ) (1.2)

Trong đó:

4
• gti là giá trị của input gate tại thời điểm t và chiều i.

• st−1
i là giá trị của cell state tại thời điểm trước đó, chiều i

Input Gate

Input Gate (Cổng đầu vào): Cổng đầu vào quyết định thông tin nào từ đầu vào nên
được chấp nhận và truyền vào trong trạng thái mới. Tương tự như cổng quên, cổng đầu
vào sử dụng hàm kích hoạt sigmoid để tạo ra một vector giá trị từ 0 đến 1 cho mỗi phần
tử trong đầu vào. Ngoài ra, cổng đầu vào còn sử dụng hàm kích hoạt tanh để tạo ra một
vector giá trị từ -1 đến 1 cho mỗi phần tử trong đầu vào. Vector giá trị từ cổng đầu vào
xác định mức độ quan trọng của thông tin từ đầu vào và thông tin nào nên được lưu trữ
trong trạng thái mới.

Công thưc tính toán cổng đầu vào như sau:

gti = σ (Wg xt +Ug ht−1 + bg ) (1.3)

Output Gate

Output Gate (Cổng đầu ra): Cổng đầu ra quyết định thông tin nào từ Cell State nên
được sử dụng để tính toán đầu ra. Cổng này sử dụng hàm kích hoạt sigmoid để xác định
mức độ quan trọng của thông tin đầu ra.Cổng đầu ra sử dụng hàm kích hoạt sigmoid để
tạo ra một vector giá trị từ 0 đến 1 cho mỗi phần tử trong trạng thái hiện tại. Vector giá
trị này xác định mức độ quan trọng của thông tin từ trạng thái hiện tại và thông tin nào
nên được truyền đến đầu ra của đơn vị LSTM hiện tại.Khi cổng đầu ra mở (giá trị gần
1), các giá trị trong trạng thái hiện tại được truyền qua để tính toán đầu ra. Ngược lại, khi
cổng đầu ra đóng (giá trị gần 0), các giá trị trong trạng thái hiện tại không được truyền
qua và không ảnh hưởng đến đầu ra.Cổng đầu ra giúp mô hình quyết định xem thông tin
từ trạng thái hiện tại có đóng góp vào việc tính toán đầu ra hay không. Điều này giúp
kiểm soát việc truyền thông tin và tạo ra sự linh hoạt trong việc xử lý chuỗi dữ liệu bởi
mạng LSTM.

5
Công thức tính toán cổng đầu ra như sau:

hti = qti tanh(Sti ) (1.4)

Với qti có công thức như sau.

qti = σ (Wq xt +Uq ht−1 + bq ) (1.5)

Trong đó:

• Sti là giá trị của cell state tại thời điểm hiện tại

• qti là giá trị được tính toán từ input gate và cell state tại thời điểm hiện tại.

• tanh là hàm tanh được sử dụng để đưa giá trị của cell state về khoảng [-1, 1].

1.1.2 Hoạt động của LSTM

Quá trình hoạt động của LSTM được thực hiện thông qua các bước sau:

• Đầu tiên, LSTM nhận đầu vào từ một thời điểm trong chuỗi dữ liệu và kết hợp nó
với trạng thái ẩn từ thời điểm trước đó.

• Tiếp theo, LSTM tính toán giá trị của cổng đầu vào và cổng quên để xác định thông
tin mới sẽ được lưu trữ trong Cell State và thông tin cũ sẽ bị quên đi.

• Sau đó, LSTM cập nhật trạng thái của Cell State bằng cách kết hợp thông tin mới
và thông tin cũ.

• Cuối cùng, LSTM tính toán giá trị của cổng đầu ra và sử dụng nó để tính toán đầu
ra của đơn vị LSTM hiện tại và truyền trạng thái ẩn tới đơn vị LSTM tiếp theo
trong chuỗi.

Với các cổng và trạng thái ẩn được điều chỉnh thông qua các hàm kích hoạt sigmoid,
LSTM có khả năng lưu trữ thông tin lâu dài và xử lý các phụ thuộc xa trong dữ liệu
chuỗi. Điều này làm cho LSTM trở thành một công cụ mạnh mẽ trong việc dự báo thời
tiết và xử lý các bài toán dự báo chuỗi thời gian.

6
1.2 Ưu điểm của LSTM

LSTM có một số ưu điểm quan trọng khi được áp dụng vào dự báo thời tiết và xử lý
chuỗi thời gian:

• Xử lý các phụ thuộc dài hạn: LSTM có khả năng xử lý các phụ thuộc dài hạn trong
dữ liệu chuỗi, cho phép mô hình học được mối quan hệ phức tạp giữa các quan sát
trong quá khứ và tương lai.

• Điều chỉnh thông tin quan trọng: Với sự hiện diện của các cổng, LSTM cho phép
mô hình tập trung vào thông tin quan trọng và loại bỏ thông tin không cần thiết.
Điều này giúp cải thiện khả năng dự báo và hiệu suất của mô hình.

• Giải quyết vấn đề biến mất đường hồi quy: LSTM giải quyết vấn đề biến mất đường
hồi quy bằng cách duy trì và truyền thông tin trong Cell State. Điều này giúp mô
hình học được các phụ thuộc xa trong dữ liệu chuỗi.

Với các ưu điểm này, LSTM đã trở thành một công cụ quan trọng và phổ biến trong
việc xử lý dữ liệu chuỗi thời gian. Trong phần tiếp theo, chúng tôi sẽ trình bày chi tiết về
quy trình áp dụng LSTM trong dự báo thời tiết, bao gồm tiền xử lý dữ liệu, xây dựng mô
hình và huấn luyện. [1], [2]

7
Chương 2 Dự báo thời tiết với LSTM

Trong phần này, chúng ta sẽ tìm hiểu về việc sử dụng mạng nơ-ron LSTM để dự báo
thời tiết. Các mô hình cần xây dựng ở đây bao gồm dự báo nhiệt độ và thời tiết trong 5
giờ tiếp theo, dự báo nhiệt độ thấp nhất, cao nhất và thời tiết của ngày mai. Đối với dự
báo theo giờ, mô hình sẽ nhận đầu vào là các chỉ số môi trường như nhiệt độ, độ ẩm, tốc
độ gió, lượng mưa, độ che phủ mây, áp suất, thời tiết trong 5 giờ trước đó để đưa ra dự
báo. Tương tự đối với mô hình dự báo theo ngày, mô hình sẽ nhận đầu vào là các chỉ số
môi trường của 5 ngày trước đó để đưa ra dự đoán thời tiết trong ngày tiếp theo.

2.1 Tiền xử lý dữ liệu

Với sự phát triển của internet trong thời gian qua, việc thu thập dữ liệu đã trở nên dễ
dàng hơn. Trong thực tế, có rất nhiều tập dữ liệu về thời tiết có sẵn trên các trang web
như Kangle, Google Dataset Search, OpenML... tuy nhiên các tập dữ liệu này không đủ
lớn và không phù hợp với mục đích của đề tài. Do đó, nhóm quyết định tự thu thập dữ
liệu bằng API từ trang web thời tiết https://www.weatherbit.io/api/ thay vì
sử dụng các tập dữ liệu có sẵn.

2.1.1 Thu thập dữ liệu

Trang web thời tiết https://www.weatherbit.io/api/ cung cấp API để lấy


dữ liệu thời tiết của các thành phố trên thế giới. Nhóm sử dụng API này để lấy dữ liệu
thời tiết của thành phố Hà Nội bằng thư viện request của python.

Thu thập dữ liệu theo ngày

Listing 2.1: Thu thập dữ liệu thời tiết theo ngày

1 import csv
2 import requests
3
4 # api_key = "7c0a239224e7429daddafb9b9de536c5"
5 api_key = "5e27f851fd764810be5b08f89ab34e3e"
6 # api_key ="b57f5d5ab486430db1d389157fd6ee1e"
7
8 city_name = "Hanoi"
9

8
10 start_date = "2004-05-01"
11 step = "604800"# 7 days
12 end_date = "2005-05-01"
13
14 url = f"https://api.weatherbit.io/v2.0/history/daily?city=Hanoi&country=VN&
start_date={start_date}&end_date={end_date}&key={api_key}"
15
16 response = requests.get(url)
17 print(response)
18
19 data = response.json()
20 with open('data/weather_date.csv', mode='a', newline='') as file:
21 writer = csv.writer(file)
22
23 #writer.writerow([ 'Datetime','Date', 'Temperature', 'Humidity', 'Temp_min',
'Temp_max', 'Pressure', 'Wind_speed', 'Clouds','Precip'])
24 for item in data['data']:
25 # Extract the date, temperature, and humidity from the JSON data
26 date = item['ts']
27 wind_speed = item['wind_spd']
28 humidity = item['rh']
29 temp_min = item['min_temp']
30 temp_max = item['max_temp']
31 pressure = item['pres']
32 temp = item['temp']
33 clouds = item['clouds']
34 datetime = item['datetime']
35 precip = item['precip']
36 writer.writerow([datetime,date, temp, humidity, temp_min, temp_max,
pressure, wind_speed, clouds,precip])

Kết quả trả về là file dưới dạng json với các thuộc tính từ môi trường như hình 2.1.
Tuy nhiên, để thuận tiện cho quá trình huấn luyện mô hình thì cần phải loại bỏ các thông
số không cần thiết và chuyển đổi chúng thành file csv. Với thư viện csv có sẵn trong
python, nhóm đã thực hiện việc này bằng đoạn code trên. Kết quả thu được là file csv
với các thuộc tính như hình 2.2.

Bằng giải thuật trên, nhóm đã thu thập được dữ liệu thời tiết theo ngày trong gần 17
năm từ 1/5/2003 đến 30/4/2020.

9
Hình 2.1: Dữ liệu thu trả về sau khi request

Hình 2.2: Dữ liệu sau khi chuyển đổi

10
Thu thập dữ liệu theo giờ

Listing 2.2: Thu thập dữ liệu thời tiết theo giờ

1 import requests
2 import datetime
3 import csv
4 import time
5
6 api_key = "ccc9d9071252498cbd589c8689961bd8"
7 city = "Hanoi,VN"
8
9 start_date = datetime.date(2019, 12, 31)
10 end_date = start_date + datetime.timedelta(days=13)
11
12
13
14 while end_date <= datetime.date(2023, 1, 1):
15 # create url with start and end date
16 url = f"https://api.weatherbit.io/v2.0/history/hourly?&city={city}&
start_date={start_date.strftime('%Y-%m-%d')}&end_date={end_date.strftime
('%Y-%m-%d')}&tz=local&units=S&key={api_key}"
17
18 # make API request and get data
19 response = requests.get(url)
20 print(response)
21 data = response.json()["data"]
22 print(data)
23 # write data to csv
24 with open('data/data_hour.csv', mode='a', newline='') as file:
25 writer = csv.writer(file)
26 for item in data:
27 humidity = item["rh"]
28 temperature = item["temp"]
29 wind_speed = item["wind_spd"]
30 wind_dir = item["wind_dir"]
31 precipitation = item["precip"]
32 pressure = item["pres"]
33 app_temp = item["app_temp"]
34 cloud_cover = item["clouds"]
35 timestamp = item["timestamp_local"]
36 weather_description = item["weather"]["description"]
37
38 writer.writerow([humidity, temperature, wind_speed, wind_dir,
precipitation, pressure, app_temp, cloud_cover, timestamp,
weather_description])
39
40 # update dates for next iteration
41 start_date = end_date + datetime.timedelta(days=1)
42 end_date = start_date + datetime.timedelta(days=13)
43 time.sleep(40)

Tương tự như việc thu thập dữ liệu theo ngày, dữ liệu theo giờ sẽ được requets và
chuyển thành file csv. Nhóm đã thu thập được dữ liệu theo giờ trong gần 12 năm từ
1/1/2010 đến 22/12/2022 với 105745 mẫu.

11
2.1.2 Chuẩn hóa dữ liệu

Trong khi xây dựng bất kỳ một mô hình học máy nào thì quá trình chuẩn hóa dữ liệu
là vô cùng quan trọng, việc chuẩn hóa dữ liệu sẽ giúp cho mô hình đạt được kết quả tốt
hơn. Trong phần này, nhóm sẽ trình bày về các phương pháp chuẩn hóa dữ liệu mà nhóm
đã sử dụng trong quá trình xây dựng mô hình.

Mô hình dự đoán thời tiết

Đối với mô hình dự báo thời tiết, bài toán này sẽ thuộc về bài toán phân loại nhiều lớp
trong học máy với các lớp cần phân loại bao gồm nắng, mưa và nhiều mây.

Listing 2.3: Chuẩn hóa dữ liệu cho phân loại thời tiết

1 # load data
2 df = pd.read_csv('data/weather_normal.csv')
3 df = df.dropna()
4
5
6 X = df.iloc[: , 0:10].values
7 y = df.iloc[: , 9].values
8
9 # y value constant [fog,rainy,cloudy,sunny]
10 n = 5
11 y = np.roll(y, -n)
12
13 X = X[:-n, :]
14 y = y[:-n]
15
16 for i in range(len(y)):
17 if y[i] == 'Rainy':
18 y[i] = 2
19 elif y[i] == 'Cloudy':
20 y[i] = 0
21 elif y[i] == 'Sunny':
22 y[i] = 1
23
24 # one hot encode y value
25
26 def one_hot_encode(y):
27 one_hot = np.zeros((len(y), 3))
28 for i in range(len(y)):
29 one_hot[i, int(y[i])] = 1
30 return one_hot
31
32
33 y = one_hot_encode(y)
34
35
36
37 X = np.array(X, dtype=np.float32)
38 y = np.array(y, dtype=np.float32)
39
40 # normalize data stardardization
41
42 x_mean = np.mean(X, axis=0)
43 x_std = np.std(X, axis=0)

12
44
45 X = (X - x_mean) / x_std
46
47
48 X = [X[i:i+5].ravel() for i in range(len(X)-4)]
49 # print(X[0])
50
51 # remove first 4 samples of label
52 y = y[4:, :]
53
54 X = np.array(X)
55 y = np.array(y)
56 # split data into training and testing sets
57
58 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
59
60
61
62 X_train_lstm = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
63 X_test_lstm = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

Dữ liệu trong file CSV sẽ được load bằng thư viện pandas. Đối với dữ liệu đầu vào,
nhóm sử dụng phương pháp mean-standard deviation để chuẩn hóa dữ liệu về dạng từ -1
đến 1. Do mô hình cẩn sử dụng các giá trị trong 5 giờ trước đó để dự đoán nên dữ liệu
đầu vào sẽ được tạo thành các hàng trong mảng, với mỗi hàng gồm các dữ liệu của 5 giờ
nối tiếp nhau. Do mô hình là mô hình phân loại nhiều lớp nên các trạng thái thời tiết sẽ
phải được one hot encode bằng hàm one_hot_encode() như trên.

Sau khi chuẩn hóa dữ liệu, dữ liệu sẽ được chia thành tập train và tập test với tỉ lệ 80%
và 20%. Đối với mô hình LSTM, dữ liệu sẽ được reshape lại thành dạng (samples, time
steps, features) với samples là số lượng mẫu, time steps là số lượng thời gian liền trước
và features là số lượng đặc trưng của mỗi mẫu.

Mô hình dự đoán nhiệt độ

Đối với mô hình dự đoán nhiệt độ, bài toán này sẽ thuộc về bài toán hồi quy trong
học máy với đầu ra là nhiệt độ. tương tự như mô hình dự đoán thời tiết, dữ liệu sẽ được
chuẩn hóa về dạng từ -1 đến 1 bằng phương pháp mean-standard deviation. Tuy nhiên
sự khác biệt ở đây chính là nhãn y cũng cần chuẩn hóa. Mô hình sẽ đưa ra dự đoán nhiệt
độ cho 5 giờ tiếp theo vì vậy cần dịch các mốc nhiệt độ theo giờ sang 5 giờ tiếp theo. Để
làm được điều này, nhóm sử dụng hàm np.roll() để dịch các mốc nhiệt độ sang 5 giờ tiếp
theo. Sau đó, nhóm sử dụng phương pháp mean-standard deviation để chuẩn hóa dữ liệu
về dạng từ -1 đến 1.

Listing 2.4: Chuẩn hóa dữ liệu cho dự đoán nhiệt độ


13
1
2 df = pd.read_csv('data/weather_date.csv')
3 df = df.dropna()
4
5 for i in range(len(df['weather'])):
6 if df['weather'][i] == 'rain':
7 df['weather'][i] = 2
8 elif df['weather'][i] == 'sunny':
9 df['weather'][i] = 1
10 elif df['weather'][i] == 'clouds':
11 df['weather'][i] = 0
12
13 X = df.iloc[:, 2:12].values
14 y = df.iloc[:, 4:6].values
15
16 print(X[0])
17 print(y[0])
18
19 y = np.roll(y, -1)
20
21 X = X[:-1, :]
22 y = y[:-1]
23
24
25
26 print(X[0])
27 print(y[0])
28
29 X = np.array(X, dtype=np.float32)
30 y = np.array(y, dtype=np.float32)
31
32 # normalize data stardardization
33
34 x_mean = np.mean(X, axis=0)
35 x_std = np.std(X, axis=0)
36
37 X = (X - x_mean) / x_std
38
39 y_mean = np.mean(y, axis=0)
40 y_std = np.std(y, axis=0)
41
42 y = (y - y_mean) / y_std
43
44
45 print(X[0])
46 print(y[0])
47 X = np.array(X, dtype=np.float32)
48 y = np.array(y, dtype=np.float32)
49
50 X = [X[i:i+5].ravel() for i in range(len(X)-4)]
51
52 # remove first 4 samples of label
53 y = y[4:]
54
55 X = np.array(X)
56 y = np.array(y)
57
58 print(X.shape)
59 print(y.shape)
60
61 # split data
62
63 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
64
65 # reshape data
66
67 X_train_lstm = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

14
68 X_test_lstm = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))

2.2 Xây dựng mô hình

Như đã giới thiệu ở chương 1, LSTM (Long Short-Term Memory) là một mô hình
mạng nơ-ron hồi quy (RNN) phổ biến được sử dụng trong dự báo chuỗi thời gian, bao
gồm cả dự báo thời tiết. Vì vậy trong phần này, nhóm sẽ sử dụng mạng nơ-ron LSTM để
xây dựng mô hình dự báo thời tiết và nhiệt độ.

2.2.1 Mô hình dự đoán thời tiết

Listing 2.5: Xây dựng mô hình dự báo thời tiết

1 model = tf.keras.Sequential([
2 tf.keras.layers.LSTM(64, input_shape=(X_train_lstm.shape[1], 1),
return_sequences=True, activation='tanh'),
3 tf.keras.layers.LSTM(64, return_sequences=True, activation='tanh'),
4 tf.keras.layers.Dropout(0.2),
5
6 tf.keras.layers.LSTM(64, activation='tanh'),
7 tf.keras.layers.Dense(128, activation="relu"),
8 tf.keras.layers.Dense(128, activation="relu"),
9 tf.keras.layers.Dense(3, activation="softmax")
10 ])
11
12 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['
accuracy'])
13
14 model.fit(X_train_lstm, y_train, epochs=25, batch_size= 128, validation_split
= 0.2)

Như đã giới thiệu ở phần trước, bài toán dự đoán thời tiết sẽ thuộc bài toán phân
loại nhiều lớp vì vậy mô hình xây dựng sẽ sử dụng hàm kích hoạt ở layer cuối cùng là
softmax. Như đoạn code ở Listing 2.5, mô hình được xây dựng bởi 3 lớp LSTM và 3 lớp
kết nối đầy đủ. Thư viện tensorflow cung cấp đầy đủ chức năng cần thiết để xây dựng
mô hình như trên. Ở đây hai lớp LSTM đầu tiên sẽ đặt tham số ’return_sequences=True’
để cho phép LSTM layer sẽ trả về chuỗi kết quả cho mỗi bước thời gian trong chuỗi đầu
vào.

Sau khi xây dựng mô hình, mô hình sẽ được biên dịch với hàm mất mát là categori-
cal_crossentropy và hàm tối ưu hóa là adam. Sau đó, mô hình sẽ được huấn luyện với 25
epochs và batch size là 128.

15
2.2.2 Mô hình dự đoán nhiệt độ

Như đã giới thiệu ở phần trước, bài toán dự đoán nhiệt độ sẽ thuộc bài toán hồi quy
vì vậy mô hình xây dựng sẽ sử dụng hàm kích hoạt ở layer cuối cùng là linear. Như đoạn
code ở Listing 2.6, mô hình được xây dựng bởi 3 lớp LSTM và 3 lớp kết nối đầy đủ. Thư
viện tensorflow cung cấp đầy đủ chức năng cần thiết để xây dựng mô hình như trên. Ở
đây hai lớp LSTM đầu tiên sẽ đặt tham số ’return_sequences=True’ để cho phép LSTM
layer sẽ trả về chuỗi kết quả cho mỗi bước thời gian trong chuỗi đầu vào.

Listing 2.6: Xây dựng mô hình dự báo thời tiết

1 model = tf.keras.models.Sequential([
2 tf.keras.layers.LSTM(64, input_shape=(X_train_lstm.shape[1], 1),
return_sequences=True, activation='tanh'),
3 tf.keras.layers.LSTM(64, return_sequences=True, activation='tanh'),
4 tf.keras.layers.Dropout(0.2),
5
6 tf.keras.layers.LSTM(128, activation='tanh'),
7 tf.keras.layers.Dropout(0.2),
8
9
10 tf.keras.layers.Dense(256, activation="linear"),
11 tf.keras.layers.Dense(128, activation="linear"),
12 tf.keras.layers.Dense(128, activation="linear"),
13 tf.keras.layers.Dense(5, activation="linear")
14 ])
15
16
17 model.compile(optimizer='adam', loss='mse', metrics=['mae'])
18
19 # train model
20
21 history = model.fit(X_train_lstm, y_train, epochs=70, batch_size= 128,
validation_split=0.2)

Sau khi xây dựng mô hình, mô hình sẽ được biên dịch với hàm mất mát là mean
squared error và hàm tối ưu hóa là adam. Sau đó, mô hình sẽ được huấn luyện với 70
epochs và batch size là 128.

Sau khi các mô hình được đào tạo và đánh giá, chúng sẽ được lưu vào thư mục data
dưới dạng file .h5 để có thể gọi lại và tiến hành dự đoán thời tiết.

16
Chương 3 Kết quả và đánh giá

Phần này tập trung vào việc trình bày kết quả dự báo thời tiết sử dụng mạng nơ-ron
LSTM và đánh giá hiệu suất của mô hình. Sau khi huấn luyện mô hình LSTM trên dữ
liệu thời tiết, chúng ta sẽ tiến hành kiểm thử và đánh giá độ chính xác của các mô hình.

Thông qua quá trình đánh giá, chúng ta sẽ có cái nhìn rõ hơn về hiệu suất và độ chính
xác của mô hình LSTM trong việc dự báo thời tiết. Kết quả và đánh giá này sẽ giúp
chúng ta đánh giá khả năng ứng dụng thực tế của mô hình và cải thiện nó nếu cần thiết.

3.1 Đánh giá các mô hình

3.1.1 Mô hình dự đoán nhiệt độ theo giờ

Như đã nói ở phần trước bài toán này là một bài toán hồi quy, vì vậy để đánh giá độ
chính xác của mô hình ta sẽ sử dụng các độ đo đánh giá mô hình hồi quy như: Mean
Absolute Error (MAE), Mean Squared Error (MSE), R2-Score (R2).

Từ hình 3.1 ta thấy rằng tốc độ hội tụ của mô hình là rất nhanh, chỉ sau 10 epochs giá
trị của loss đã xuống dưới 0.05 và gần như đạt giới hạn dưới. Từ hình 3.1 ta thấy các độ
đo chỉ ra mô hình dự đoán nhiệt độ theo thời gian hoạt động khá tốt khi MAE và MSE
đều nhỏ và R2-Score đạt giá trị gần 0.965. Điều này cho thấy mô hình có thể dự đoán
nhiệt độ theo giờ khá chính xác.

So sánh với mô hình sử dụng hàm kích hoạt Relu ta thấy, khi sử dụng hàm kích hoạt
Relu thì hàm loss hội tụ không ổn định, đồng thời giá trị của hàm loss và các chỉ số đánh
giá mae và mse là lớn hơn nhiều so với hàm tanh như hình 3.2. Điều này cho thấy hàm
kích hoạt tanh là hàm kích hoạt phù hợp hơn với mô hình LSTM và trong thực tế hàm
tanh cũng là hàm kích hoạt được sử dụng phổ biến khi xây dựng mô hình LSTM. Có thể
giải thích điều này như sau:

• Đồng nhất với đầu ra: Hàm kích hoạt tanh cho đầu ra nằm trong khoảng [-1, 1],
đồng nhất với khoảng giá trị của đầu ra LSTM. Điều này giúp làm giảm vấn đề

17
Hình 3.1: Đánh giá mô hình dự đoán nhiệt độ theo giờ với hàm kích
hoạt tanh

Hình 3.2: Đánh giá mô hình dự đoán nhiệt độ theo giờ với hàm kích
hoạt Relu

18
biên của đầu ra và tạo ra một phản hồi tốt hơn trong quá trình lan truyền ngược và
cập nhật trọng số.

• Giảm vấn đề biến mất gradient: Một lợi ích quan trọng của hàm kích hoạt tanh
là nó giảm vấn đề biến mất gradient trong quá trình lan truyền ngược. Biến mất
gradient xảy ra khi đạo hàm của hàm kích hoạt gần bằng 0 và khiến việc cập nhật
trọng số trở nên khó khăn. Hàm tanh có đạo hàm không bằng 0 ở phạm vi lớn hơn
so với hàm sigmoid, giúp giảm thiểu vấn đề này.

Bảng 3.1: Đánh giá mô hình dự đoán nhiệt độ theo giờ với hàm kích
hoạt tanh

Epochs MAE MSE R2-Score


20 0.152 0.044 0.941
40 0.140 0.039 0.958
70 0.135 0.035 0.964
80 0.137 0.038 0.959
100 0.131 0.033 0.965

Từ bảng 3.1 ta thấy rằng mô hình dự đoán nhiệt độ theo giờ hoạt động khá tốt và việc
sử dụng hàm tanh giúp cho mô hình hội tụ nhanh hơn, Vì vậy ở các mô hình sau sẽ sử
dụng hàm tanh để huấn luyện.

3.1.2 Mô hình dự đoán nhiệt độ theo ngày

Tương tự như mô hình dự đoán nhiệt độ theo ngày, mô hình dự đoán nhiệt độ cao nhất
và thấp nhất của ngày mai cũng được đánh giá bằng các chỉ số MAE, MSE, R2-Score.

Bảng 3.2: Đánh giá mô hình dự đoán nhiệt độ theo ngày với hàm kích
hoạt tanh

Epochs MAE MSE R2-Score


20 0.182 0.071 0.921
40 0.170 0.065 0.933
70 0.165 0.052 0.946
80 0.162 0.051 0.947
100 0.153 0.053 0.948

Do lượng dữ liệu trong tập dữ liệu dự đoán nhiệt độ theo ngày chưa nhiều lắm, 17
năm hơn 6000 mẫu nên kết quả của các chỉ số đánh giá mô hình hơi thấp hơn một tí so

19
Hình 3.3: Đánh giá mô hình dự đoán nhiệt độ cao nhất và thấp nhất
theo ngày với hàm kích hoạt tanh

với mô hình dự đoán nhiệt độ theo giờ. Tuy nhiên mô hình vẫn cho kết quả khá tốt khi
MAE và MSE đều nhỏ và R2-Score đạt giá trị gần 0.95. Điều này cho thấy mô hình có
thể dự đoán nhiệt độ cao nhất và thấp nhất của ngày mai khá chính xác. Tốc độ hội tụ
của loss cũng khá nhanh và ổn định như hình 3.3.

3.1.3 Mô hình phân loại thời tiết theo giờ

Mô hình phân loại thời tiết theo giờ thuộc bài toán phân loại nhiều lớp nên sẽ được
đánh giá bằng các chỉ số đánh giá mô hình phân loại như: Accuracy, Precision, Recall,
F1-Score.

Từ hình 3.4 ta thấy rằng hàm loss giảm khá nhanh, tuy nhiên khi số epoch tăng thì
đang có xu hướng overfitting, tương tự thì độ chính xác khi dự đoán thời tiết sau 1h là
khá cao gần 88%. Từ hình 3.5 ta thấy rằng các chỉ số đánh giá của mô hình dự đoán
thời tiết sau 1h là khá cao, từ confution matrix dễ thấy rằng số lượng của lớp số 2 là ít
hơn nhiều so với hai lớp còn lại, do tập data về thời tiết là tập dataset về chuỗi thời gian
nên việc căn chỉnh là rất khó, sự mất cân bằng về số lượng của các lớp dẫn đến việc

20
Hình 3.4: Loss và accuracy của mô hình phân loại thời tiết theo giờ
với hàm kích hoạt tanh

21
Hình 3.5: Đánh giá mô hình phân loại thời tiết theo giờ với hàm kích
hoạt tanh

22
overfitting khi số epoch tăng cao. Để giải quyết vấn đề này có thể sử dụng dừng sớm
hoặc callback để dừng huấn luyện khi độ chính xác trên tập validation không cải thiện.
Ở đây, nhóm đã cố gắng điều chỉnh mạng neural tuy nhiên nó không thay đổi nhiều về
các độ đo.

Bảng 3.3: Độ chính xác của các mô hình phân loại thời tiết theo giờ
với hàm kích hoạt tanh
Epochs 1h 2h 3h 4h 5h
20 0.88 0.82 0.77 0.75 0.74
40 0.87 0.80 0.77 0.75 0.73
70 0.86 0.80 0.76 0.74 0.73

Từ bảng 3.3 ta thấy càng về sau độ chính xác càng giảm, điều này khá dễ hiểu vì thời
tiết theo giờ sẽ rất thất thường và khó dự đoán vì vậy thời gian càng về sau thì độ chính
xác của mô hình càng thấp. Tuy nhiên độ chính xác của các mô hình vẫn ở mức chấp
nhận được.

3.1.4 Mô hình phân loại thời tiết theo ngày

Tương tự như mô hình phân loại thời tiết theo giờ, mô hình phân loại thời tiết theo
ngày thuộc bài toán phân loại nhiều lớp nên sẽ được đánh giá bằng các chỉ số đánh giá
mô hình phân loại như: Accuracy, Precision, Recall, F1-Score.

Khác với mô hình phân loại thời tiết theo giờ, mô hình phân loại thời tiết theo ngày
hoạt động rất tốt, kết quả khiến cho nhóm nhầm rằng mô hình bị overfitting tuy nhiên
nó không phải overfitting. Từ hình 3.6 ta thấy rằng hàm loss giảm khá nhanh trong khi
val_loss gần như đi ngang và tiến tới 0. Ở hình 3.7 ta thấy rằng các chỉ số đánh giá của
mô hình dự đoán thời tiết theo ngày là tuyệt đối, tất cả các chỉ số đều băng 1. Điều này
có thể lý giải là tập dữ liệu ở thời tiết theo ngày gồm 17 năm là khoảng thời gian khá lớn
và số lượng mẫu trong các lớp là cân bằng nên độ chính xác mô hình là rất cao.

23
Hình 3.6: Loss và accuracy của mô hình phân loại thời tiết theo ngày
với hàm kích hoạt tanh

24
Hình 3.7: Đánh giá mô hình phân loại thời tiết theo ngày với hàm
kích hoạt tanh

25
3.2 Kết quả

Kết quả của mô hình được lấy vào lúc 11h44p ngày 6/3/2023, kết quả này được so
sánh với các kết quả trên trang web thời tiết https://www.msn.com/.

Từ kết quả ở hình 3.8 và hình 3.10 ta thấy mô hình dự báo theo giờ hoạt động khá tốt,
cho ra kết quả khá gần với trang web dự báo thời tiết. Tương tự như mô hình dự đoán
theo giờ, mô hình dự đoán theo ngày cũng cho ra kết quả khá tốt như hình 3.9. Ta thấy
mô hình dự đoán nhiệt độ cao nhất và thấp nhất ngày mai là 38/31 trong khi trang web
dự báo thời tiết là 37/28 có sự chênh lệch tuy nhiên không nhiều.

26
Hình 3.8: Kết quả dự báo thời tiết của mô hình

Hình 3.9: Kết quả dự báo thời tiết ngày mai trên web

27
Hình 3.10: Kết quả dự báo thời tiết theo giờ trên web

28
Kết Luận

Qua bài báo cáo này, nhóm đã tìm hiểu về mạng nơ-ron hồi quy dài (LSTM) và cách
áp dụng nó vào dự báo thời tiết. Nhóm đã thực hiện các bước thu thập dữ liệu, tiền xử lý
dữ liệu thời tiết, xây dựng mô hình LSTM và huấn luyện mô hình trên tập dữ liệu thời
tiết thực tế. Kết quả dự báo thời tiết từ mô hình LSTM cho thấy mô hình có thể dự báo
thời tiết với độ chính xác tương đối cao.

Khó khăn lớn nhất trong quá trình thực hiện đề tài là việc thu thập dữ liệu và huấn
luyện mô hình. Đối với việc thu thập dữ liệu, do dùng API miễn phí nên sẽ bị giới hạn số
lần requets và lượng dữ liệu mỗi lần requets, vì vậy mất rất nhiều thời gian để thu thập
được tập dữ liệu như trên. Đối với việc huấn luyện mô hình, do hạn chế về tài nguyên
tính toán nên chưa kiểm tra và đánh giá hết các mô hình với các bộ tham số khác, mới
chỉ đánh giá một số khía cạnh như số epochs và hàm kích hoạt.

Về kết quả của mô hình, nhóm nhận thấy mô hình LSTM có thể dự báo thời tiết với
độ chính xác tương đối cao. Tuy nhiên, việc phân loại thời tiết theo giờ vẫn chưa đạt độ
chính xác như mong đợi và vẫn dẫn đến hiện tượng overfitting.

Trong tương lai nhóm sẽ thu thập thêm dữ liệu và cải thiện dữ liệu cũng như mô hình
để khắc phục vấn đề gặp phải trong mô hình dự báo thời tiết theo giờ.

Link sourcode: https://github.com/Danhnt0/ML

29
Tài liệu tham khảo

[1] Ian Goodfellow, Yoshua Bengio, and Aaron Courville. Deep Learning. http :
//www.deeplearningbook.org. MIT Press, 2016, pp. 400–414.
[2] Andrew Ng. “LSTM”. In: (). URL: https://www.coursera.org/lecture/
nlp-sequence-models/long-short-term-memory-lstm-KXoay.

30

You might also like