sức khỏe cụ thể
Do điều kiện khách quan, nhóm không thể thu thập được dữ liệu thực tế từ các bệnh viện nên nhóm đã tìm hiểu và nghiên cứu các chỉ số của bệnh nhân sau khi xét nghiệm máu về mức độ ảnh hưởng của chúng tới một số loại bệnh ung thư phổ biến. Dựa vào các ngưỡng chỉ số của người bình thường và người bệnh nhóm tạo ra một tập dữ liệu gồm 200000 hàng, 22 cột. Mỗi hàng tương ứng với một hồ sơ bệnh nhân, mỗi cột tương ứng với một chỉ số trong kết quả xét nghiệm máu. Để có thể dễ hình dung nhóm sẽ thực hiện bài toán với 3 loại bệnh là:
Ung thư gan: Bệnh ung thư gan được phản ành bởi 3 chỉ số chính là : PIVKA-II, AFP, AFP_L3
Ung thư tuyến tụy: Bệnh ung thư tuyến tụy được phản ành bởi 2 chỉ số chính là: CEA, CA19-9
Ung thư vòm họng: Bệnh ung thư vòm họng được phản ành bởi 3 chỉ số chính là : EBV, SSC
95 Chương trình code:
1 Khai báo thư viện và thiết lập giao diện import tkinter.ttk
import numpy as np import pandas as pd import tkinter
from tkinter import*
from tkinter import messagebox import matplotlib.pyplot as plt root = Tk()
# tạo tiêu đề cho app
root.title('CHAN_DOAN_BENH') # tạo kích thước cửa sổ
root.geometry("1400x500") # tạo hàm cập nhật listbox color = "black"
def update(data):
96 # xóa dữ liệu trên list
my_list.delete(0, END)
# thêm các toppings vào listbox for item in data:
my_list.insert(END, item)
# cập nhật listbox theo các kí tự gõ trên entry def fillout(e):
# xóa entry
my_entry.delete(0, END)
# thêm vào entry khi click chuột chọn một item trong listbox my_entry.insert(0, my_list.get(ANCHOR))
def check(e):
# lấy những gì được gõ ở phần entry typed = my_entry.get()
# nếu không gõ gì trên entry thì data = tất cả các item hiện có lưu ở biến toppings if typed == '': data = toppings # nếu có kí tự được gõ else: # data là một mảng trắng data = []
# khởi tạo vòng lặp với biến item chạy lần lượt các item trong toppings for item in toppings:
# trả về các kí tưj trung khớp trên entry và item trong biến toppings if typed.lower() in item.lower():
# lưu các kí tự trùng khớp vào mảng data data.append(item)
97 # cập nhật mảng data hiện tại
update(data) # tạo label
my_label = Label(root, text="SEARCH", font=("Helvetica", 13), fg=color) # xác định toạ độ cua label trên giao diện
my_label.place(x=5,y=12)
# tạo một entry box để nhập tư khóa
my_entry = Entry(root, font=("Helvetica", 20), fg = color) # xác định toạ độ cua entry box trên giao diện
my_entry.place(x = 100, y=8)
# tạo môt listbox chưa các item
my_list = Listbox(root, height = 20,width=70,fg = color) # xác định toạ độ cua listbox trên giao diện
my_list.place(x=50,y=60)
# khởi tạo mảng trắng toppings toppings = []
# khởi tạo môt vòng lặp 5000 lần for i in range(5000):
# khởi tạo một item gán vào biến list list = ("BN{}".format(i))
# lưu biến vừa khởi tạo vào mảng toppings toppings.append(list)
# cập nhật giá trị hiện tại của mảng toppings update(toppings)
98
# thực hiện điền item được click chon lên entry_box gọi hàm fillout my_list.bind("<<ListboxSelect>>", fillout)
# thực hiện tìm kiếm các item có trong toppings gọi hàm check my_entry.bind("<KeyRelease>", check)
# khởi tạo hàm xử lí khi bấm button
2 Đọc và xử lý dữ liệu từ bảng training def handle_bt1():
# đọc file trainning
data = pd.read_csv("trainning_ungthu1.csv") # lưu lại gtri vào một mảng data
data = np.array(data)
# xáo trộn ngâu nhiên các hàng np.random.shuffle(data)
# tạo ma trận 0 kích thước 200000x22 train = np.zeros((200000, 22))
# lấy các gtri của từng hàng trong mỗi cột chia cho các gtri cho trước để làm nhỏ đầu vào
# sau đó điền các gtri đó vào hàng và côt tương ứng của ma trận 0 đã tạo ở trên for i in range(200000): train[i, 0] = data[i, 0] / 7 for i in range(200000): train[i, 1] = data[i, 1] / 180 for i in range(200000): train[i, 2] = data[i, 2] / 0.6 for i in range(200000):
99 train[i, 3] = data[i, 3] / 105 for i in range(200000): train[i, 4] = data[i, 4] / 40 for i in range(200000): train[i, 5] = data[i, 5] / 390 for i in range(200000): train[i, 6] = data[i, 6] / 20 for i in range(200000): train[i, 7] = data[i, 7] / 12 for i in range(200000): train[i, 8] = data[i, 8] / 6 for i in range(200000): train[i, 9] = data[i, 9] / 1.2 for i in range(200000): train[i, 10] = data[i, 10] / 1 for i in range(200000): train[i, 11] = data[i, 11] / 0.5 for i in range(200000): train[i, 12] = data[i, 12] / 0.7 for i in range(200000): train[i, 13] = data[i, 13] / 360 for i in range(200000): train[i, 14] = data[i, 14] / 12 for i in range(200000): train[i, 15] = data[i, 15] / 12 for i in range(200000): train[i, 16] = data[i, 16] / 6 for i in range(200000): train[i, 17] = data[i, 17] / 6
100 for i in range(200000): train[i, 18] = data[i, 18] / 60 for i in range(200000): train[i, 19] = data[i, 19] / 8 for i in range(200000): train[i, 20] = data[i, 20] / 130 for i in range(200000): train[i, 21] = data[i, 21] / 430
#khởi tạo ma trận xtrain là một mảng con của ma trận train ( các hàng 0,1,2,..194999),(các cột 0,1,2,..21)
# sau đó chuyển vị ma trận thu được một ma trận xtrain kích thước 22 x 195000 xtrain = np.array(train[:195000, :21]).T
# khởi tạo ma trận ytrain l một mảng con của ma trận data ( các hàng 0,1,2,..194999), (các cột 22,23,24)
# sau đó chuyển vị ma trận thu được một ma trận ytrain kích thước 3 x 195000 ytrain = np.array(data[:195000, 22:25]).T
# khởi tạo ma trận xtest là một mảng con của ma trận train (các hàng 194999,195000,..199999),(các cột 0,1,2,..21)
# sau đó chuyển vị ma trận thu được một ma trận xtest kích thước 22 x 5000 xtest = np.array(train[195000:200000, :21]).T
# khởi tạo ma trận ytest là một mảng con của ma trận data (các hàng 194999,195000,..199999),(các cột 22,23,24)
# sau đó chuyển vị ma trận thu được một ma trận xtest kích thước 22 x 5000 ytest = np.array(data[195000:200000, 22:25]).T
# gán các biến m, n tương ứng kích thước ma trận xtrain m, n = np.array(xtrain).shape
101
3 Khởi tạo các bộ trọng số, thực hiện lan truyền tiến, lan truyền ngược, các hàm và thuật toán liên quan
# khởi tạo các hàm tính toán giống với vd về nhận diện số viết tay def trong_so(): w1 = np.random.rand(20, 21) - 0.5 b1 = np.random.rand(20, 1) - 0.5 w2 = np.random.rand(3, 20) - 0.5 b2 = np.random.rand(3, 1) - 0.5 return w1, b1, w2, b2 def Relu(Z): return np.maximum(Z, 0) def sigmoid(x): return 1 / (1 + np.exp(-x)) def lan_truyen_tien(w1, w2, b1, b2, X): Z1 = np.dot(w1, X) + b1 A1 = Relu(Z1) Z2 = np.dot(w2, A1) + b2 A2 = sigmoid(Z2) return Z1, A1, Z2, A2
# khởi tạo hàm tính lossfunction trên toàn bộ dữ liệu def lossfunction(A2):
# khởi tạo biến loss = 0 loss = 0
# khởi tạo một mảng trắng losstable = []
102 for i in range(3):
# tính lossfunction của các label 1 gán vào biến loss1 loss1 = - ytrain[i, :] * np.log(A2[i, :])
# tính lossfunction của các label 0 gán vào biến loss2 loss2 = -(1 - ytrain[i, :]) * np.log(1 - A2[i, :])
# tính tổng lossfunction của 2 label 1 và 0 và gán vào biến sum_loss1 sum_loss1 = loss1 + loss2
# tính gtri lossfunction trung bình trên cả bộ dữ liệu trainning gán vào biên sum_loss1
sum_loss1 = np.sum(sum_loss1) / n
# cộng sum_loss1 vào biến loss và lưu gtri vào biến loss loss += sum_loss1
# ghi lại giá trị lossfunction vào mảng trắng đã tạo ở trên losstable.append(sum_loss1)
# trả ra gtri của hàm return losstable, loss / 3 def ReLU_deriv(Z): return Z > 0
def backward_prop(Z1, A1, Z2, A2, w1, w2, X, Y): dZ2 = A2 - Y dW2 = 1 / n * dZ2.dot(A1.T) db2 = 1 / n * np.sum(dZ2) dZ1 = w2.T.dot(dZ2) * ReLU_deriv(Z1) dW1 = 1 / n * dZ1.dot(X.T) db1 = 1 / n * np.sum(dZ1) return dW1, db1, dW2, db2
103
def update_params(w1, b1, w2, b2, dW1, db1, dW2, db2, alpha): w1 = w1 - alpha * dW1
b1 = b1 - alpha * db1 w2 = w2 - alpha * dW2 b2 = b2 - alpha * db2 return w1, b1, w2, b2
def GD(X, Y, alpha, iter): w1, b1, w2, b2 = trong_so() # khởi tạo mảng trắng loss_table = [] # khởi tạo vòng lặp for i in range(iter): Z1, A1, Z2, A2 = lan_truyen_tien(w1, w2, b1, b2, X)
dW1, db1, dW2, db2 = backward_prop(Z1, A1, Z2, A2, w1, w2, X, Y) # gán giá trị đầu ra của hàm lossfunction(A2) vào 2 biến losstable,loss1 losstable,loss1 = lossfunction(A2)
# ghi lại giá trị của loss1 vào mảng trắng loss_table.append(loss1)
w1, b1, w2, b2 = update_params(w1, b1, w2, b2, dW1, db1, dW2, db2, alpha) # trả ra giá trị của hàm GD()
return w1, b1, w2, b2, loss_table, losstable
# lưu giá trị trả ra của hàm GD(xtrain, ytrain, 0.1, 900) vào các biến w1, b1, w2, b2, loss_table, losstable
w1, b1, w2, b2, loss_table, losstable = GD(xtrain, ytrain, 0.1, 900)
# gán giá trị trả ra A2 của hàm lan_truyen_tien(w1, w2, b1, b2, xtrain) vào biến predict_train
_, _, _, predict_train = lan_truyen_tien(w1, w2, b1, b2, xtrain)
104 predict_test
_, _, _, predict_test = lan_truyen_tien(w1, w2, b1, b2, xtest)
#gán gtri lần lượt các hàng 0,1,2 của ma trận losstable vào các biến để biểu diễn gtri hàm mất mát
loss_UTG = losstable[0] loss_UTTT = losstable[1] loss_UTVH = losstable[2]
#in gtri hàm mất mát của mỗi loại bệnh print("loss_UTG",loss_UTG)
print("loss_UTTT", loss_UTTT) print("loss_UTVH", loss_UTVH)
4 Tính toán độ chính xác của bộ trọng số và kết quả dự đoán # tạo vòng lặp để đánh giá
# j chạy từ 0 - 3 for j in range(3): # i chạy từ 0 - n for i in range(n):
# nếu gtri tại hàng j cột i của predict_train >= 0,5 thi gán cho nó gtri 1 if predict_train[j, i] >= 0.5:
predict_train[j, i] = 1
# nếu gtri tại hàng j cột i của predict_train < 0,5 thi gán cho nó gtri 0 else:
predict_train[j, i] = 0 for j in range(3):
for i in range(5000):
# nếu gtri tại hàng j cột i của predict_test >= 0,5 thi gán cho nó gtri 1 if predict_test[j, i] >= 0.5:
105 predict_test[j, i] = 1
# nếu gtri tại hàng j cột i của predict_test < 0,5 thi gán cho nó gtri 0 else:
predict_test[j, i] = 0
# so sánh lần lượt các phần tử trong mảng predict_train với ytrain
# đem tổng số các phần tử trùng khớp chia cho tổng số các phần tư của ytrain # gán giá trị tìm được vào biến acctrain
acctrain = np.sum(predict_train == ytrain) / 585000 # nhân acctrain với 100
acctrain = acctrain*100
# so sánh lần lượt các phần tử trong mảng predict_test với ytest
# đem tổng số các phần tử trùng khớp chia cho tổng số các phần tư của ytest # gán giá trị tìm được vào biến acctest
acctest_UTG = np.sum(predict_test[0,:] == ytest[0,:]) / 5000 acctest_UTTT = np.sum(predict_test[1, :] == ytest[1, :]) / 5000 acctest_UTVH = np.sum(predict_test[2, :] == ytest[2, :]) / 5000 # nhân acctest với 100
acctest_UTG = float(acctest_UTG * 100) acctest_UTTT = float(acctest_UTTT * 100) acctest_UTVH = float(acctest_UTVH * 100) # khởi tảo mảng con của xtest
input = xtest[:, 2]
# reshape mảng về kích thước 6x1 input = np.array(input).reshape(21, 1)
# gán giá trị trả ra A2 của hàm lan_truyen_tien(w1, w2, b1, b2, input) vào biến test _, _, _, test = lan_truyen_tien(w1, w2, b1, b2, input)
# gán các gtri lần lượt các hàng của mảng vào các biến UTGAN, UTTT, UTVH UTGAN1 = float(test[0])*100
106 UTTTUY1 = float(test[1])*100
UTVHONG1 = float(test[2])*100
5 In thông số, kết quả ra giao diện
# khởi tạo label trên app hiển thị mã bệnh nhân + kết qua của entry_box khởi tạo ở trên lbl.configure(text="MÃ BỆNH NHÂN:" +" "+ my_entry.get(), fg = color)
# thay đổi nội dung hiển thi của label
suckhoe.configure(text ="CHỈ SỐ SỨC KHỎE:",fg = "RED")
# thay đổi nội dung các label bằng các chỉ số chính là các giá trị lần lượt tại từng hàng của mảng input
lbl11.configure(text="-RBC:" +" "+ str(data.T[0,2]) +" "+ "T/L",fg = color) lbl12.configure(text="-HBG:" + " "+ str(data.T[1,2]) +" "+"G/L",fg = color) lbl13.configure(text="-HCT:" +" "+ str(data.T[2,2])+" "+"L/L",fg = color) lbl14.configure(text="-MCV:" +" "+ str(data.T[3,2])+" "+"fL",fg = color)
lbl15.configure(text="-PIVKA-II:" +" "+ str(data.T[4,2])+" "+"mAu/ml",fg = color) lbl16.configure(text="-MCHC:" +" "+ str(data.T[5,2])+" "+"g/L",fg = color)
lbl17.configure(text="-AFP:" + " " + str(data.T[6, 2]) + " " + "ul/mL", fg=color) lbl18.configure(text="-EBV:" + " " + str(data.T[7, 2]) + " " + "G/L", fg=color) lbl19.configure(text="-CEA:" + " " + str(data.T[8, 2]) + " " + "ng/mL", fg=color) lbl20.configure(text="-SSC:" + " " + str(data.T[9, 2]) + " " + "ng/mL", fg=color) lbl21.configure(text="-GGT:" + " " + str(data.T[10, 2]) + " " + "U/L", fg=color) lbl22.configure(text="-BASO:" + " " + str(data.T[11, 2]) + " " + "G/L", fg=color) lbl23.configure(text="-LUC:" + " " + str(data.T[12, 2]) + " " + "G/L", fg=color) lbl24.configure(text="-PLT:" + " " + str(data.T[13, 2]) + " " + "G/L", fg=color) lbl25.configure(text="-AFP_L3:" + " " + str(data.T[14, 2]) + " " + "%", fg=color) lbl26.configure(text="-MPV:" + " " + str(data.T[15, 2]) + " " + "fL", fg=color) lbl27.configure(text="-GLU:" + " " + str(data.T[16, 2]) + " " + "mm/L", fg=color) lbl28.configure(text="-AFP:" + " " + str(data.T[17, 2]) + " " + "mm/L", fg=color)
107
lbl29.configure(text="-CA19-9:" + " " + str(data.T[18, 2]) + " " + "U/mL", fg=color) lbl30.configure(text="-URE:" + " " + str(data.T[19, 2]) + " " + "umol/L", fg=color) lbl31.configure(text="-CRE:" + " " + str(data.T[20, 2]) + " " + "umol/L", fg=color) lbl32.configure(text="-URIC:" + " " + str(data.T[21, 2]) + " " + "umol/L", fg=color) # thay đổi nội dung label dự đoán kết quả
UTG.configure(text = "NGUY CO UNG THU GAN: %0.2f"%(UTGAN1)+"%",fg = color)
UTTT.configure(text = "NGUY CO UNG THU TUYEN TUY: %0.2f"%(UTTTUY1)+"%",fg = color)
UTVH.configure(text = "NGUY CO UNG THU VOM HONG: %0.2f"%(UTVHONG1)+"%",fg = color)
# thay đổi nội dung label độ chính xxác acc_bp.configure(text = "%0.2f"%acc_bp + "%")
acc_UTG.configure(text="%0.2f" % acctest_UTG + "%",fg = color) acc_UTTT.configure(text="%0.2f" % acctest_UTTT + "%",fg = color) acc_UTVH.configure(text="%0.2f" % acctest_UTVH + "%",fg = color) # tháy đổi nội dung label tính toán độ chính xác trung bình trên cả 3 bệnh lbl4.configure(text="CHẨN ĐOÁN ", fg="red")
# khởi tạo một đầu vào tương tưj in ra màn hình để kiểm tra input = xtest[:, 2]
input = np.array(input).reshape(21, 1)
_, _, _, test1 = lan_truyen_tien(w1, w2, b1, b2, input) for i in range(3):
if test1[i,0] >=0.5: test1[i,0] = 1
108 else:
test1[i,0] = 0 predict = test1[:,0] print("x_test",xtest[:,2])
print("label thuc y_test",ytest[:,2]) print("label predict: ",predict)
solanlap = [i for i in range(900)] plt.plot(solanlap, loss_table, 'r')
plt.title("ảnh hưởng của iteration tới LOSSFUNCTION") plt.xlabel("iteration")
plt.ylabel("loss") plt.show()
# khởi tạo hàm thực thi button "RESET" def handle_bt2():
# thay đổi thông tin các label hiển thị trên màn hình lbl.configure(text="NO INFORMATION", fg = "red") suckhoe.configure(text="", fg="red") lbl11.configure(text="", fg="red") lbl12.configure(text="", fg="red") lbl13.configure(text="", fg="red") lbl14.configure(text="", fg="red") lbl15.configure(text="", fg="red") lbl16.configure(text="", fg="red") lbl17.configure(text="", fg="red") lbl18.configure(text="", fg="red") lbl19.configure(text="", fg="red")
109 lbl20.configure(text="", fg="red") lbl21.configure(text="", fg="red") lbl22.configure(text="", fg="red") lbl23.configure(text="", fg="red") lbl24.configure(text="", fg="red") lbl25.configure(text="", fg="red") lbl26.configure(text="", fg="red") lbl27.configure(text="", fg="red") lbl28.configure(text="", fg="red") lbl29.configure(text="", fg="red") lbl30.configure(text="", fg="red") lbl31.configure(text="", fg="red") lbl32.configure(text="", fg="red")
UTG.configure(text="NO INFORMATION", fg="red") UTTT.configure(text="NO INFORMATION", fg="red") UTVH.configure(text="NO INFORMATION", fg="red") acc_UTG.configure(text="", fg="red")
acc_UTTT.configure(text="", fg="red") acc_UTVH.configure(text="", fg="red")
lbl4.configure(text="CHẨN ĐOÁN ", fg="red")
# khởi tạo các button1 và chức năng của button1 gọi đến hàm handle_bt1
button1 = Button(root,height = 2,width = 10, text = "RUN",font=("Helvetica", 14), fg = color, command = handle_bt1)
# khởi tạo các button2 và chức năng của button1 gọi đến hàm handle_bt2
110 fg = color, command = handle_bt2)
# khởi tạo label hiển thị trên giao diện app
lbl = Label(root, text = "NO INFORMATION",font=("Helvetica", 20), fg = "red") # khởi tạo các ô trắng bằng thư viện canvas
canvas = Canvas(root, height = 200, width = 590, bg = color) canvas2 =Canvas(root, height = 90, width = 300, bg = color) canvas3 =Canvas(root, height = 90, width = 150, bg = color) # khởi tạo các label giao diện app
suckhoe = Label(root, text = "", fg ="red") lbl11 = Label(root, fg ="red") lbl12 = Label(root, fg ="red") lbl13 = Label(root, fg ="red") lbl14 = Label(root, fg ="red") lbl15 = Label(root, fg ="red") lbl16 = Label(root, fg ="red") lbl17 = Label(root, fg ="red") lbl18 = Label(root, fg ="red") lbl19 = Label(root, fg ="red") lbl20 = Label(root, fg ="red") lbl21 = Label(root, fg ="red") lbl22 = Label(root, fg ="red") lbl23 = Label(root, fg ="red") lbl24 = Label(root, fg ="red") lbl25 = Label(root, fg ="red") lbl26 = Label(root, fg ="red") lbl27 = Label(root, fg ="red")
111 lbl28 = Label(root, fg ="red") lbl29 = Label(root, fg ="red") lbl30 = Label(root, fg ="red") lbl31 = Label(root, fg ="red") lbl32 = Label(root, fg ="red")
UTG = Label(root, text = "NO INFORMATION", fg ="red") UTTT = Label(root, text = "NO INFORMATION", fg ="red") UTVH = Label(root, text = "NO INFORMATION", fg ="red") acc_UTG = Label(root, fg ="red")
acc_UTTT = Label(root, fg ="red") acc_UTVH = Label(root, fg ="red")
lbl4 = Label(root, text = "CHẨN ĐOÁN", fg ="red")
accuracy = Label(root, text = "ĐỘ CHÍNH XAC ", fg ="red")
# sắp xếp bố cục của app, toạ độ của các label, canvas, button, listbox, entry_box button1.place(x = 550, y = 140) button2.place(x = 550, y = 230) canvas.place(x = 710, y =124) canvas2.place(x=780, y = 363) canvas3.place(x=1080, y = 363) lbl.place(x=890, y = 30) suckhoe.place(x=930, y = 100) lbl11.place(x = 720, y =140) lbl12.place(x = 720, y =170)
112 lbl13.place(x = 720, y =200) lbl14.place(x = 720, y =230) lbl15.place(x = 720, y =260) lbl16.place(x = 720, y =290) lbl17.place(x = 870, y =140) lbl18.place(x = 870, y =170) lbl19.place(x = 870, y =200) lbl20.place(x = 870, y =230) lbl21.place(x = 870, y =260) lbl22.place(x = 870, y =290) lbl23.place(x = 1020, y =140) lbl24.place(x = 1020, y =170) lbl25.place(x = 1020, y =200) lbl26.place(x = 1020, y =230) lbl27.place(x = 1020, y =260) lbl28.place(x = 1020, y =290) lbl29.place(x = 1170, y =140) lbl30.place(x = 1170, y =170) lbl31.place(x = 1170, y =200) lbl32.place(x = 1170, y =230) UTG.place(x = 800, y =370) UTTT.place(x =800, y =400) UTVH.place(x =800, y =430)
113 acc_UTG.place(x = 1120, y =370) acc_UTTT.place(x = 1120, y =400) acc_UTVH.place(x = 1120, y =430) lbl4.place(x = 860, y=340) accuracy.place( x = 1100, y =340) # hiển thị thực thi app
root.mainloop()
Kết quả chạy chương trình
Hình 4-11 Giao diện chương trình dự đoán
114
4.3Thử nghiệm và đánh giá hệ thống
Trong bài toán số 1:
Kết quả chạy chương trình với các hệ số learning rate khác nhau:
Từ bảng kết quả trên ta thấy với learning rate là 1, số lần lặp 300 độ chính xác trên tập trainning rất cao vì vậy trong bài toán dự đoán chữ số ta sẽ sử dụng bộ số trên.
Trong bài toán số 2:
❖ Ban đầu nhóm tạo 1 tập dữ liệu với 20000 dữ liệu Lần chạy thứ nhất với các thông số
• Learning rate : 0.5 • Số lần lặp: 300 • Số lớp ẩn: 50
115 Ta thu được • loss_UTG 0.6930486288738151 • loss_UTTT 0.6930528832966404 • loss_UTVH 0.6928909507245145 loss_trungbinh ~ 0.7
Đồ thị giảm mạnh sau khoảng 20 lần chạy, tuy nhiên lossfunction ở mức rất cao dẫn tới độ chính xác rất thấp
Lần chạy thứ hai với các thông số • Learning rate : 0.3
• Số lần lặp: 500 • Số lớp ẩn : 50
116 Ta thu được:
• loss_UTG 0.6932923897717506 • loss_UTTT 0.6931881292766071 • loss_UTVH 0.6931070157283328
Kết luận: Kết quả gần như không thay đổi, hiện tượng OVERFITING do lượng dữ liệu đầu vào chưa đủ để mô hình có thể học hỏi và đưa ra dự đoán nên độ chính xác trên tập test gần như không thể cái thiện mặc dù trên tập trainning có thể cái thiện ❖ Tập dữ liệu với 200000 dữ liệu
Lần chạy thứ nhất • Learning rate : 0.5
117 • Số lần lặp: 300 • So lớp ẩn: 50 Ta thu được: • loss_UTG 0.30091290913139657 • loss_UTTT 0.18005818845174035 • loss_UTVH 0.21728261379970168 loss_trungbinh ~ 0.23
Nhận xét sự bất ổn của đồ thị, do bước nhảy còn lớn, hàm mất mát vẫn còn cao
Lần chạy thứ hai với thông số • Learning rate : 0.3
• Số lần lặp: 500
118 • Số lớp ẩn : 50 Ta thu được: • loss_UTG 0.21887631457600604 • loss_UTTT 0.22512184338267985 • loss_UTVH 0.10624281743795591 loss_trungbinh ~ 0.18
Nhận xét sự bất ổn của đồ thị, do bước nhảy còn lớn, hàm mất mát vẫn còn cao
Lần chạy thứ ba với thông số • Learning rate : 0.2
• Số lần lặp: 600 • Số lớp ẩn : 50
119 Ta thu được: • loss_UTG 0.25021847407790776 • loss_UTTT 0.09382886568315578 • loss_UTVH 0.10912298641795942 loss_trungbinh :0.15
=> Nhận xét sự bất ổn của đồ thị, do bước nhảy còn vẫn còn khá cao mặc dù mức độ giảm đã ổn định hơn, lossfunction ở mức tương đối
Lần chạy thứ tư với thông số • Learning rate : 0.1
• Số lần lặp: 900 • Số lớp ẩn : 20
120 Ta thu được: • loss_UTG : 0.16323042318539596 • loss_UTTT : 0.09406318927201206 • loss_UTVH: 0.10231265537894242 loss_trungbinh ~ 0.116
Đồ thị giảm ổn định, bước nhảy và số lần lặp phù hợp, lossfunction ở mức nhỏ và đủ để độ chính xác đạt mức cao.