Sau khi đã làm quen với mô hình cây quyết định, bạn lại phải đưa ra một quyết định khó khăn. Một cây quyết định sâu với nhiều phân nhánh sẽ dễ overfitting vì mỗi dự đoán chỉ dựa trên một lượng dữ liệu nhỏ. Mặt khác, một cây quyết định nông với sẽ có độ chính xác kém do không nắm bắt được những quy luật trong dữ liệu.

Ngay cả những mô hình phức tạp nhất hiện nay cũng gặp phải vấn đề giữa underfitting và overfitting. Tuy nhiên, nhiêu mô hình có ý tưởng rất thông minh để cân bằng chúng và đạt kết quả tương đối tốt. Trong bài hôm nay, chúng ta sẽ tìm hiểu mô hình Random Forest (rừng ngẫu nhiên?) như một ví dụ về mô hình có khả năng như vậy.

Random Forest model

Mô hình Random Forest sử dụng nhiều cây quyết định và thực hiện dự đoán bằng cách lấy trung bình các dự đoán của các cây quyết định thành phần. Mô hình này thường có độ chính xác tốt hơn nhiều so với mỗi cây quyết định đơn lẻ và hoạt động tốt với cả các tham số mặc định. Trên thực tế có nhiều mô hình với hiệu suất tốt hơn Random Forest, nhưng chúng thường đòi hỏi phải lựa chọn các tham số một cách cẩn thận và chính xác hơn.

Thực hành

Có lẽ bạn đã quen với cách chia dữ liệu thành train_X, val_X, train_y, val_y ở các bài trước:

import pandas as pd

# Đọc dữ liệu
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# Lọc bớt các dòng mà có giá trị bị thiếu
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# Lựa chọn giá trị mục tiêu (y) và các đặc trưng (X)
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 
                        'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]

from sklearn.model_selection import train_test_split

# chia dữ liệu thành tập huấn luyện và tập đánh giá (training_data & validation_data)
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)

Chúng ta xây dựng mô Random Forest tương tự như mô hình cây quyết định trong scikit-learn, chỉ cần thay thế DecisionTreeRegressor bằng RandomForestRegressor.

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

forest_model = RandomForestRegressor(random_state=1)
forest_model.fit(train_X, train_y)
melb_preds = forest_model.predict(val_X)
print(mean_absolute_error(val_y, melb_preds))
# kết quả: 191669.7536453626

Tạm kết

Chúng ta có thể thấy Random Forest cho kết quả tốt hơn đáng kể so với mô hình cây quyết định tốt nhất (sai số trung bình 192,000 so với 250,000). Chúng ta cũng có thể thay đổi các tham số của mô hình để cải thiện chất lượng giống như việc chúng ta đã thay đổi độ sâu của cây quyết định trong bài trước. Tuy Random Forest thường hoạt động tốt với tham số mặc định, nhưng việc thay đổi tham số và quan sát xem nó ảnh hưởng đến độ chính xác như thế nào rất thú vị, các bạn cùng thử xem nhé.

Tham khảo

Leave a comment