Đo lường độ chính xác của mô hình dựa trên hồi quy logistic


26

Tôi có một mô hình hồi quy logistic được đào tạo mà tôi đang áp dụng cho một tập dữ liệu thử nghiệm. Biến phụ thuộc là nhị phân (boolean). Đối với mỗi mẫu trong tập dữ liệu thử nghiệm, tôi áp dụng mô hình hồi quy logistic để tạo% xác suất rằng biến phụ thuộc sẽ là đúng. Sau đó, tôi ghi lại liệu giá trị acutal là đúng hay sai. Tôi đang cố gắng tính toán một con số hoặc Điều chỉnh như trong mô hình hồi quy tuyến tính.R2R2

Điều này mang lại cho tôi một bản ghi cho từng mẫu trong bộ thử nghiệm như:

prob_value_is_true         acutal_value
   .34                          0
   .45                          1
   .11                          0
   .84                          0
    ....                        ....          

Tôi đang tự hỏi làm thế nào để kiểm tra độ chính xác của mô hình. Nỗ lực đầu tiên của tôi là sử dụng bảng dự phòng và nói "nếu prob_value_is_true> 0,80, hãy đoán rằng giá trị thực là đúng" và sau đó đo tỷ lệ chính xác với phân loại không chính xác. Nhưng tôi không thích điều đó, vì cảm giác giống như tôi chỉ đánh giá 0,80 là ranh giới, không phải là độ chính xác của mô hình nói chung và ở tất cả các prob_value_is_truegiá trị.

Sau đó, tôi đã cố gắng chỉ xem xét từng giá trị riêng biệt của prob_value_is_true, xem xét tất cả các mẫu trong đó prob_value_is_true= 0,34 và đo% của các mẫu trong đó giá trị acutal là đúng (trong trường hợp này, độ chính xác hoàn hảo sẽ là nếu% của các mẫu đó là sự thật = 34%). Tôi có thể tạo một điểm chính xác của mô hình bằng cách tính tổng chênh lệch ở mỗi giá trị riêng biệt của prob_value_is_true. Nhưng kích thước mẫu là một mối quan tâm lớn ở đây, đặc biệt là đối với các cực trị (gần 0% hoặc 100%), do đó trung bình của các giá trị acutal là không chính xác, vì vậy sử dụng chúng để đo độ chính xác của mô hình có vẻ không đúng.

Tôi thậm chí đã thử tạo ra các phạm vi lớn để đảm bảo đủ kích thước mẫu (0-.25, .25-.50, .50-.75, .75-1.0), nhưng làm thế nào để đo lường "mức độ tốt" của% giá trị thực đó làm tôi thất vọng . Nói tất cả các mẫu trong prob_value_is_truekhoảng từ 0,25 đến 0,50 có trung bình acutal_value0,45. Điều đó có tốt không vì nó nằm trong phạm vi? Xấu vì nó không gần 37,5% (trung tâm của phạm vi)?

Vì vậy, tôi bị mắc kẹt ở những gì có vẻ như là một câu hỏi dễ dàng và hy vọng ai đó có thể chỉ cho tôi một tài nguyên hoặc phương pháp để tính toán độ chính xác cho mô hình hồi quy logistic.


Tôi nghĩ ví dụ về phạm vi: (0-.25, .25-.50, .50-.75, .75-1.0) có ý nghĩa. Nó sẽ hữu ích nếu bạn thu hẹp phạm vi? Chẳng hạn như: 0-.03, .03-.06, .06-.09, ..... tức là, mỗi 0,03. Điều này có thể hữu ích cho các khu vực có nhiều điểm dữ liệu.
mac

Câu trả lời:


18

Một biện pháp thường được sử dụng để xác nhận hồi quy logistic, là AUC của đường cong ROC (biểu đồ độ nhạy chống lại tính đặc hiệu 1 - chỉ cần google cho các thuật ngữ nếu cần). Điều này, về bản chất, đánh giá toàn bộ phạm vi của các giá trị ngưỡng.

Mặt khác: việc đánh giá toàn bộ phạm vi của các giá trị ngưỡng có thể không phải là những gì bạn theo đuổi, vì điều này (thường) bao gồm các ngưỡng dẫn đến số lượng rất lớn âm tính giả hoặc dương tính giả. Có các phiên bản của AUC chiếm phần này (AUC một phần), vì vậy nếu đó là một vấn đề cho bạn, bạn có thể xem xét điều đó.


1
Đặt AUC sang một bên, tôi có đúng không khi cho rằng việc xây dựng Đường cong ROC là như thế này? Đối với mỗi giá trị riêng biệt của prob_value_is_true, hãy tạo một bảng dự phòng bằng cách sử dụng giá trị rời rạc làm ngưỡng. Sau đó ghi lại Tỷ lệ Tích cực Đúng và Tỷ lệ Tích cực Sai của từng bảng dự phòng. Vẽ tỷ lệ cho tất cả các bảng dự phòng trên một biểu đồ phân tán và bạn sẽ thấy đường cong ROC? Nghe có đúng không?
John Reed

Tôi kết hợp một số mã để làm điều này, chỉ cung cấp các giá trị ngẫu nhiên là xác suất và giá trị thực và đó là một đường thẳng. Tôi giả sử AUC đang đo độ lệch của "đường cong" từ một mô hình được trang bị để chống lại "đường thẳng" hay tính ngẫu nhiên?
John Reed

Về ROC: vâng, điều đó đúng. Có một số biến thể (ít nhiều được làm mịn; có tính đến xác suất dự đoán cho sự lựa chọn ngưỡng của bạn hay không). Lưu ý rằng (tùy thuộc vào phần mềm / ngôn ngữ bạn đã sử dụng), có vô số công cụ hiện có cung cấp công cụ này. Wrt AUC: nó không nhiều hơn hoặc ít hơn diện tích thực tế dưới đường cong ROC. Không phải là một công cụ dự đoán ngẫu nhiên hoàn hảo, đường cong ROC sẽ là một đường thẳng từ (0,0) đến (1,1), dẫn đến AUC là 0,5. AUC có một số giải thích hay, mặc dù (xem Google hoặc Wikipedia thậm chí :-))
Nick Sabbe

8

Bạn đúng khi lo lắng về tỷ lệ được phân loại chính xác vì chủ yếu phản ánh ảnh hưởng của một ranh giới tùy ý. Tôi muốn giới thiệu hai biện pháp. Một là khu vực -index hoặc ROC như những người khác đã mô tả. Điều này có một cách giải thích đơn giản hơn so với suy nghĩ về một đường cong ROC và là thước đo của sự phân biệt dự đoán thuần túy. Thứ hai, ước tính một đường cong hiệu chuẩn liên tục mà không có bất kỳ dữ liệu nào. Nếu dự đoán đang được đánh giá trên một tập dữ liệu độc lập, bạn có thể sử dụng tắt phát hiện ngoại lệ để ước tính mối quan hệ giữa Dự đoán và thực tế [Y = 1]. Các chức năng trong R gói sẽ làm cả hai điều. Các chức năng khác trongclowessval.probrmsrms sẽ làm tương tự để xác nhận nội bộ, sử dụng việc lấy mẫu lại để loại bỏ các ảnh hưởng của quá mức.


6

Nếu dữ liệu của bạn được nhóm theo giá trị , bạn có thể tính toán giá trị dự đoán của mô hình và khoảng tin cậy được liên kết và xem liệu tỷ lệ phần trăm quan sát có nằm trong phạm vi đó không. Ví dụ, nếu bạn có 10 quan sát tại , 10 obs tại , 10 obs tại , vv, thì , vv, sẽ mang lại tỷ lệ phần trăm có thể được so sánh với dự đoán. Hãy nhớ rằng, ngay cả khi mô hình hoàn hảo, một số phần trăm được quan sát sẽ bật ra ngoài 95% CI, giống như trong hồi quy OLS. Nếu dữ liệu của bạn không được nhóm, bạn có thể tạo các nhóm của riêng mình bằng cách tạo dữ liệu theo phạm vi củaxx=10x=20x=30mean(y[x==10]==1)mean(y[x==20]==1)xbiến, như bạn đề nghị. Điều này không hoàn toàn hợp lệ, vì nó sẽ phụ thuộc vào sự lựa chọn thùng, có thể hữu ích như một cách khám phá mô hình của bạn.

Nói chung, nhiệm vụ bạn đã đưa ra cho mình ở đây là khó khăn. Đó là bởi vì, với hồi quy logistic, bạn đang đối phó với hai loại khác nhau. Dự đoán của mô hình là một biến tiềm ẩn, trong khi biến phản ứng được quan sát của bạn (trong khi có lẽ được tạo bởi một biến tiềm ẩn) thì không. Tất nhiên, mọi người thường sẽ muốn biết phản ứng dự đoán là gì và điều đó hoàn toàn hợp lý; đây chỉ là một trong những trường hợp mà cuộc sống không công bằng.

Nếu bạn muốn dự đoán kết quả, bạn cần quyết định những gì bạn muốn tối đa hóa. Nếu bạn chỉ có 1 trường hợp và bạn muốn dự đoán của mình có khả năng đúng nhất, bạn nên dự đoán , nếu . (Điều này hoàn toàn trực quan.) Mặt khác, nếu bạn muốn tối đa hóa độ chính xác tổng thể trên tổng mẫu của bạn (hoặc bất kỳ nhóm nào khác), bạn nên dự đoán , nếu . Ví dụ: giả sử trong mẫu của bạn, 30% của tất cả các trường hợp là 1, thì nếu , bạn nên dự đoán rằng sẽ là , mặc dù đó lày=1y^.5y=1y^p(y=1)y^=.31y1<.5. Điều này là phản trực giác và rất nhiều người vấp ngã ở đây, nhưng thuật toán này sẽ tối đa hóa độ chính xác của bạn.

Một cách toàn diện hơn để suy nghĩ về lượng thông tin trong mô hình của bạn, là tích hợp vào mức độ chính xác mà bạn sẽ được cung cấp cho mọi ngưỡng có thể(0,1)R2R2c


Câu trả lời chính xác! Vì vậy, trong ví dụ 30% của tất cả các trường hợp là 1, xác suất dự đoán 0,31 của một trường hợp cụ thể giống như "xếp hạng" của trường hợp này so với các trường hợp khác về mức độ gần với 1 (càng lớn càng gần)? Và nó không nên được coi là xác suất dự đoán rằng trường hợp cụ thể này là 1?
mac

1
y^i=.311.31.31.25

3

Tôi nghĩ rằng bạn có thể thiết lập một ngưỡng (giả sử 0,5), vì vậy khi xác suất của bạn bằng hoặc lớn hơn ngưỡng đó, lớp dự đoán của bạn sẽ là 1 và 0 nếu không. Sau đó, bạn có thể có được thước đo độ chính xác của mình theo cách này:

confusion_matrix <- ftable(actual_value, predicted_value)
accuracy <- sum(diag(confusion_matrix))/number of events*100

Cho rằng xác suất của bạn là xác suất đưa ra dữ liệu của bạn (x) và sử dụng mô hình của bạn, giá trị lớp của bạn bằng 1, tôi không hiểu tại sao bạn luôn đạt được các giá trị xác suất thấp hơn 0,5. Tần suất của các lớp thực tế của bạn (fact_value) là bao nhiêu?


2

Bạn có thể muốn xem gói của tôi softclassval(tại softgroupval.r-forge.r-project.org bạn cũng tìm thấy hai bài thuyết trình bằng miệng mà tôi đã đưa ra về các ý tưởng đằng sau gói).

Tôi đã viết nó cho một vấn đề hơi khác, cụ thể là nếu tài liệu tham khảo (ví dụ như bệnh lý học) "từ chối" để đưa ra một lớp rõ ràng. Tuy nhiên, bạn có thể sử dụng nó với các lớp cứng "bình thường" và nó tránh định nghĩa về ngưỡng để làm cứng dự đoán liên tục ban đầu - vì vậy bạn không đánh giá 0,8.

Tuy nhiên, tôi khuyên bạn nên sử dụng cùng với biểu đồ ROC hoặc độ nhạy độ đặc hiệu: kết quả thường trông khá tệ vì các phương pháp "của tôi" sẽ xử phạt các sai lệch nhỏ (ví dụ 0,9 thay vì 1 cho chênh lệch 0,1 đối với các biện pháp của tôi , nhưng tất cả các ngưỡng dưới 0,9 sẽ bỏ qua điều này). Trên thực tế tôi nghĩ rằng đó là một lợi thế: sự thiếu độ nhạy nhỏ này của người chủ nghĩa sai lệch nhỏ là một trong những điểm chính của sự chỉ trích với các biện pháp "cứng" như độ chính xác, độ nhạy, thu hồi, v.v.

Ngoài ra, bằng cách so sánh lỗi trung bình tuyệt đối trung bình (MAE) và lỗi bình phương trung bình gốc RMSE, bạn có thể tìm hiểu xem bạn có nhiều sai lệch nhỏ hay ít mẫu bị đánh giá sai không.


1

Pri=invlogit(a+bxi)

y.rep[i]Bernoulli(p[i])

Sau đó, chạy mô phỏng này, nói, 100 lần. Bạn sẽ có một ma trận với n hàng (n là số lượng đối tượng) và k cột (trong trường hợp này, k = 100, số lượng mô phỏng). Trong mã r:

for (j  in 1:100)
  mat.y.rep[,j] <- Bernoulli ( p) # p is a vector with a probability for each subject

Bây giờ bạn tính toán sự khác biệt giữa dự đoán trong mỗi mô phỏng và quan sát. Sau khi tính toán sự khác biệt này, chỉ cần tính số trung bình của dương tính thật và dương tính giả cho mỗi hàng (mỗi đối tượng) và vẽ biểu đồ. Hoặc tính cả hai cho mỗi cột (mô phỏng) e vẽ biểu đồ (tôi thích cái này).

Hy vọng nó giúp...


1

Có nhiều cách để ước tính độ chính xác của các dự đoán đó và sự lựa chọn tối ưu thực sự phụ thuộc vào việc ước tính sẽ được thực hiện cho mục đích gì.

Ví dụ: nếu bạn có kế hoạch chọn một vài điểm số cao cho một nghiên cứu tiếp theo đắt tiền, bạn có thể muốn tối đa hóa độ chính xác ở điểm cao. Mặt khác, nếu nghiên cứu tiếp theo rẻ, bạn có thể muốn tối đa hóa thu hồi (độ nhạy) ở điểm thấp hơn. ROC AUC có thể phù hợp nếu bạn so sánh các phương pháp khác nhau, v.v.

Về phía thực tế, Rcủa ROCRgói chứa 2 chức năng hữu ích

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Cùng với nhau, các hàm này có thể tính toán một loạt các thước đo độ chính xác, bao gồm các giá trị vô hướng toàn cầu (chẳng hạn như "auc" ) và các vectơ phụ thuộc điểm để vẽ các đường cong Recall-precision và ROC ( "pre" , "rec" , "tpr""fpr" , v.v.)


1

Bạn cần xác định những gì bạn có nghĩa là "chính xác". Những gì bạn muốn biết, xin vui lòng tha thứ cho tôi vì đã đưa từ ngữ vào miệng, là mô hình của bạn phù hợp với dữ liệu đào tạo như thế nào và quan trọng hơn là mô hình này "khái quát hóa" như thế nào đối với các mẫu không có trong dữ liệu đào tạo của bạn. Mặc dù các đường cong ROC có thể hữu ích trong việc phân tích sự đánh đổi giữa độ chính xác và thu hồi các giá trị khác nhau của ngưỡng, tôi khuyên bạn nên thêm lỗi bình phương trung bình hoặc điểm Brier vào hộp công cụ của bạn. Thật dễ dàng để tính toán và bạn có thể cảm nhận ngay được liệu các thay đổi tính năng có ảnh hưởng đến sự phù hợp của mô hình hay không, khi áp dụng vào dữ liệu đào tạo. Vì trường hợp quá sức là có thể trong trường hợp này, công việc của bạn không được thực hiện ở đây. Để đánh giá hiệu suất tổng quát hóa hoặc mức độ bạn làm trên dữ liệu bạn chưa thấy, đó không phải là ' t đủ để xem hiệu suất của bạn trên các mẫu đào tạo. Tất nhiên mô hình của bạn tốt ở những điều đó, bởi vì chúng là các giá trị bạn đã sử dụng để xác định các hệ số cho logistic của bạn. Bạn cần đặt một số mẫu cho dữ liệu thử nghiệm. Hiệu suất MSE của bạn trên bộ này sẽ đặt kỳ vọng khái quát của bạn theo bất đẳng thức Hoeffding. Lỗi tổng quát hóa tối đa của bạn sẽ phụ thuộc vào số lượng tính năng trong mô hình của bạn cũng như số lượng mẫu được sử dụng để tính toán thống kê kiểm tra. Hãy chú ý rằng bạn sẽ cần lấy cắp một số mẫu đào tạo của bạn để lấy mẫu thử. Tôi khuyên bạn nên xác thực chéo 10 lần, trong đó bạn xáo trộn, chọn 90% cho đào tạo, 10% cho thử nghiệm, sau đó đo, lặp lại, và sau đó tính trung bình tất cả các phép đo. bởi vì chúng là các giá trị bạn đã sử dụng để xác định các hệ số cho logistic của bạn. Bạn cần đặt một số mẫu cho dữ liệu thử nghiệm. Hiệu suất MSE của bạn trên bộ này sẽ đặt kỳ vọng khái quát của bạn theo bất đẳng thức Hoeffding. Lỗi tổng quát hóa tối đa của bạn sẽ phụ thuộc vào số lượng tính năng trong mô hình của bạn cũng như số lượng mẫu được sử dụng để tính toán thống kê kiểm tra. Hãy chú ý rằng bạn sẽ cần lấy cắp một số mẫu đào tạo của bạn để lấy mẫu thử. Tôi khuyên bạn nên xác thực chéo 10 lần, trong đó bạn xáo trộn, chọn 90% cho đào tạo, 10% cho thử nghiệm, sau đó đo, lặp lại, và sau đó tính trung bình tất cả các phép đo. bởi vì chúng là các giá trị bạn đã sử dụng để xác định các hệ số cho logistic của bạn. Bạn cần đặt một số mẫu cho dữ liệu thử nghiệm. Hiệu suất MSE của bạn trên bộ này sẽ đặt kỳ vọng khái quát của bạn theo bất đẳng thức Hoeffding. Lỗi tổng quát hóa tối đa của bạn sẽ phụ thuộc vào số lượng tính năng trong mô hình của bạn cũng như số lượng mẫu được sử dụng để tính toán thống kê kiểm tra. Hãy chú ý rằng bạn sẽ cần lấy cắp một số mẫu đào tạo của bạn để lấy mẫu thử. Tôi khuyên bạn nên xác thực chéo 10 lần, trong đó bạn xáo trộn, chọn 90% cho đào tạo, 10% cho thử nghiệm, sau đó đo, lặp lại, và sau đó tính trung bình tất cả các phép đo. Hiệu suất MSE của bạn trên bộ này sẽ đặt kỳ vọng khái quát của bạn theo bất đẳng thức Hoeffding. Lỗi tổng quát hóa tối đa của bạn sẽ phụ thuộc vào số lượng tính năng trong mô hình của bạn cũng như số lượng mẫu được sử dụng để tính toán thống kê kiểm tra. Hãy chú ý rằng bạn sẽ cần lấy cắp một số mẫu đào tạo của bạn để lấy mẫu thử. Tôi khuyên bạn nên xác thực chéo 10 lần, trong đó bạn xáo trộn, chọn 90% cho đào tạo, 10% cho thử nghiệm, sau đó đo, lặp lại, và sau đó tính trung bình tất cả các phép đo. Hiệu suất MSE của bạn trên bộ này sẽ đặt kỳ vọng khái quát của bạn theo bất đẳng thức Hoeffding. Lỗi tổng quát hóa tối đa của bạn sẽ phụ thuộc vào số lượng tính năng trong mô hình của bạn cũng như số lượng mẫu được sử dụng để tính toán thống kê kiểm tra. Hãy chú ý rằng bạn sẽ cần lấy cắp một số mẫu đào tạo của bạn để lấy mẫu thử. Tôi khuyên bạn nên xác thực chéo 10 lần, trong đó bạn xáo trộn, chọn 90% cho đào tạo, 10% cho thử nghiệm, sau đó đo, lặp lại, và sau đó tính trung bình tất cả các phép đo.


1

0log(1p^)01log(p^)1

Điều này không bị ngưỡng tùy ý. Các biện pháp càng nhỏ càng tốt.

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.