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
và
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.0
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
==============================================================================
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
- #3 [tuổi]
- #4 [tình dục]
- #9 [cp]
- #10 [trestbps]
- #12 [chol]
- #16 [fbs]
- #19 [khôi phục]
- #32 [thạch]
- #38 [ngoại ngữ]
- #40 [đỉnh cũ]
- #41 [dốc]
- #44 [ca]
- #51 [thal]
- #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 npdf = 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.1] để xem xét mức độ phù hợp của mô hình ban đầu là sử dụng
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
==============================================================================
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.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ã
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
==============================================================================
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.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
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
==============================================================================
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 labelsdef 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 8from 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ố 8Tỷ 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