Bạn đang xem thử công khai
Đăng nhập để lưu tiến độ, làm bài tập, thảo luận và nhận phản hồi.
Mô hình chỉ ăn số. Bài này lo hai việc: đưa các cột số về cùng thang, và biến các cột chữ thành số.
Giả sử dự đoán giá nhà từ hai đặc trưng:
| Đặc trưng | Khoảng giá trị |
|---|---|
| Diện tích (m²) | 30 – 200 |
| Số phòng ngủ | 1 – 5 |
Với thuật toán tính khoảng cách (KNN, SVM) hoặc dùng gradient descent, cột diện tích sẽ áp đảo cột số phòng chỉ vì con số của nó lớn hơn — chứ không phải vì nó quan trọng hơn.
Normalization (Min-Max) — ép về đoạn [0, 1]:
x_new = (x − x_min) / (x_max − x_min)
Standardization (z-score) — đưa về trung bình 0, độ lệch chuẩn 1:
x_new = (x − mean) / std
| Min-Max | z-score | |
|---|---|---|
| Khoảng kết quả | Cố định [0, 1] | Không giới hạn |
| Nhạy với ngoại lai | Rất nhạy — một giá trị cực lớn ép hết phần còn lại về gần 0 | Ít nhạy hơn |
| Hợp khi | Biết rõ biên trên/dưới, dữ liệu sạch | Có ngoại lai, phân phối gần chuẩn |
from sklearn.preprocessing import StandardScaler, MinMaxScaler
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train) # học mean/std TỪ train
x_test = scaler.transform(x_test) # áp cùng mean/std đó lên test
One-hot encoding cho biến nominal (không thứ tự) — mỗi hạng mục thành một cột 0/1:
data = pd.get_dummies(data, columns=["city"])
# city → city_Hanoi, city_HCM, city_Hue
Ordinal encoding cho biến có thứ tự — giữ lại quan hệ lớn/nhỏ:
size_map = {"S": 0, "M": 1, "L": 2}
data["size"] = data["size"].map(size_map)
Gán số cho biến nominal. Nếu mã Hà Nội = 1, TP.HCM = 2, Huế = 3, mô hình sẽ hiểu rằng Huế > TP.HCM > Hà Nội và khoảng cách Hà Nội–Huế gấp đôi Hà Nội–TP.HCM. Đó là quan hệ hoàn toàn bịa ra. Với biến không thứ tự, phải dùng one-hot.