Báo cáo môn học ứng dụng thuật toán hồi quy tuyến tính để chẩn đoán xơ vữa động mạch
- 23 trang
- file .pdf
TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO MÔN HỌC
NHẬP MÔN HỌC MÁY
ĐỀ TÀI
ỨNG DỤNG THUẬT TOÁN HỒI QUY TUYẾN TÍNH ĐỂ CHẨN
ĐOÁN XƠ VỮA ĐỘNG MẠCH
Sinh viên thực hiện : NGUYỄN QUỐC TUẤN
: NGUYỄN HỒNG KỲ
: LÊ CÔNG QUYỀN
: TRỊNH THÀNH ĐẠT
Giảng viên hướng dẫn : NGÔ TRƯỜNG GIANG
Ngành : CÔNG NGHỆ THÔNG TIN
Chuyên ngành : CÔNG NGHỆ PHẦN MỀM
Lớp : D12 – CNPM2
Hà Nội
PHIẾU CHẤM ĐIỂM
STT Họ và Tên sinh viên Nội dung thực hiện Điểm Chữ ký
1 Nguyễn Quốc Tuấn
2 Nguyễn Hồng Kỳ
3 Lê Công Quyền
4 Trịnh Thành Đạt
Giảng viên chấm thi Chữ ký Ghi chú
Giảng viên chấm thi 1:
Giảng viên chấm thi 2:
MỤC LỤC
LỜI CẢM ƠN ....................................................................................................... 6
LỜI MỞ ĐẦU ....................................................................................................... 7
CHƯƠNG 1 : THUẬT TOÁN HỒI QUY TUYẾN TÍNH TRONG HỌC MÁY 8
1.1. Giới thiệu .................................................................................................... 8
1.2. Phân tích toán học ...................................................................................... 8
1.2.1. Dạng của Linear Regression ............................................................... 8
1.2.2. Hàm mất mát ....................................................................................... 9
1.2.3. Tìm nghiệm của mô hình hồi quy tuyến tính ...................................... 9
1.2.4. Mức độ lỗi của mô hình hồi quy tuyến tính .............................................. 10
CHƯƠNG 2 : ÁP DỤNG THUẬT TOÁN ......................................................... 11
2.1. Mô tả bài toán........................................................................................... 11
2.2. Xây dựng bộ dữ liệu ................................................................................. 11
2.3. Áp dụng thuật toán vào bài toán .............................................................. 13
2.3.2. Kiểm nghiệm thuật toán .................................................................... 15
2.4. Thực nghiệm với thư viện scikit-learn của python .................................. 16
2.4.1. Giới thiệu thư viện scikit-learn ......................................................... 16
2.4.2. Các phương thức và các biến của class LinearRegression ............... 16
2.4.3. Cài đặt ............................................................................................... 17
3.4.4 Kiểm nghiệm ...................................................................................... 19
KẾT LUẬN ......................................................................................................... 22
LIỆT KÊ CHỮ VIẾT TẮT
BMI Body Mass Index Chỉ số khối cơ thể
BEDAYTM Bề dày thành mạch
HA SBP Huyết áp tối đa
mmHg Đơn vị milimet thủy
ngân
mmol/l Milimol trên lit
Mm Milimet
DANH MỤC HÌNH ẢNH
Trang
Hình 1: Các thuộc tính của bộ dữ liệu 12
Hình 2: Kết quả chạy thuật toán 15
Hình 3: Bảng biểu so sánh giá trị Y dự đoán và Y thực tế 19
Hình 4: Kết quả huấn luyện bằng thư biện sklearn 20
LỜI CẢM ƠN
Trong lời đầu tiên của báo cáo môn học “ Nhập môn học máy ” , chúng em
muốn gửi những lời cám ơn và biết ơn chân thành nhất của mình tới tất cả
những người đã hỗ trợ, giúp đỡ chúng em về kiến thức và tinh thần trong quá
trình thực hiện báo cáo.
Em xin chân thành gửi lời cảm ơn tới các thầy cô giáo trong Trường Đại
học Điện Lực nói chung và các thầy cô giáo trong Khoa Công nghệ thông tin nói
riêng đã tận tình giảng dạy, truyền đạt cho em những kiến thức cũng như kinh
nghiệm quý báu trong suốt quá trình học tập.
Đặc biệt, em xin gửi lời cảm ơn đến Giáo viên hướng dẫn Ngô Trường
Giang, giảng viên Khoa Công nghệ thông tin - Trường Đại học Điện Lực. Thầy
đã tận tình theo sát giúp đỡ, trực tiếp chỉ bảo, hướng dẫn trong suốt quá trình
nghiên cứu và học tập của chúng em. Trong thời gian học tập với thầy, nhóm em
không những tiếp thu thêm nhiều kiến thức bổ ích mà còn học tập được tinh thần
làm việc, thái độ nghiên cứu khoa học nghiêm túc, hiệu quả. Đây là những điều
rất cần thiết cho chúng em trong quá trình học tập và công tác sau này.
Do thời gian thực hiện có hạn kiến thức còn nhiều hạn chế nên bài làm của em
chắc chắn không tránh khỏi những thiếu sót nhất định. Em rất mong nhận được
ý kiến đóng góp của thầy cô giáo và các bạn để em có thêm kinh nghiệm và tiếp
tục hoàn thiện đồ án của mình.
Em xin chân thành cảm ơn!
GVHD: Ngô Trường Giang 6
LỜI MỞ ĐẦU
Công nghệ thông tin (CNTT) ngày càng có vai trò quan trọng trong cuộc
sống hằng ngày của chúng ta. Việc ứng dụng CNTT vào các lĩnh vực trong đời
sống giúp công việc được tiến hành nhanh chóng và hiệu quả hơn. Có rất nhiều
công việc mới phát triển song song với sự phát triển của CNTT, một trong
những số đó là phân tích chuẩn đoán dữ liệu – big data, hướng đi mang lại hiệu
quả rất lớn.
Nhóm chúng em chọn đề tài “ Ứng dụng thuật toán Linear Regresion để
chẩn đoán xơ vữa động mạch (độ dày thành mạch)” nhằm tìm hiểu sâu hơn về
dữ liệu cách khai thác và sử dụng hiệu quả, từ đó viết một ứng dụng cụ thể thử
nghiệm làm cơ sở củng cố kiến thức và định hướng, kế hoạch xây dựng các ứng
dụng trong tương lai.
GVHD: Ngô Trường Giang 7
CHƯƠNG 1 : THUẬT TOÁN HỒI QUY TUYẾN TÍNH TRONG
HỌC MÁY
1.1. Giới thiệu
Hồi quy tuyến tính la một phương pháp thống kê để hồi quy dữ liệu với
biến phụ thuộc có giá trị liên tục trong khi các biến độc lập có thể có một trong
hai giá trị liên tục hoặc là giá trị phân loại. Hồi quy tuyến tính là một trong hai
dạng lớn của học có giám sát (supervised learning) dựa trên tập dữ liệu mẫu.
Nói cách khác "Hồi quy tuyến tính" là một phương pháp để dự đoán biến
phụ thuộc (Y) dựa trên giá trị của biến độc lập (X). Nó có thể được sử dụng cho
các trường hợp chúng ta muốn dự đoán một số lượng liên tục. Ví dụ, dự đoán
giao thông ở một cửa hàng bán lẻ, dự đoán thời gian người dùng dừng lại một
trang nào đó hoặc số trang đã truy cập vào một website nào đó v.v...
1.2. Phân tích toán học
1.2.1. Dạng của Linear Regression
Hồi quy tuyến tính có phương trình đạng :
F(x) = w0 + w1x1 + w2x2 + … + wnxn (1)
Trong đó, w1, w2, wn, w0 là các hằng số, w0 còn được gọi là bias hay sai số.
Mối quan hệ giữa y ≈ f(x) bên trên là một mối quan hệ tuyến tính (linear). Bài
toán chúng ta đang làm là một bài toán thuộc loại regression. Bài toán đi tìm các
hệ số tối ưu { w1, w2, wn, w0 } chính vì vậy được gọi là bài toán Linear Regression
(Hồi quy tuyến tính).
Trong phương trình (1) nếu chúng ta đặt w = [w0, w1, w2, wn]T là một vecter
(cột) hệ số cần phải tối ưu và = [1, x1, x2, xn] (đọc là x bar trong tiếng Anh) là
vector (hàng) dữ liệu đầu vào mở rộng. Số 1 ở đầu được thêm vào để phép tính
đơn giản hơn và thuận tiện cho việc tính toán. Khi đó, phương trình (1) có thể
được viết lại dưới dạng:
y≈ = ŷ ( trong đó là một vecter hàng)
GVHD: Ngô Trường Giang 8
1.2.2. Hàm mất mát
Máy học từ giá trị trung bình của một hàm mất mát. Đây là một phương
pháp đánh giá độ hiệu quả của một thuật toán nào đó trên bộ dữ liệu cho trước.
Nếu kết quả dự đoán chênh lệch quá nhiều so với kết quả thực tế, hàm mất mát
sẽ là một số rất lớn. Điều tương tự xảy ra với tất cả các cặp (xi, yi), i = 1, 2, 3,
…, N với N là số lượng dữ liệu quan sát được. Để hàm mất mát nhỏ nhất khi đó
tổng sai số là nhỏ nhất tương đương với việc tìm w để hàm số sau đạt giá trị nhỏ
nhất:
J(w) = ∑ − (2)
Hàm số J(w) được gọi là hàm mất mát (loss function) của bài toán Linear
Regression. Chúng ta luôn mong muốn rằng sự mất mát (sai số) là nhỏ nhất,
điều đó đồng nghĩa với việc tìm vector hệ số w sao cho giá trị của hàm mất mát
này càng nhỏ càng tốt.
Trước khi đi tìm lời giải, chúng ta đơn giản hóa phép toán trong phương
trình hàm mất mát (2). Đặt =[ ; ; ;…; ] là một vector cột chứa tất cả
các output của training data; =[ ; ; ;…; ] là ma trận dữ liệu đầu
vào (mở rộng) mà mỗi hàng của nó là một điểm dữ liệu.
1.2.3. Tìm nghiệm của mô hình hồi quy tuyến tính
Để tìm nghiệm cho một bài toán tối ưu chúng ta thường giải phương trình
đạo hàm J(w) = ∑ − bằng 0.
Đạo hàm theo w của hàm mất mát là:
Phương trình đạo hàm bằng 0 tương đương với:
⟺ − =0
⟺ − =0
GVHD: Ngô Trường Giang 9
⟺ =
Đặt ≜ ! và ≜ b (≜ "à $ý ℎ'ệ) đố, ) khi đó ta có :
A.W = b
⟺ !- . !. = !- . /
⟺ 0. = !- . / (với I là ma trận đơn vị)
⟺ = !- . /
= !- là nghiệm của mô hình hồi quy tuyến tính.
Trên thực tế A có thể không khả nghịch nên ta sẽ dùng ma trận giả nghịch
-
đảo !† nên ta có W = !† . / hay W = . . Đây chính là nghiệm tổng
quát của hồi quy tuyến tính.
1.2.4. Mức độ lỗi của mô hình hồi quy tuyến tính
Ta có công thức tính mức độ lỗi của mô hình như sau :
MSE = ∑ − ŷ'
Với mức độ lỗi của mô hình cho ta biết mức độ học của mô hình.
GVHD: Ngô Trường Giang 10
CHƯƠNG 2 : ÁP DỤNG THUẬT TOÁN
2.1. Mô tả bài toán
Trong y sinh học, thường có rất nhiều yếu tố khác nhau dẫn đến một hiện
tượng. Ví dụ như hiện tượng xơ vữa động mạch không chỉ do lượng cholesterol
máu mà còn do nhiều yếu tố khác như di truyền, chủng tộc, tiền sử mắc bệnh
tim mạch, tuổi, giới, BMI, tăng huyết áp, đái tháo đường,…
Vì vậy cần phải có mô hình hồi quy tuyến tính đa biến. Trong đề tài tài này
chúng em không đề cập các yếu tố di truyền, chủng tộc, giới, mắc bệnh tim
mạch... mà chỉ lưu ý đến các biến số như: tuổi, cholesterol, glucose, huyết áp
tâm thu và BMI. Khi đó mô hình hồi quy tuyến tính đa biến với 5 yếu tố (
x1=tuổi, x2 = cholesterol, x3 = glucose, x4 = huyết áp, x5 = BMI ) như sau:
Bề dày TM = w0 + w1(tuổi) + w2(cholesterol) + w3(glucose) + w4(huyết áp)
+ w5(BMI)
2.2. Xây dựng bộ dữ liệu
Bộ dữ liệu xây dựng là một bộ dữ liệu được xây dựng bởi một bệnh viện
trong quá trình khảo sát xơ vữa động mạch ở 100 bệnh nhân khác nhau. Bộ dữ
liệu gồm có 6 thuộc tính bao gồm: tuổi, chỉ số BMI, chỉ số huyết áp tối đa
(mmHg), nồng độ glucose trong máu (mmol/l), nồng dộ cholesterol trong máu
(mmol/l) và bề dày thành mạch (mm).
Bộ dữ liệu sẽ chia thành 2 phần trong đó 80% dữ liệu được làm bộ dữ liệu
huấn luyện mô hình, 20% còn lại làm bộ dữ liệu thử nghiệm độ chính xác của
mô hình. Dữ liệu về độ dày thành mạch làm biến mục tiêu, những bộ dữ liệu còn
lại bao gồm (tuổi, BMI, nồng độ glucose máu, nồng độ cholesterol máu) làm
biến giải thích.
GVHD: Ngô Trường Giang 11
Thuộc tính Ý Nghĩa
Tuổi Tuổi
BMI Chỉ số sức khỏe
HA Huyết áp tối đa
Glucose Nồng độ Glucose
Cholesterol Nồng độ Cholesterol
Bedaytm Bề dày thành mạch
Hình 1: Các thuộc tính của bộ dữ liệu
Hình trên là 40 tập dữ liệu đầu của bộ dự liệu huấn luyện mô hình
Đánh giá bộ dữ liệu này hoàn toàn có thể sử dụng cho mô hình hồi quy
tuyến tính chẩn đoán xơ vữa động mạch vì những lý do sau:
Mối quan hệ giữa biến mục tiêu (Y) và biến giải thích (X) là tham số.
Ví dụ Y = WX thì mỗi lần X tăng lên 1 đơn vị thì Y thêm W đơn vị
dù cho bất kể X, Y có giá trị là bao nhiêu.
Các giá trị của biến mục tiêu (Y) phải độc lập với nhau
Các giá trị của biến giải thích (X) không được có sai số ngẫu nhiên.
Ví dụ: Giá trị huyết áp tối đa là 120 mmHg là 120 mmHg không
được là 120 mmHg ± 2 mmHg
GVHD: Ngô Trường Giang 12
2.3. Áp dụng thuật toán vào bài toán
2.3.1. Cài đặt thuật toán
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import math
import sklearn
from sklearn.model_selection import train_test_split
#Xây dựng hàm tìm hệ số hồi quy
def HoiQuyTT(X_train, Y_train):
# Xây dựng Xbar
one = np.ones((X_train.shape[0], 1))
Xbar = np.concatenate((one, X_train), axis=1)
# Các giá trị A, b, At
A = np.dot(Xbar.T, Xbar)
b = np.dot(Xbar.T, Y_train)
At = np.linalg.pinv(A)
#Trả về hệ số hồi quy
W = np.dot(At, b)
return W
#Xây dựng hàm dự đoán với tập dữ liệu test
def KiemTra(W, X_test):
_X_test = np.concatenate((np.ones((X_test.shape[0], 1)), X_test), axis=1)
Y_pred = np.dot(_X_test, W)
return Y_pred
#Xây dựng hàm kiểm tra mức độ sai của mô hình
def SaiSoMoHinh(Y_pred, Y_test):
return np.average((Y_pred - Y_test)**2)
#Tiến hành thực nghiệm
#Đọc tệp
data = pd.read_csv("DuLieuYKhoa.csv", sep=";")
data.head
print(data)
GVHD: Ngô Trường Giang 13
#Lấy dataframe bề dày thành mạch làm biên mục tiêu
Y = data['BEDAYTM'].to_numpy()
#Lấy datafarame không chứa bề dày thành mạch làm biến giải thích
X = data.drop("BEDAYTM", axis = 1)
#Phân loại dữ liệu train và test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 30)
#Hệ số hồi quy của mô hình
print("\nHỆ SỐ HỒI QUY")
LB = ['SAI SỐ', 'TUỔI', 'BMI', 'HUYẾT ÁP', 'GLUCOSE', 'CHOLESTEROL']
w_lr = HoiQuyTT(X_train, Y_train)
print(pd.DataFrame({"Tên": LB, "Hệ số": w_lr}).sort_values(by='Hệ số'))
#Tiến hành dự đoán với tập dự liệu test
_X_test = np.concatenate((np.ones((X_test.shape[0], 1)), X_test), axis = 1)
Y_pred = np.dot(_X_test, w_lr)
print("\n GIÁ TRỊ Y DỰ ĐOÁN")
print(Y_pred)
#In giá trị y test thực tế để so sánh
print("\nGIÁ TRỊ Y THỰC TẾ")
print(Y_test)
#In giá trị sai số của mô hình
#print("\nSAI SỐ MÔ HÌNH")
#print(SaiSoMoHinh(Y_pred, Y_test))
GVHD: Ngô Trường Giang 14
2.3.2. Kiểm nghiệm thuật toán
Hình 2: Kết quả chạy thuật toán
GVHD: Ngô Trường Giang 15
Từ kết quả trên ta có thể thấy mô hình cho ra các hệ số hồi quy (w) cùng
sai số và từ đây ta cũng có thể suy ra được dạng hồi quy tuyến tính như sau: Bề
dày TM = -0.177139 + 0.061229 x [cholesterol] + 0.010665 x [tuổi] + 0.005850
x [BMI] + 0.001066 x [Huyết áp] – 0.000634 x [Glucose]
Qua các hệ số trên ta có thể thấy nồng độ cholesterol máu và số tuổi ảnh
hưởng tới bề dày thành mạch vành và đây cũng là những nguy cơ lớn gây xơ
vữa động mạch vành hay nhồi máu cơ tim hiện nay. Tuy nhiên giá trị dự đoán có
một số giá trị chênh lệch nhiều với giá trị thực tế, nguyên nhân này có thể lý giải
do bộ dự liệu huấn luyện chưa đủ nhiều để huấn luyện một mô hình tối ưu.
2.4. Thực nghiệm với thư viện scikit-learn của python
2.4.1. Giới thiệu thư viện scikit-learn
Scikit-learn (viết tắt là sklearn) là một thư viện mã nguồn mở dành cho học
máy - một ngành trong trí tuệ nhân tạo, rất mạnh mẽ và thông dụng với cộng
đồng Python, được thiết kế trên nền NumPy và SciPy. Scikit-learn chứa hầu hết
các thuật toán machine learning hiện đại nhất, đi kèm với documentations, luôn
được cập nhật. Trong sklearn có class sklearn.linear_model.LinearRegression có
các phương thức liên quan tới hồi quy tuyến tính.
2.4.2. Các phương thức và các biến của class LinearRegression
Sử dụng
sklearn.linear_model.LinearRegression(fit_intercept=True,
normalize=False, copy_X=True, n_jobs=1)
Các biến
- fit_intercept: Không tính toán những điểm cắt trục tung nếu cài đặt
là false, mặc định là true
- normalize: Nếu cài dặt làt true thì chuẩn hoá biến giải thích trước,
mặc định là false
GVHD: Ngô Trường Giang 16
- copy_X: Lưu dữ liệu trong bộ nhớ rồi mới chạy, mặc định là true
- n_jobs: Số job sử dụng khi tính toán, -1 sẽ dùng hết, mặc định là 1
Các thuộc tính của class LinearRegression
- coef_: Trả về hệ số hồi quy
- intercept_: Trả về sai số
Các phương thức
- fit(X, y[, sample_weight]): Tiến hành tìm phương trình hồi quy
tuyến tính
- get_params([deep]): Lấy parameter đã sử dụng
- predict(X): Sử dụng model vừa tạo được tiến hành dự đoán
- score(X, y[, sample_weight]): Đưa ra hệ số quyết định R2. Không
phải lúc nào giá trị dự đoán cũng giống vs giá trị thực tế. Hệ số
quyết định ~ 1 thì độ chính xác càng cao, ~ 0 thì sai lệch lớn
2.4.3. Cài đặt
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics as sq
from sklearn import linear_model
clf = linear_model.LinearRegression()
#Đọc tệp
data = pd.read_csv("DuLieuYKhoa.csv", sep=";")
data.head
#In dữ liệu
print(data)
#Lấy dataframe bề dày thành mạch làm biên mục tiêu
Y = data['BEDAYTM'].to_numpy()
#Lấy datafarame không chứa bề dày thành mạch làm biến giải thích
X = data.drop("BEDAYTM", axis = 1)
GVHD: Ngô Trường Giang 17
#Phân loại dữ liệu train và test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 20)
#Tạo model suy đoán
clf.fit(X_train, Y_train)
#In hệ số hồi quy của các biến giải thích xếp theo thứ tự tăng dần
print("\nHỆ SỐ HỒI QUY")
print(pd.DataFrame({"Tên": X_train.columns, "Hệ số":
np.abs(clf.coef_)}).sort_values(by='Hệ số'))
#In sai số
print("\nSAI SỐ")
print(clf.intercept_)
#print(clf.score())
#Tiến hành dự đoán với bộ dữ liệu test
Y_pred = clf.predict(X_test)
print("\nGIÁ TRỊ Y DỰ ĐOÁN")
print(Y_pred)
#In giá trị y test thực tế
print("\nGIÁ TRỊ Y THỰC TẾ")
print(Y_test)
#Kiểm tra mức độ lỗi của model (Mean Squared Error)
mse = sq.mean_squared_error(Y_test, Y_pred)
print("KIỂM TRA MỨC ĐỘ LỖI CỦA MÔ HÌNH")
print(mse)
#Bảng biểu so sánh giá trị y dự đoán và y thực tế
plt.scatter(Y_test, Y_pred)
plt.xlabel("Giá trị thực tế: $Y_i$")
plt.ylabel("Giá trị dự đoán: $\hat{Y}_i$")
plt.title("Bảng biểu so sánh $Y_i$ vs $\hat{Y}_i$")
plt.show()
GVHD: Ngô Trường Giang 18
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO MÔN HỌC
NHẬP MÔN HỌC MÁY
ĐỀ TÀI
ỨNG DỤNG THUẬT TOÁN HỒI QUY TUYẾN TÍNH ĐỂ CHẨN
ĐOÁN XƠ VỮA ĐỘNG MẠCH
Sinh viên thực hiện : NGUYỄN QUỐC TUẤN
: NGUYỄN HỒNG KỲ
: LÊ CÔNG QUYỀN
: TRỊNH THÀNH ĐẠT
Giảng viên hướng dẫn : NGÔ TRƯỜNG GIANG
Ngành : CÔNG NGHỆ THÔNG TIN
Chuyên ngành : CÔNG NGHỆ PHẦN MỀM
Lớp : D12 – CNPM2
Hà Nội
PHIẾU CHẤM ĐIỂM
STT Họ và Tên sinh viên Nội dung thực hiện Điểm Chữ ký
1 Nguyễn Quốc Tuấn
2 Nguyễn Hồng Kỳ
3 Lê Công Quyền
4 Trịnh Thành Đạt
Giảng viên chấm thi Chữ ký Ghi chú
Giảng viên chấm thi 1:
Giảng viên chấm thi 2:
MỤC LỤC
LỜI CẢM ƠN ....................................................................................................... 6
LỜI MỞ ĐẦU ....................................................................................................... 7
CHƯƠNG 1 : THUẬT TOÁN HỒI QUY TUYẾN TÍNH TRONG HỌC MÁY 8
1.1. Giới thiệu .................................................................................................... 8
1.2. Phân tích toán học ...................................................................................... 8
1.2.1. Dạng của Linear Regression ............................................................... 8
1.2.2. Hàm mất mát ....................................................................................... 9
1.2.3. Tìm nghiệm của mô hình hồi quy tuyến tính ...................................... 9
1.2.4. Mức độ lỗi của mô hình hồi quy tuyến tính .............................................. 10
CHƯƠNG 2 : ÁP DỤNG THUẬT TOÁN ......................................................... 11
2.1. Mô tả bài toán........................................................................................... 11
2.2. Xây dựng bộ dữ liệu ................................................................................. 11
2.3. Áp dụng thuật toán vào bài toán .............................................................. 13
2.3.2. Kiểm nghiệm thuật toán .................................................................... 15
2.4. Thực nghiệm với thư viện scikit-learn của python .................................. 16
2.4.1. Giới thiệu thư viện scikit-learn ......................................................... 16
2.4.2. Các phương thức và các biến của class LinearRegression ............... 16
2.4.3. Cài đặt ............................................................................................... 17
3.4.4 Kiểm nghiệm ...................................................................................... 19
KẾT LUẬN ......................................................................................................... 22
LIỆT KÊ CHỮ VIẾT TẮT
BMI Body Mass Index Chỉ số khối cơ thể
BEDAYTM Bề dày thành mạch
HA SBP Huyết áp tối đa
mmHg Đơn vị milimet thủy
ngân
mmol/l Milimol trên lit
Mm Milimet
DANH MỤC HÌNH ẢNH
Trang
Hình 1: Các thuộc tính của bộ dữ liệu 12
Hình 2: Kết quả chạy thuật toán 15
Hình 3: Bảng biểu so sánh giá trị Y dự đoán và Y thực tế 19
Hình 4: Kết quả huấn luyện bằng thư biện sklearn 20
LỜI CẢM ƠN
Trong lời đầu tiên của báo cáo môn học “ Nhập môn học máy ” , chúng em
muốn gửi những lời cám ơn và biết ơn chân thành nhất của mình tới tất cả
những người đã hỗ trợ, giúp đỡ chúng em về kiến thức và tinh thần trong quá
trình thực hiện báo cáo.
Em xin chân thành gửi lời cảm ơn tới các thầy cô giáo trong Trường Đại
học Điện Lực nói chung và các thầy cô giáo trong Khoa Công nghệ thông tin nói
riêng đã tận tình giảng dạy, truyền đạt cho em những kiến thức cũng như kinh
nghiệm quý báu trong suốt quá trình học tập.
Đặc biệt, em xin gửi lời cảm ơn đến Giáo viên hướng dẫn Ngô Trường
Giang, giảng viên Khoa Công nghệ thông tin - Trường Đại học Điện Lực. Thầy
đã tận tình theo sát giúp đỡ, trực tiếp chỉ bảo, hướng dẫn trong suốt quá trình
nghiên cứu và học tập của chúng em. Trong thời gian học tập với thầy, nhóm em
không những tiếp thu thêm nhiều kiến thức bổ ích mà còn học tập được tinh thần
làm việc, thái độ nghiên cứu khoa học nghiêm túc, hiệu quả. Đây là những điều
rất cần thiết cho chúng em trong quá trình học tập và công tác sau này.
Do thời gian thực hiện có hạn kiến thức còn nhiều hạn chế nên bài làm của em
chắc chắn không tránh khỏi những thiếu sót nhất định. Em rất mong nhận được
ý kiến đóng góp của thầy cô giáo và các bạn để em có thêm kinh nghiệm và tiếp
tục hoàn thiện đồ án của mình.
Em xin chân thành cảm ơn!
GVHD: Ngô Trường Giang 6
LỜI MỞ ĐẦU
Công nghệ thông tin (CNTT) ngày càng có vai trò quan trọng trong cuộc
sống hằng ngày của chúng ta. Việc ứng dụng CNTT vào các lĩnh vực trong đời
sống giúp công việc được tiến hành nhanh chóng và hiệu quả hơn. Có rất nhiều
công việc mới phát triển song song với sự phát triển của CNTT, một trong
những số đó là phân tích chuẩn đoán dữ liệu – big data, hướng đi mang lại hiệu
quả rất lớn.
Nhóm chúng em chọn đề tài “ Ứng dụng thuật toán Linear Regresion để
chẩn đoán xơ vữa động mạch (độ dày thành mạch)” nhằm tìm hiểu sâu hơn về
dữ liệu cách khai thác và sử dụng hiệu quả, từ đó viết một ứng dụng cụ thể thử
nghiệm làm cơ sở củng cố kiến thức và định hướng, kế hoạch xây dựng các ứng
dụng trong tương lai.
GVHD: Ngô Trường Giang 7
CHƯƠNG 1 : THUẬT TOÁN HỒI QUY TUYẾN TÍNH TRONG
HỌC MÁY
1.1. Giới thiệu
Hồi quy tuyến tính la một phương pháp thống kê để hồi quy dữ liệu với
biến phụ thuộc có giá trị liên tục trong khi các biến độc lập có thể có một trong
hai giá trị liên tục hoặc là giá trị phân loại. Hồi quy tuyến tính là một trong hai
dạng lớn của học có giám sát (supervised learning) dựa trên tập dữ liệu mẫu.
Nói cách khác "Hồi quy tuyến tính" là một phương pháp để dự đoán biến
phụ thuộc (Y) dựa trên giá trị của biến độc lập (X). Nó có thể được sử dụng cho
các trường hợp chúng ta muốn dự đoán một số lượng liên tục. Ví dụ, dự đoán
giao thông ở một cửa hàng bán lẻ, dự đoán thời gian người dùng dừng lại một
trang nào đó hoặc số trang đã truy cập vào một website nào đó v.v...
1.2. Phân tích toán học
1.2.1. Dạng của Linear Regression
Hồi quy tuyến tính có phương trình đạng :
F(x) = w0 + w1x1 + w2x2 + … + wnxn (1)
Trong đó, w1, w2, wn, w0 là các hằng số, w0 còn được gọi là bias hay sai số.
Mối quan hệ giữa y ≈ f(x) bên trên là một mối quan hệ tuyến tính (linear). Bài
toán chúng ta đang làm là một bài toán thuộc loại regression. Bài toán đi tìm các
hệ số tối ưu { w1, w2, wn, w0 } chính vì vậy được gọi là bài toán Linear Regression
(Hồi quy tuyến tính).
Trong phương trình (1) nếu chúng ta đặt w = [w0, w1, w2, wn]T là một vecter
(cột) hệ số cần phải tối ưu và = [1, x1, x2, xn] (đọc là x bar trong tiếng Anh) là
vector (hàng) dữ liệu đầu vào mở rộng. Số 1 ở đầu được thêm vào để phép tính
đơn giản hơn và thuận tiện cho việc tính toán. Khi đó, phương trình (1) có thể
được viết lại dưới dạng:
y≈ = ŷ ( trong đó là một vecter hàng)
GVHD: Ngô Trường Giang 8
1.2.2. Hàm mất mát
Máy học từ giá trị trung bình của một hàm mất mát. Đây là một phương
pháp đánh giá độ hiệu quả của một thuật toán nào đó trên bộ dữ liệu cho trước.
Nếu kết quả dự đoán chênh lệch quá nhiều so với kết quả thực tế, hàm mất mát
sẽ là một số rất lớn. Điều tương tự xảy ra với tất cả các cặp (xi, yi), i = 1, 2, 3,
…, N với N là số lượng dữ liệu quan sát được. Để hàm mất mát nhỏ nhất khi đó
tổng sai số là nhỏ nhất tương đương với việc tìm w để hàm số sau đạt giá trị nhỏ
nhất:
J(w) = ∑ − (2)
Hàm số J(w) được gọi là hàm mất mát (loss function) của bài toán Linear
Regression. Chúng ta luôn mong muốn rằng sự mất mát (sai số) là nhỏ nhất,
điều đó đồng nghĩa với việc tìm vector hệ số w sao cho giá trị của hàm mất mát
này càng nhỏ càng tốt.
Trước khi đi tìm lời giải, chúng ta đơn giản hóa phép toán trong phương
trình hàm mất mát (2). Đặt =[ ; ; ;…; ] là một vector cột chứa tất cả
các output của training data; =[ ; ; ;…; ] là ma trận dữ liệu đầu
vào (mở rộng) mà mỗi hàng của nó là một điểm dữ liệu.
1.2.3. Tìm nghiệm của mô hình hồi quy tuyến tính
Để tìm nghiệm cho một bài toán tối ưu chúng ta thường giải phương trình
đạo hàm J(w) = ∑ − bằng 0.
Đạo hàm theo w của hàm mất mát là:
Phương trình đạo hàm bằng 0 tương đương với:
⟺ − =0
⟺ − =0
GVHD: Ngô Trường Giang 9
⟺ =
Đặt ≜ ! và ≜ b (≜ "à $ý ℎ'ệ) đố, ) khi đó ta có :
A.W = b
⟺ !- . !. = !- . /
⟺ 0. = !- . / (với I là ma trận đơn vị)
⟺ = !- . /
= !- là nghiệm của mô hình hồi quy tuyến tính.
Trên thực tế A có thể không khả nghịch nên ta sẽ dùng ma trận giả nghịch
-
đảo !† nên ta có W = !† . / hay W = . . Đây chính là nghiệm tổng
quát của hồi quy tuyến tính.
1.2.4. Mức độ lỗi của mô hình hồi quy tuyến tính
Ta có công thức tính mức độ lỗi của mô hình như sau :
MSE = ∑ − ŷ'
Với mức độ lỗi của mô hình cho ta biết mức độ học của mô hình.
GVHD: Ngô Trường Giang 10
CHƯƠNG 2 : ÁP DỤNG THUẬT TOÁN
2.1. Mô tả bài toán
Trong y sinh học, thường có rất nhiều yếu tố khác nhau dẫn đến một hiện
tượng. Ví dụ như hiện tượng xơ vữa động mạch không chỉ do lượng cholesterol
máu mà còn do nhiều yếu tố khác như di truyền, chủng tộc, tiền sử mắc bệnh
tim mạch, tuổi, giới, BMI, tăng huyết áp, đái tháo đường,…
Vì vậy cần phải có mô hình hồi quy tuyến tính đa biến. Trong đề tài tài này
chúng em không đề cập các yếu tố di truyền, chủng tộc, giới, mắc bệnh tim
mạch... mà chỉ lưu ý đến các biến số như: tuổi, cholesterol, glucose, huyết áp
tâm thu và BMI. Khi đó mô hình hồi quy tuyến tính đa biến với 5 yếu tố (
x1=tuổi, x2 = cholesterol, x3 = glucose, x4 = huyết áp, x5 = BMI ) như sau:
Bề dày TM = w0 + w1(tuổi) + w2(cholesterol) + w3(glucose) + w4(huyết áp)
+ w5(BMI)
2.2. Xây dựng bộ dữ liệu
Bộ dữ liệu xây dựng là một bộ dữ liệu được xây dựng bởi một bệnh viện
trong quá trình khảo sát xơ vữa động mạch ở 100 bệnh nhân khác nhau. Bộ dữ
liệu gồm có 6 thuộc tính bao gồm: tuổi, chỉ số BMI, chỉ số huyết áp tối đa
(mmHg), nồng độ glucose trong máu (mmol/l), nồng dộ cholesterol trong máu
(mmol/l) và bề dày thành mạch (mm).
Bộ dữ liệu sẽ chia thành 2 phần trong đó 80% dữ liệu được làm bộ dữ liệu
huấn luyện mô hình, 20% còn lại làm bộ dữ liệu thử nghiệm độ chính xác của
mô hình. Dữ liệu về độ dày thành mạch làm biến mục tiêu, những bộ dữ liệu còn
lại bao gồm (tuổi, BMI, nồng độ glucose máu, nồng độ cholesterol máu) làm
biến giải thích.
GVHD: Ngô Trường Giang 11
Thuộc tính Ý Nghĩa
Tuổi Tuổi
BMI Chỉ số sức khỏe
HA Huyết áp tối đa
Glucose Nồng độ Glucose
Cholesterol Nồng độ Cholesterol
Bedaytm Bề dày thành mạch
Hình 1: Các thuộc tính của bộ dữ liệu
Hình trên là 40 tập dữ liệu đầu của bộ dự liệu huấn luyện mô hình
Đánh giá bộ dữ liệu này hoàn toàn có thể sử dụng cho mô hình hồi quy
tuyến tính chẩn đoán xơ vữa động mạch vì những lý do sau:
Mối quan hệ giữa biến mục tiêu (Y) và biến giải thích (X) là tham số.
Ví dụ Y = WX thì mỗi lần X tăng lên 1 đơn vị thì Y thêm W đơn vị
dù cho bất kể X, Y có giá trị là bao nhiêu.
Các giá trị của biến mục tiêu (Y) phải độc lập với nhau
Các giá trị của biến giải thích (X) không được có sai số ngẫu nhiên.
Ví dụ: Giá trị huyết áp tối đa là 120 mmHg là 120 mmHg không
được là 120 mmHg ± 2 mmHg
GVHD: Ngô Trường Giang 12
2.3. Áp dụng thuật toán vào bài toán
2.3.1. Cài đặt thuật toán
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import math
import sklearn
from sklearn.model_selection import train_test_split
#Xây dựng hàm tìm hệ số hồi quy
def HoiQuyTT(X_train, Y_train):
# Xây dựng Xbar
one = np.ones((X_train.shape[0], 1))
Xbar = np.concatenate((one, X_train), axis=1)
# Các giá trị A, b, At
A = np.dot(Xbar.T, Xbar)
b = np.dot(Xbar.T, Y_train)
At = np.linalg.pinv(A)
#Trả về hệ số hồi quy
W = np.dot(At, b)
return W
#Xây dựng hàm dự đoán với tập dữ liệu test
def KiemTra(W, X_test):
_X_test = np.concatenate((np.ones((X_test.shape[0], 1)), X_test), axis=1)
Y_pred = np.dot(_X_test, W)
return Y_pred
#Xây dựng hàm kiểm tra mức độ sai của mô hình
def SaiSoMoHinh(Y_pred, Y_test):
return np.average((Y_pred - Y_test)**2)
#Tiến hành thực nghiệm
#Đọc tệp
data = pd.read_csv("DuLieuYKhoa.csv", sep=";")
data.head
print(data)
GVHD: Ngô Trường Giang 13
#Lấy dataframe bề dày thành mạch làm biên mục tiêu
Y = data['BEDAYTM'].to_numpy()
#Lấy datafarame không chứa bề dày thành mạch làm biến giải thích
X = data.drop("BEDAYTM", axis = 1)
#Phân loại dữ liệu train và test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 30)
#Hệ số hồi quy của mô hình
print("\nHỆ SỐ HỒI QUY")
LB = ['SAI SỐ', 'TUỔI', 'BMI', 'HUYẾT ÁP', 'GLUCOSE', 'CHOLESTEROL']
w_lr = HoiQuyTT(X_train, Y_train)
print(pd.DataFrame({"Tên": LB, "Hệ số": w_lr}).sort_values(by='Hệ số'))
#Tiến hành dự đoán với tập dự liệu test
_X_test = np.concatenate((np.ones((X_test.shape[0], 1)), X_test), axis = 1)
Y_pred = np.dot(_X_test, w_lr)
print("\n GIÁ TRỊ Y DỰ ĐOÁN")
print(Y_pred)
#In giá trị y test thực tế để so sánh
print("\nGIÁ TRỊ Y THỰC TẾ")
print(Y_test)
#In giá trị sai số của mô hình
#print("\nSAI SỐ MÔ HÌNH")
#print(SaiSoMoHinh(Y_pred, Y_test))
GVHD: Ngô Trường Giang 14
2.3.2. Kiểm nghiệm thuật toán
Hình 2: Kết quả chạy thuật toán
GVHD: Ngô Trường Giang 15
Từ kết quả trên ta có thể thấy mô hình cho ra các hệ số hồi quy (w) cùng
sai số và từ đây ta cũng có thể suy ra được dạng hồi quy tuyến tính như sau: Bề
dày TM = -0.177139 + 0.061229 x [cholesterol] + 0.010665 x [tuổi] + 0.005850
x [BMI] + 0.001066 x [Huyết áp] – 0.000634 x [Glucose]
Qua các hệ số trên ta có thể thấy nồng độ cholesterol máu và số tuổi ảnh
hưởng tới bề dày thành mạch vành và đây cũng là những nguy cơ lớn gây xơ
vữa động mạch vành hay nhồi máu cơ tim hiện nay. Tuy nhiên giá trị dự đoán có
một số giá trị chênh lệch nhiều với giá trị thực tế, nguyên nhân này có thể lý giải
do bộ dự liệu huấn luyện chưa đủ nhiều để huấn luyện một mô hình tối ưu.
2.4. Thực nghiệm với thư viện scikit-learn của python
2.4.1. Giới thiệu thư viện scikit-learn
Scikit-learn (viết tắt là sklearn) là một thư viện mã nguồn mở dành cho học
máy - một ngành trong trí tuệ nhân tạo, rất mạnh mẽ và thông dụng với cộng
đồng Python, được thiết kế trên nền NumPy và SciPy. Scikit-learn chứa hầu hết
các thuật toán machine learning hiện đại nhất, đi kèm với documentations, luôn
được cập nhật. Trong sklearn có class sklearn.linear_model.LinearRegression có
các phương thức liên quan tới hồi quy tuyến tính.
2.4.2. Các phương thức và các biến của class LinearRegression
Sử dụng
sklearn.linear_model.LinearRegression(fit_intercept=True,
normalize=False, copy_X=True, n_jobs=1)
Các biến
- fit_intercept: Không tính toán những điểm cắt trục tung nếu cài đặt
là false, mặc định là true
- normalize: Nếu cài dặt làt true thì chuẩn hoá biến giải thích trước,
mặc định là false
GVHD: Ngô Trường Giang 16
- copy_X: Lưu dữ liệu trong bộ nhớ rồi mới chạy, mặc định là true
- n_jobs: Số job sử dụng khi tính toán, -1 sẽ dùng hết, mặc định là 1
Các thuộc tính của class LinearRegression
- coef_: Trả về hệ số hồi quy
- intercept_: Trả về sai số
Các phương thức
- fit(X, y[, sample_weight]): Tiến hành tìm phương trình hồi quy
tuyến tính
- get_params([deep]): Lấy parameter đã sử dụng
- predict(X): Sử dụng model vừa tạo được tiến hành dự đoán
- score(X, y[, sample_weight]): Đưa ra hệ số quyết định R2. Không
phải lúc nào giá trị dự đoán cũng giống vs giá trị thực tế. Hệ số
quyết định ~ 1 thì độ chính xác càng cao, ~ 0 thì sai lệch lớn
2.4.3. Cài đặt
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn import metrics as sq
from sklearn import linear_model
clf = linear_model.LinearRegression()
#Đọc tệp
data = pd.read_csv("DuLieuYKhoa.csv", sep=";")
data.head
#In dữ liệu
print(data)
#Lấy dataframe bề dày thành mạch làm biên mục tiêu
Y = data['BEDAYTM'].to_numpy()
#Lấy datafarame không chứa bề dày thành mạch làm biến giải thích
X = data.drop("BEDAYTM", axis = 1)
GVHD: Ngô Trường Giang 17
#Phân loại dữ liệu train và test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 20)
#Tạo model suy đoán
clf.fit(X_train, Y_train)
#In hệ số hồi quy của các biến giải thích xếp theo thứ tự tăng dần
print("\nHỆ SỐ HỒI QUY")
print(pd.DataFrame({"Tên": X_train.columns, "Hệ số":
np.abs(clf.coef_)}).sort_values(by='Hệ số'))
#In sai số
print("\nSAI SỐ")
print(clf.intercept_)
#print(clf.score())
#Tiến hành dự đoán với bộ dữ liệu test
Y_pred = clf.predict(X_test)
print("\nGIÁ TRỊ Y DỰ ĐOÁN")
print(Y_pred)
#In giá trị y test thực tế
print("\nGIÁ TRỊ Y THỰC TẾ")
print(Y_test)
#Kiểm tra mức độ lỗi của model (Mean Squared Error)
mse = sq.mean_squared_error(Y_test, Y_pred)
print("KIỂM TRA MỨC ĐỘ LỖI CỦA MÔ HÌNH")
print(mse)
#Bảng biểu so sánh giá trị y dự đoán và y thực tế
plt.scatter(Y_test, Y_pred)
plt.xlabel("Giá trị thực tế: $Y_i$")
plt.ylabel("Giá trị dự đoán: $\hat{Y}_i$")
plt.title("Bảng biểu so sánh $Y_i$ vs $\hat{Y}_i$")
plt.show()
GVHD: Ngô Trường Giang 18