Label Encoder là một kỹ thuật trong tiền xử lý dữ liệu (data preprocessing) dùng để chuyển đổi các nhãn hoặc dữ liệu dạng chữ (categorical data) thành dạng số (numerical data).
Các mô hình máy học (Machine Learning) thường làm việc hiệu quả với số liệu chứ không phải văn bản. Vì vậy, chúng ta cần một cách để “mã hóa” các giá trị văn bản này thành số mà mô hình có thể hiểu được. Label Encoder thực hiện chính xác điều đó.
Cách hoạt động
Label Encoder hoạt động rất đơn giản: nó gán một số nguyên duy nhất cho mỗi lớp (category) trong cột dữ liệu của bạn, bắt đầu từ 0.
Ví dụ: Giả sử bạn có một cột “Thành phố” với dữ liệu như sau:
[‘Hà Nội’, ‘Đà Nẵng’, ‘Hà Nội’, ‘TP. Hồ Chí Minh’]
Khi áp dụng Label Encoder, nó sẽ chuyển đổi thành:
[0, 1, 0, 2]
Ở đây, bộ mã hóa đã tự động tạo ra một “bản đồ” ánh xạ:
Hà Nội→0Đà Nẵng→1TP. Hồ Chí Minh→2
Ưu và nhược điểm
👍 Ưu điểm
- Đơn giản và nhanh chóng: Rất dễ để triển khai và thực thi.
- Không làm tăng số chiều dữ liệu: Nó chỉ thay thế cột dữ liệu gốc bằng một cột số mới, không tạo thêm cột nào.
👎 Nhược điểm
- Tạo ra mối quan hệ thứ tự không có thật: Đây là nhược điểm lớn nhất. Mô hình có thể hiểu nhầm rằng các giá trị số này có một thứ tự nào đó (ví dụ:
TP. Hồ Chí Minh(2) >Đà Nẵng(1) >Hà Nội(0)). Điều này không đúng với các dữ liệu danh nghĩa (nominal data) như tên thành phố, màu sắc, v.v. và có thể làm giảm hiệu suất của mô hình.
Khi nào nên sử dụng?
Do nhược điểm trên, Label Encoder thường được sử dụng trong các trường hợp sau:
- Cho biến mục tiêu (target variable): Rất phổ biến khi mã hóa biến đầu ra
ytrong các bài toán phân loại (classification). - Cho dữ liệu có thứ tự (ordinal data): Khi các nhãn của bạn thực sự có một thứ tự rõ ràng. Ví dụ: mã hóa
['Nhỏ', 'Vừa', 'Lớn']thành[0, 1, 2]. Trong trường hợp này, mối quan hệ thứ tự là có thật và hữu ích.
Đối với các biến đầu vào (X) không có thứ tự (như tên thành phố), các phương pháp khác như One-Hot Encoding thường được ưu tiên hơn để tránh tạo ra mối quan hệ thứ tự sai lệch.
Ví dụ bằng code Python 🐍
Bạn có thể dễ dàng sử dụng LabelEncoder từ thư viện scikit-learn.
Python
from sklearn.preprocessing import LabelEncoder
import pandas as pd
# 1. Tạo dữ liệu mẫu
data = {'Thành phố': ['Hà Nội', 'Đà Nẵng', 'Hà Nội', 'TP. Hồ Chí Minh', 'Hải Phòng', 'Đà Nẵng']}
df = pd.DataFrame(data)
print("Dữ liệu ban đầu:")
print(df)
print("-" * 25)
# 2. Khởi tạo LabelEncoder
label_encoder = LabelEncoder()
# 3. Fit và transform cột 'Thành phố'
# .fit() -> học các nhãn duy nhất
# .transform() -> áp dụng ánh xạ số vào dữ liệu
df['Thành phố (mã hóa)'] = label_encoder.fit_transform(df['Thành phố'])
print("Dữ liệu sau khi mã hóa:")
print(df)
print("-" * 25)
# 4. Kiểm tra các lớp đã được học
# Thuộc tính .classes_ sẽ cho bạn biết nhãn nào tương ứng với số nào
print("Các lớp được mã hóa (theo thứ tự từ 0):")
print(list(label_encoder.classes_))
# Kết quả: ['Đà Nẵng', 'Hà Nội', 'Hải Phòng', 'TP. Hồ Chí Minh']
# Điều này có nghĩa là: Đà Nẵng -> 0, Hà Nội -> 1, Hải Phòng -> 2, TP.HCM -> 3
# Lưu ý: Thứ tự được sắp xếp theo bảng chữ cái
# 5. Chuyển đổi ngược lại (từ số về chữ)
encoded_values = [1, 3, 0]
original_values = label_encoder.inverse_transform(encoded_values)
print(f"Giá trị mã hóa {encoded_values} tương ứng với: {list(original_values)}")
Kết quả chạy code:
Dữ liệu ban đầu:
Thành phố
0 Hà Nội
1 Đà Nẵng
2 Hà Nội
3 TP. Hồ Chí Minh
4 Hải Phòng
5 Đà Nẵng
-------------------------
Dữ liệu sau khi mã hóa:
Thành phố Thành phố (mã hóa)
0 Hà Nội 1
1 Đà Nẵng 0
2 Hà Nội 1
3 TP. Hồ Chí Minh 3
4 Hải Phòng 2
5 Đà Nẵng 0
-------------------------
Các lớp được mã hóa (theo thứ tự từ 0):
['Đà Nẵng', 'Hà Nội', 'Hải Phòng', 'TP. Hồ Chí Minh']
-------------------------
Giá trị mã hóa [1, 3, 0] tương ứng với: ['Hà Nội', 'TP. Hồ Chí Minh', 'Đà Nẵng']
Discover more from Cùng Học Cùng Mơ
Subscribe to get the latest posts sent to your email.