XỬ LÝ DỮ LIỆU BỆNH NHÂN MẮC BỆNH THẬN

Một phần của tài liệu Nghiên cứu các giải thuật máy học và áp dụng vào bài toán dự đoán bệnh thận tại bệnh viện đa khoa tỉnh điện biên dùng ngôn ngữ python (Trang 71)

3.2.1. Hiển thị dữ liệu [17,18]

Dữ liệu định dạng csv

Tất cả các thuật toán trong Máy học cần dữ liệu. Các dữ liệu trong luận văn này sẽ được lưu trữ trên tệp (file). Trong Máy học, tệp có định dạng thông dụng nhất và được coi là chuẩn là tệp csv (comma separated values – các giá trị dữ liệu được ngăn cách bởi dấu phẩy). Tệp csv thường được dùng để nhập và xuất cho cơ sở dữ liệu. Tệp csv chứa nhiều hàng, mỗi hàng có thể chứa nhiều cột, các giá trị được cách nhau bởi dấu phảy (,).

01. from pandasimport read_csv

02. import os

03. duongDan = os.getcwd() + '\data\\Kedney_final.csv' 04. tenCot = ['age','sex','WBC','LY','NE','RBC','HGB',

'HCT','PLT','Na','K','Protein','Albumin','Ure','Creatinin','absence']

05. duLieu = read_csv(duongDan, names=tenCot)

06. print (duLieu.shape) # (3648, 16): Dữ liệu có 3648hàng và 16 cột

07. print (duLieu.head()) # Hiển thị 5 hàng đầu tiên

Chương trình 3. 1: Kết nối cơ sở dữ liệu

Một số chú thích cho Chương trình 3.1: - Dòng 1: Chúng ta nhập thư viện pandas.

- Dòng 2: os giúp chúng ta truy xuất vào nơi chứa tệp thông qua hệ điều hành. - Dòng 3: getcwd(), trả ra một xâu chứa thông tin của thư mục đang làm việc (dùng cho Windows và Unix). Ví dụ trên máy của tôi chương trình đang làm việc trên thư mục: C:/Users/Tu/PycharmProjects/Master2017/.

- Dòng 4: Đặt tên cột cho dữ liệu, để sau này DataFrame có 11 cột để truy xuất thông tin thông qua tên cột. Để cho thuận tiện, chúng ta đặt luôn tên là tên các đặc tính.

- Dòng 5: Sử dụng hàm pandas.read_csv để đọc dữ liệu từ tệp Kedney_final.csv, kết quả trả ra là một DataFrame. Từ đây chúng ta có thể thao tác với dữ liệu.

- Dòng 06: Hiển thị số hàng và số cột

62

Kết quả của chương trình trên như sau:

(3648, 16)

age sex WBC LY NE RBC HGB HCT PLT Na K Protein 0 78 1 6.13 14.4 77.7 2.98 88 25.5 98.0 139.80 3.70 71.28 1 16 0 7.69 13.6 73.5 3.64 81 25.5 249.0 141.90 3.70 60.77 2 51 0 10.13 14.8 82.2 3.74 127 35.6 179.0 138.95 3.42 74.10 3 79 0 4.33 25.5 62.6 3.34 101 30.8 260.0 134.35 3.06 73.90 4 42 1 3.53 13.0 75.0 1.58 47 13.0 52.0 125.50 6.82 66.50

Albumin Ure Creatinin absence 0 36.3 2.988 55.43 1 1 28.2 18.003 566.34 1 2 38.9 4.200 94.00 1 3 33.7 6.400 476.00 1 4 32.6 50.400 2246.00 1 Chúng ta cũng có thể hiển thị 5 hàng cuối cùng:

print (duLieu.tail()) # Hiển thị 5 hàng cuối cùng

Kết quả hiển thị: age sex WBC LY NE RBC HGB HCT PLT Na K 3643 5 1 10.88 37.8 52.4 4.70 136 40.2 393.0 144.6 4.6 3644 83 1 9.10 23.2 70.8 4.00 125 35.4 248.0 139.6 4.1 3645 20 1 8.85 24.6 65.1 4.70 122 36.6 292.0 139.7 3.6 3646 21 1 9.61 21.8 70.3 4.59 143 39.2 220.0 139.3 3.5 3647 15 1 16.32 5.2 92.2 5.43 115 35.8 268.0 139.9 4.0

Protein Albumin Ure Creatinin absence 3643 72.44 43.3 5.163 62.30 0 3644 72.32 41.9 3.827 56.86 0 3645 71.44 39.7 5.888 58.10 0 3646 74.41 46.0 2.750 50.64 0 3647 75.00 41.0 4.002 47.78 0 3.2.2. Thống kê dữ liệu [19]

Chúng ta đã có thể biết những thông tin tổng quan vô cùng quan trọng về dữ liệu chúng ta sẽ sử dụng: Kích thước, những hàng đầu – cuối của dữ liệu, những thống kê về các đặc tính (cột). Điều này giúp người làm Máy học có thể điều chỉnh cách xử lý dữ liệu sao cho tăng tính hiệu quả cho thuật toán dùng sau này.

63

Câu hỏi người làm Máy học luôn đặt ra là: Chúng ta có bao nhiêu dữ liệu? kích thước ra sao (số hàng và cột)?

Nếu có quá nhiều hàng, chúng ta có thể mất nhiều thời gian để huấn luyện, nhưng nếu ít quá thì cũng không đủ để thuật toán đạt độ chính xác (“học” quá ít).

Nếu có quá nhiều cột (features – đặc tính) so với hàng, thuật toán có thể dẫn tới overfitting và thực hiện kém với dữ liệu mới.

Python có thư viện giúp bạn có thể nhìn tổng quan nhưng rất quan trọng về dữ liệu. Điều này có thể ảnh hưởng rất lớn tới quá trình tiền xử lý dữ liệu trước khi áp dụng các thuật toán Máy học.

Chúng ta cũng có thể thống kê dữ liệu thông qua câu lệnh: print (duLieu.describe()) age sex WBC LY NE count 3648.000000 3648.000000 3648.000000 3648.000000 3648.000000 mean 44.625000 0.554276 8.197667 23.084907 67.066351 std 18.640752 0.497113 5.967637 10.896665 12.888672 min 0.000000 0.000000 1.110000 0.500000 0.010000 25% 31.000000 0.000000 5.610000 15.900000 59.200000 50% 44.000000 1.000000 7.175000 22.200000 67.500000 75% 58.000000 1.000000 9.502500 29.200000 75.700000 max 95.000000 1.000000 215.580000 98.100000 98.000000 RBC HCT PLT Na K count 3648.000000 3648.000000 3648.000000 3648.000000 3648.000000 mean 4.151565 34.491467 256.953884 138.555414 4.076848 std 2.474384 7.245409 114.363240 4.272003 1.983674 min 1.330000 11.300000 13.000000 5.300000 2.240000 25% 3.440000 29.700000 191.000000 136.900000 3.610000 50% 4.130000 35.100000 241.000000 138.800000 3.980000 75% 4.730000 39.400000 301.000000 140.600000 4.300000 max 138.000000 126.000000 2141.000000 172.100000 103.200000 (adsbygoogle = window.adsbygoogle || []).push({});

Protein Albumin Ure Creatinin absence count 3648.000000 3648.000000 3647.000000 3646.000000 3648.000000 mean 72.072963 38.322390 12.491269 364.951347 0.435033 std 11.752686 5.803205 9.991852 402.423273 0.495829 min 29.000000 -1.000000 0.500000 4.260000 0.000000 25% 67.400000 36.000000 4.885000 78.000000 0.000000 50% 72.300000 38.800000 7.513000 112.010000 0.000000

64

75% 77.362500 41.600000 19.104000 642.810000 1.000000 max 565.310000 141.700000 107.419000 8632.000000 1.000000

Ở đây, chúng ta có thông tin thống kê cho từng đặc tính (cột): - count: Số thể hiện (tất cả đều có 150 hàng)

- mean: Giá trị trung bình - std: Độ lệch chuẩn

- min (max): Giá trị nhỏ (lớn) nhất

- 25%, 50%, và 75%: Trả ra giá trị xếp thứ 25, 50 (median) và 75 trong dữ liệu (khi được sắp xếp)

3.2.3. Biểu đổ hóa dữ liệu [20]

Chúng ta càng biết thêm thông tin về dữ liệu, chúng ta càng có phán đoán xử lý bài toán phù hợp hơn. Một trong những cách tìm hiểu là quan sát hình ảnh, thông qua: Các đồ thị và biểu đồ biểu diễn dữ liệu. Thông qua hình ảnh là cách nhanh nhất để tiếp cận và để xử lý dữ liệu.

Trong phần này chúng ta đề cập tới hai vấn đề:

Tìm hiểu dữ liệu qua: Biểu đồ hình chữ nhật, histograms (dùng cho dữ liệu nhiều chiều).

Dùng thư viện pandas để hình ảnh hóa các dữ liệu thông qua Python.

Việc hình ảnh hóa dữ liệu có vai trò quan trọng trong quá trình tìm hiểu dữ liệu. Rất nhiều trường hợp, chỉ nhờ hình ảnh mà chúng ta có cách chọn thuật toán hiệu quả cho vấn đề mà chúng ta đang xử lý.

Khi dữ liệu của chúng ta có nhiều đặc tính (features), biểu đồ là một sự lựa chọn dễ dàng biểu diễn để chúng ta có cái nhìn tổng quan. Biểu đồ sẽ biểu diễn mỗi đặc tính một phần nhỏ. Từ các hình đó, chúng ta có thể phán đoán ban đầu về các phân phối cho mỗi đặc tính (phân phối Gauss, phân phỗi hàm mũ) hoặc các điểm kì dị.

01. from matplotlib import pyplot

02. duLieu.hist()

65

Hình 3. 2. Biểu đồ biểu diễn dữ liệu cho bài toán dự đoán bệnh Thận

Thông qua Hình 3.2 chúng ta cũng có thể dự đoán rằng đặc tính NE, age có thể có phân phối Gauss. Đây được coi là một quan sát thú vị vì rất nhiều kĩ thuật dùng trong Máy học giả định các đặc tính có phân phối Gauss.

3.2.4. Chuẩn hóa dữ liệu [21]

Bước tiền xử lý dữ liệu như một bước bắt buộc trong rất nhiều bài toán. Điều khó khăn là mỗi thuật toán lại có những giả định về dữ liệu khác nhau nên nó cần những bước chuẩn hóa dữ liệu khác nhau. Nếu chúng ta làm tốt bước tiền xử lý, thuật toán Máy học sẽ được cải thiện hiệu quả rõ rệt.

Dữ liệu gồm nhiều đặc tính (cột), và mỗi đặc tính thì lại có các đơn vị và độ lớn nhỏ khác nhau. Điều này tác động tới tính hiệu quả của nhiều thuật toán, ví dụ thời gian thực hiện, quá trình hội tụ, hay thậm chí ảnh hưởng cả tới độ chính xác của thuật

66

toán. Chính vì vậy, người ta thường tiến hành điều chỉnh dữ liệu để các đặc tính cùng có chung một tỉ lệ (data scaling).

Kết quả sẽ giúp cho nhiều thuật toán quan trọng trong Máy học sử dụng kĩ thuật Gradient Descent hội tụ nhanh. Việc điều chỉnh tỉ lệ thường dùng công thức sau đây (giả sử chúng ta đang làm trên một cột dữ liệu số cụ thể, gọi là F):

𝑥𝑛𝑒𝑤 = 𝑥 − 𝐹𝑚𝑖𝑛

𝐹𝑚𝑎𝑥−𝐹𝑚𝑖𝑛 (3.1) Trong đó 𝑥𝑛𝑒𝑤: Là giá trị sau khi điều chỉnh; x: Là giá trị ban đầu trong cột

F,𝐹𝑚𝑖𝑛 (𝐹𝑚𝑎𝑥): Là giá trị nhỏ nhất (lớn nhất) của cột F.

Công thức (3.1) trên được cài đặt trong lớp MinMaxScaler [4]của gói preprocessing trong scikit-learn [3], một thư viện mã nguồn mở dùng Python được dùng rất phổ biến trong cộng đồng Máy học.

01. from sklearn import preprocessing (adsbygoogle = window.adsbygoogle || []).push({});

02. maTran = duLieu.values

03. X = maTran[:,:-1]

04. y = maTran[:,-1]

05. dieuChinh = preprocessing.MinMaxScaler(feature_range= (0,1))

06. X_dieuChinh = dieuChinh.fit_transform(X)

07. print (X[:3]) # In ra 3 dòng đầu của X

08. print (X_dieuChinh[:3]) # In ra 3 dòng đầu của X sau khi điều chỉnh

Chương trình 3. 2: Điều chỉnh tỉ lệ của toàn bộ tập dữ liệu về [0,1]

Một vài chú thích thêm cho Chương trình 3.2:

- Dòng 02: Chuyển toàn bộ dữ liệu từ DataFrame sang mảng dữ liệu nhiều chiều (ndarray)

- Dòng 03: Tách các đặc tính riêng ra, thường đặt là X (lấy tất cả các cột, trừ cột cuối cùng)

- Dòng 04: Tách nhãn riêng ra, thường đặt là y (lấy cột cuối cùng)

- Dòng 05: Thiết lập chế độ điều chỉnh dữ liệu với kĩ thuật MinMaxScaler - Dòng 06: Biến đổi X, dữ liệu sau khi biến đổi được lưu vào X_dieuchinh - Dòng 07 và 08 để in ra dữ liệu trước và sau khi điều chỉnh

67 [[ 78. 1. 6.13 14.4 77.7 2.98 88. 25.5 98. 139.8 3.7 71.28 36.3 2.988 55.43 ] [ 16. 0. 7.69 13.6 73.5 3.64 81. 25.5 249. 141.9 3.7 60.77 28.2 18.003 566.34 ] [ 51. 0. 10.13 14.8 82.2 3.74 127. 35.6 179. 138.95 3.42 74.1 38.9 4.2 94. ]] [[ 0.82105263 1. 0.02340654 0.14241803 0.792836 0.01207288 0.4619228 0.12380122 0.03994361 0.80635492 0.01446117 0.078835 0.26138753 0.02326995 0.00593087] [ 0.16842105 0. 0.03068028 0.13422131 0.74997449 0.01690203 0.42348872 0.12380122 0.11090226 0.81894484 0.01446117 0.05923813 0.20462509 0.16370336 0.065148 ] [ 0.53684211 0. 0.04205716 0.14651639 0.83875906 0.01763372 0.67605556 0.21185702 0.07800752 0.80125899 0.0116878 0.08409316 0.27960757 0.03460564 0.01040133]] 3.2.5 Ma trận tương quan

Sự tương quan cho thấy sự thay đổi liên quan giữa hai đặc tính như thế nào. Nếu hai biến số thay đổi theo cùng một hướng mà chúng có mối tương quan dương. Nếu chúng thay đổi ngược lại thì có mối tương quan âm. Chúng ta có thể tính tương quan giữa mỗi cặp thuộc tính. Đây được gọi là ma trận tương quan.

Sau đó có thể vẽ được ma trận tương quan và có được cái nhìn quan trọng về các đặc tính có mối tương quan với nhau. Điều này rất hữu ích khi cho chúng ta, bởi vì một số thuật toán học máy như tuyến tính (linear regression) và hồi quy logistic (logistic regression) sẽ có hiệu suất thấp nếu có các đặc trưng tương quan cao trong dữ liệu.

from pandasimport read_csv

import os

from matplotlib import pyplot

from sklearn import preprocessing

import numpy

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)

maTran = duLieu.values X = maTran[:,:-1] y = maTran[:,-1]

dieuChinh = preprocessing.MinMaxScaler(feature_range= (0,1)) X_dieuChinh = dieuChinh.fit_transform(X)

68

correlations = duLieu.corr()

# plot correlation matrix

fig = pyplot.figure() ax = fig.add_subplot(111) (adsbygoogle = window.adsbygoogle || []).push({});

cax = ax.matshow(correlations, vmin=-1, vmax=1) fig.colorbar(cax) ticks = numpy.arange(0,9,1) ax.set_xticks(ticks) ax.set_yticks(ticks) ax.set_xticklabels(tenCot) ax.set_yticklabels(tenCot) pyplot.show()

Chương trình 3. 3: Ma trận tương quan giữa các đặc tính

Kết quả của chương trình 3.3 là:

Hình 3. 3. Biểu đồ biểu diễn ma trận tương quan của các đặc tính của bệnh Thận

Nhìn vào đây chúng ta thấy rằng ma trận là đối xứng, tức là phía dưới bên trái của ma trận là giống như phía trên bên phải. Điều này rất hữu ích vì chúng ta có thể thấy hai chế độ xem khác nhau trên cùng một dữ liệu trong một ô. Chúng ta cũng có thể thấy rằng mỗi đặc tính có độ tương quan hoàn hảo với nhau (không có gì ngạc nhiên) trên đường chéo chính của ma trận.Nhìn vào ma trận trận tương quan ở Hình

69

3.3 chúng ta thấy rằng hai đặc tính NE và LY có tương quan ngược nhau hoàn hảo (- 1.0); trong khi đó 3 đặc tính cuối (Albumin','Ure','Creatinin’) có độ tương quan khá cao (khoảng 0.8).

3.3. SỬ DỤNG THAM SỐ TRONG MÔ HÌNH SVM [22]

Phần này sẽ trình bày các bước cài đặt thuật toán Support Vector Machine sử dụng thư viện scikit-learn. Chúng ta sử dụng lớp sklearn.svm.SVC cài đặt thuật toán support vector classification.

from sklearn import svm

clf = SVC(C=1.0, gamma='auto', kernel='rbf',cache_size=200, class_weight=None,

coef0=0.0,decision_function_shape='ovo', degree=3,max_iter=-1, probability=False, random_state=None, shrinking=True,

tol=0.001, verbose=False) clf.fit(X_dieuChinh, y)

Chương trình 3. 4: Chương trình xây dựng mô hình SVM cho tập dữ liệu huấn luyện

Trong chương trình này, chúng ta đặt clf là một bộ phân lớp, và nó học từ mô hình thông qua phương thức fit(X,y). Trong scikit-learn, lớp SVC thực thi phương thức fit(X,y) để huấn luyện mô hình, trong đó X là tập đặc tính và y là tập nhãn.

Hàm khởi tạo sử dụng các tham số cho mô hình SVM. Việc lựa chọn tham số phù hợp sẽ làm cải thiện hiệu quả thực thi của mô hình. Phần này chỉ đề tập tới ba tham số quan trọng nhất, tác động lớn nhất, tới mô hình: ‘kernel’, ‘gamma’, và ‘C’.

3.3.1. Sự tác động của tham số C

Điểm mấu chốt trong mô hình SVM làtìm siêu phẳng với 2 điều kiện: 1) siêu phẳng với lề phân tách dữ liệu lớn nhất; và 2) siêu phẳng phân tách đúng nhiều điểm dữ liệu nhất có thể. Vấn đề sẽ trở lên khó khăn khi chúng ta không luôn luôn tìm được siêu phẳng thỏa mãn cả hai điều kiện đó. Tham số C dùng để xác định cho điều kiện thứ 2. Cụ thể:

- Giá trịC nhỏ sẽ dẫn tới chi phí nhỏ cho phân tách lỗi (misclassification). 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ỏ.

70

- Ngược lại, giá trị của C lớn sẽ dẫn tới chi phí lớn cho phân tách lỗi. 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.

- Hình 3.4 minh họa cho sự tác động của tham số C. Hình bên trái với C nhỏ có điểm dị biệt (outlier), phân tách sai; trong khi hình bên phải ứng với C lớn, mô hình phân tách đúng mọi điểm dữ liệu.

Hình 3. 4: Hình minh họa cho sự tác động của tham số C

Hình bên trái ứng với giá trị C nhỏ cho lề lớn (khoảng cách đoạn màu tím) nhưng vẫn còn điểm bị phân tách sai. Hình bên phải ứng với giá trị C lớn cho lề nhỏ, nhưng phân tách đúng mọi điểm

Vậy thì bộ phân tách nào lớn hơn. Điều này phụ thuộc vào dữ liệu tương lai mà chúng ta muốn dự đoán. Tất nhiên chúng ta không biết chính xác dữ liệu này nó như thế nào. Giả sử dữ liệu dự đoán của chúng ta giống như Hình 3.5, thì khi đó mô hình với giá trị C lớn sẽ cho độ chính xác tốt hơn.

71

Hình 3. 5: Hình bên trái ứng với giá trị C nhỏ cho lề lớn. Hình bên phải ứng với giá trị C lớn cho lề nhỏ, và trong trường hợp này sẽ cho mô hình phù hợp hơn với hình bên trái.

Tuy nhiên, nếu dữ liệu dự đoán của chúng ta giống như Hình 3.6, thì khi đó mô hình với giá trị C nhỏ sẽ cho độ chính xác tốt hơn.

Hình 3. 6: Hình bên trái ứng với giá trị C nhỏ cho lề lớn, và trong trường hợp này sẽ cho mô hình phù hợp hơn với hình bên phải, ứng với giá trị C lớn cho lề nhỏ

Để xác định được giá trị C phù hợp, phương pháp thường được áp dụng là cross- validation. (adsbygoogle = window.adsbygoogle || []).push({});

3.3.2. Sự tác động của tham số Gamma

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, tên là Gamma. Tham số Gamma dùng

72

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 cả ở 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 khác đi, đường biên quyết định (decision boundary) phụ thuộc vào những điểm gần nó nhất;

Một phần của tài liệu Nghiên cứu các giải thuật máy học và áp dụng vào bài toán dự đoán bệnh thận tại bệnh viện đa khoa tỉnh điện biên dùng ngôn ngữ python (Trang 71)