Tìm đường cong ROC ngưỡng tốt nhất Python

Mỗi khi học Hồi quy logistic, chúng ta luôn gặp phải câu hỏi Làm cách nào để tìm giá trị Ngưỡng tối ưu cho mô hình của mình?  


Nếu ai chưa biết Threshold value trong Logistic Regression là gì thì phải xem link này


https. //www. vô cựccodex. trong/hậu cần-hồi quy-trong-máy-học


Và đối với những người biết giá trị ngưỡng là gì có thể tiếp tục đọc

Bây giờ tại sao một số người dùng/khách hàng muốn thay đổi giá trị ngưỡng và tại vấn đề nào chúng ta nên quyết định rằng chúng ta phải thay đổi giá trị ngưỡng

 

Bây giờ giá trị ngưỡng có thể được tăng hoặc giảm dựa trên vấn đề hoặc tập dữ liệu mà chúng tôi đang xử lý. Nhân tiện, giá trị ngưỡng mặc định trong Hồi quy logistic là 0. 5. Bây giờ bạn hẳn đang nghĩ tại sao chúng ta lại muốn tăng hoặc giảm giá trị ngưỡng?

Hãy hiểu điều này với 2 kịch bản đơn giản, một kịch bản giảm và kịch bản khác tăng giá trị ngưỡng

 

1. ] Giảm giá trị Ngưỡng

Giả sử bạn muốn dự đoán rằng những sinh viên đạt điểm dưới 30% sẽ trượt trong kỳ thi đó. Vì vậy, tại tuyên bố vấn đề này, bạn phải giảm giá trị ngưỡng xuống 30%

 

2. ] Tăng giá trị Ngưỡng

Giả sử bạn có bộ dữ liệu về ung thư và bác sĩ nói với bạn rằng bạn phải dự đoán người đó có bị ung thư hay không. Nếu người đó bị nhiễm bệnh trên 80% thì người đó nên được coi là bị ung thư nặng nhất và cần hóa trị ngay lập tức nếu người đó có ít hơn 80% khả năng chúng ta có thể coi người đó có thể được điều trị bằng thuốc bình thường.  

Tôi biết hầu hết họ đều đã biết tất cả những điều này bởi câu hỏi chính là làm thế nào để chúng ta mã hóa toàn bộ quá trình này từ việc tìm giá trị Ngưỡng tối ưu cho đến khi thay đổi giá trị ngưỡng


Chúng tôi sẽ sử dụng Đường cong ROC sẽ giúp chúng tôi dự đoán giá trị ngưỡng tối ưu. Dành cho những ai chưa biết ROC Curve là gì. Đường cong ROC được gọi là Đặc tính hoạt động của máy thu

* Đường cong ROC được sử dụng trong Phân loại nhị phân

* Đó là biểu đồ của Tỷ lệ dương thực [1] trên trục Y so với tỷ lệ dương sai [0] trên trục X

* Một khi bạn nhận được đầu ra trong xác suất. Bạn có thể sử dụng điểm giới hạn khác nhau để phân biệt đâu sẽ là Trường hợp Đúng và đâu sẽ là Trường hợp Sai

* Đường cong ROC cho biết khi đường cong của bạn gần với Trục Y hơn, đó là Tỷ lệ dương thực sự thì đó là một mô hình rất tốt và mô hình của bạn ở giữa đó là 0. 5 so với mô hình trung bình và nếu đường cong của bạn hướng tới Tỷ lệ Tích cực Sai thì đó là mô hình tồi tệ nhất

Đường cong ROC trông giống như thế này




MÃ.

nhập gấu trúc dưới dạng pd
nhập numpy dưới dạng np

data = pd. read_csv["D. \corona\heart_Disease\heart. csv"]
dữ liệu. cái đầu[]





dữ liệu = pd. get_dummies[data, column=['cp','slope','thal','retecg'], drop_first=True]
data. cái đầu[]




từ sklearn. model_selection nhập train_test_split

X = dữ liệu. drop['mục tiêu', trục=1]. giá trị
y = dữ liệu['mục tiêu']. giá trị


X_train, X_test, y_train, y_test = train_test_split[X, y, test_size=0. 2, random_state=42]



Chuẩn hóa các giá trị bằng MinMaxScaler.


từ sklearn. tiền xử lý nhập MinMaxScaler

scaler = MinMaxScaler[]

X_train = scaler. fit_transform[X_train]
X_test = scaler. biến đổi[X_test]



Tìm giá trị ngưỡng

Tại đây, bạn có thể sử dụng Cây quyết định, Rừng ngẫu nhiên, Đóng bao, Tăng tốc. vân vân.

từ sklearn. nhập số liệu roc_auc_score, roc_curve

# Rừng ngẫu nhiên
từ sklearn. nhập đồng bộ RandomForestClassifier

rf_model = RandomForestClassifier[]
rf_model. fit[X_train, y_train]

rf_ytrain_pred = rf_model. Predict_proba[X_train]
print["Tàu RF roc-auc. {}". định dạng[roc_auc_score[y_train, rf_ytrain_pred[. ,1]]]]]

rf_y_test_pred = rf_model. Predict_proba[X_test]
print["Thử nghiệm RF roc-acc. {}". định dạng[roc_auc_score[y_test, rf_y_test_pred[. ,1]]]]]

#---------------------------------- . linear_model nhập LogisticRegression

# Logistic Regression
from sklearn.linear_model import LogisticRegression

lg_model = LogisticRegression[]
lg_model. fit[X_train, y_train]

lg_ytrain_pred = lg_model. Predict_proba[X_train]
print["LG Train roc-auc. {}". định dạng[roc_auc_score[y_train, lg_ytrain_pred[. ,1]]]]]

lg_y_test_pred = lg_model. Predict_proba[X_test]
print["LG Test roc-auc. {}". định dạng[roc_auc_score[y_test, lg_y_test_pred[. ,1]]]]



Đầu ra.

RF Train roc-auc. 1. 0
Roc-acc thử nghiệm RF. 0. 915948275862069
LG Train roc-auc. 0. 9226736566186108
LG Test roc-auc. 0. 9450431034482759


Lựa chọn giá trị ngưỡng tốt nhất cho độ chính xác

pred = []

cho mô hình trong [rf_model, lg_model].
    pred. nối thêm [pd. Sê-ri [mô hình. dự đoán_proba[X_test][. ,1]]]

Final_pred = pd. concat[pred, axis=1]. mean[axis=1]
print["Kiểm tra tập hợp roc-auc. {}". định dạng[roc_auc_score[y_test,Final_pred]]]


Đầu ra.

Kiểm tra tập hợp roc-auc. 0. 9407327586206897

# Tính đường cong roc

False_pos_rate, True_pos_rate, Ngưỡng = roc_curve[y_test, final_pred]

threshold


Đầu ra.

mảng[[1. 97525308, 0. 97525308, 0. 82803343, 0. 82740393, 0. 61206134, 0. 5829135 , 0. 48185878, 0. 45554149, 0. 45229139, 0. 38156861, 0. 21880427, 0. 07000419, 0. 06909258, 0. 0069847 ]]

Đây là một số ứng cử viên tốt nhất mà từ đó chúng tôi có thể chọn giá trị ngưỡng của mình.


từ sklearn. nhập số liệu precision_score

acc = []

cho ngưỡng.
    y_pred = np. where[FINAL_pred>thres,1,0]

    #tôi nhận được bất kỳ dự đoán nào và nếu nó lớn hơn ngưỡng tôi sẽ chuyển đổi thành 1 hoặc tôi sẽ giữ nguyên là 0.




    acc. append[accuracy_score[y_test,y_pred,normalize=True]]

    #Sau đó, tôi sẽ tính toán điểm chính xác của mình bằng y_test rồi
    #append độ chính xác .



acc = pd. concat[[pd. Sê-ri [ngưỡng], pd. Sê-ri[acc]], axis=1]
acc. cột = ['ngưỡng','độ chính xác']
acc. sort_values[by="accuracy",Ascending=False, inplace = True]
acc. cái đầu[]




Đây là 5 giá trị ngưỡng hàng đầu.


nhập matplotlib. pyplot dưới dạng plt
def plot_roc_curve[False_pos_rate,True_pos_rate].
     plt. cốt truyện[False_pos_rate, True_pos_rate, label="ROC"]
     plt. plot[[0,1],[0,1],color="Red",linestyle="--"]
     plt. xlabel["False_Positive_rate"]
     plt. ylabel["True_Positive_rate"]
     plt. title["ROC Curve"]
     plt. chú giải
     plt. show[]

plot_roc_curve[False_pos_rate,True_pos_rate]




Đây là một số ứng cử viên tốt nhất mà từ đó chúng tôi có thể chọn giá trị ngưỡng của mình.


Tạo Mô hình bằng 0. 61 Ngưỡng

từ sklearn. linear_model nhập LogisticRegression
từ sklearn. nhập số liệu precision_score,confused_matrix,recall_score, roc_auc_score, precision_score,class_report

clf = LogisticRegression[class_weight="balanced"]
clf. vừa vặn[X_train, y_train]

THRESHOLD = 0. 61
preds = np. ở đâu [clf. dự đoán_proba[X_test][. ,1] > THRESHOLD, 1, 0]

pd. DataFrame[data=[accuracy_score[y_test, preds], thu hồi_score[y_test, dự đoán], precision_score[y_test, dự đoán], roc_auc_score[y_test, dự đoán]], chỉ mục=["độ chính xác", "thu hồi", "độ chính xác", "





Mô hình có giá trị ngưỡng Đã thay đổi

print[classification_report[y_test,preds]]






in[confusion_matrix[y_test,preds]]


[[28 1]
  [ 9 23]]


Vì vậy, chúng tôi hy vọng rằng bạn tìm thấy giải pháp. Nếu bạn thấy điều này hữu ích thì hãy chia sẻ nó với bạn bè của bạn và truyền bá kiến ​​​​thức này

Ngưỡng đường cong ROC được tính như thế nào?

Đường cong ROC được tạo bằng cách tính toán và vẽ biểu đồ tỷ lệ dương tính thực so với tỷ lệ dương tính giả cho một bộ phân loại duy nhất ở nhiều ngưỡng khác nhau. Ví dụ: trong hồi quy logistic, ngưỡng sẽ là xác suất dự đoán của một quan sát thuộc lớp tích cực.

Ngưỡng tối ưu là gì?

Ngưỡng tối ưu được định nghĩa là ngưỡng dẫn đến tổng độ nhạy và độ đặc hiệu của xét nghiệm cao nhất [trong tổng này, các trọng số khác nhau có thể .

Chủ Đề