Tại sao một lựa chọn lớn của K làm giảm điểm xác nhận chéo của tôi?


11

Chơi xung quanh với Bộ dữ liệu nhà ở BostonRandomForestRegressor(w / tham số mặc định) trong scikit-learn, tôi nhận thấy một điều kỳ lạ: điểm xác thực chéo có nghĩa là giảm khi tôi tăng số lần vượt quá 10. Chiến lược xác thực chéo của tôi như sau:

cv_met = ShuffleSplit(n_splits=k, test_size=1/k)
scores = cross_val_score(est, X, y, cv=cv_met)

... nơi num_cvsđã được thay đổi. Tôi thiết lập test_sizeđể 1/num_cvsphản chiếu hành vi kích thước phân chia thử nghiệm / thử nghiệm của CV gấp k. Về cơ bản, tôi muốn một cái gì đó như CV gấp, nhưng tôi cũng cần sự ngẫu nhiên (do đó là ShuffleSplit).

Thử nghiệm này được lặp lại nhiều lần, và điểm số avg và độ lệch chuẩn sau đó được vẽ.

Diện tích hình tròn ~ K trong xác thực chéo K-gấp

(Lưu ý rằng kích thước của kđược biểu thị bằng diện tích của vòng tròn; độ lệch chuẩn nằm trên trục Y.)

Một cách nhất quán, tăng k(từ 2 lên 44) sẽ mang lại sự gia tăng ngắn gọn về điểm số, sau đó là giảm dần khi ktăng hơn nữa (vượt quá 10 lần)! Nếu có bất cứ điều gì, tôi sẽ mong đợi nhiều dữ liệu đào tạo hơn để dẫn đến một sự gia tăng nhỏ về điểm số!

Cập nhật

Thay đổi tiêu chí chấm điểm có nghĩa là lỗi tuyệt đối dẫn đến hành vi mà tôi mong đợi: việc ghi điểm sẽ cải thiện với số lần tăng lên trong CV gấp K, thay vì tiếp cận 0 (như mặc định, ' r2 '). Câu hỏi vẫn là tại sao số liệu chấm điểm mặc định dẫn đến hiệu suất kém trên cả số liệu trung bình và STD cho số lần tăng lên.


Bất kỳ hồ sơ trùng lặp trong nếp gấp của bạn? Điều này có thể là do quá mức .
Có QUIT - Anony-Mousse

1
@ Anony-Mousse Không, vì bộ dữ liệu Nhà ở Boston không có hồ sơ trùng lặp và việc lấy mẫu của ShuffleSplit không gây ra các bản ghi trùng lặp.
Brian Biên

4
Ngoài ra, cải thiện âm mưu của bạn. Sử dụng các thanh lỗi, để hiển thị giá trị trung bình, + - stddev và min / max. Đặt k trên trục khác.
Có QUIT - Anony-Mousse

1
Tôi không nghĩ rằng các ví dụ đào tạo nhiều hơn làm tăng cơ hội thừa. Tôi đã vẽ một đường cong học tập với bộ dữ liệu này, một lần nữa sử dụng ShuffleSplit (n_splits = 300 với các kích cỡ thử nghiệm khác nhau) và thấy độ chính xác tăng lên một cách nhất quán khi có thêm các ví dụ đào tạo.
Brian Biên

1
xin lỗi, bạn đã đúng, nhiều hơn là tốt hơn và tốt nhất là 1. Nhưng bạn không gặp phải vấn đề này nếu bạn sử dụng sai số bình phương hoặc sai số tuyệt đối. Vì vậy, nó phải làm một cái gì đó với thuật ngữ lỗi
rep_ho

Câu trả lời:


1

r ^ 2 điểm không được xác định khi áp dụng cho một mẫu duy nhất (ví dụ: CV rời khỏi một lần).

r ^ 2 không tốt cho việc đánh giá các bộ thử nghiệm nhỏ: khi nó được sử dụng để đánh giá một bộ thử nghiệm đủ nhỏ, điểm số có thể vượt xa các tiêu cực mặc dù có dự đoán tốt.

Cho một mẫu duy nhất, một dự đoán tốt cho một miền nhất định có thể xuất hiện khủng khiếp:

from sklearn.metrics import r2_score
true = [1]
predicted = [1.01] # prediction of a single value, off by 1%
print(r2_score(true, predicted))
# 0.0

Tăng kích thước của bộ kiểm tra (giữ nguyên độ chính xác của các dự đoán) và đột nhiên điểm số r ^ 2 xuất hiện gần như hoàn hảo:

true = [1, 2, 3]
predicted = [1.01, 2.02, 3.03]
print(r2_score(true, predicted))
# 0.9993

Được đưa đến một thái cực khác, nếu kích thước thử nghiệm là 2 mẫu và chúng tôi tình cờ đánh giá 2 mẫu gần nhau một cách tình cờ, điều này sẽ có tác động đáng kể đến điểm số r ^ 2, ngay cả khi dự đoán khá tốt :

true = [20.2, 20.1] # actual target values from the Boston Housing dataset
predicted = [19, 21]
print(r2_score(true, predicted))
# -449.0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.