Chuyển đến nội dung chính

Hướng dẫn Learning Curves: Learning Curves là gì?

Tìm hiểu cách learning curves giúp bạn đánh giá dữ liệu và xác định giải pháp tối ưu.
· 15 phút đọc

Khám phá cùng AI

Có hai nguyên nhân chính gây ra lỗi trong các mô hình machine learning:

  • Bias mô tả một mô hình đưa ra các giả định đơn giản hóa để hàm mục tiêu dễ xấp xỉ hơn; ví dụ, một mô hình có thể học rằng mọi nam giới cao 5'9 trên thế giới đều mặc áo size M - rõ ràng đây là thiên lệch.
  • Variance mô tả mức độ biến thiên trong dự đoán của mô hình; tức là dự đoán của mô hình thay đổi bao nhiêu khi chúng ta thay đổi dữ liệu dùng để huấn luyện.

Để đạt được lời giải chính xác hơn, chúng ta tìm cách giảm lượng bias và variance có trong mô hình. Đây không phải nhiệm vụ đơn giản. Bias và variance đối nghịch nhau - giảm cái này sẽ tăng cái kia do một khái niệm gọi là sự đánh đổi giữa bias và variance (bias-variance tradeoff).

Trong bài viết này bạn sẽ học:

  • Cách phát hiện một mô hình đang gặp bias cao hay variance cao
  • Cách chẩn đoán mô hình mắc một trong hai vấn đề
  • Cách xây dựng mô hình phù hợp (good-fit)

Trước khi tìm hiểu cách phát hiện triệu chứng lỗi, hãy đi sâu hơn vào sự đánh đổi giữa bias và variance.

Nhìn vào sự đánh đổi giữa bias và variance

Tất cả các thuật toán học có giám sát đều hướng tới cùng mục tiêu: ước lượng hàm ánh xạ (f_hat) cho biến mục tiêu (y) khi biết một số dữ liệu đầu vào (X). Hàm mà mô hình machine learning cố gắng xấp xỉ được gọi là hàm mục tiêu.

Thay đổi dữ liệu đầu vào dùng để xấp xỉ biến mục tiêu có thể dẫn tới một hàm mục tiêu khác, điều này có thể ảnh hưởng đến đầu ra mô hình dự đoán. Mức độ mà hàm mục tiêu của chúng ta thay đổi khi dữ liệu huấn luyện thay đổi được gọi là variance. Chúng ta không muốn mô hình có variance cao vì dù thuật toán có thể hoạt động hoàn hảo trong huấn luyện, nó sẽ thất bại khi khái quát hóa sang các trường hợp chưa thấy.

variance
[Nguồn: Wikipedia]

Trong hình trên, hàm mục tiêu được xấp xỉ là đường màu xanh lá và đường hồi quy tốt nhất là đường màu đen. Hãy để ý mô hình học dữ liệu huấn luyện tốt như thế nào với đường màu xanh lá. Nó cố gắng đảm bảo mọi quan sát màu đỏ và xanh dương đều được tách biệt. Nếu chúng ta huấn luyện mô hình này với các quan sát mới, nó sẽ học một hàm mục tiêu hoàn toàn khác và cố gắng thể hiện cùng hành vi.

Xét một kịch bản trong đó chúng ta dùng phương pháp tuyến tính như hồi quy tuyến tính để xấp xỉ hàm mục tiêu. Điều đầu tiên cần lưu ý về hồi quy tuyến tính là nó giả định mối quan hệ tuyến tính giữa dữ liệu đầu vào và biến mục tiêu cần dự đoán. Các hiện tượng ngoài đời thực phức tạp hơn nhiều. Đổi lại một phần tính linh hoạt, giả định đơn giản này giúp việc học hàm mục tiêu nhanh hơn và dễ hiểu hơn. Chúng ta gọi mô hình như vậy là có Bias.

Bias
[Nguồn: Wikipedia]

Trong hình trên, đường màu đỏ biểu thị hàm mục tiêu đã học. Nhiều quan sát nằm khá xa các giá trị mà mô hình dự đoán.

Chúng ta có thể giảm bias của mô hình bằng cách làm cho nó linh hoạt hơn, nhưng điều này sẽ làm tăng variance. Ngược lại, có thể giảm variance bằng cách đơn giản hóa mô hình, nhưng như vậy lại tăng bias. Không có cách nào thoát khỏi mối quan hệ này. Phương án tốt nhất là chọn và cấu hình mô hình để đạt sự cân bằng giữa bias và variance.

sự đánh đổi giữa bias và variance.
[Nguồn: Wikipedia]

Do có các yếu tố không biết ảnh hưởng đến hàm mục tiêu, mô hình luôn tồn tại một phần lỗi gọi là lỗi không thể giảm (irreducible error). Có thể quan sát điều này trong hình bằng lượng lỗi tại điểm thấp nhất của đường Tổng Lỗi (Total Error). Để xây dựng mô hình lý tưởng, ta phải tìm được điểm cân bằng giữa bias và variance sao cho tổng lỗi được tối thiểu hóa. Điều này được minh họa bằng đường nét đứt gọi là Độ phức tạp mô hình tối ưu (Optimum Model Complexity).

Hãy mở rộng khái niệm bias và variance thông qua learning curves.

Cấu trúc của một learning curve

Learning curves là các biểu đồ dùng để hiển thị hiệu suất của mô hình khi kích thước tập huấn luyện tăng lên. Một cách khác là dùng chúng để thể hiện hiệu suất mô hình theo thời gian xác định. Chúng thường được dùng để chẩn đoán các thuật toán học tăng dần từ dữ liệu. Cách làm là đánh giá mô hình trên tập huấn luyện và tập xác thực, rồi vẽ biểu đồ hiệu suất đo được.

Ví dụ, giả sử chúng ta đã mô hình hóa mối quan hệ giữa một số đầu vào và đầu ra bằng một thuật toán machine learning. Ta bắt đầu huấn luyện mô hình với một quan sát và xác thực trên một trăm quan sát. Bạn nghĩ điều gì sẽ xảy ra? Nếu bạn nói mô hình sẽ học hoàn hảo dữ liệu huấn luyện thì đúng - sẽ không có lỗi.

Không khó để mô hình hóa mối quan hệ một đầu vào - một đầu ra; bạn chỉ cần ghi nhớ mối quan hệ đó. Phần khó là đưa ra dự đoán chính xác khi gặp các trường hợp mới, chưa thấy. Vì mô hình học quá tốt dữ liệu huấn luyện, nó sẽ rất khó khái quát hóa sang dữ liệu chưa từng thấy. Kết quả là mô hình hoạt động kém trên dữ liệu xác thực. Điều này có nghĩa là có sự khác biệt lớn giữa hiệu suất của mô hình trên dữ liệu huấn luyện và dữ liệu xác thực. Chúng ta gọi sự khác biệt này là lỗi khái quát hóa (generalization error).

Nếu thuật toán của chúng ta muốn có cơ hội đưa ra dự đoán tốt hơn trên tập xác thực, chúng ta cần thêm dữ liệu. Việc đưa các quan sát mới vào dữ liệu huấn luyện tất yếu sẽ thay đổi hàm mục tiêu của mô hình. Hiệu suất của mô hình khi chúng ta mở rộng tập huấn luyện có thể được theo dõi và vẽ để thấy sự biến thiên của điểm lỗi huấn luyện và xác thực.

Điều này có nghĩa biểu đồ sẽ hiển thị hai kết quả khác nhau:

  • Đường huấn luyện: Đường cong tính từ dữ liệu huấn luyện; cho biết mô hình học tốt đến đâu.
  • Đường xác thực: Đường cong tính từ dữ liệu xác thực; cho biết mô hình khái quát hóa tốt thế nào với các trường hợp chưa thấy.

Những đường cong này cho chúng ta thấy mô hình hoạt động thế nào khi dữ liệu tăng lên, vì vậy chúng được gọi là learning curves.

Lưu ý: Cùng quy trình có thể dùng để xem mô hình học theo thời gian. Thay vì theo dõi khi dữ liệu lớn dần, ta theo dõi cách mô hình học qua thời gian. Ví dụ, bạn quyết định học một ngôn ngữ mới. Khả năng ngôn ngữ của bạn có thể được đánh giá và gán một điểm số để cho thấy bạn tiến bộ thế nào trong 52 tuần.

Bạn đã hiểu cấu trúc của learning curve; giờ hãy áp dụng vào một bộ dữ liệu thực tế để có hình dung trực quan.

Tình huống sử dụng: Dự đoán định giá bất động sản

Chúng ta sẽ sử dụng bộ dữ liệu: dữ liệu lịch sử thị trường về định giá bất động sản. Dữ liệu này được thu thập tại Quận Sindian, Tân Bắc, Đài Loan và bao gồm dữ liệu lịch sử thị trường.

Nhiệm vụ của chúng ta là dự đoán định giá bất động sản dựa trên các đặc trưng sau:

  • X1 = ngày giao dịch (ví dụ, 2013.250 = tháng 3/2013, 2013.500 = tháng 6/2013, v.v.)
  • X2 = tuổi tòa nhà (đơn vị: năm)
  • X3 = khoảng cách đến ga MRT gần nhất (đơn vị: mét)
  • X4 = số cửa hàng tiện lợi trong phạm vi đi bộ (số nguyên)
  • X5 = tọa độ địa lý, vĩ độ (đơn vị: độ)
  • X6 = tọa độ địa lý, kinh độ (đơn vị: độ)

Biến mục tiêu được định nghĩa như sau:

  • Y = giá nhà trên đơn vị diện tích (10.000 Đài tệ/Ping, trong đó Ping là đơn vị địa phương, 1 Ping = 3,3 mét vuông)

Biến mục tiêu chúng ta dự đoán là liên tục, do đó bài toán này sẽ cần các kỹ thuật hồi quy.

Hãy bắt đầu bằng cách xem lướt qua dữ liệu:

import pandas as pd

data = pd.read_excel("/content/gdrive/MyDrive/real_estate_valuation_data.xlsx")
print(data.info())
data.head()

>>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 414 entries, 0 to 413
Data columns (total 8 columns):
 #   Column                                  Non-Null Count  Dtype  
---  ------                                  --------------  -----  
 0   No                                      414 non-null    int64  
 1   X1 transaction date                     414 non-null    float64
 2   X2 house age                            414 non-null    float64
 3   X3 distance to the nearest MRT station  414 non-null    float64
 4   X4 number of convenience stores         414 non-null    int64  
 5   X5 latitude                             414 non-null    float64
 6   X6 longitude                            414 non-null    float64
 7   Y house price of unit area              414 non-null    float64
dtypes: float64(6), int64(2)
memory usage: 26.0 KB
None

No    X1 transaction date    X2 house age    X3 distance to the nearest MRT station    X4 number of convenience stores    X5 latitude    X6 longitude    Y house price of unit area
0    1    2012.916667    32.0    84.87882    10    24.98298    121.54024    37.9
1    2    2012.916667    19.5    306.59470    9    24.98034    121.53951    42.2
2    3    2013.583333    13.3    561.98450    5    24.98746    121.54391    47.3
3    4    2013.500000    13.3    561.98450    5    24.98746    121.54391    54.8
4    5    2012.833333    5.0    390.56840    5    24.97937    121.54245    43.1

Có một đặc trưng bổ sung tên là No không được nhắc tới trong tài liệu của bộ dữ liệu. Có thể nó là chỉ số (index), nhưng để đơn giản chúng ta sẽ loại bỏ nó. Ngoài ra, tên các đặc trưng không khớp với mô tả trong tài liệu nên chúng ta sẽ làm sạch lại.

# rename the columns
renamed_columns = [col.split()[0] for col in data.columns]
renamed_columns_map = {data.columns[i]:renamed_columns[i] for i in range(len(data.columns))}

data.rename(renamed_columns_map, axis=1, inplace=True)

# remove No column
data.drop("No", axis=1, inplace=True)

print(data.head())

# separate features and target data
features, target = data.columns[:-1], data.columns[-1]

X = data[features]
y = data[target]

Dưới đây là cách bộ dữ liệu cuối cùng trông như thế nào trước khi chúng ta tách đặc trưng và nhãn mục tiêu:


        X1          X2          X3      X4      X5          X6        Y
0   2012.916667     32.0    84.87882    10  24.98298    121.54024   37.9
1   2012.916667     19.5    306.59470   9   24.98034    121.53951   42.2
2   2013.583333     13.3    561.98450   5   24.98746    121.54391   47.3
3   2013.500000     13.3    561.98450   5   24.98746    121.54391   54.8
4   2012.833333     5.0     390.56840   5   24.97937    121.54245   43.1

Để minh họa bias, variance và lời giải phù hợp, chúng ta sẽ xây dựng ba mô hình: decision tree regressor, support vector machine cho hồi quy, và random forest regressor. Sau khi xây dựng, chúng ta sẽ vẽ learning curves cho từng mô hình và chia sẻ một số kỹ thuật chẩn đoán.

Chẩn đoán learning curves

Learning curves được diễn giải bằng cách đánh giá hình dạng của chúng. Khi đã hiểu hình dạng và động lực, chúng ta có thể dùng chúng để chẩn đoán các vấn đề trong hành vi của mô hình học máy.

Hàm learning_curve() trong Scikit-learn giúp chúng ta dễ dàng theo dõi điểm số huấn luyện và xác thực, đây là những gì cần có để vẽ một learning curve.

Các tham số chúng ta truyền vào hàm learning_curve() như sau:

  • estimator: mô hình dùng để xấp xỉ hàm mục tiêu
  • X: dữ liệu đầu vào
  • y: biến mục tiêu
  • cv: chiến lược chia cross-validation
  • scoring: thước đo dùng để đánh giá hiệu suất mô hình
  • train_sizes: số lượng tuyệt đối các mẫu huấn luyện sẽ được dùng để tạo learning curve; các giá trị chúng ta dùng là ngẫu nhiên.

Mô hình 1: Decision tree regressor

Một mô hình có variance cao được gọi là overfit. Nó học rất kỹ dữ liệu huấn luyện và cả nhiễu ngẫu nhiên, dẫn tới việc mô hình hoạt động tốt trên dữ liệu huấn luyện nhưng thất bại khi khái quát hóa sang trường hợp chưa thấy. Ta quan sát hành vi như vậy khi thuật toán được dùng quá linh hoạt so với bài toán, hoặc khi mô hình được huấn luyện quá lâu.

Ví dụ, decision tree regressor là một thuật toán học máy phi tuyến. Các thuật toán phi tuyến thường có bias thấp và variance cao. Điều này gợi ý rằng thay đổi trong bộ dữ liệu sẽ gây biến thiên lớn cho hàm mục tiêu.

Hãy minh họa variance cao với decision tree regressor của chúng ta:

from sklearn.model_selection import learning_curve
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

# overfitting
decision_tree = DecisionTreeRegressor()

train_sizes, train_scores, test_scores = learning_curve(
    estimator=decision_tree,
    X=X,
    y=y,
    cv=5,
    scoring="neg_root_mean_squared_error",
    train_sizes = [1, 75, 165, 270, 331]
)

train_mean = -train_scores.mean(axis=1)
test_mean = -test_scores.mean(axis=1)

plt.subplots(figsize=(10,8))
plt.plot(train_sizes, train_mean, label="train")
plt.plot(train_sizes, test_mean, label="validation")

plt.title("Learning Curve")
plt.xlabel("Training Set Size")
plt.ylabel("RMSE")
plt.legend(loc="best")

plt.show()
Mô hình 1: Decision tree regressor

Mô hình mắc rất ít lỗi khi phải dự đoán các trường hợp nó đã thấy trong huấn luyện, nhưng hoạt động tệ trên các trường hợp mới chưa từng tiếp xúc. Bạn có thể quan sát hành vi này qua khoảng cách lỗi khái quát hóa lớn giữa đường huấn luyện và đường xác thực. Một giải pháp cải thiện là thêm các quan sát vào tập huấn luyện, điều này sẽ đưa thêm bias. Một giải pháp khác là bổ sung regularization cho mô hình (ví dụ: hạn chế độ sâu tối đa của cây, không để cây phát triển toàn bộ độ sâu).

Mô hình 2: Support Vector Machine

Một mô hình có bias cao được gọi là underfit. Nó đưa ra các giả định đơn giản hóa về dữ liệu huấn luyện, khiến khó học được các mẫu ẩn bên dưới. Hậu quả là mô hình có lỗi cao trên cả tập huấn luyện và tập xác thực. Ta có thể thấy hành vi này khi mô hình quá đơn giản so với bài toán, hoặc khi thời gian huấn luyện chưa đủ lâu.

Ví dụ, support vector machine là một thuật toán tuyến tính. Các thuật toán tuyến tính thường có bias cao và variance thấp. Điều này ngụ ý rằng có nhiều giả định hơn về dạng của hàm mục tiêu. Để đưa thêm bias vào mô hình, chúng tôi đã thêm regularization bằng cách thiết lập tham số C trong mô hình.

Hãy minh họa bias cao với support vector machine:

from sklearn.svm import SVR
from sklearn.preprocessing import StandardScaler

# Underfitting
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

svm = SVR(C=0.25)

train_sizes, train_scores, test_scores = learning_curve(
    estimator=svm,
    X=X_scaled,
    y=y,
    cv=5,
    scoring="neg_root_mean_squared_error",
    train_sizes = [1, 75, 150, 270, 331]
)

train_mean = -train_scores.mean(axis=1)
test_mean = -test_scores.mean(axis=1)

plt.subplots(figsize=(10,8))
plt.plot(train_sizes, train_mean, label="train")
plt.plot(train_sizes, test_mean, label="validation")

plt.title("Learning Curve")
plt.xlabel("Training Set Size")
plt.ylabel("RMSE")
plt.legend(loc="best")

plt.show()
Mô hình 2: Support Vector Machine

Khoảng cách khái quát hóa giữa đường huấn luyện và đường xác thực trở nên cực kỳ nhỏ khi kích thước tập huấn luyện tăng. Điều này cho thấy thêm nhiều ví dụ vào mô hình sẽ không cải thiện hiệu suất. Một giải pháp có thể là tạo thêm đặc trưng hoặc làm cho mô hình linh hoạt hơn để giảm số lượng giả định đang được đặt ra.

Mô hình 3: Random Forest Regressor

Một mô hình phù hợp tốt nằm trong vùng xám giữa underfit và overfit. Mô hình có thể không tốt bằng trên dữ liệu huấn luyện như trong trường hợp overfit, nhưng sẽ mắc ít lỗi hơn nhiều khi gặp các trường hợp chưa thấy. Hành vi này có thể quan sát khi lỗi huấn luyện tăng lên nhưng chỉ đến điểm ổn định, trong khi lỗi xác thực giảm xuống đến điểm ổn định.

Để minh họa điều này, chúng ta sẽ dùng random forest - một tập hợp (ensemble) các cây quyết định. Nghĩa là mô hình cũng phi tuyến, nhưng bias được đưa vào bằng cách tạo ra nhiều mô hình đa dạng và kết hợp dự đoán của chúng.

Chúng ta cũng thêm regularization bằng cách đặt max_depth, tức độ sâu tối đa của mỗi cây, bằng 3.

Hãy xem điều này trong mã:

from sklearn.ensemble import RandomForestRegressor

# better
random_forest = RandomForestRegressor(max_depth=3)

train_sizes, train_scores, test_scores = learning_curve(
    estimator=random_forest,
    X=X,
    y=y,
    cv=5,
    scoring="neg_root_mean_squared_error",
    train_sizes = [1, 75, 150, 270, 331]
)

train_mean = -train_scores.mean(axis=1)
test_mean = -test_scores.mean(axis=1)

plt.subplots(figsize=(10,8))
plt.plot(train_sizes, train_mean, label="train")
plt.plot(train_sizes, test_mean, label="validation")

plt.title("Learning Curve")
plt.xlabel("Training Set Size")
plt.ylabel("RMSE")
plt.legend(loc="best")

plt.show()
Mô hình 3: Random Forest Regressor

Bây giờ bạn có thể thấy chúng ta đã giảm lỗi trên dữ liệu xác thực. Cái giá phải trả là hiệu suất trên dữ liệu huấn luyện yếu đi, nhưng tổng thể đây là mô hình tốt hơn.

Lỗi khái quát hóa nhỏ hơn nhiều, với số lỗi thấp. Ngoài ra, cả hai đường cong đều ổn định khi kích thước tập huấn luyện vượt 250, ngụ ý rằng thêm nhiều quan sát nữa có thể không cải thiện mô hình này nhiều.

Tóm lại, hành vi của mô hình có thể được quan sát bằng learning curves. Kịch bản lý tưởng khi xây dựng các mô hình machine learning là giữ lỗi thấp nhất có thể. Hai yếu tố dẫn đến lỗi cao là bias và variance, và đạt được sự cân bằng giữa cả hai sẽ giúp mô hình hoạt động tốt hơn.

Chủ đề

Liên quan