GIỚI THIỆU BÀI TOÁN
Phát biểu bài toán
Bệnh tim mạch là các bệnh lý ảnh hưởng đến tim và mạch máu, bao gồm bệnh lý tim bẩm sinh và bệnh tim mạch mắc phải Trong đó, các bệnh mạch vành, tai biến mạch máu não (đột quỵ), tăng huyết áp, bệnh động mạch ngoại biên và suy tim là các bệnh lý khá phổ biến, gây ảnh hưởng không nhỏ đến đời sống người bệnh Đặc biệt là những bệnh nhân có yếu tố nguy cơ cao như ngồi nhiều, ít vận động, béo phì, hút thuốc lá, uống nhiều rượu bia, tiểu đường, mỡ máu cao Ngoài ra, các bệnh do thấp tim hay rối loạn nhịp tim cũng là nguyên nhân thứ phát gây ra các vấn đề tim mạch.
Trong dự đoán tim mạch, người ta thường dùng Hệ thống máy chẩn đoán tim mạch qua các phương pháp kiểm tra nhịp tim như: Máy điện tim 12 cần, Máy Holter điện tâm đồ - Điện tâm đồ lưu động, Nghiệm pháp điện tâm đồ gắng sức trên thảm chạy, …
Tuy nhiên, sự xuất hiện của AI - mô hình dự đoán khả năng mắc bệnh tim mạch, được tích hợp nhiều loại công nghệ sẽ giúp giải quyết những số liệu một cách dễ dàng Các thuật toán sẽ được sử dụng để dự báo khả năng mắc bệnh, giảm rủi ro liên quan đến các mô hình dự đoán truyền thống Ngoài ra, logic mở (khác với logic truyền thống chỉ nhận 1 trong 2 giá trị: 1 và 0) của AI sẽ đánh giá được một giá trị ở giữa, có thể nói là cho ta thấy được tính trọng yếu trên thang đo liên tục từ 1 đến 0, chứ không phải quyết định bằng nhị phân Ngoài ra, hệ thống mạng nơron có khả năng tìm hiểu, tổng quát hóa và phân loại dữ liệu để đánh giá rủi ro thông tin sơ bộ, rủi ro kiểm soát, xác định sai sót và gian lận, từ đó tổng hợp được nhận định về tình hình sức khỏe của người bệnh
Lý do chọn bài toán
Bài toán “AI - mô hình dự đoán khả năng mắc bệnh tim mạch” mang lại nhiều lợi ích cho bản thân những người bị mắc bệnh cũng như các bác sĩ, cơ sở bệnh viện: Đối với bệnh viện, cơ sở khám bệnh nói chung: Mô hình này sẽ giúp các bác sĩ có thể nhận định được về mức độ mắc bệnh của bệnh nhân, đồng thời tiết kiệm được công sức cũng như nguồn lực doanh nghiệp nói chung Nó cũng giúp các bác sĩ kịp thời đưa ra những biện pháp, kế hoạch để chữa trị cho bệnh nhân Đồng thời, doanh nghiệp cũng sẽ cần tốn ít chi phí và nhân lực hơn cho công tác đánh giá, kiểm tra sau này. Đối với người bệnh: Mô hình này sẽ là một trong những cơ sở quan trọng giúp bệnh nhân nhanh chóng phát hiện tình trạng của mình, từ đó sẽ có những chuẩn bị kịp thời để điều trị bệnh dứt điểm sớm
Ngoài những đối tượng nêu trên, mô hình này sẽ trở thành một mô hình hiệu quả, thay đổi hoàn toàn công tác chuẩn đoán bệnh, mang lại nhiều lợi ích cho nền y học trong tương lai.
CÁCH THỨC THỰC HIỆN BÀI TOÁN
Giới thiệu về bộ dữ liệu
Dữ liệu được thu thập từ Tập dữ liệu công cộng Kaggle - Insurance Premium Prediction.
Số lượng thuộc tính: 14 (13 biến độc lập và 1 biến phụ thuộc (thuộc tính phân lớp/nhãn)) Cụ thể:
Biến phụ thuộc: Target - Nhận 1 trong 2 giá trị 0 (không mắc bệnh tim) hoặc
- Age: Tuổi của người đó
- Sex: Giới tính của người đó (1= nam, 0= nữ)
- Cp: Bị đau lồng ngực (Giá trị 0: Đau thắt ngực điển hình, Giá trị 1: Đau thắt ngực không điển hình, Giá trị 2: Không đau thắt ngực, Giá trị 3: Không có triệu chứng)
- Trestbps: Huyết áp lúc nghỉ của người đó (mm Hg khi nhập viện)
- Chol: Đo cholesterol của người đó bằng mg / dl
- Fbs: Đường huyết lúc đói của người đó (> 120 mg / dl, 1 = true; 0 = false)
- Restegs: Đo điện tâm đồ khi nghỉ ngơi (0 = bình thường, 1 = có bất thường sóng ST-T, 2 = hiển thị phì đại thất trái có thể hoặc xác định theo tiêu chí của Estes)
- Thalach: Nhịp tim tối đa của người đó đạt được
- Exang: Tập thể dục gây ra chứng đau thắt ngực (1 = có; 0 = không)
- Oldpeak: ST chênh xuống do tập thể dục so với khi nghỉ ngơi ('ST' liên quan đến các vị trí trên đồ thị ECG
- Slope: Độ dốc của đoạn ST bài tập cao điểm (Giá trị 0: dốc lên, Giá trị 1: bằng phẳng, Giá trị 2: dốc xuống)
- Ca: Số lượng mạch máu chính (0-3)
- Thal: Nhịp tim tối đa đạt được - (Ordinal): 0 = bình thường; 1 = khuyết tật cố định; 2 = khuyết tật có thể đảo ngược; 3 = khuyết tật
- Target: Bệnh tim (0 = không, 1 = có)
➔ Hình ảnh minh họa file dữ liệu dưới dạng csv:
Giới thiệu tổng quan thuật toán được sử dụng
2.1 Thuật toán Cây quyết định (Decision Tree)
Cây quyết định (Decision Tree) là một cây phân cấp có cấu trúc được dùng để phân lớp các đối tượng dựa vào dãy các luật Các thuộc tính của đối tượng có thể thuộc các kiểu dữ liệu khác nhau như Nhị phân (Binary), Định danh (Nominal), Thứ tự (Ordinal), Số lượng (Quantitative), trong khi đó thuộc tính phân lớp phải có kiểu dữ liệu là Binary hoặc Ordinal Tóm lại, cho dữ liệu về các đối tượng gồm các thuộc tính cùng với lớp (classes) của nó, cây quyết định sẽ sinh ra các luật để dự đoán lớp của các dữ liệu chưa biết.
Cây quyết định là một mô hình dự đoán, có nghĩa là từ việc quan sát các item để rút ra kết luận về giá trị đích của item đó Mỗi nút bên trong tương đương với một biến, mỗi cung đi tới một nút con tương ứng với giá trị có thể của biến đó Các là tương ứng với giá trị đích được dự đoán cho các biến
Học cây quyết định cũng là một phương pháp rất thông dụng trong khai phá dữ liệu Trong đó cây quyết định mô tả cấu trúc cây mà ở đó các lá đại diện cho các lớp và các nhánh cây biểu diễn sự kết hợp của các đặc trưng dẫn dắt tới việc phân lớp Một cây quyết định có thể được học bằng cách chia tập nguồn thành các tập con dựa trên giá trị các thuộc tính kiểm tra.
2.1.2 Cấu trúc của Cây quyết định
Cây quyết định gồm 3 phần chính: 1 node gốc (root node), những node lá (leaf nodes) và các nhánh của nó (branches) Node gốc là điểm bắt đầu của cây quyết định và cả hai node gốc và node chứa câu hỏi hoặc tiêu chí để được trả lời Nhánh biểu diễn các kết quả của kiểm tra trên nút Ví dụ câu hỏi ở node đầu tiên yêu cầu câu trả lời là “yes” hoặc là “no” thì sẽ có 1 node con chịu trách nhiệm cho phản hồi là “yes”, 1 node là “no”.
2.1.3 Ưu điểm & nhược điểm của thuật toán cây quyết định a, Ưu điểm:
Cây quyết định là một thuật toán đơn giản và phổ biến Thuật toán này được sử dụng rộng rãi với những lợi ích của nó:
Dữ liệu đầu vào có thể là là dữ liệu missing, không cần chuẩn hóa hoặc tạo biến giả: Thuật toán Decision trees đơn giản, trực quan, dễ thực hiện Một số thuật toán cây quyết định có khả năng xử lý dữ liệu bị missing và dữ liệu bị lỗi mà không cần áp dụng phương pháp như “imputing missing values” hay chọn lọc loại trừ Bên cạnh đó, Decision trees còn ít bị ảnh hưởng bởi các dữ liệu ngoại lệ (outliers) Thuật toán cây quyết định là phương pháp không sử dụng tham số, nên không cần phải có các giả định ban đầu về các quy luật phân phối như trong thống kê, nên kết quả phân tích thường là khách quan nhất.
Có thể làm việc với cả dữ liệu số và dữ liệu phân loại: Thuật toán cây quyết định có thể giúp chúng ta phân loại đối tượng dữ liệu theo biến mục tiêu có nhiều lớp, nhiều nhóm khác nhau (multi-class classification,) đặc biệt nếu biến mục tiêu là dạng biến định lượng phức tạp Thuật toán cây quyết định có thể áp dụng linh hoạt cho các biến target, biến mục tiêu là biến định tính (classification task) Ví dụ phân loại khách hàng theo “rủi ro tín dụng” và “không rủi ro tín dụng”.
Có thể xác thực mô hình bằng cách sử dụng các kiểm tra thống kê: Thuật toán cây quyết định mang lại kết quả dự báo có độ chính xác cao, dễ dàng thực hiện, nhanh chóng trong việc huấn luyện Thêm vào đó, bộ dữ liệu dùng để training không cần quá lớn, không cần phải chuyển đổi các biến vì kết quả sẽ như nhau với bất kể loại biến dữ liệu biến đổi ra sao Thuật toán cây quyết định vẫn nói lên được mối liên hệ giữa các biến, các thuộc tính dữ liệu một cách trực quan nhất mặc dù không thể hiện được rõ mối quan hệ tuyến tính, hay mức độ liên hệ giữa chúng như phương pháp hồi quy (regression analysis) Ngoài kinh tế, tài chính, thuật toán cây quyết định có thể được ứng dụng trong lĩnh vực y tế, nông nghiệp, sinh học. b, Nhược điểm:
Cây quyết định hay gặp vấn đề overfitting: Thuật toán cây quyết định hoạt động hiệu quả trên bộ dữ liệu đơn giản, có ít biến dữ liệu liên hệ với nhau nhưng lại kém hiệu quả với bộ dữ liệu phức tạp Cụ thể, thuật toán cây quyết định khi được áp dụng với bộ dữ liệu phức tạp, nhiều biến và thuộc tính khác nhau có thể dẫn đến mô hình bị overfitting, quá khớp với dữ liệu training dẫn đến vấn đề không đưa ra kết quả phân loại chính xác khi áp dụng cho dữ liệu test, và dữ liệu mới.
Mô hình cây quyết định phụ thuộc rất lớn vào dữ liệu tìm được Thậm chí, với một sự thay đổi nhỏ trong bộ dữ liệu, cấu trúc mô hình cây quyết định có thể thay đổi hoàn toàn: Khi chúng ta điều chỉnh dữ liệu, cách thức phân nhánh, ngắt cây sẽ bị thay đổi, có thể dẫn đến kết quả sẽ khác so với ban đầu, phức tạp hơn Các chuyên gia gọi đây là vấn đề “high variance” – giá trị phương sai cao
Thuật toán cây quyết định khi áp dụng cho biến định tính (classification tree), nếu phân loại sai có thể dẫn đến sai lầm nghiêm trọng Ví dụ một người có khả năng bị đột quỵ lại được phân loại là không thì vô tình đặt người này vào tình thế nguy hiểm Còn khi áp dụng cho biến định lượng (regression tree), thì chỉ phân loại đối tượng, hay dự báo theo phạm vi giá trị (range) được tạo ra trước đó Vì vậy đây cũng là một hạn chế khi khả năng có nhiều phạm vi giá trị khác mà thuật toán chưa xét đến
Thuật toán cây quyết định có khả năng “bias” hay thiên vị nếu bộ dữ liệu không được cân bằng Nói đơn giản, khi bộ dữ liệu được phân ra thành các nhóm theo các đặc trưng khác nhau nào đó, mà số lượng quan sát trong mỗi nhóm là quá chênh lệch hay khác biệt rõ rệt về đặc trưng, lúc này có thể dẫn đến mô hình bị
“bias”, phân nhánh đơn giản, chỉ xét đến các giá trị tiêu biểu, và nguy cơ
“Underfitting” (không rà soát hết các khả năng phân loại dữ liệu)
Thuật toán cây quyết định yêu cầu bộ dữ liệu training và test phải được chuẩn bị hoàn hảo, chất lượng tốt phải được cân đối theo các lớp, các nhóm trong biến mục tiêu Ngoài ra biến mục tiêu phải có các giá trị “rời rạc” dễ nhận biết, không được quá đa dạng, và phải cụ thể để quá trình phân loại diễn ra dễ dàng hơn cho thuật toán
Thuật toán cây quyết định không “hỗ trợ” kỹ thuật hay khả năng “truy vấn ngược” mà chỉ phân nhánh liên tục dựa trên các công thức phân nhánh cho đến khi thấy được kết quả sau cùng nên chúng ta khó phát hiện được các lỗi ở đâu nếu có sai sót.
2.2 Giới thiệu về thuật toán SVM
SVM (Support Vector Machine) là 1 thuật toán học máy thuộc nhóm Supervised Learning (học có giám sát), được sử dụng trong các bài toán phân lớp dữ liệu (classification) hay hồi quy (Regression) SVM được coi là một thuật toán giám sát, nó có thể sử dụng cho cả việc phân loại hoặc đệ quy
Giải thuật máy vector hỗ trợ SVM (Support Vector Machine) ra đời từ lý thuyết học thống kê do Vapnik và Chervonenkis xây dựng năm 1995 Đây là một giải thuật phân lớp có hiệu quả cao và đã được áp dụng nhiều trong lĩnh vực khai phá dữ liệu và nhận dạng Ban đầu thuật toán SVM được thiết kế để giải quyết bài toán phân lớp nhị phân SVM là 1 thuật toán phân loại nhị phân, SVM nhận dữ liệu vào và phân loại chúng vào hai lớp khác nhau Với 1 bộ các ví dụ luyện tập thuộc hai thể loại cho trước, thuật toán luyện tập SVM xây dựng 1 mô hình SVM để phân loại các ví dụ khác vào hai thể loại đó.
Mã lệnh chương trình
3.1 Đọc dữ liệu, tiền xử lý dữ liệu
Bước 1: Khai báo thư viện
IN [1]: Thư viện dùng để đọc dữ liệu từ tệp
- import numpy as np: Khai báo thư viện hỗ trợ tính toán số học
- import pandas as pd: Khai báo thư viện hỗ trợ đọc và phân tích dữ liệu ở dạng bảng
- import seaborn as sns: Khai báo thư viện để vẽ biểu đồ thống kê nâng cao
- import matplotlib.pyplot as plt: Khai báo thư viện để vẽ biểu đồ
- import joblib: Thư viện dùng để lưu trữ mô hình học ra tệp
- import pickle: Thư viện giúp lưu trữ mô hình
IN [2]: Liên kết với Google Drive
- from google.colab import drive
IN [3]: Chỉ dẫn đến thư mục lấy dữ liệu
- dulieu=pd.read_csv('/content/drive/MyDrive/heart.csv’)
IN [4]: Xem các thông tin trong bảng dữ liệu
IN [5]: Kiểm tra kích thước của dữ liệu bằng cách sử dụng hàm Shape
➢ Số lượng mẫu và số thuộc tính
- print("số lượng mẫu và thuộc tính: ", dulieu.shape)
- print("Số dòng: ", dulieu.shape[0])
- print("Số cột: ", dulieu.shape[1])
• số lượng mẫu và thuộc tính: (1025, 14)
IN [6]: Hiển thị dữ liệu của các thuộc tính
➔ Kết quả thu được age int64 sex int64 cp int64 trestbps int64 chol int64 fbs int64 restecg int64 thalach int64 exang int64 oldpeak float64 slope int64 ca int64 thal int64 target int64 dtype: object
IN [7]: Đổi tên các thuộc tính cần dùng về dạng đơn giản giúp dễ dàng truy cập để vẽ biểu đồ
- Mối quan hệ giữa Số lượng mạch máu chính (ca) và ST chênh xuống do tập thể dục so với khi nghỉ ngơi (oldpeak)
IN [10]: Thêm nhãn cho biểu đồ Cột
- plt.xlabel('ST chênh xuống do tập thể dục so với khi nghỉ ngơ')
- plt.ylabel('Số lượng mạch máu chính')
- plt.suptitle('Số lượng mạch máu chính theo số ST chênh xuống do tập thể dục so với khi nghỉ ngơi ')
- plt.xlabel('ST chênh xuống do tập thể dục so với khi nghỉ ngơi')
- plt.ylabel('Số lượng mạch máu chính')
- plt.suptitle('Số lượng mạch máu chính theo số ST chênh xuống do tập thể dục so với khi nghỉ ngơi')
- plt.barh(ca, oldpeak, color = 'pink')
- Biểu đồ thể hiện Mối quan hệ giữa Số lượng mạch máu chính (ca) và ST chênh xuống do tập thể dục so với khi nghỉ ngơi (oldpeak)
- Mối quan hệ này có liên hệ chặt chẽ với nhau, khi ST chênh xuống do tập thể dục so với khi nghỉ ngơi (oldpeak) tăng lên thì khi đó số lượng mạch máu chính cũng tăng theo Ví dụ: khi ST chênh xuống do tập thể dục so với khi nghỉ ngơi (oldpeak) là 6.2 thì Số lượng mạch máu chính có thể nhận giá trị là 3
3.2 Áp dụng thuật toán Decision Tree
3.2.1 Xây dựng mô hình Đầu tiên, chúng ta sẽ dụng thuộc toán Decision Tree để phân lớp và đưa ra dự đoán cho tập dữ liệu
IN [12]: Chuẩn bị dữ liệu, đào tạo và đưa ra dự đoán
- from sklearn import tree: Thư viện mô hình cây quyết định
- from sklearn.metrics import confusion_matrix: Thư viện xác định ma trận nhầm lẫn
- from sklearn.model_selection import train_test_split: Thư viện để chia tách dữ liệu
- from sklearn.metrics import accuracy_score: Thư viện xác định độ chính xác của mô hình
IN [13]: Xác định thuộc tính mô tả X và thuộc tính dự đoán Y
- features = ['age','sex','cp','trestbps','chol','fbs','restecg','thalach','exang','oldp eak', 'slope','ca','thal']
IN [14]: Chia tệp dữ liệu thành hai tập train và test tỉ lệ 70% train, 30% test
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
IN [15]: Khai báo mô hình câu quyết định
- model=tree.DecisionTreeClassifier(criterion = "entropy", random_state = 100, max_depth = 6, min_samples_leaf = 5)
IN [16]: Thực thi mô hình
- y_pred= model.fit(X_train,y_train)
IN [17]: Kiểm thử mô hình
- print("Giá trị nhãn mô hình dự đoán được:\n " ,y_pred)
➔ Kết quả thu được: Giá trị nhãn mô hình dự đoán được:
IN [18]: Xác định ma trận nhầm lẫn
- print("Confusion Matrix: \n", confusion_matrix(y_test, y_pred))
IN [19]: Độ chính xác của mô hình
- print('Độ chính xác của Decision Tree là: ',ACC) #accuracy
➔ Kết quả thu được: Độ chính xác của Decision Tree là 91.70731707317074
Bảng thay đổi độ chính xác của mô hình Decision Tree
Cách 1: thay đổi tỉ lệ train và test
Tỉ lệ train và test Độ chính xác
Cách 2: thay đổi tỉ lệ max_depth
Tỉ lệ max_depth Độ chính xác
➔ Với kết quả thu được, thì nhóm chúng em quyết định chọn tỉ lệ train 80% và test 20%, max_depth là 6 để đạt được độ chính xác cao nhất
IN [20]: Sử dụng mô hình Dự đoán khả năng mắc bệnh tim mạch của người dân có các thông tin sau:
• Điện tâm đồ khi nghỉ ngơi: 0
• Tập thể dục gây ra chứng đau thắt ngực: 0
• ST chênh xuống do tập thể dục so với khi nghỉ ngơi: 0
• Độ dốc của đoạn ST bài tập cao điểm: 2
• Số lượng mạch máu chính: 2
• Nhịp tim tối đa đạt được: 3
- print("Người dân mắc bệnh tim mạch")
- print("Người dân không mắc bệnh tim mạch")
➔ Kết quả thu được: Người dân không mắc bệnh tim mạch
3.2.3 Tái sử dụng mô hình
IN [21]: Lưu trữ mô hình dưới dạng tệp
- joblib.dump(model, "Decision_Tree")
➔ Kết quả thu được: ['Decision_Tree']
IN [22]: Tái sử dụng mô hình
Sử dụng mô hình Dự đoán khả năng mắc bệnh tim mạch của người dân có các thông tin sau:
• Điện tâm đồ khi nghỉ ngơi: 1
• Tập thể dục gây ra chứng đau thắt ngực: 0
• ST chênh xuống do tập thể dục so với khi nghỉ ngơi: 1.9
• Độ dốc của đoạn ST bài tập cao điểm: 1
• Số lượng mạch máu chính: 2
• Nhịp tim tối đa đạt được: 2
- print("Người dân mắc bệnh tim mạch")
- print("Người dân không mắc bệnh tim mạch")
➔ Kết quả thu được: Người dân mắc bệnh tim mạch
3.3 Áp dụng mô hình SVM ( Support Vector Machine)
Bước 1: Khai báo thư viện
IN [1]: Khai báo thư viện
- import numpy as np: Khai báo thư viện hỗ trợ tính toán số học
- import pandas as pd: Khai báo thư viện hỗ trợ đọc và phân tích dữ liệu ở dạng bảng
- import matplotlib.pyplot as plt: Khai báo thư viện để vẽ biểu đồ
- import seaborn as sns: Khai báo thư viện để vẽ biểu đồ thống kê nâng cao
IN [2]: Phân quyền truy cập Google Drive cho Google Colab
- from google.colab import drive
IN [3] Chỉ dẫn đến thư mục lấy dữ liệu
- df =pd.read_csv('/content/drive/MyDrive/heart (1).csv')
IN [4]: Xem các thông tin của dữ liệu
IN [5]: Xem 5 dòng dữ liệu đầu tiên
IN [6]: Xem 5 dòng dữ liệu cuối cùng
IN [7]: Hiển thị số lượng mẫu và số thuộc tính
- print("số lượng mẫu và số thuộc tính: ", df.shape)
- print("Số dòng: ", df.shape[0])
- print("Số cột: ", df.shape[1])
IN [8]: Trả về số lượng giá trị duy nhất cho mỗi biến
IN [9]: Thống kê các giá trị định lượng
IN[10]: Hiển thị số lượng giá trị bị thiếu cho mỗi cột
IN [11]: Đếm số giá trị được chuẩn đoán mắc bệnh tim và không mắc bệnh tim
IN[12]: Biểu đồ cột minh họa cho mỗi thuộc tính
Dựa vào biểu đồ ta có thể thấy một số đặc điểm như, trong tập dữ liệu, độ tuổi chiếm tỷ lệ cao nhất là 55 đến 60 tuổi, đa số người dân là nữ, huyết áp lúc nghỉ ngơi phân bổ ở 130-140 mg/dl, khi tập thể dục không gây ra triệu chứng đau thắt ngực chiếm phần đa, đường huyết lúc đói