You are on page 1of 36

TRƯỜNG ĐẠI HỌC SÀI GÒN

KHOA CÔNG NGHỆ THÔNG TIN

Báo Cáo Đồ Án
NHẬP MÔN MÁY HỌC
HEART DISEASE CLASSIFICATION

Giảng viên hướng dẫn: TS. Vũ Ngọc Thanh Sang


Sinh viên thực hiện:
Mã số sinh viên:

Thành phố Hồ Chí Minh - Tháng 11/2022

1
MỤC LỤC

1 Định nghĩa bài toán ………………………………………………………..5

1.1 Vấn đề cần giải quyết là gì ……………………………………………5

1.2 Định nghĩa bài toán cho người không cùng chuyên môn ...…………5

1.3 Định nghĩa bài toán cho người có cùng chuyên môn ……..…………5

1.4 Giải thiết của bài toán là gì ……………………………...……………6

1.5 Các bài toán tương tự trong thực tế ….………………...……………6

2 Sự cần thiết của project ….……………………..…………...……………6

2.1 Động lực để giải quyết bài toán ….……………………...……………6

2.2 Giải pháp mang lại những lợi ích gì ….…….…………...……………6

2.3 Giải pháp được sử dụng như thế nào ….…….…………...………….7

3 Giải pháp thủ công cho bài toán ….…….……………..……....………….7

3.1 Giải pháp hiện tại của bài toán ….………………………...………….7

3.2 Giải pháp CNTT cho bài toán ….………………………...…………..8

4 Chuẩn bị dữ liệu ….………………………...………………………...……8

4.1 Mô tả dữ liệu ….………………………...………………………….….8

4.2 Trong hoàn cảnh như thế nào thì có thể thu thập được dữ liệu ..…..8

4.3 Trong hoàn cảnh như thế nào thì không thể thu thập được dữ liệu ..8

5 Xử lý dữ liệu …………………...………………...…………………….…..9

5.1 Xác định và xử lý dữ liệu bị bỏ …………………...……………...…...9

5.2 Mã hóa dữ liệu ……………….…...…………………………………...9

5.3 Thống kê dữ liệu …………………...……………...………………...10

2
5.4 Gom nhóm các đặc trưng ( theo kiểu dữ liệu ) …….…………...….11

5.5 Phân bố của từng đặc trưng như thế nào? ……………………...….12

5.6 Mối tương quan của từng cặp đặc trưng như thế nào? …………...16

5.7 Tính năng tác động nhiều nhất đến dự đoán của mô hình …...……18

6 Đặc trưng …………………….………...……………...………………….20

6.1 Trích xuất đặc trưng ………….…………...……………...………….20

6.2 Chọn lọc đặc trưng ………….…………...……………...………..….21

7 Huấn luyện mô hình ………….…………...……………...…………...….21

7.1 Chia dữ liệu thành các tập train, validation, test ……………….….21

7.2 Xác định độ đo cho bài toán (phân loại, hồi quy, phân cụm) ……...21

7.3 Huấn luyện mô hình ……………….………………………………....25

8 Cải thiện mô hình ……………….………………………………………..31

8.1 Tinh chỉnh tham số trong không gian tham số ……………….……31

9 Lựa chọn mô hình ……………….………………………………………..34

9.1 So sánh hiệu suất ……………….………………………………........34

10 Báo cáo ……………….………………………………...........................35

10.1 Tóm tắt bài toán .………………………………..............................35

10.2 Các công trình liên quan .……………………………….................35

10.3 Đề xuất giải pháp .……………………………….............................36

10.4 Kết quả của giải pháp ………………………..................................36

10.5 Kết luận ………………………........................................................37

11 Người giới thiệu ……………………….................................................37

3
1 Định nghĩa bài toán

1.1 Vấn đề cần giải quyết là gì

Theo Tổ chức Y tế Thế giới, mỗi năm 12 triệu ca tử vong xảy ra trên toàn thế
giới về bệnh tim. Tải trọng của bệnh tim đang tăng nhanh trên toàn thế giới từ
vài năm qua. Nhiều nghiên cứu đã được thực hiện trong nỗ lực xác định các yếu
tố nhất của bệnh tim cũng như dự đoán chính xác nguy cơ chung. Bệnh tim
được nhấn mạnh như một kẻ giết người thầm lặng dẫn đến cái chết của người
mà không có triệu chứng rõ ràng. Chẩn đoán sớm bệnh tim đóng vai trò quan
trọng trong việc đưa ra quyết định về thay đổi lối sống bệnh nhân và lần lượt
làm giảm các biến chứng. Dự án này nhằm dự đoán bệnh tim bằng cách phân
tích dữ liệu của bệnh nhân phân loại liệu họ có bệnh tim hay không sử dụng các
thuật toán học máy.

1.2 Định nghĩa bài toán cho người không cùng chuyên môn

Thách thức lớn trong bệnh tim là phát hiện ra nó. Có những công cụ có sẵn
có thể dự đoán bệnh nhưng chúng rất tốn kém hoặc không hiệu quả để tính toán
khả năng mắc bệnh tim ở người. Phát hiện sớm bệnh tim có thể làm giảm tỷ lệ
tử vong và các biến chứng tổng thể. Tuy nhiên, không thể theo dõi bệnh nhân
mỗi ngày trong mọi trường hợp một cách chính xác và tham khảo ý kiến của
bệnh nhân trong 24 giờ bởi vì bác sĩ không có sẵn và nó đòi hỏi thời gian và sự
chuyên môn cao. Vì vậy, trong dự án này chúng em đã phát triển và nghiên cứu
mô hình để dự đoán sức khỏe bệnh nhân có bị mắc bệnh tim hay không bằng
cách sử dụng các thuật toán học máy.

1.3 Định nghĩa bài toán cho người có cùng chuyên môn

Học máy được sử dụng trên nhiều phạm vi trên khắp thế giới. Ngành công
nghiệp chăm sóc sức khỏe cũng không loại trừ. Học máy có thể đóng một vai
trò thiết yếu trong việc dự đoán sự xuất hiện của bệnh tim. Thông tin như vậy,
nếu dự đoán trước có thể cung cấp trực giác quan trọng cho các bác sĩ sau đó có
thể điều chỉnh chẩn đoán và xử lý chính xác cho mỗi trường hợp của bệnh nhân.
Trong dự án này, chúng em sử dụng các thuật toán học máy thực hiện phân tích
so sánh các phân loại như Logistic Regression, Nearest Neighbors, Support
Vectors, Nu SVC, Decision Tree, Random Forest, AdaBoost, Gradient
Boosting, Naive Bayes, Linear DA, Quadratic DA, Neural Net, Catboost,
LightGBM, Xgboost để cung cấp độ chính xác và phân tích dự đoán tốt hơn.

4
1.4 Giải thiết của bài toán là gì

Trong dự án này, chúng em sẽ lấy bộ dữ liệu về bệnh tim và sẽ phân tích, dự


đoán kết quả của bệnh nhân liệu họ có bệnh tim hay không, tức là dự đoán bệnh
bệnh tim bằng cách sử dụng học máy. Dự đoán này sẽ làm cho nó nhanh hơn và
hiệu quả hơn trong lĩnh vực chăm sóc sức khỏe cần tốn nhiều thời gian.

1.5 Các bài toán tương tự trong thực tế

Bài toán dự đoán bệnh tiểu đường

Bài toán dự đoán bệnh parkinson

2 Sự cần thiết của project

2.1 Động lực để giải quyết bài toán

Động lực chính của việc thực hiện nghiên cứu này là trình bày một mô hình
dự đoán sự xuất hiện của bệnh bệnh tim. Hơn nữa, công việc nghiên cứu này
nhằm mục đích xác định thuật toán phân loại tốt nhất để xác định khả năng mắc
bệnh bệnh tim ở bệnh nhân. Công trình này được chứng minh bằng cách thực
hiện một nghiên cứu và phân tích so sánh bằng cách sử dụng các thuật toán
phân loại là Logistic Regression, Nearest Neighbors, Support Vectors, Nu SVC,
Decision Tree, Random Forest, AdaBoost, Gradient Boosting, Naive Bayes,
Linear DA, Quadratic DA, Neural Net, Catboost, LightGBM , Xgboost được sử
dụng ở các cấp độ đánh giá khác nhau.Dự đoán bệnh tim là một nhiệm vụ quan
trọng liên quan đến độ chính xác cao. Do đó, các thuật toán được đánh giá ở
nhiều cấp độ và loại chiến lược đánh giá. Điều này sẽ cung cấp cho các nhà
nghiên cứu và các học viên y tế tiên lượng sớm bệnh tim và hỗ trợ đưa ra những
quyết định thay đổi lối sống ở những bệnh nhân có nguy cơ cao và giảm các
biến chứng.

2.2 Giải pháp mang lại những lợi ích gì

- Giảm chi phí, tiết kiệm thời gian.

- Hiệu suất cao.

- Giúp đưa ra gợi ý cho bác sĩ.

- Đưa ra chẩn đoán mà không cần bác sĩ

5
2.3 Giải pháp được sử dụng như thế nào

Trong phần này, chúng em đã thử nghiệm các thuật toán phân loại khác
nhau để dự đoán bệnh nhân có mắc bệnh tim hay không dựa trên một số thông
số sức khỏe.

Quy trình của giải pháp:

Bước 1: Nhập các thư viện cần thiết, Nhập bộ dữ liệu bệnh tim.

Bước 2: Xử lý trước dữ liệu để loại bỏ dữ liệu bị thiếu.

Bước 3: Thực hiện phân chia tỷ lệ phần trăm 75% để chia tập dữ liệu thành
tập huấn luyện và 25% cho tập kiểm tra.

Bước 4: Chọn thuật toán học máy, tức là Logistic Regression, Nearest
Neighbors, Support Vectors, Nu SVC, Decision Tree, Random Forest,
AdaBoost, Gradient Boosting, Naive Bayes, Linear DA, Quadratic DA, Neural
Net, Catboost, LightGBM , Xgboost.

Bước 5: Xây dựng mô hình phân loại cho thuật toán học máy đã đề cập dựa
trên tập huấn luyện.

Bước 6: Kiểm tra mô hình trình phân loại cho thuật toán học máy đã đề cập
dựa trên tập kiểm tra.

Bước 7: Thực hiện so sánh đánh giá các kết quả hoạt động thử nghiệm thu
được đối với mỗi bộ phân loại.

Bước 8: Thực hiện điều chỉnh tham số từ tham số mặc định trong mô hình
phân loại dựa trên các biện pháp khác nhau.

Bước 9: Thực hiện so sánh đánh giá các kết quả với mô hình phân loại từ
tham số mặc định, kết luận thuật toán hoạt động tốt nhất.

6
3 Giải pháp thủ công cho bài toán

3.1 Giải pháp hiện tại của bài toán

Chẩn đoán y khoa cụ thể là bệnh tim được coi là một nhiệm vụ quan trọng,
phức tạp và cần nhiều thời gian vì vậy các chẩn đoán được đưa ra đều dựa trên
trực giác, kinh nghiệm và chuyên môn của các bác sĩ chuyên ngành.

3.2 Giải pháp CNTT cho bài toán

Điện tâm đồ (ECG – Electrocardiogram) là đồ thị ghi lại những thay đổi
của dòng điện trong quả tim con người trên một đơn vị thời gian. Tim co bóp
theo nhịp là nhờ vào sự điều khiển của một hệ thống dẫn truyền điện học của cơ
tim. Dòng điện của tim tuy nhỏ, chỉ một phần nghìn volt nhưng hoàn toàn có thể
dò được thông qua các điện cực đặt trên tay, chân, ngực của bệnh nhân và
chuyển đến máy ghi điện. Tại đây, dòng điện sẽ được khuếch đại lên và ghi lại
trên giấy đồ thị.

Đo điện tâm đồ không gây tổn hại đến sức khỏe của người được đo, giá
thành đo điện tim tương đối thấp và được xem là xét nghiệm cơ bản, xét nghiệm
thường quy trong công tác khám chữa bệnh về tim.

Dựa vào dữ liệu từ điện tâm đồ bác sĩ sẽ nắm được khả năng bơm máu của
tim tại thời điểm đó và cho phép bác sĩ có thể áp dụng trong nhiều tình huống y
khoa khác nhau để theo dõi tình trạng sức khỏe tim của bệnh nhân.

4 Chuẩn bị dữ liệu

4.1 Mô tả dữ liệu

Bộ dữ liệu được cung cấp công khai trên trang web UCI Machine Learning
Repository - Heart Disease Dataset. Cơ sở dữ liệu này chứa 76 thuộc tính,
nhưng tất cả các thử nghiệm đã công bố đề cập đến việc sử dụng một tập hợp
con gồm 14 thuộc tính. Đặ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 Machine Learning sử dụng đến hiện tại.

4.2 Trong hoàn cảnh như thế nào thì có thể thu thập được dữ liệu

Bệnh nhân còn sống trong lúc làm nghiên cứu, đầy đủ các chỉ số khi lấy
mẫu thử, bộ test phải được bảo quản đúng nơi quy định, ...

7
4.3 Trong hoàn cảnh như thế nào thì không thể thu thập được dữ liệu

Bệnh nhân không còn sống trong lúc làm nghiên cứu, thiếu các chỉ số khi
lấy mẫu thử, bộ test không được bảo quản đúng nơi quy định, ...

5 Xử lý dữ liệu

5.1 Xác định và xử lý dữ liệu bị bỏ

Dữ liệu hàng thứ 93, 159, 164, 165 và 252 có ‘ca=4’ và hàng thứ 49 và 282
có ‘thal = 0’ là không chính xác. Theo bộ dữ liệu gốc chúng có giá trị là NaNs.
Vì vậy, chúng em sẽ bỏ đi những dữ liệu sai.

5.2 Mã hóa dữ liệu

Các tên đặc trưng trong tập dữ liệu được viết tắt và khó hiểu ý nghĩa của
chúng. Tên đầy đủ về y tế / kỹ thuật đã đủ khó hiểu đối với hầu hết chúng ta chứ
đừng nói đến dạng viết tắt của chúng. Vì vậy, để làm cho chúng dễ đọc hơn một
chút, ở đây, chúng em sẽ thay đổi tên cột của khung dữ liệu bằng cách sử dụng
thông tin từ kho lưu trữ dữ liệu UCI.

Chúng em cũng sẽ thay thế các danh mục được mã hóa (0, 1, 2,..) theo ý
nghĩa y tế của chúng (ví dụ: 'đau thắt ngực không điển hình', 'đau thắt ngực điển
hình', v.v.).

8
9
5.3 Thống kê dữ liệu

5.4 Gom nhóm các đặc trưng ( theo kiểu dữ liệu )

Như chúng ta thấy ở trên thì sẽ có 3 loại kiểu dữ liệu object, int và float.
Hãy gom chúng dựa theo kiểu dữ liệu.

# đặc trưng số học

num_feats = ['age', 'cholesterol', 'resting_blood_pressure',


'max_heart_rate_achieved', 'st_depression', 'num_major_vessels']

# đặc trưng nhị phân

10
bin_feats = ['sex', 'fasting_blood_sugar', 'exercise_induced_angina', 'target']

# đặc trưng phân loại

nom_feats= ['chest_pain_type', 'resting_electrocardiogram', 'st_slope',


'thalassemia']

cat_feats = nom_feats + bin_feats

5.5 Phân bố của từng đặc trưng như thế nào?

Chúng em quan sát được rằng kết quả khá cân bằng với ~46% cho các kết
quả không có bệnh và ~54% cho các kết quả có bệnh. Vì vậy không cần để tâm
về vấn đề mất cân bằng dữ liệu.

Phân phối của các đặc trưng số học:

11
12
Phân phối của các đặc trưng phân loại:

13
14
5.6 Mối tương quan của từng cặp đặc trưng như thế nào?

15
Tương quan:

- Mối tương quan giữa các đặc trưng là yếu nhất

- Từ các đặc trưng số ‘num_major_vessels’, ‘max_heart_rate_achieved’ và


‘st_depression’ tương quan khá hợp lý với biến mục tiêu ở hệ số tương quan -
0,47, 0,43 và -0,43 tương ứng.

- Từ các đặc điểm phân loại ‘chest_pain_type’, ‘st_depression’,


‘thalassemia’, và ‘exercise_created_angina’ có tương quan tốt hơn với biến mục
tiêu, ‘thalassemia’ cao nhất ở mức 0,52.

- Cholestrol ít tương quan với bệnh tim.

Vậy các đặc trưng có khả năng dự đoán cao hơn có thể là ‘chest_pain_type’,
‘num_major_vessels’, ‘thalassemia’, ‘exercise_created_angina’,
‘max_heart_rate_achieved’ và ‘st_depression’.

16
5.7 Tính năng tác động nhiều nhất đến dự đoán của mô hình

Một trong những thách thức của dự án học máy là giải thích dự đoán của mô
hình. Permutation importance và SHAP là hai phương pháp mà người ta có thể
sử dụng để hiểu những tính năng nào đã được chọn để có tác động nhiều nhất
đến dự đoán của mô hình.

Permutation importance : Là sự giảm điểm của mô hình khi một giá trị tính
năng duy nhất được xáo trộn ngẫu nhiên. Quy trình này phá vỡ mối quan hệ
giữa tính năng và mục tiêu, do đó, điểm số mô hình giảm cho thấy mức độ phụ
thuộc của mô hình vào tính năng.

SHAP (SHapley Additive exPlanations): Là một cách tiếp cận lý thuyết trò
chơi để giải thích đầu ra của bất kỳ mô hình học máy nào. Nó kết nối phân bổ
tín dụng tối ưu với các giải thích cục bộ bằng cách sử dụng các giá trị Shapley
cổ điển từ lý thuyết trò chơi và các phần mở rộng liên quan của chúng. Các giá
trị Shapley được tính gần đúng bằng cách sử dụng Kernel SHAP, sử dụng hạt
nhân có trọng số để tính gần đúng và DeepSHAP, sử dụng DeepLift để ước tính
chúng.

17
Theo cả permutation importance và SHAP, ba đặc điểm quan trọng nhất của
mô hình là ‘num_major_vessels’, ‘chest_pain_type’ và ‘st_slope’.

18
6 Đặc trưng

6.1 Trích xuất đặc trưng

Đặc trưng số học:

Đặc trưng phân loại :

19
6.2 Chọn lọc đặc trưng

Reg-plots của một số các chọn lọc đặc trưng được hiển thị dưới dạng quan
hệ tuyến tính với tuổi, tương tự với cột đầu tiên của pair-plot( đặc trưng số học )
ở trên, ta quan sát thấy được:

- Ngoại trừ ‘maximum_heart_rate_achieved’, thì các chỉ số khác có xu


hướng quan hệ với nhau tuyến tính ‘age’ (mặc dù có quan hệ yếu hơn với
‘st_depression’).

- Bệnh nhân trẻ hơn với ‘maximum_heart_rate_achieved’ cao hơn thì


thường sẽ có điều kiện tim mạch.

- Chỉ số ‘st_depression’ thấp hơn bất chấp tuổi tác thì đều biểu lộ ra kết quả
mắc bệnh về tim mạch.

7 Huấn luyện mô hình

7.1 Chia dữ liệu thành các tập train, validation, test

Dữ liệu được chia thành 75% dữ liệu đào tạo và 25% dữ liệu thử nghiệm, dữ
liệu này được chuyển tiếp cho mô hình Logistic Regression, Nearest Neighbors,
Support Vectors, Nu SVC, Decision Tree, Random Forest, AdaBoost, Gradient
Boosting, Naive Bayes, Linear DA, Quadratic DA, Neural Net, Catboost,
LightGBM , Xgboost để phù hợp, dự đoán và cho điểm mô hình

7.2 Xác định độ đo cho bài toán ( phân loại, hồi quy, phân cụm )

Độ đo cho bài toán chúng em sử dụng confusion matrix là một cách bố trí
bảng cụ thể cho phép trực quan hóa hiệu suất của thuật toán học có giám sát.
Mỗi hàng của ma trận biểu thị các thể hiện trong lớp ‘thực tế’ trong khi mỗi cột
biểu thị các thể hiện trong lớp ‘dự đoán’.

Confusion matrix có các chỉ số đánh giá sau:

20
- Accuracy: Là tỷ lệ dự đoán chính xác cho kết quả kiểm tra.
- Recall: Là tỷ lệ các ví dụ được dự đoán thuộc về một lớp so với tất cả các ví
dụ thực sự thuộc về lớp đó.
- Precision: : Là tỷ lệ phần trăm của các mẫu có liên quan (dương tính thực)
trong số tất cả các mẫu được dự đoán thuộc về một loại nhất định.
- F1-Score: Là giá trị trung bình hài hòa của precision và recall của mô
hình.

21
Ngoài ra, chúng em còn sử dụng đường cong ROC một biểu đồ đồ họa minh
họa hiệu suất của thuật toán phân loại nhị phân dưới dạng hàm của tốc độ
dương và tốc độ dương sai.

22
Bảng tóm tắt chỉ số hiệu suất của thuật toán truyền thống

Từ bảng tóm tắt chỉ số hiệu suất của thuật toán truyền thống chúng em có thể
thấy rằng về accuracy Logistic Regression đứng đầu với 86%; trong việc recall,
Neural Nets đứng đầu với 94%. Về precision, Quadratic DA đứng đầu với
85%.Vậy nên chọn cái nào? F1-Score có thể cho chúng ta sự cân bằng giữa thu
hồi và độ chính xác. Logistic Regression tình cờ có F1-Score tốt nhất, vì vậy
chúng em chọn Logistic Regression làm công cụ phân loại tốt nhất của chúng

23
em. Chúng em sẽ sử dụng nó để cải thiện hơn nữa mô hình của mình với các
tham số được điều chỉnh bằng thuật toán scikit-learning Randomized Search.

Bảng tóm tắt chỉ số hiệu suất của thuật toán hiện đại

Từ bảng tóm tắt chỉ số hiệu suất của thuật toán hiện đại chúng em có thể thấy
rằng bộ phân loại LightGBM tốt hơn một chút so với hai bộ phân loại còn lại và
chúng em sẽ sử dụng nó để cải thiện hơn nữa mô hình của mình với các tham số
được điều chỉnh bằng thuật toán scikit-learning Grid Search.

7.3 Huấn luyện mô hình

from sklearn.linear_model import LogisticRegression

from sklearn.neighbors import KNeighborsClassifier

from sklearn.svm import SVC, LinearSVC, NuSVC

from sklearn.tree import DecisionTreeClassifier

from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier,


GradientBoostingClassifier

from sklearn.naive_bayes import GaussianNB

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis

from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier

from sklearn.neural_network import MLPClassifier

def label_encode_cat_features(data, cat_features):

24
label_encoder = LabelEncoder()

data_encoded = data.copy()

for col in cat_features:

data_encoded[col] = label_encoder.fit_transform(data[col])

data = data_encoded

return data

def score_summary(names, classifiers):

cols=["Classifier", "Accuracy", "ROC_AUC", "Recall", "Precision", "F1"]

data_table = pd.DataFrame(columns=cols)

for name, clf in zip(names, classifiers):

clf.fit(X_train, y_train)

pred = clf.predict(X_val)

accuracy = accuracy_score(y_val, pred)

pred_proba = clf.predict_proba(X_val)[:, 1]

fpr, tpr, thresholds = roc_curve(y_val, pred_proba)

roc_auc = auc(fpr, tpr)

# confusion matrix, cm

cm = confusion_matrix(y_val, pred)

# recall: TP/(TP+FN)

recall = cm[1,1]/(cm[1,1] +cm[1,0])

# precision: TP/(TP+FP)

25
precision = cm[1,1]/(cm[1,1] +cm[0,1])

# F1 score: TP/(TP+FP)

f1 = 2*recall*precision/(recall + precision)

df = pd.DataFrame([[name, accuracy*100, roc_auc, recall, precision, f1]],


columns=cols)

data_table = data_table.append(df)

return(np.round(data_table.reset_index(drop=True), 2))

def plot_conf_matrix(names, classifiers, nrows, ncols, fig_a, fig_b):

fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(fig_a, fig_b))

i=0

for clf, ax in zip(classifiers, axes.flatten()):

clf.fit(X_train, y_train)

plot_confusion_matrix(clf, X_val, y_val, ax=ax)

ax.title.set_text(names[i])

i=i+1

plt.tight_layout()

plt.show()

def roc_auc_curve(names, classifiers):

plt.figure(figsize=(12, 8))

for name, clf in zip(names, classifiers):

clf.fit(X_train, y_train)

26
pred_proba = clf.predict_proba(X_val)[:, 1]

fpr, tpr, thresholds = roc_curve(y_val, pred_proba)

roc_auc = auc(fpr, tpr)

plt.plot(fpr, tpr, lw=3, label= name +' ROC curve (area = %0.2f)' %
(roc_auc))

plt.plot([0, 1], [0, 1], color='navy', lw=1, linestyle='--')

plt.xlim([0.0, 1.0])

plt.ylim([0.0, 1.0])

plt.xlabel('False Positive Rate')

plt.ylabel('True Positive Rate')

plt.title('Receiver operating characteristic (ROC) curves', fontsize=20)

plt.legend(loc="lower right")

cat_features = ['chest_pain_type', 'resting_electrocardiogram', 'st_slope',


'thalassemia','sex', 'fasting_blood_sugar', 'exercise_induced_angina', 'target']

data = label_encode_cat_features(data, cat_features)

seed = 0

test_size = 0.25

features = data.columns[:-1]

X = data[features]

y = data['target']

X_train, X_val, y_train, y_val = train_test_split(X, y, test_size = test_size,


random_state=seed)

27
names = [ 'Logistic Regression', 'Nearest Neighbors', 'Support Vectors','Nu
SVC', 'Decision Tree', 'Random Forest', 'AdaBoost', 'Gradient Boosting','Naive
Bayes', 'Linear DA', 'Quadratic DA', "Neural Net"]

classifiers = [

LogisticRegression(solver="liblinear", random_state=seed),

KNeighborsClassifier(2),

SVC(probability=True, random_state=seed),

NuSVC(probability=True, random_state=seed),

DecisionTreeClassifier(random_state=seed),

RandomForestClassifier(random_state=seed),

AdaBoostClassifier(random_state=seed),

GradientBoostingClassifier(random_state=seed),

GaussianNB(),

LinearDiscriminantAnalysis(),

QuadraticDiscriminantAnalysis(),

MLPClassifier(random_state=seed)]

score_summary(names, classifiers).sort_values(by='Accuracy' , ascending =


False)\

.style.background_gradient(cmap='coolwarm')\

.bar(subset=["ROC_AUC",], color='#6495ED')\

.bar(subset=["Recall"], color='#ff355d')\

.bar(subset=["Precision"], color='lightseagreen')\

28
.bar(subset=["F1"], color='gold')

roc_auc_curve(names, classifiers)

plot_conf_matrix(names, classifiers, nrows=4, ncols=3, fig_a=12, fig_b=12)

from catboost import CatBoostClassifier

from xgboost import XGBClassifier

from lightgbm import LGBMClassifier

names_boost =['Catboost', 'xgbbost', 'light GBM']

classifiers = [

CatBoostClassifier(random_state=seed, verbose=0),

XGBClassifier(objective= 'binary:logistic', random_state=seed),

LGBMClassifier(random_state=seed)]

score_summary(names_boost, classifiers).sort_values(by='Accuracy' ,
ascending = False)\

.style.background_gradient(cmap='coolwarm')\

.bar(subset=["ROC_AUC",], color='#6495ED')\

.bar(subset=["Recall"], color='#ff355d')\

.bar(subset=["Precision"], color='lightseagreen')\

.bar(subset=["F1"], color='gold')

roc_auc_curve(names_boost, classifiers)

plot_conf_matrix(names=names_boost, classifiers=classifiers, nrows=1,


ncols=3, fig_a=12, fig_b=3)

29
8 Cải thiện mô hình

8.1 Tinh chỉnh tham số trong không gian tham số

Tinh chỉnh tham số cho mô hình LightGBM bằng thuật toán scikit-learning
Grid Search giúp tăng thêm hiệu suất của mô hình.

from sklearn.model_selection import GridSearchCV

# Tạo từ điển rs_params trong đó đề cập đến một siêu tham số cụ thể cùng với
các giá trị mà nó có thể nhận

# GridSearchCV thử tất cả các kết hợp giá trị được truyền trong rs_params và
đánh giá mô hình cho từng kết hợp bằng phương pháp xác thực chéo

# Sau khi sử dụng chức năng này, chúng em có thể chọn một tổ hợp có hiệu suất
tốt nhất

# Sau đó chúng em sẽ chạy lại các dự đoán

rs_params = {'num_leaves': [20, 100],'max_depth': [5, 15],'min_data_in_leaf':


[80, 120],}

rs_cv = GridSearchCV(estimator=LGBMClassifier(random_state=seed,
verbose=-1),param_grid=rs_params,cv = 5)

rs_cv.fit(X_train, y_train)

params = rs_cv.best_params_

lgbm = LGBMClassifier(**params)

lgbm.fit(X_train, y_train,eval_set=(X_val, y_val),verbose=False,)

print(classification_report(y_val, lgbm.predict(X_val)))

plot_confusion_matrix(lr, X_val, y_val)

30
Ngược lại, mô hình Logistic Regression không giúp tăng thêm hiệu suất
của mô hình.

from sklearn.model_selection import RandomizedSearchCV

from scipy.stats import uniform

from sklearn.model_selection import RepeatedStratifiedKFold

lr = LogisticRegression(tol=1e-4, max_iter=1000, random_state=seed)

# Lấy mẫu một giá trị cho C theo phân phối đồng đều trong[0, 5] và thống nhất
giữa l1 và l2 của penalty ( nghĩa là với xác suất 50% cho mỗi giá trị), sử dụng
bộ giải liblinear hỗ trợ penalty

31
# Sử dụng các giá trị được lấy mẫu này để chạy RandomizedSearchCV và đánh
giá mô hình cho một dải giá trị kết hợp ngẫu nhiên bằng phương pháp xác thực
chéo

# Sau khi sử dụng chức năng này, chúng em có thể chọn một tổ hợp có hiệu suất
tốt nhất

# Sau đó chúng em sẽ chạy lại các dự đoán

space = dict(C=uniform(loc=0, scale=5),penalty=['l2', 'l1'], solver= ['liblinear'])

search = RandomizedSearchCV(lr, space, random_state=seed,cv =


5,scoring='f1')

rand_search = search.fit(X_train, y_train)

print('Best Hyperparameters: %s' % rand_search.best_params_)

params = rand_search.best_params_

lr = LogisticRegression(**params)

lr.fit(X_train, y_train)

print(classification_report(y_val, lr.predict(X_val)))

32
9 Lựa chọn mô hình

9.1 So sánh hiệu suất

Bây giờ chúng em đã có tất cả các chỉ số hiệu suất của bộ phân loại, vậy nên
đã đến lúc quyết định để chọn thuật toán phân loại tốt nhất có thể. Dựa trên
accuracy Logistic Regression và LightGBM cùng bằng 86%; trong việc recall,
LightGBM đứng đầu với 94%. Về precision, LightGBM đứng đầu với 94%.
Dựa trên điểm F1 LightGBM có F1-Score tốt nhất, vì vậy chúng em chọn
LightGBM làm thuật toán phân loại tốt nhất của chúng em.

10 Báo cáo

10.1 Tóm tắt bài toán

Trong thời gian gần đây, dự đoán bệnh tim là một trong những nhiệm vụ
phức tạp nhất trong lĩnh vực y tế. Trong kỷ nguyên hiện đại, cứ mỗi phút lại có
khoảng một người chết vì bệnh tim. Khoa học dữ liệu đóng một vai trò quan
trọng trong việc xử lý lượng dữ liệu khổng lồ trong lĩnh vực chăm sóc sức khỏe.
Vì dự đoán bệnh tim là một nhiệm vụ phức tạp nên cần phải tự động hóa quy
trình dự đoán để tránh những rủi ro liên quan và cảnh báo trước cho bệnh nhân.
Dự án này sử dụng bộ dữ liệu bệnh tim có sẵn trong kho lưu trữ máy học của
UCI và chúng em đã sử dụng các thuật toán học máy phân loại khác nhau như
Logistic Regression, Nearest Neighbors, Support Vectors, Nu SVC, Decision

33
Tree, Random Forest, AdaBoost, Gradient Boosting, Naive Bayes, Linear DA,
Quadratic DA, Neural Net, Catboost, LightGBM , Xgboost để cung cấp độ
chính xác và phân tích dự đoán tốt hơn khi dự đoán khả năng mắc bệnh tim và
phân loại mức độ rủi ro của bệnh nhân. Kết quả thử nghiệm xác minh rằng thuật
toán LightGBM là thuật toán tốt nhất so với các thuật toán học máy khác đã
triển khai.

10.2 Các công trình liên quan

T.Nagamani, et al. đã đề xuất một hệ thống [1] triển khai các kỹ thuật khai
thác dữ liệu cùng với thuật toán MapReduce. Độ chính xác thu được theo bài
báo này đối với 45 trường hợp của bộ thử nghiệm, lớn hơn độ chính xác thu
được khi sử dụng mạng thần kinh nhân tạo mờ thông thường. Ở đây, độ chính
xác của thuật toán được sử dụng đã được cải thiện do sử dụng lược đồ động và
chia tỷ lệ tuyến tính.

Fahd Saleh Alotaibi đã thiết kế một mô hình so sánh năm thuật toán khác
nhau [2]. Công cụ Rapid Miner được sử dụng mang lại độ chính xác cao hơn so
với công cụ Matlab và Weka. Trong nghiên cứu này, độ chính xác của các thuật
toán phân loại Cây quyết định, Hồi quy logistic, Rừng ngẫu nhiên, Naive Bayes
và SVM đã được so sánh. Thuật toán cây quyết định có độ chính xác cao nhất.

Nagaraj M Lutimath, và cộng sự, đã thực hiện dự đoán bệnh tim bằng phân
loại Naive bayes và SVM (máy vector hỗ trợ). Các phép đo hiệu suất được sử
dụng trong phân tích là Lỗi tuyệt đối trung bình, Tổng lỗi bình phương và Lỗi
bình phương trung bình gốc, người ta thấy rằng SVM vượt trội về độ chính xác
so với Naive Bayes [3].

10.3 Đề xuất giải pháp

Quy trình của đề xuất giải pháp:

Bước 1: Nhập các thư viện cần thiết, Nhập bộ dữ liệu bệnh tim.

Bước 2: Xử lý trước dữ liệu để loại bỏ dữ liệu bị thiếu.

Bước 3: Thực hiện phân chia tỷ lệ phần trăm 75% để chia tập dữ liệu thành
tập huấn luyện và 25% cho tập kiểm tra.

Bước 4: Chọn thuật toán học máy, tức là Logistic Regression, Nearest
Neighbors, Support Vectors, Nu SVC, Decision Tree, Random Forest,

34
AdaBoost, Gradient Boosting, Naive Bayes, Linear DA, Quadratic DA, Neural
Net, Catboost, LightGBM , Xgboost.

Bước 5: Xây dựng mô hình phân loại cho thuật toán học máy đã đề cập dựa
trên tập huấn luyện.

Bước 6: Kiểm tra mô hình trình phân loại cho thuật toán học máy đã đề cập
dựa trên tập kiểm tra.

Bước 7: Thực hiện so sánh đánh giá các kết quả hoạt động thử nghiệm thu
được đối với mỗi bộ phân loại.

Bước 8: Thực hiện điều chỉnh tham số từ tham số mặc định trong mô hình
phân loại dựa trên các biện pháp khác nhau.

Bước 9: Thực hiện so sánh đánh giá các kết quả với mô hình phân loại từ
tham số mặc định, kết luận thuật toán hoạt động tốt nhất.

10.4 Kết quả của giải pháp

Dựa trên accuracy Logistic Regression và LightGBM đứng đầu với 86%;
trong việc recall, LightGBM đứng đầu với 94%. Về precision, LightGBM ,
Neural Nets đứng đầu với 94%. Dựa trên F1-Score LightGBM có F1-Score tốt
nhất, vì vậy chúng em chọn LightGBM làm thuật toán phân loại tốt nhất của
chúng em.

10.5 Kết luận

Mục đích chính của dự án này là thiết kế và triển khai dự đoán bệnh tim
bằng phương pháp học máy và phân tích hiệu suất của các phương pháp đó và
nó đã đạt được thành công. Cách tiếp cận được đề xuất là sử dụng nhiều phương
pháp phân loại ,trong đó các bộ phân loại Logistic Regression, Nearest
Neighbors, Support Vectors, Nu SVC, Decision Tree, Random Forest,
AdaBoost, Gradient Boosting, Naive Bayes, Linear DA, Quadratic DA, Neural
Net, Catboost, LightGBM, Xgboost được sử dụng. Và độ chính xác phân loại
86% đã đạt được. Kết quả thực nghiệm có thể giúp cho cơ sở y tế tiên lượng
sớm và đưa ra quyết định sớm điều trị dứt điểm bệnh tim, cứu sống con người.

Tài liệu tham khảo


1. T.Nagamani, S.Logeswari, B.Gomathy, Dự đoán bệnh tim bằng khai thác
dữ liệu với thuật toán Mapreduce, Tạp chí quốc tế về công nghệ đổi mới

35
và kỹ thuật khám phá (IJITEE) ISSN: 2278-3075, Tập-8 Số phát hành-3,
tháng 1 năm 2019.

2. Fahd Saleh Alotaibi, Triển khai mô hình học máy để dự đoán bệnh suy
tim, (IJACSA) Tạp chí quốc tế về ứng dụng và khoa học máy tính tiên
tiến, Tập. 10, số 6, 2019.

3. Nagaraj M Lutimath,Chethan C,Basavaraj S Pol.,Dự đoán bệnh tim bằng


máy học, Tạp chí quốc tế về công nghệ và kỹ thuật gần đây,8,(2S10),
trang 474-477, 2019.

36

You might also like