Hồi quy logistic k fold xác thực chéo

Trong hướng dẫn này, chúng ta sẽ tìm hiểu xác thực chéo trong học máy là gì và cách triển khai nó trong python bằng cách sử dụng các gói StatModels

from statsmodels.formula.api import logitfit_logit = logit["target ~ age + sex + cp + trestbps +	chol + fbs + restecg + thalach + exang + oldpeak + slope + ca + thal", df].fit[]print[fit_logit.summary[]]Optimization terminated successfully.
Current function value: 0.348904
Iterations 7
Logit Regression Results
==============================================================================
Dep. Variable: target No. Observations: 303
Model: Logit Df Residuals: 289
Method: MLE Df Model: 13
Date: Sun, 04 Jul 2021 Pseudo R-squ.: 0.4937
Time: 19:07:27 Log-Likelihood: -105.72
converged: True LL-Null: -208.82
Covariance Type: nonrobust LLR p-value: 7.262e-37
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 3.4505 2.571 1.342 0.180 -1.590 8.490
age -0.0049 0.023 -0.212 0.832 -0.050 0.041
sex -1.7582 0.469 -3.751 0.000 -2.677 -0.839
cp 0.8599 0.185 4.638 0.000 0.496 1.223
trestbps -0.0195 0.010 -1.884 0.060 -0.040 0.001
chol -0.0046 0.004 -1.224 0.221 -0.012 0.003
fbs 0.0349 0.529 0.066 0.947 -1.003 1.073
restecg 0.4663 0.348 1.339 0.181 -0.216 1.149
thalach 0.0232 0.010 2.219 0.026 0.003 0.044
exang -0.9800 0.410 -2.391 0.017 -1.783 -0.177
oldpeak -0.5403 0.214 -2.526 0.012 -0.959 -0.121
slope 0.5793 0.350 1.656 0.098 -0.106 1.265
ca -0.7733 0.191 -4.051 0.000 -1.147 -0.399
thal -0.9004 0.290 -3.104 0.002 -1.469 -0.332
==============================================================================
0

Xác thực chéo là gì và tại sao chúng ta cần nó?

Xác thực chéo là một phương pháp lấy mẫu lại trong học máy. Để hiểu xác thực chéo, trước tiên chúng ta cần xem lại sự khác biệt giữa tỷ lệ lỗi đào tạo và tỷ lệ lỗi kiểm tra

Tỷ lệ lỗi đào tạo là lỗi trung bình [tỷ lệ phân loại sai trong các vấn đề phân loại] xuất phát từ cùng một dữ liệu mà mô hình đã được đào tạo trên đó

Ngược lại, Tỷ lệ lỗi kiểm tra là lỗi trung bình xuất phát từ việc sử dụng mô hình được đào tạo trên tập dữ liệu kiểm tra chưa nhìn thấy [còn được gọi là tập dữ liệu xác thực]

Trong trường hợp không có dữ liệu thử nghiệm, chúng tôi sẽ không thể biết liệu mô hình của chúng tôi có hoạt động tốt như nhau trên dữ liệu không nhìn thấy hay không, đây là mục tiêu cuối cùng của bất kỳ vấn đề học máy nào. Quá trình sử dụng dữ liệu thử nghiệm để ước tính sai số trung bình khi mô hình được trang bị/đào tạo được sử dụng trên dữ liệu không nhìn thấy được gọi là xác thực chéo. Nói một cách đơn giản, chúng tôi xác thực chéo dự đoán của mình trên dữ liệu không nhìn thấy và do đó có tên là “xác thực chéo”

Các loại xác thực chéo

Có ba loại xác thực chéo chính. Một số bài báo đề cập đến bootstrap như một phương thức xác thực chéo nhưng cá nhân tôi không coi bootstrap là một phương thức xác thực chéo

  • Phương pháp thiết lập xác thực

Cách tiếp cận này là đơn giản nhất trong tất cả. Chỉ cần chia dữ liệu của bạn thành hai phần tôi. e. huấn luyện và kiểm tra tập dữ liệu. Huấn luyện mô hình của bạn trên tập dữ liệu huấn luyện và chạy xác thực trên tập dữ liệu thử nghiệm. Cách tiếp cận này có thể có vấn đề vì bạn đang cho rằng dữ liệu thử nghiệm của mình đại diện cho toàn bộ dữ liệu, điều này có thể bị vi phạm trong thực tế. Do đó, ước tính lỗi kiểm tra của bạn có thể rất không ổn định. Ngoài ra, do các phương pháp học máy có xu hướng hoạt động kém hơn khi được đào tạo trên ít quan sát hơn, điều này cho thấy tỷ lệ lỗi của bộ xác thực có thể có xu hướng đánh giá quá cao tỷ lệ lỗi kiểm tra

  • Xác thực chéo một lần để lại

Như tên gợi ý, bạn để lại một quan sát từ dữ liệu đào tạo trong khi đào tạo mô hình của mình. Về mặt kỹ thuật, cách tiếp cận này giống như trên nhưng trong tập dữ liệu thử nghiệm của bạn, bạn chỉ có 1 hàng. Điều khác biệt là bạn lặp lại thử nghiệm này bằng cách chạy một vòng lặp for và lấy 1 hàng làm dữ liệu thử nghiệm trong mỗi lần lặp lại và lấy lỗi kiểm tra cho càng nhiều hàng càng tốt và cuối cùng lấy trung bình các lỗi. Lý tưởng nhất là bạn nên chạy vòng lặp for trong n lần [trong đó n = kích thước mẫu]. Đến lúc này, bạn đã có thể xác định vấn đề tại đây. Khi dữ liệu của bạn lớn, phương pháp này có thể rất kém hiệu quả

  • Xác thực chéo k-Fold

Đây là lai giữa 2 loại trên. Chúng tôi chia dữ liệu của mình thành k lần và chạy một vòng lặp for trong k lần, mỗi lần lấy một lần làm tập dữ liệu thử nghiệm trong mỗi lần lặp và tính toán tỷ lệ lỗi trung bình [hoặc độ chính xác] cuối cùng

Chúng tôi sẽ sử dụng cách tiếp cận bộ xác thực và k-Fold trong hướng dẫn này

Đăng kí

Hãy bắt tay với một số mã hóa. Bạn thấy phấn khích không?

TÔI CŨNG VẬY

Vấn đề thiết lập

Chúng tôi sẽ sử dụng bộ dữ liệu tim để dự đoán xác suất đau tim bằng cách sử dụng tất cả các yếu tố dự đoán trong bộ dữ liệu. Khi làm như vậy, chúng tôi cũng muốn ước tính lỗi kiểm tra của mô hình hồi quy logistic được mô tả trong phần đó bằng cách sử dụng xác thực chéo

Thông tin tập dữ liệu

Tôi lấy bộ dữ liệu này từ Trung tâm Máy học và Hệ thống Thông minh

https. //lưu trữ. ics. uci. edu/ml/bộ dữ liệu/Tim+Bệnh

Cơ sở dữ liệu này chứa 76 thuộc tính, nhưng tất cả các thử nghiệm đã xuất bản đề cập đến việc sử dụng một tập hợp con gồm 14 thuộc tính trong số đó. Đặc biệt, cơ sở dữ liệu Cleveland là cơ sở dữ liệu duy nhất được các nhà nghiên cứu ML sử dụng cho đến nay. Trường “mục tiêu” đề cập đến sự hiện diện của bệnh tim ở bệnh nhân. Nó là số nguyên có giá trị từ 0 [không có mặt] đến 4. Trường “mục tiêu” đề cập đến sự hiện diện của bệnh tim ở bệnh nhân. Nó là số nguyên có giá trị 0 = không/ít nguy cơ đau tim và 1 = nhiều nguy cơ đau tim hơn

Thông tin thuộc tính

Chỉ có 14 thuộc tính được sử dụng

  1. #3 [tuổi]
  2. #4 [tình dục]
  3. #9 [cp]
  4. #10 [trestbps]
  5. #12 [chol]
  6. #16 [fbs]
  7. #19 [khôi phục]
  8. #32 [thạch]
  9. #38 [ngoại ngữ]
  10. #40 [đỉnh cũ]
  11. #41 [dốc]
  12. #44 [ca]
  13. #51 [thal]
  14. #58 [mục tiêu] [thuộc tính dự đoán]

Xin lưu ý rằng bộ dữ liệu này có một số dữ liệu bị thiếu. Để đơn giản, chúng tôi sẽ chỉ thử phân tích trường hợp hoàn chỉnh

import pandas as pd
import numpy as np
df = pd.read_csv['heart.csv']df.head[]

Mô hình hồi quy Logistics sử dụng Mô hình thống kê

Cách đơn giản và thanh lịch hơn [so với

from statsmodels.formula.api import logitfit_logit = logit["target ~ age + sex + cp + trestbps +	chol + fbs + restecg + thalach + exang + oldpeak + slope + ca + thal", df].fit[]print[fit_logit.summary[]]Optimization terminated successfully.
Current function value: 0.348904
Iterations 7
Logit Regression Results
==============================================================================
Dep. Variable: target No. Observations: 303
Model: Logit Df Residuals: 289
Method: MLE Df Model: 13
Date: Sun, 04 Jul 2021 Pseudo R-squ.: 0.4937
Time: 19:07:27 Log-Likelihood: -105.72
converged: True LL-Null: -208.82
Covariance Type: nonrobust LLR p-value: 7.262e-37
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 3.4505 2.571 1.342 0.180 -1.590 8.490
age -0.0049 0.023 -0.212 0.832 -0.050 0.041
sex -1.7582 0.469 -3.751 0.000 -2.677 -0.839
cp 0.8599 0.185 4.638 0.000 0.496 1.223
trestbps -0.0195 0.010 -1.884 0.060 -0.040 0.001
chol -0.0046 0.004 -1.224 0.221 -0.012 0.003
fbs 0.0349 0.529 0.066 0.947 -1.003 1.073
restecg 0.4663 0.348 1.339 0.181 -0.216 1.149
thalach 0.0232 0.010 2.219 0.026 0.003 0.044
exang -0.9800 0.410 -2.391 0.017 -1.783 -0.177
oldpeak -0.5403 0.214 -2.526 0.012 -0.959 -0.121
slope 0.5793 0.350 1.656 0.098 -0.106 1.265
ca -0.7733 0.191 -4.051 0.000 -1.147 -0.399
thal -0.9004 0.290 -3.104 0.002 -1.469 -0.332
==============================================================================
1] để xem xét mức độ phù hợp của mô hình ban đầu là sử dụng
from statsmodels.formula.api import logitfit_logit = logit["target ~ age + sex + cp + trestbps +	chol + fbs + restecg + thalach + exang + oldpeak + slope + ca + thal", df].fit[]print[fit_logit.summary[]]Optimization terminated successfully.
Current function value: 0.348904
Iterations 7
Logit Regression Results
==============================================================================
Dep. Variable: target No. Observations: 303
Model: Logit Df Residuals: 289
Method: MLE Df Model: 13
Date: Sun, 04 Jul 2021 Pseudo R-squ.: 0.4937
Time: 19:07:27 Log-Likelihood: -105.72
converged: True LL-Null: -208.82
Covariance Type: nonrobust LLR p-value: 7.262e-37
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 3.4505 2.571 1.342 0.180 -1.590 8.490
age -0.0049 0.023 -0.212 0.832 -0.050 0.041
sex -1.7582 0.469 -3.751 0.000 -2.677 -0.839
cp 0.8599 0.185 4.638 0.000 0.496 1.223
trestbps -0.0195 0.010 -1.884 0.060 -0.040 0.001
chol -0.0046 0.004 -1.224 0.221 -0.012 0.003
fbs 0.0349 0.529 0.066 0.947 -1.003 1.073
restecg 0.4663 0.348 1.339 0.181 -0.216 1.149
thalach 0.0232 0.010 2.219 0.026 0.003 0.044
exang -0.9800 0.410 -2.391 0.017 -1.783 -0.177
oldpeak -0.5403 0.214 -2.526 0.012 -0.959 -0.121
slope 0.5793 0.350 1.656 0.098 -0.106 1.265
ca -0.7733 0.191 -4.051 0.000 -1.147 -0.399
thal -0.9004 0.290 -3.104 0.002 -1.469 -0.332
==============================================================================
0. Tôi thích báo cáo tóm tắt mà nó tạo ra chỉ trong một dòng mã

from statsmodels.formula.api import logitfit_logit = logit["target ~ age + sex + cp + trestbps +	chol + fbs + restecg + thalach + exang + oldpeak + slope + ca + thal", df].fit[]print[fit_logit.summary[]]Optimization terminated successfully.
Current function value: 0.348904
Iterations 7
Logit Regression Results
==============================================================================
Dep. Variable: target No. Observations: 303
Model: Logit Df Residuals: 289
Method: MLE Df Model: 13
Date: Sun, 04 Jul 2021 Pseudo R-squ.: 0.4937
Time: 19:07:27 Log-Likelihood: -105.72
converged: True LL-Null: -208.82
Covariance Type: nonrobust LLR p-value: 7.262e-37
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 3.4505 2.571 1.342 0.180 -1.590 8.490
age -0.0049 0.023 -0.212 0.832 -0.050 0.041
sex -1.7582 0.469 -3.751 0.000 -2.677 -0.839
cp 0.8599 0.185 4.638 0.000 0.496 1.223
trestbps -0.0195 0.010 -1.884 0.060 -0.040 0.001
chol -0.0046 0.004 -1.224 0.221 -0.012 0.003
fbs 0.0349 0.529 0.066 0.947 -1.003 1.073
restecg 0.4663 0.348 1.339 0.181 -0.216 1.149
thalach 0.0232 0.010 2.219 0.026 0.003 0.044
exang -0.9800 0.410 -2.391 0.017 -1.783 -0.177
oldpeak -0.5403 0.214 -2.526 0.012 -0.959 -0.121
slope 0.5793 0.350 1.656 0.098 -0.106 1.265
ca -0.7733 0.191 -4.051 0.000 -1.147 -0.399
thal -0.9004 0.290 -3.104 0.002 -1.469 -0.332
==============================================================================

Giải thích mô hình ngắn gọn

Chúng tôi thấy rằng các biến

from statsmodels.formula.api import logitfit_logit = logit["target ~ age + sex + cp + trestbps +	chol + fbs + restecg + thalach + exang + oldpeak + slope + ca + thal", df].fit[]print[fit_logit.summary[]]Optimization terminated successfully.
Current function value: 0.348904
Iterations 7
Logit Regression Results
==============================================================================
Dep. Variable: target No. Observations: 303
Model: Logit Df Residuals: 289
Method: MLE Df Model: 13
Date: Sun, 04 Jul 2021 Pseudo R-squ.: 0.4937
Time: 19:07:27 Log-Likelihood: -105.72
converged: True LL-Null: -208.82
Covariance Type: nonrobust LLR p-value: 7.262e-37
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 3.4505 2.571 1.342 0.180 -1.590 8.490
age -0.0049 0.023 -0.212 0.832 -0.050 0.041
sex -1.7582 0.469 -3.751 0.000 -2.677 -0.839
cp 0.8599 0.185 4.638 0.000 0.496 1.223
trestbps -0.0195 0.010 -1.884 0.060 -0.040 0.001
chol -0.0046 0.004 -1.224 0.221 -0.012 0.003
fbs 0.0349 0.529 0.066 0.947 -1.003 1.073
restecg 0.4663 0.348 1.339 0.181 -0.216 1.149
thalach 0.0232 0.010 2.219 0.026 0.003 0.044
exang -0.9800 0.410 -2.391 0.017 -1.783 -0.177
oldpeak -0.5403 0.214 -2.526 0.012 -0.959 -0.121
slope 0.5793 0.350 1.656 0.098 -0.106 1.265
ca -0.7733 0.191 -4.051 0.000 -1.147 -0.399
thal -0.9004 0.290 -3.104 0.002 -1.469 -0.332
==============================================================================
1 có liên quan đáng kể [chúng tôi không suy luận quan hệ nhân quả trong vấn đề này] với cơn đau tim

Xác thực chéo bằng cách sử dụng phương pháp tập dữ liệu Xác thực

Hãy chia dữ liệu của chúng tôi thành hai bộ i. e. đào tạo và kiểm tra

from sklearn.model_selection import train_test_split# splitting our dataset into train and test datasets.train, test = train_test_split[df, test_size = 0.3, random_state = 1]

Hãy điều chỉnh mô hình trên dữ liệu đào tạo và xem xét tỷ lệ lỗi kiểm tra

fit_logit_train = logit["target ~ age + sex + cp + trestbps + chol + fbs + restecg + thalach + exang + oldpeak + slope + ca + thal", train].fit[]train_pred = fit_logit_train.predict[test]

# converting probability to labels
def convert_prob_to_label[prob, cutoff = 0.5]:
label = None
if prob > cutoff:
label = 1
else:
label = 0
return label

pred_labels = list[map[convert_prob_to_label, train_pred]]
pred_labels = np.asarray[pred_labels]
Optimization terminated successfully.
Current function value: 0.317208
Iterations 8
from sklearn.metrics import confusion_matrix
conf_matrix = confusion_matrix[test.target, pred_labels]

Từ ma trận nhầm lẫn ở trên, chúng ta có thể tính tỷ lệ phân loại sai là

mis_rate = [conf_matrix[[1],[0]].flat[0] + conf_matrix[[0],[1]].flat[0]]/len[test]print[f"Misclassification rate = {mis_rate :.3f}"]

Tỷ lệ phân loại sai = 0. 220

Chúng tôi có một mô hình tốt để bắt đầu với tỷ lệ lỗi là 22%. Xin lưu ý rằng chúng tôi không chạy bất kỳ lựa chọn mô hình nào [việc lựa chọn mô hình nằm ngoài phạm vi của bài viết này]. Tuy nhiên, tỷ lệ phân loại sai trong thử nghiệm này có thể là do ngẫu nhiên và có thể phụ thuộc vào dữ liệu thử nghiệm. Do đó, chúng tôi có thể đánh giá quá cao tỷ lệ lỗi kiểm tra. Để có được ước tính ổn định hơn về tỷ lệ lỗi kiểm tra/phân loại sai, chúng ta có thể sử dụng xác thực chéo k-fold

Xác thực chéo k-Fold bằng Sklearn

Khi chạy xác thực chéo k-Fold, có hai tham số chính mà chúng ta cần quan tâm

  • Số nếp gấp. Chúng ta cần nhận thức về số lần gấp. Trong thực tế, 5–10 nếp gấp hoạt động tốt đối với kích thước dữ liệu trung bình. Số lượng nếp gấp quá lớn có thể dẫn đến kết quả chênh lệch cao
  • Số lần lặp lại. Chúng tôi có thể chạy thử nghiệm bao nhiêu lần tùy thích. Tùy thuộc vào khả năng tính toán chúng ta có trong tay, chúng ta có thể chọn một số lớn ở đây. Lớn hơn là tốt hơn ở đây

Đối với vấn đề cụ thể này, tôi đang sử dụng xác thực chéo KFold năm lần trong 100 thử nghiệm để tính tỷ lệ phân loại sai trung bình

** Xin lưu ý rằng Mô hình thống kê không có thư viện xác thực chéo của riêng nó. **

from sklearn.model_selection import RepeatedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
X = df.loc[ : , ['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach', 'exang', 'oldpeak', 'slope', 'ca', 'thal']]
y = df[['target']]

cv = RepeatedKFold[n_splits=5, n_repeats= 100, random_state=1]
model = LogisticRegression[]

# getting misclassification rate
scores = 1 - cross_val_score[model, X, y, scoring='accuracy', cv=cv, n_jobs=-1]
import seaborn as sns
ax = sns.histplot[x=scores, kde=True]

Biểu đồ trên cho chúng ta thấy rõ sự thay đổi trong lỗi kiểm tra. Thay vì cung cấp một ước tính số duy nhất về lỗi kiểm tra, tốt hơn hết là cung cấp lỗi trung bình và lỗi tiêu chuẩn của lỗi kiểm tra để đưa ra quyết định

Sự kết luận

________số 8

Tỷ lệ lỗi phân loại sai trung bình trong ngày kiểm tra là, 0. 167 với độ lệch chuẩn = 0. 0424

Tóm lại, tỷ lệ phân loại sai của chúng tôi là 16. 7%. Trong bài viết này, chúng tôi đã tìm hiểu cách xác thực chéo giúp chúng tôi ước tính lỗi kiểm tra ổn định và mạnh mẽ hơn. Trong blog tiếp theo, chúng ta sẽ làm điều tương tự bằng cách sử dụng các phương thức bootstrap

Cách sử dụng k

Chia tập dữ liệu thành K phân vùng bằng nhau [hoặc "các nếp gấp"].
Sử dụng nếp gấp 1 làm tập kiểm tra và sự kết hợp của các nếp gấp khác làm tập huấn luyện. .
Tính toán độ chính xác kiểm tra
Lặp lại các bước 2 và 3 nghìn lần, mỗi lần sử dụng một nếp gấp khác làm bộ kiểm tra

có thể vượt qua

Chạy ví dụ sẽ tạo tập dữ liệu, sau đó đánh giá mô hình hồi quy logistic trên đó bằng cách sử dụng xác thực chéo 10 lần . Độ chính xác phân loại trung bình trên tập dữ liệu sau đó được báo cáo. Trong trường hợp này, chúng ta có thể thấy rằng mô hình đạt được độ chính xác phân loại ước tính khoảng 86. 8 phần trăm.

chữ thập là gì

Xác thực chéo là một cách tiếp cận thay thế cho phân tách đào tạo/kiểm tra. Để xác thực chéo k-fold, tập dữ liệu được chia thành k phần. Mỗi phần đóng vai trò là tập kiểm tra trong mỗi lần lặp và phần còn lại đóng vai trò là tập huấn luyện

chéo

Mẫu dữ liệu được chia thành 'k' số lượng mẫu nhỏ hơn, do đó có tên. Xác thực chéo K-fold . Bạn cũng có thể nghe các thuật ngữ như xác thực chéo bốn lần hoặc xác thực chéo mười lần, về cơ bản có nghĩa là dữ liệu mẫu được chia thành bốn hoặc mười mẫu nhỏ hơn tương ứng.

Chủ Đề