Phần này sẽ cài đặt mô hình Logistic Regression cho bài toán dự báo bệnh thận. Để xem sự ảnh hưởng của các tham số như đã trình bày trong phần trước (phần 3.4), Tôi có thay đổi các giá trị của tham số.
Hàm Logistic cũng được gọi là là hàm sigmoid. Chúng ta dựng đồ thị cho hàm này bằng Python:
01. import numpy as np
02.from matplotlib import pyplot
03. def sigmoid(z): 04. return 1 / (1 + np.exp(-z)) 05. nums= np.linspace(-10, 10, 100) 06. fig, ax = pyplot.subplots() 07. ax.plot(nums, sigmoid(nums), 'r') 08. ax.set_title('Sigmoid') 09. pyplot.show() Chương trình 3. 7: Dựng đồ thị hàm sigmoid
Chương trình trên sẽ cho đồ thị:
78
from pandas import read_csv
import os
duongDan = os.getcwd() + '\data\\Kedney_final.csv'
tenCot = ['age','sex','WBC','LY','NE','RBC','HGB',
'HCT','PLT','Na','K','Protein','Albumin','Ure','Creatinin','absence'] duLieu = read_csv(duongDan, names=tenCot)
##########################################################
from sklearn import preprocessing maTran = duLieu.values X = maTran[:,:-1] y = maTran[:,-1] dieuChinh = preprocessing.MinMaxScaler(feature_range= (0,1)) X_dieuChinh = dieuChinh.fit_transform(X) #######################################################
# tách dữ liệu ra thành 2 tập: huấn luyện (training) và kiểm tra (test)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_dieuChinh, y, test_size=0.2, random_state=1)
# huấn luyện mô hình trên tâp huấn luyện
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None,
random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
lr.fit(X_train, y_train)
# dự đoán trên tập kiểm tra
y_pred = lr.predict(X_test)
# so sánh giá trị thực tế (y_test) với giá trị dự đoán của mô hình (y_pred)
from sklearn import metrics
print("Logistic Regression model accuracy(in %):", metrics.accuracy_score(y_test, y_pred)*100)
Chương trình 3. 8: Chương trình thực thi mô hình Logistic Regression với giả định phân phối Bernoulli
Chương trình 3.8 thực thi mô hình Logistic Regression kết quả sẽ cho: ('Logistic Regression model accuracy(in %):', 91.917808219178085)
Để tránh trường hợp overfitting, chúng ta sử dụng kĩ thuật Regularization. Có 2 kĩ thuật đó là sử dụng hàm phạt L1 (L1-norm) và L2 (L2-norm).
79
Used to specify the norm used in the penalization. The ‘newton-cg’, ‘sag’ and ‘lbfgs’ solvers support only l2 penalties.
from pandas import read_csv
import os
duongDan = os.getcwd() + '\data\\Kedney_final.csv'
tenCot = ['age','sex','WBC','LY','NE','RBC','HGB',
'HCT','PLT','Na','K','Protein','Albumin','Ure','Creatinin','absence'] duLieu = read_csv(duongDan, names=tenCot)
##########################################################
from sklearn import preprocessing maTran = duLieu.values X = maTran[:,:-1] y = maTran[:,-1] dieuChinh = preprocessing.MinMaxScaler(feature_range= (0,1)) X_dieuChinh = dieuChinh.fit_transform(X) #######################################################
# Tac du lieu ra thanh 2 tap: Huan luyen (Training) va kiem tra (test)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_dieuChinh, y, test_size=0.2, random_state=1)
# Huan luyen mo hinh tren tap huan luyen
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(penalty='l1', dual=False, tol=0.0001, C=1.0,
fit_intercept=True, intercept_scaling=1,
class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr',
verbose=0, warm_start=False, n_jobs=1) lr.fit(X_train, y_train)
'''
lr = LogisticRegression(penalty='l1', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1,
class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr',
verbose=0, warm_start=False, n_jobs=1) lr.fit(X_train, y_train)
'''
# Du doan tren tap kiem tra
y_pred = lr.predict(X_test)
# So sanh gia tri thuc te (y_test) voi gia tri du doan cua mo hinh (y_pred)
from sklearn import metrics
print("Logistic Regression model accuracy(in %):", metrics.accuracy_score(y_test, y_pred)*100)
Chương trình 3. 9: Chương trình thực thi mô hình Logistic Regression
Chương trình 3.9 thực thi mô hình Logistic Regression kết quả sẽ cho: ('Logistic Regression model accuracy(in %):', 93.424657534246577)
80
Kết quả này tương đối cao so với mô hình SVM, tuy nhiên kết quả cho chúng ta kết luận rằng dữ liệu của bài toán sẽ phù hợp hơn với giả định phân phối Bernoulli so với giả định phân phối Multinomial.
Qua kết quả của ba hàm phân phối, chúng ta nhận ra rằng dữ liệu của bài toán dự báo bệnh thận sẽ phù hợp với giả định có hàm phạt L1 (L1-norm) hơn so với hàm phạt L2 (L2-norm).
81
KẾT LUẬN
Máy học gây nên cơn “sốt” công nghệ trên toàn thế giới trong vài năm nay. Trong giới học thuật, mỗi năm có hàng ngàn bài báo khoa học về đề tài này. Trong giới công nghiệp, từ các công ty lớn như Google, Facebook, Microsoft đến các công ty khởi nghiệp đều đầu tư vào máy học. Hàng loạt các ứng dụng sử dụng máy học ra đời trên mọi linh vực của cuộc sống, từ khoa học máy tính đến những ngành ít liên quan hơn như vật lý, hóa học, y học, chính trị. Và được xem là con đường gắn nhất để bắt kịp xu hướng phát triển công nghệ thông tin trên thế gới.Máy học sẽ giúp chúng ta đến gần hơn với cuộc cách mạng này. Máy học trong y tế nó sẽ giải quyết nguồn dữ liệu vô giá dẫn đến việc thay đổi trong chăm sóc sức khoẻ và nghiên cứu y học. Chính những gì các thầy thuốc thấy và thu thập khi khám chữa bệnh bấy lâu nay được viết và lưu giữ trong các bệnh án. Khi rất nhiều bệnh án được phân tích và so sánh bằng máy tính, ta có thể phát hiện ra những tri thức y học mới cũng như kiểm nghiệm lại các tri thức y học đã có, vốn được tìm ra khi chưa ai quan sát được nhiều người bệnh như ngày nay với máy học. Đây là lý do để Máy học được coi là người soi đường tìm ra nguồn tài nguyên vô giá cho sự phát triển của chăm sóc sức khoẻ và nghiên cứu y khoa. Điều đó sẽ được máy học giải mã và đưa con người đến với những cơ hội sống lâu hơn, sống lành mạnh hơn.
Kết quả đạt được của đề tài
Đề tài thực hiện 2 công việc: Phần tìm hiểu lí thuyết và phần thực nghiệm. Có bài báo đăng trên tạp chí khoa học và công nghệ của Trường đại học Sư phạm Kĩ thuật Hưng Yên.
1. Về phần lý thuyết
Trong luận văn này, Tôi đã tìm hiểu hai mô hình quan trọng của Máy học: Mô hình Support vector machine (SVM) và mô hìnhLogistic Regression (LGR).
Mô hình SVM
Mô hình SVM là một giải thuật Máy học phức tạp, và có rất nhiều tham số. Tuy nhiên luận văn đã đề cập tới ba tham số chính:
82
Xác định kernel cho bài toán (Linear, Polynominal, Gaussian, Sigmoid) để có thể biến đổi sang không gian mới.
- Tham số C dùng để xác định cho điều kiện thứ 2. Cụ thể:
+ Giá trị của C lớn sẽ dẫn tới chi phí lớn cho phân tách lỗi (misclassification). Khi đó, mô hình SVM sẽ chọn siêu phẳng có lề nhỏ hơn vì siêu phẳng đó phân tách chính xác hơn các điểm dữ liệu. Giá trị C nhỏ sẽ dẫn tới đường biên (boundary) sẽ phức tạp hơn để phân tách nhiều điểm dữ liệu, khi đó bias (độ lệch) nhỏ và variance (phương sai) lớn.
+ Ngược lại, giá trị C nhỏ sẽ dẫn tới chi phí nhỏ cho phân tách lỗi. Khi đó, mô hình SVM sẽ chọn siêu phẳng có lề lớn hơn, ngay cả khi siêu phẳng đó phân tách bị lỗi nhiều hơn. Giá trị C nhỏ sẽ dẫn tới đường biên (boundary) trơn hơn, khi đó bias (độ lệch) lớn và variance (phương sai) nhỏ.
- Trong thuật toán Support Vector Machine, ngoài sự tác động của tham số C như các thuật toán khác, còn có một tham số nữa, là Gamma. Tham số Gamma dùng khi chúng ta sử dụng Gaussian kernel để xử lý bài toán phi tuyến (non-linear classification). Một cách dễ hiểu, tham số Gamma xác định sự ảnh hưởng bao xa của mỗi điểm dữ liệu. Cụ thể:
+ Nếu Gamma nhỏ, thì mọi điểm dữ liệu có sự ảnh hưởng ở xa. Nói một cách khác, đường biên quyết định (decision boundary) phụ thuộc vào cả những điểm gần và cả những điểm ở xa nó.
+ Nếu Gamma lớn, thì mọi điểm dữ liệu chỉ có tác động ở gần. Nói cách khác, đường biên quyết định (decision boundary) phụ thuộc vào những điểm gần nó nhất; những điểm ở xa có sự tác động rất nhỏ.
Trong bài toán dự báo bệnh thận mô hình SVM cho thời gian thực thi tương đối nhanh, với kết quả cao khi chúng ta sử dụng tính linh hoạt của mô hình: Khiphân lớp là phi tuyến tính. Khả năng áp dụng kernel mới cho phép linh động giữa các phương pháp tuyến tính và phi tuyến tính từ đó khiến cho hiệu suất phân loại lớn hơn. Tuy nhiên SVM cũng có một vài nhược điểm.
83
Mô hình Logistic Regression
Mô hình Logistic có một giả định rằng biến phụ thuộc (dự đoán) có giá trị rời rạc. Nếu biến dự đoán chỉ lấy hai giá trị rời rạc, đó là mô hình Binary Logistic Regression. Nếu biến dự đoán lấy nhiều hơn hai giá trị, đó là mô hình Multinomial Logistic Regression.
Luận văn này chỉ tập trung vào Binary Logistic Regression, nó rất hay được sử dụng trong thực tế, ví dụ khi bài toán liên quan tới dự báo: Có/không, thành công/thất bại, sống/chết, qua/trượt, bị bệnh/không bị, chấp nhận/từ chối, nam/nữ, v.v...
Binary Logistic Regression được xem như là một trong những thuật toán quan trọng bậc nhất trong Máy học.
2. Về phần thu thập và sử lý dữ liệu
Thu thập và xử lý dữ liệu từ Bệnh viện Đa khoa tỉnh Điện Biên với tổng số mẫu nghiên cứu là 166.823 mẫu trong đó mẫu đạt tiêu chuẩn là 3648 mẫu.
Trong 3648 bệnh nhân đạt tiêu chuẩn nghiên cứu có 1587 là bệnh nhân có chẩn đoán mắc các bệnh về thận, còn 2061 bệnh nhân có chẩn đoán không phải các bệnh về thận và đây chính là các tập dữ liệu để ta có thể huấn luyện trong luận văn này.
Xây dựng 2 mô hình SVM và LGR để dự đoán cho bệnh nhân bị bệnh thận trên 2 tập dữ liệu thực tế chuẩn xác.
3. Về phần thực nghiệm
Thông qua việc cài đặt hai mô hình vào bài toán dự báo bệnh nhân bệnh thận, Tôi có một vài nhận xét. Thứ nhất, mô hình SVM cho kết quả khá cao. Đặc biệt khi chọn đúng các tham số. Có một vài cách lựa chọn tham số để mô hình SVM cùng cho kết quả với độ chính xác cao nhất: 96.1644 ứng với C = 10000, kernel = ‘rbf’ và gamma = 0.600.
Đây là một kết quả rất bất ngờ trên dữ liệu thật được lấy từ bệnh viện Đa khoa tỉnh Điện Biên. Với tỉ lệ chính xác như thế này, Tôi tin rằng chương trình sẽ hỗ trợ rất tốt cho các bác sĩ thêm thông tin để chuẩn đoán bệnh cho các bệnh nhân.
4. Hướng phát triển của đề tài
84
- Thứ nhất, liên quan tới dữ liệu (Feature engineering), mặc dù trong luận văn này cũng đã đề cập, nhưng Tôi muốn tiến hành kĩ hơn. Có ba bước Tôi sẽ lưu tâm khi làm việc với dữ liệu:
+Lựa chọn dữ liệu (Data Selection): Bổ sung dữ liệu và lựa chọn các đặc tính phù hợp nhằm tăng tính chính xác cho mô hình. Tuy nhiên không phải lúc nào dữ liệu thêm vào cũng làm tăng hiệu quả cho mô hình.
+Xử lý dữ liệu (Data Preprocessing): Có thể tìm cách bổ sung những dữ liệu bị thiếu, hoặc loại bỏ nó.
+Biến đổi dữ liệu (Data Transformation): Khi chúng ta muốn chuyển (scaling) dữ liệu về cùng một tỉ lệ, và cũng có khi là phân tách đặc tính ra (decomposition) hoặc tích hợp lại (Aggregation).
+Cụ thể Tôi sẽ phải tìm hiểu thêm các kĩ thuật xử lý dữ liệu trong Máy học: Principal component analysis (PCA–phân tích thành phần chính), factor analysis (phân tích thành tố), ...
- Thứ hai, Tôi muốn tìm hiểu thêm các mô hình khác trong Máy học (machine learning algorithms), ngoài hai mô hình mà luận văn này đã bàn tới (SVM và LGR). Cụ thể Tôi muốn tìm hiểu và so sánh kết quả với một số mô hình học có giám sát:
+Decision Trees
+K – nearest neighbor +Neuron Network
- Phần thứ ba, Tôi sẽ rà soát lại và trao đổi với các bác sĩ chuyên khoa để thực thi thêm các bệnh án mới, nhằm kiểm định lại chương trình của Tôi.Tôi sẽ thêm các chỉ số như tuổi, giới tính, dân tộc vào để sử lý dữ liệu. Một hướng khác Tôi cũng muốn áp dụng mô hình đã xây dựng vào dữ liệu mới (ở bệnh viện khác, ở vùng khác) để có thêm những thông tin về tính hiệu quả của mô hình.
Sau khi đã tìm hiểu và so sánh như vậy, Tôi tin rằng sẽ tìm được mô hình thực sự phù hợp với bài toán dự đoán bệnh thận. Tôi nhận thức được rằng việc chuẩn đoán bệnh là một công việc khó, đòi hỏi tính chuyên môn cao và rất quan trọng, vì nó liên quan tới sức khỏe của con người. Tuy nhiên, Tôi cũng nhận thấy rằng với sự phát
85
triển của khoa học máy tính gần đây, đặc biệt là ngành Trí tuệ Nhân tạo và Máy học, đã có rất nhiều ứng dụng quan trọng đã có hiệu quả cao. Do vậy, Tôi tin rằng luận văn có thể được mở rộng và có thể ứng dụng vào hỗ trợ cả bệnh nhân và bác sĩ của bệnh viện Đa khoa tỉnh Điện Biên.
TÀI LIỆU THAM KHẢO
1 https://vi.wikipedia.org/wiki/Máy_vectơ_hỗ_trợ
2 James, G., Witten, D., Hastie, T., Tibshiranie, R (2013). An Introduction to Statistical Learning. Publisher Springer-Verlag New York, pp.418.
3 Alexey Nefedov. Support Vecto Machines: A Simple Tutorial. Creative Commons Attribution - NonCommercial - NoDerivatives 4.0 license, 2016. 4 https://courses.csail.mit.edu/6.867/wiki/images/a/a7/Qp-cvxopt.pdf 5 https://en.wikipedia.org/wiki/Lagrange_multiplier 6 https://en.wikipedia.org/wiki/Karush–Kuhn–Tucker_conditions 7 https://en.wikipedia.org/wiki/Quadratic_programming 8 http://www.math.sjsu.edu/~gchen/Math285S16/lec7svm.pdf 9 http://scikit-learn.org/stable/modules/naive_bayes.html 10 https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection 11 https://wiki.python.org/moin/BeginnersGuide/Programmers 12 https://developers.google.com/edu/python/introduction 13 https://docs.python.org/3/tutorial/ 14 https://www.tutorialspoint.com/python/index.htm 15 https://en.wikipedia.org/wiki/Scikit-learn 16 http://scikit-learn.org/stable/ 17 http://scikit-learn.org/stable/modules/preprocessing.html 18 http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html 19 http://pandas.pydata.org/pandasdocs/stable/generated/pandas.DataFrame.desc ribe.html 20 http://pandas.pydata.org/pandas-docs/version/0.18.1/visualization.html 21 http://scikitlearn.org/stable/modules/generated/sklearn.preprocessing.MinMax Scaler.html 22 http://scikit-learn.org/stable/auto_examples/svm/plot_rbf_parameters.html 23 https://www.technologyreview.com/s/607831/nvidia-ceo-software-is-eating- the-world-but-ai-is-going-to-eat-software/
24 http://mucmd.org/ 25 http://www.enlitic.com/ 26 http://staging.csml.ucl.ac.uk/clinics/ 27 https://www.recode.net/2016/12/5/13837908/machine-learning-doctors-vic- gundotra-recode-podcast 28 http://genk.vn/ibm-va-cuoc-cach-mang-tri-tue-nhan-tao-mang-ten-watson- 20160830152953753.chn 29 http://genk.vn/tri-tue-nhan-tao-ibm-watson-se-duoc-trien-khai-voi-ngan- hang-benh-vien-va-truyen-hinh-cap-tai-viet-nam-20170420183145415.chn 30 https://tinhte.vn/threads/tri-thong-minh-nhan-tao-giup-chan-doan-benh- alzheimer-truoc-10-nam.2729923/ 31 http://genk.vn/tri-tue-nhan-tao-ibm-watson-se-duoc-trien-khai-voi-ngan- hang-benh-vien-va-truyen-hinh-cap-tai-viet-nam-20170420183145415.chn 32 Trần Văn Chất, Bệnh viện Bạch Mai Khoa Thận - Tiết niệu (2008), Bệnh thận,
NXB Y học, tr.287-470.
33 Nguyễn Trường Sơn, Bệnh viện Chợ Rẫy(2013), Phác đồ điều trị 2013 phần nội khoa, NXB Y học, tr.479-544.
34 Nguyễn Đạt Anh, Nguyễn Thị Hương (2012), Các xét nghiệm thường quy áp dụng trong thực hành lâm sàng, NXB Y học, tr.30.
BẢN XÁC NHẬN CÓ BÀI BÁO ĐĂNG TRÊN TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN
ĐƠN MƯỢN HỒ SƠ BỆNH ÁN CÓ BỆNH LÝ THẬN TẠI BỆNH VIỆN ĐA KHOA TỈNH ĐIỆN BIÊN