Chúng ta đã hoàn thành việc xây dựng mô hình ở bài trước, vậy chất lượng mô hình đó ra sao? Trong bài hôm nay, chúng ta sẽ làm quen với việc đánh giá chất lượng mô hình. Đây là một bước quan trọng để giúp chúng ta cải thiện mô hình sau này.

Đánh giá chất lượng mô hình là gì

Thông thường, bạn sẽ muốn đánh giá tất cả các mô hình mà bạn đã phát triển. Và trong hầu hết các trường hợp, chúng ta sẽ quan tâm đến độ chính xác của mô hình, là chỉ số đánh giá xem dự đoán của mô hình và giá trị thực tế có gần nhau hay không.

Rất nhiều người mắc sai lầm khi đo lường độ chính xác này. Họ thực hiện dự đoán bằng tập dữ liệu huấn luyện (training data) và rồi so sánh những dự đoán đó với các giá trị thực tế trong chính tập dữ liệu đó. Chúng ta sẽ có phươnng pháp giái quyết vấn đề này, nhưng trước tiên, hãy xem cách chúng ta huấn luyện và dự đoán trên cùng tập huấn luyện ra sao.

Trước tiên chúng ta cần tìm một chỉ số để đánh giá chất lượng mô hình một cách dễ hiểu. Nếu chúng ta so sánh dự đoán và giá trị thực tế của 10000 căn nhà, khả năng cao là có những dự đoán tốt và không tốt. Do đó, chúng ta nên tổng hợp lại thành 1 chỉ số mà thôi.

Có rất nhiều chỉ số để tổng hợp lại chất lượng mô hình, chúng ta hãy bắt đầu với Sai Số Trung Bình Tuyệt Đối (Mean Absolute Error - MAE). Chỉ số này có thể hiểu như sau:

Sai số dự đoán cho mỗi căn nhà:

Sai số = Thực tế - Dự đoán

Ví dụ, nếu căn nhà có giá 150,000 đô và bạn dự đoán giá là 100,000 đô, thì sai số là 50,000 đô.

Với MAE, chúng ta sẽ lấy giá trị tuyệt đối của mỗi sai số rồi lấy giá trị trung bình của các sai số tuyệt đối này. Đây chính ta chỉ số đánh giá chất lượng mô hình của chúng ta. Nếu chỉ số này có giá trị E, điều đó có nghĩa là trung bình, dự đoán của chúng ta bị lệch 1 khoảng E so với giá trị thực tế.

Để tính MAE, trước hết chúng ta cần một mô hình. Hãy lặp lại những bước ở bài trước như sau:

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.tree import DecisionTreeRegressor
# Định nghĩa mô hình
melbourne_model = DecisionTreeRegressor()
# Huấn luyện mô hình 
melbourne_model.fit(X, y)

Sau khi đã có mô hình, đây là cách để tính giá trị trung bình tuyệt đối

from sklearn.metrics import mean_absolute_error

predicted_home_prices = melbourne_model.predict(X)
print(mean_absolute_error(y, predicted_home_prices))  # kết quả: 434.71594577146544

Vấn đề của đánh giá trong mẫu (in sample validation)

Chỉ số chúng ta mới tính toán còn được gọi là điểm số trong mẫu. Chúng ta dùng một tập dữ liệu cho cả việc huấn luyện và đánh giá mô hình. Điều này là hoàn toàn không nên và chúng ta sẽ hiểu tại sao thông qua ví dụ dưới đây.

Hãy tưởng tượng rằng, trên thị trường bất động sản thì màu cửa không liên quan đến giá nhà.

Tuy nhiên, trong tập dữ liệu mà chúng ta sử dụng để xây dựng mô hình, tất cả các ngôi nhà có cửa màu xanh đều rất đắt tiền. Mô hình sẽ tìm được quy luật này và sẽ luôn dự đoán giá cao cho những căn nhà có cửa màu xanh. Tuy mô hình sẽ cho những dự đoán tương đối chính xác trên tập huấn luyện, nhưng nếu quy luật này không còn đúng cho tập dữ liệu mới, mô hình sẽ cho những dự đoán rất thiếu chính xác.

Do giá trị của mô hình nằm ở khả năng dự đoán tốt trên tập dữ liệu mới, chúng ta nên đánh giá chất lượng mô hình trên dữ liệu chưa được sử dụng cho việc huấn luyện mô hình. Cách dễ nhất để làm được điều này đó là loại bỏ một phần dữ liệu ra khỏi quá trình xây dựng mô hình, sau đó sử dụng phần dữ liệu này để kiểm tra độ chính xác của mô hình trên dữ liệu mà nó chưa từng nhìn thấy trước đây. Phần dữ liệu này còn được gọi là tập kiểm định (validation data).

Sử dụng tập kiểm định

Thư viện scikit-learn có hàm train_test_split để chia dữ liệu làm 2 phần. Chúng ta sẽ dùng một phần cho việc huấn luyện và phần còn lại cho việc đánh giá chất lượng mô hình.

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)
# việc chia dữ liệu cũng dựa trên việc lựa chọn ngẫu nhiên, nên chúng ta nên gán giá trị
# cho random_state để đảm bảo kết quả giống nhau trong nhiều lần chạy
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# Định nghĩa mô hình
melbourne_model = DecisionTreeRegressor()
# Huấn luyện
melbourne_model.fit(train_X, train_y)

# Dự đoán trên tập đánh giá và tính sai số trung bình tuyệt đối
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))  # kết quá: 265806.91478373145

Chúng ta có thể thấy, sai số trung bình tuyệt đối cho dữ liệu trong mẫu là 500 đô, trong khi chỉ số này ngoài mẫu là 250,000 đô.

Với giá trị trung bình của các ngôi nhà trong tập kiểm định là 1.1 triệu đô, đây là sự khác biệt “một trời một vực” giữa một mô hình gần như hoàn hảo và một mô hình gần như không sử dụng được trong thực tiễn. Do đó, hãy nhớ rằng đánh giá mô hình dựa trên dữ liệu ngoài mẫu (out-samples) sẽ có độ tin cậy cao hơn.

Tạm kết

Bài hôm nay giới thiệu đến các bạn một số khái niệm mới liên quan đến việc đánh giá chất lượng mô hình. Chúng ta cần quan tâm đến:

  • Định nghĩa chỉ số đánh giá chất lượng
  • Đánh giá ngoài mẫu thay vì trong mẫu
  • Hàm train_test_split trong scikit-learn

Khi mô hình chưa đạt được độ chính xác như ý, chúng ta có thể cải thiện chất lượng mô hình bằng cách dùng những đặc trưng hoặc mô hình khác. Hãy đón đọc bài tiếp theo để thử nghiệm các phương pháp này nhé.

Tham khảo

Leave a comment