Cách tính khoảng tin cậy cho chỉ số hiệu suất trong Machine Learning bằng phương pháp bootstrap tự động

Nút nguồn: 1178501

Cách tính khoảng tin cậy cho chỉ số hiệu suất trong Machine Learning bằng phương pháp bootstrap tự động

Các phép đo hiệu suất mô hình của bạn rất chính xác do tập kiểm tra “lớn” hay rất không chắc chắn do tập kiểm tra “nhỏ” hoặc không cân bằng?


By David B Rosen (Tiến sĩ), Nhà khoa học dữ liệu chính về Phê duyệt tín dụng tự động tại IBM Global Finance



Đường màu cam hiển thị 89.7% là giới hạn dưới của khoảng tin cậy Độ chính xác cân bằng, màu xanh lục cho Độ chính xác cân bằng được quan sát ban đầu=92.4% (ước tính điểm) và màu đỏ cho giới hạn trên 94.7%. (Đây và tất cả các hình ảnh là của tác giả trừ khi có ghi chú khác.)

Giới thiệu

 
 
Nếu bạn báo cáo hiệu suất của bộ phân loại của mình là có Độ chính xác=94.8% và F1=92.3% trên bộ kiểm tra, điều này không có ý nghĩa gì nhiều nếu bạn không biết điều gì đó về kích thước và thành phần của bộ kiểm tra. Biên độ sai số của các phép đo hiệu suất đó sẽ thay đổi rất nhiều tùy thuộc vào kích thước của bộ thử nghiệm hoặc, đối với bộ dữ liệu không cân bằng, chủ yếu phụ thuộc vào số lượng phiên bản độc lập của bộ dữ liệu. dân tộc thiểu số lớp mà nó chứa (nhiều bản sao của cùng một phiên bản từ việc lấy mẫu quá mức không giúp ích cho mục đích này).

Nếu bạn có thể thu thập một bộ thử nghiệm độc lập khác có nguồn gốc tương tự, Độ chính xác và F1 của mô hình của bạn trên bộ dữ liệu này có thể không giống nhau, nhưng chúng có thể khác nhau đến mức nào? Một câu hỏi tương tự như thế này được trả lời trong thống kê là khoảng tin cậy của phép đo.

Nếu chúng tôi lấy nhiều bộ dữ liệu mẫu độc lập từ tập hợp cơ sở, thì đối với 95% trong số các tập dữ liệu đó, giá trị tổng thể cơ bản thực sự của chỉ số sẽ nằm trong khoảng tin cậy 95% mà chúng tôi sẽ tính toán cho tập dữ liệu mẫu cụ thể đó.

Trong bài viết này, chúng tôi sẽ chỉ cho bạn cách tính khoảng tin cậy cho bất kỳ số lượng chỉ số hiệu suất Học máy nào cùng một lúc, bằng phương pháp bootstrap tự động xác định có bao nhiêu bộ dữ liệu mẫu khởi động được tạo theo mặc định.

Nếu bạn chỉ muốn xem cách gọi mã này để tính khoảng tin cậy, hãy bỏ qua phần “Tính kết quả!" xuống bên dưới.

Phương pháp bootstrap

 
 
Nếu chúng tôi có thể rút ra các tập dữ liệu thử nghiệm bổ sung từ phân phối thực sự bên dưới dữ liệu, chúng tôi sẽ có thể thấy phân phối của (các) chỉ số hiệu suất quan tâm trên các tập dữ liệu đó. (Khi vẽ các bộ dữ liệu đó, chúng tôi sẽ không làm bất cứ điều gì để ngăn việc vẽ một trường hợp giống hệt hoặc tương tự nhiều lần, mặc dù điều này có thể hiếm khi xảy ra.)

Vì chúng tôi không thể làm điều đó, điều tốt nhất tiếp theo là rút ra các bộ dữ liệu bổ sung từ phân phối theo kinh nghiệm của tập dữ liệu thử nghiệm này, có nghĩa là lấy mẫu, có thay thế, từ các phiên bản của nó để tạo tập dữ liệu mẫu bootstrap mới. Lấy mẫu bằng phương pháp thay thế có nghĩa là sau khi chúng tôi vẽ một phiên bản cụ thể, chúng tôi sẽ đặt lại phiên bản đó để có thể vẽ lại phiên bản đó cho cùng một tập dữ liệu mẫu. Do đó, mỗi tập dữ liệu như vậy thường có nhiều bản sao của một số phiên bản và không bao gồm tất cả các phiên bản nằm trong tập thử nghiệm cơ sở.

Nếu chúng tôi lấy mẫu không có thay thế, thì chúng tôi chỉ cần nhận được một bản sao giống hệt nhau của tập dữ liệu gốc mỗi lần, được xáo trộn theo một thứ tự ngẫu nhiên khác, điều này sẽ không được sử dụng.

Sản phẩm phần trăm phương pháp bootstrap để ước tính khoảng tin cậy như sau:

  1. Tạo ra nboots bộ dữ liệu “bootstrap sample”, mỗi bộ có cùng kích thước với bộ thử nghiệm ban đầu. Mỗi bộ dữ liệu mẫu được lấy bằng cách rút ngẫu nhiên các trường hợp từ bộ thử nghiệm có thay thế.
  2. Trên mỗi bộ dữ liệu mẫu, hãy tính toán số liệu và lưu nó.
  3. Khoảng tin cậy 95% được cho bởi 2.5th đến 97.5th phần trăm trong số nboots các giá trị được tính toán của chỉ số. Nếu như nboots=1001 và bạn đã sắp xếp các giá trị theo chuỗi/mảng/danh sách X có độ dài 1001, số 0th phân vị là X[0] và 100th phân vị là X[1000], vì vậy khoảng tin cậy sẽ được đưa ra bởi X[25] đến X[975.

Tất nhiên, bạn có thể tính toán bao nhiêu chỉ số tùy thích cho từng tập dữ liệu mẫu ở bước 2, nhưng ở bước 3, bạn sẽ tìm thấy phần trăm riêng cho từng chỉ số.

Tập dữ liệu mẫu và kết quả khoảng tin cậy

 
 
Chúng tôi sẽ sử dụng kết quả từ bài viết trước này làm ví dụ: Làm thế nào để đối phó với phân loại mất cân bằng, mà không cần cân bằng lại dữ liệuTrước khi xem xét lấy mẫu quá mức dữ liệu bị sai lệch của bạn, hãy thử điều chỉnh ngưỡng quyết định phân loại của bạn.

Trong bài báo đó chúng tôi đã sử dụng cao-Kaggle hai lớp không cân bằng bộ dữ liệu nhận dạng gian lận thẻ tín dụng. Chúng tôi đã chọn sử dụng ngưỡng phân loại hoàn toàn khác với ngưỡng 0.5 mặc định, ngầm định khi sử dụng phương thức predict(), khiến việc cân bằng dữ liệu trở nên không cần thiết. Cách tiếp cận này đôi khi được gọi là ngưỡng di chuyển, trong đó trình phân loại của chúng tôi chỉ định lớp bằng cách áp dụng ngưỡng đã chọn cho xác suất lớp dự đoán được cung cấp bởi dự đoán_proba() phương pháp.

Chúng tôi sẽ giới hạn phạm vi của bài viết này (và mã) đối với phân loại nhị phân: lớp 0 và 1, với lớp 1 theo quy ước là lớp “tích cực” và cụ thể là lớp thiểu số cho dữ liệu mất cân bằng, mặc dù mã sẽ hoạt động cho hồi quy (đơn mục tiêu liên tục) là tốt.

Tạo một tập dữ liệu mẫu khởi động

 
 
Mặc dù mã khoảng tin cậy của chúng tôi có thể xử lý nhiều đối số dữ liệu khác nhau được chuyển đến các hàm số liệu, nhưng chúng tôi sẽ tập trung vào các số liệu kiểu sklearn, luôn chấp nhận hai đối số dữ liệu, y_true và y_pred, trong đó y_pred sẽ là dự đoán của lớp nhị phân (0 hoặc 1), hoặc dự đoán hàm quyết định hoặc xác suất lớp liên tục hoặc thậm chí dự đoán hồi quy liên tục nếu y_true cũng liên tục. Hàm sau đây tạo một tập dữ liệu mẫu khởi động duy nhất. Nó chấp nhận bất kỳ data_args nào nhưng trong trường hợp của chúng tôi, các đối số này sẽ là ytest(thử nghiệm thực tế/đúng của chúng tôi đặt các giá trị mục tiêu trong bài viết trước) Và hardpredtst_tuned_thresh (lớp dự đoán). Cả hai đều chứa các số XNUMX và XNUMX để biểu thị lớp đúng hoặc lớp dự đoán cho từng trường hợp.

Tính đặc hiệu của số liệu tùy chỉnh_score() và các chức năng tiện ích

 
 
Chúng tôi sẽ xác định một hàm số liệu tùy chỉnh cho Tính đặc hiệu, đây chỉ là một tên gọi khác của Thu hồi tiêu cực lớp (lớp 0). Cũng là một hàm calc_metrics áp dụng một chuỗi các số liệu quan tâm cho dữ liệu của chúng tôi và một vài hàm tiện ích cho nó:

Ở đây chúng tôi lập danh sách các số liệu và áp dụng chúng cho dữ liệu. Chúng tôi đã không coi Độ chính xác là một số liệu có liên quan vì âm tính giả (phân loại sai một hành vi gian lận thực sự thành hợp pháp) gây tốn kém cho doanh nghiệp hơn nhiều so với dương tính giả (phân loại sai một hành vi hợp pháp thành gian lận), trong khi Độ chính xác xử lý cả hai loại phân loại sai đều tệ như nhau và do đó ưu tiên phân loại chính xác những người có loại thực sự là loại đa số vì những điều này xảy ra thường xuyên hơn và do đó đóng góp nhiều hơn vào Độ chính xác tổng thể.

met=[ metrics.recall_score, specificity_score, metrics.balanced_accuracy_score ]
calc_metrics(met, ytest, hardpredtst_tuned_thresh)



Tạo từng bộ dữ liệu mẫu khởi động và tính toán số liệu cho nó

 
 
Trong raw_metric_samples(), chúng tôi thực sự sẽ tạo từng bộ dữ liệu mẫu và lưu số liệu của từng bộ dữ liệu:

Bạn cung cấp cho raw_metric_samples() một danh sách các chỉ số (hoặc chỉ một chỉ số) quan tâm cũng như dữ liệu lớp đúng và được dự đoán, đồng thời, nó lấy các tập dữ liệu mẫu của nboots và trả về một khung dữ liệu chỉ với các giá trị của chỉ số được tính từ mỗi tập dữ liệu. Thông qua _boot_generator() nó gọi từng one_boot() trong một biểu thức trình tạo thay vì lưu trữ tất cả các bộ dữ liệu cùng một lúc dưới dạng-lớn danh sách.

Xem số liệu trên 7 bộ dữ liệu mẫu khởi động

 
 
Chúng tôi lập danh sách các hàm số liệu và gọi raw_metric_samples() để nhận kết quả chỉ cho 7 bộ dữ liệu mẫu. Chúng tôi đang gọi raw_metric_samples() ở đây để dễ hiểu — không cần thiết phải sử dụng ci_auto() bên dưới để lấy khoảng tin cậy, mặc dù chỉ định danh sách số liệu (hoặc chỉ một số liệu) cho ci_auto() is cần thiết.

np.random.seed(13)
raw_metric_samples(met, ytest, hardpredtst_tuned_thresh, nboots=7).style.format('{:.2%}') #optional #style



Mỗi cột ở trên chứa các chỉ số được tính toán từ một tập dữ liệu mẫu khởi động (được đánh số từ 0 đến 6), do đó, các giá trị chỉ số được tính toán sẽ khác nhau do lấy mẫu ngẫu nhiên.

Số lượng bộ dữ liệu khởi động, với giá trị mặc định được tính toán

 
 
Trong triển khai của chúng tôi, theo mặc định, số lượng bộ dữ liệu khởi động nboots sẽ được tính toán tự động từ mức độ tin cậy mong muốn (ví dụ: 95%) để đáp ứng khuyến nghị của Bắc, Curtis và Sham để có số lượng kết quả khởi động tối thiểu trong mỗi đuôi của bản phân phối. (Thực ra khuyến nghị này áp dụng cho p-giá trị và do đó kiểm tra giả thuyết vùng chấp nhận, Nhưng khoảng tin cậy tương tự như những người sử dụng điều này như một quy tắc ngón tay cái.) Mặc dù các tác giả đó khuyến nghị tối thiểu 10 kết quả khởi động ở phần đuôi, Davidson & MacKinnon đề xuất ít nhất 399 chiếc ủng để có độ tin cậy 95%, yêu cầu 11 chiếc ủng ở đuôi, vì vậy chúng tôi sử dụng đề xuất thận trọng hơn này.

Chúng tôi chỉ định alpha là 1 – mức tin cậy. Ví dụ: độ tin cậy 95% trở thành 0.95 và alpha=0.05. Nếu bạn chỉ định số lượng giày rõ ràng (có thể nhỏ hơn nboots bởi vì bạn muốn có kết quả nhanh hơn) nhưng vẫn chưa đủ cho alpha bạn yêu cầu, alpha cao hơn sẽ được chọn tự động để có được khoảng tin cậy chính xác cho số lần khởi động đó. Tối thiểu 51 ủng sẽ được sử dụng vì bất kỳ ít hơn nào cũng chỉ có thể tính toán chính xác các mức độ tin cậy nhỏ một cách kỳ lạ (chẳng hạn như độ tin cậy 40% tạo ra khoảng cách từ 30th phần trăm đến 70th phần trăm, có 40% bên trong khoảng nhưng 60% bên ngoài khoảng) và không rõ ràng rằng đề xuất khởi động tối thiểu thậm chí đã dự tính trường hợp như vậy.

Hàm get_alpha_nboots() đặt nboots mặc định hoặc sửa đổi alpha và nboots được yêu cầu ở trên:

Hãy hiển thị nboots mặc định cho các giá trị khác nhau của alpha:

g = get_alpha_nboots pd.DataFrame( [ g(0.40), g(0.20, None), g(0.10), g(), g(alpha=0.02), g(alpha=0.01, nboots=None), g(0.005, nboots=None) ], columns=['alpha', 'default nboots'] ).set_index('alpha')



Đây là những gì xảy ra nếu chúng tôi yêu cầu một nboots rõ ràng:

req=[(0.01,3000), (0.01,401), (0.01,2)]
out=[get_alpha_nboots(*args) for args in req]
mydf = lambda x: pd.DataFrame(x, columns=['alpha', 'nboots'])
pd.concat([mydf(req),mydf(out)],axis=1, keys=('Requested','Using'))



Các giá trị nboots nhỏ đã tăng alpha lên 0.05 và 0.40 và nboots=2 được thay đổi thành mức tối thiểu là 51.

Biểu đồ của bộ dữ liệu mẫu bootstrap hiển thị khoảng tin cậy chỉ dành cho Độ chính xác cân bằng

 
 
Một lần nữa, chúng ta không cần phải làm điều này để có được khoảng tin cậy bên dưới bằng cách gọi ci_auto().

np.random.seed(13)
metric_boot_histogram (metrics.balanced_accuracy_score, ytest, hardpredtst_tuned_thresh)



Đường màu cam hiển thị 89.7% là giới hạn dưới của khoảng tin cậy Độ chính xác cân bằng, màu xanh lục cho Độ chính xác cân bằng được quan sát ban đầu=92.4% (ước tính điểm) và màu đỏ cho giới hạn trên 94.7%. (Hình ảnh tương tự xuất hiện ở đầu bài viết này.)

Cách tính tất cả các khoảng tin cậy cho danh sách số liệu

 
 
Đây là hàm chính gọi hàm trên và tính toán khoảng tin cậy từ phần trăm của kết quả số liệu và chèn ước tính điểm làm cột đầu tiên của khung dữ liệu kết quả đầu ra.

Tính kết quả!

 
 
Đây là tất cả những gì chúng ta thực sự cần làm: gọi ci_auto() như sau với một danh sách các số liệu (met được chỉ định ở trên) để lấy khoảng tin cậy của chúng. Định dạng phần trăm là tùy chọn:

np.random.seed(13)
ci_auto( met, ytest, hardpredtst_tuned_thresh ).style.format('{:.2%}')



Thảo luận về khoảng tin cậy kết quả

 
 
Đây là ma trận nhầm lẫn từ ban đầu bài viết. Loại 0 là tiêu cực (loại đa số) và Loại 1 là tích cực (loại rất hiếm)



Thu hồi (Tỷ lệ tích cực thực sự) là 134/(134+14) có khoảng tin cậy rộng nhất vì đây là tỷ lệ nhị thức liên quan đến số lượng nhỏ.

Độ đặc hiệu (Tỷ lệ âm tính thực) là 80,388/(80,388+4,907), bao gồm nhiều số lượng lớn hơn, do đó, nó có khoảng tin cậy cực kỳ hẹp chỉ [94.11% đến 94.40%].

Do Độ chính xác cân bằng được tính đơn giản là giá trị trung bình của Thu hồi và Độ đặc hiệu, độ rộng của khoảng tin cậy của nó là trung gian giữa chúng'.

Độ chính xác của phép đo chỉ số do các biến thể trong dữ liệu thử nghiệm, so với các biến thể trong dữ liệu đào tạo

 
 
Ở đây chúng ta chưa xét đến sự thay đổi của kiểu mẫu dựa trên sự ngẫu nhiên của chúng tôi đào tạo dữ liệu (mặc dù điều đó cũng có thể được quan tâm cho một số mục đích, ví dụ: nếu bạn đã tự động đào tạo lại nhiều lần và muốn biết hiệu suất của các mô hình trong tương lai có thể thay đổi như thế nào), mà chỉ là sự thay đổi trong phép đo hiệu suất của dữ liệu này riêng mô hình (được tạo từ một số dữ liệu đào tạo cụ thể) do tính ngẫu nhiên của chúng tôi thử nghiệm dữ liệu.

Nếu chúng tôi có đủ dữ liệu thử nghiệm độc lập, chúng tôi có thể đo lường rất chính xác hiệu suất của mô hình cụ thể này trên tập hợp cơ bản và chúng tôi sẽ biết nó sẽ hoạt động như thế nào nếu mô hình này được triển khai, bất kể chúng tôi đã xây dựng mô hình như thế nào và liệu chúng tôi có thể có được một mô hình tốt hơn hoặc xấu hơn với một tập dữ liệu mẫu đào tạo khác.

Độc lập của các trường hợp cá nhân

 
 
Phương pháp bootstrap giả định rằng mỗi phiên bản của bạn (trường hợp, quan sát) được rút ra độc lập với tập hợp cơ bản. Nếu bộ thử nghiệm của bạn có các nhóm hàng không độc lập với nhau, chẳng hạn như các quan sát lặp đi lặp lại của cùng một thực thể có khả năng tương quan với nhau hoặc các trường hợp được lấy mẫu quá mức/sao chép/được tạo từ các thực thể khác trong thử nghiệm của bạn thiết lập, kết quả có thể không hợp lệ. Bạn có thể cần phải sử dụng được nhóm lại lấy mẫu, trong đó bạn vẽ toàn bộ các nhóm lại với nhau một cách ngẫu nhiên thay vì các hàng riêng lẻ, đồng thời tránh chia nhỏ bất kỳ nhóm nào hoặc chỉ sử dụng một phần của nhóm đó.

Ngoài ra, bạn muốn đảm bảo rằng bạn không có các nhóm được phân chia trên tập huấn luyện và tập kiểm tra, bởi vì khi đó tập kiểm tra không nhất thiết phải độc lập và bạn có thể bị quá khớp mà không bị phát hiện. Ví dụ: nếu bạn sử dụng lấy mẫu quá mức, bạn thường chỉ nên làm sau khi nó đã được tách ra khỏi bộ kiểm tra, không phải trước đó. Và thông thường, bạn sẽ lấy mẫu quá mức tập huấn luyện chứ không phải tập kiểm tra, vì tập kiểm tra phải đại diện cho các phiên bản mà mô hình sẽ thấy khi triển khai trong tương lai. Và để xác thực chéo, bạn sẽ muốn sử dụng scikit-learn's model_selection.GroupKFold().

Kết luận

 
 
Bạn luôn có thể tính khoảng tin cậy cho (các) chỉ số đánh giá của mình để xem dữ liệu thử nghiệm cho phép bạn đo hiệu suất của mô hình chính xác đến mức nào. Tôi đang lên kế hoạch cho một bài viết khác để chứng minh khoảng tin cậy cho các chỉ số đánh giá dự đoán xác suất (hoặc điểm tin cậy - không liên quan đến độ tin cậy thống kê), tức là phân loại mềm, chẳng hạn như Mất nhật ký hoặc ROC AUC, thay vì các chỉ số chúng tôi đã sử dụng ở đây để đánh giá sự lựa chọn rời rạc của lớp theo mô hình (phân loại cứng). Cùng một mã hoạt động cho cả hai, cũng như cho hồi quy (dự đoán biến mục tiêu liên tục) — bạn chỉ cần chuyển cho nó một loại dự đoán khác (và loại mục tiêu thực khác trong trường hợp hồi quy).

Máy tính xách tay jupyter này có sẵn trong github: bootConfIntAutoV1o_standalone.ipynb

Bài viết này có nhiều thông tin và/hoặc hữu ích không? Vui lòng đăng nhận xét bên dưới nếu bạn có bất kỳ nhận xét hoặc câu hỏi nào về bài viết này hoặc về khoảng tin cậy, bootstrap, số lần khởi động, triển khai này, tập dữ liệu, mô hình, ngưỡng di chuyển hoặc kết quả.

Ngoài những điều đã nói ở trên bài viết trước, bạn cũng có thể quan tâm đến tôi Cách tự động phát hiện các cột ngày / giờ và đặt kiểu dữ liệu của chúng khi đọc tệp CSV trong Pandas, mặc dù nó không liên quan trực tiếp đến bài viết hiện tại.

Một số quyền được bảo lưu

 
Tiểu sử: David B Rosen (Tiến sĩ) là Trưởng nhóm Khoa học Dữ liệu về Phê duyệt Tín dụng Tự động tại Tài trợ Toàn cầu của IBM. Tìm thêm bài viết của David tại dabruro.medium.com.

Nguyên. Đăng lại với sự cho phép.

Liên quan:

Nguồn: https://www.kdnuggets.com/2021/10/calculate-trust-intervals-performance-metrics-machine-learning.html

Dấu thời gian:

Thêm từ Xe đẩy