Thuốc càng để lâu càng mất tác dụng? thực nghiệm trên Python

<p style="text-align: justify;">Để củng cố lại phần kiến thức l&yacute; thuyết của<a href="../../../khoa-hoc/machine-learning-co-ban/tim-nghiem-cua-bai-toan-hoi-quy-tuyen-tinh-bang-toi-uu-tham-so" target="_blank" rel="noopener"> b&agrave;i trước</a>, trong b&agrave;i n&agrave;y ch&uacute;ng ta sẽ xem x&eacute;t một v&iacute; dụ đơn giản cho b&agrave;i to&aacute;n hồi quy tuyến t&iacute;nh một chiều. Ở v&iacute; dụ n&agrave;y, dữ liệu đầu v&agrave;o chỉ c&oacute; 1 thuộc t&iacute;nh (1 chiều) nhằm thuận tiện cho việc minh hoạ trong mặt phẳng.</p> <p style="text-align: justify;">Để đ&aacute;nh gi&aacute; độ ch&iacute;nh x&aacute;c của c&ocirc;ng thức nghiệm trong b&agrave;i trước, ch&uacute;ng ta sẽ tiến h&agrave;nh so s&aacute;nh n&oacute; với nghiệm t&igrave;m được khi sử dụng thư viện học m&aacute;y <a href="http://scikit-learn.org/stable/">scikit-learn</a>&nbsp;của Python (một trong những thư viện được sử dụng phổ biến nhất hiện nay trong machine learning).</p> <p style="text-align: justify;">Cho bảng dữ liệu thể hiện tỷ lệ hoạt lực của loại thuốc X sau mỗi năm bảo quản như sau:</p> <p style="text-align: justify;">&nbsp;</p> <table style="border-collapse: collapse; width: 100%; border-style: solid;"> <tbody> <tr style="height: 22px;"> <td style="height: 22px; width: 16%;" width="16%">Năm</td> <td style="height: 22px; width: 16%;" width="16%">1</td> <td style="height: 22px; width: 16%;" width="16%">2</td> <td style="height: 22px; width: 16%;" width="16%">3</td> <td style="height: 22px; width: 16%;" width="16%">4</td> <td style="height: 22px; width: 16%;" width="16%">5</td> </tr> <tr style="height: 22px;"> <td style="height: 22px; width: 16%;" width="16%">Tỷ lệ</td> <td style="height: 22px; width: 16%;" width="16%">96</td> <td style="height: 22px; width: 16%;" width="16%">84</td> <td style="height: 22px; width: 16%;" width="16%">70</td> <td style="height: 22px; width: 16%;" width="16%">58</td> <td style="height: 22px; width: 16%;" width="16%">52</td> </tr> </tbody> </table> <p>&nbsp;</p> <ol style="text-align: justify;"> <li>X&acirc;y dựng đường hồi quy tuyến t&iacute;nh thể hiện tỷ lệ hoạt động của thuốc X qua thời gian</li> <li>Thể hiện bằng c&aacute;ch vẽ đồ thị bằng matplotlib</li> <li>Dựa tr&ecirc;n kết quả hồi quy tr&ecirc;n, h&atilde;y x&aacute;c định thời gian hết hạn của thuốc v&agrave; thời điểm m&agrave; thuốc chỉ c&ograve;n lại 80% hoạt lực.</li> </ol> <p style="text-align: justify;">Đ&acirc;y l&agrave; một b&agrave;i to&aacute;n hồi quy tuyến t&iacute;nh một chiều đơn giản trong đ&oacute; nhiệm vụ của ch&uacute;ng ta l&agrave; phải dự đo&aacute;n được tỷ lệ hoạt động c&ograve;n lại của một loạt thuốc X theo thời gian. Tất nhi&ecirc;n thuốc để c&agrave;ng l&acirc;u th&igrave; tỷ lệ hoạt động c&agrave;ng giảm. Tức l&agrave; quan hệ ở đ&acirc;y l&agrave; quan hệ tỷ lệ nghịch.</p> <p style="text-align: justify;">Đầu ti&ecirc;n, để thuận lợi cho việc t&iacute;nh to&aacute;n ch&uacute;ng ta th&ecirc;m v&agrave;o thư viện&nbsp;<a href="https://www.numpy.org/">numpy</a>&nbsp;để phục vụ cho việc xử l&yacute; c&aacute;c ph&eacute;p t&iacute;nh tr&ecirc;n đại số tuyến t&iacute;nh v&agrave; sử dụng th&ecirc;m thư viện&nbsp;<a href="https://matplotlib.org/">matplotlib</a>&nbsp;cho việc vẽ h&igrave;nh minh họa trực quan kết quả.</p> <pre class="language-python"><code>import numpy as np import matplotlib.pyplot as plt</code></pre> <p style="text-align: justify;">Tiếp theo, để tiện theo d&otilde;i, ch&uacute;ng ta khai b&aacute;o v&agrave; biểu diễn dữ liệu tr&ecirc;n một đồ thị.</p> <pre class="language-python"><code># Sử dụng np.array để đưa c&aacute;c ph&eacute;p to&aacute;n cho thư viện numpy xử l&yacute; X = np.array([[1,2,3,4,5]]).T y = np.array([[ 96,84,70,58,52]]).T # Vẽ đồ thị để biểu diễn dữ liệu plt.plot(X, y, 'ro') plt.axis([0, 10, 40, 100]) plt.xlabel('Số năm') plt.ylabel('Tỷ lệ hoạt động') plt.show()</code></pre> <p><img style="width: 100%; display: block; margin-left: auto; margin-right: auto;" src="../../../public_files/db90711a-1b16-4207-8925-62652e51fdc9" alt="Huan-luyen-mo-hinh-machine-learning-dau-tien" /></p> <p style="text-align: justify;">Từ đồ thị n&agrave;y ta thấy rằng dữ liệu được sắp xếp gần như theo 1 đường thẳng nghịch biến, v&agrave; do đ&oacute; m&ocirc; h&igrave;nh Linear Regression nhiều khả năng sẽ cho kết quả tốt:<br />$y=w_{1} x+w_{0}$<br />Tiếp theo, ch&uacute;ng ta sẽ t&iacute;nh to&aacute;n c&aacute;c hệ số $W=\left[w_{0}, w_{1}\right]$ theo c&ocirc;ng thức ở tr&ecirc;n. Đầu ti&ecirc;n, gh&eacute;p v&agrave;o ma trận để thu được ma trận $\overline{\mathcal{X}}$</p> <pre class="language-python"><code>one = np.ones((X.shape[0], 1)) Xbar = np.concatenate((one, X), axis = 1)</code></pre> <p style="text-align: justify;">Khi đ&oacute; Xbar của ch&uacute;ng ta sẽ c&oacute; dạng:</p> <pre class="language-python"><code>[[1. 1.] [1. 2.] [1. 3.] [1. 4.] [1. 5.]]</code></pre> <p style="text-align: justify;">Tiếp theo, ch&uacute;ng ta t&iacute;nh nghiệm theo c&ocirc;ng thức:</p> <pre class="language-python"><code>A = np.dot(Xbar.T, Xbar) b = np.dot(Xbar.T, y) w = np.dot(np.linalg.inv(A), b) print('w = ', w)</code></pre> <p style="text-align: justify;">Thu được:</p> <pre class="language-python"><code>w = [[106.2] [-11.4]]</code></pre> <p style="text-align: justify;">Tương ứng với phương tr&igrave;nh hồi quy: $y=106.2-11.4 x$.<br />Vẽ đường thẳng hồi quy tr&ecirc;n đồ thị v&agrave; hiển thị lại c&aacute;c điểm tr&ecirc;n đồ thị để so s&aacute;nh kết quả hồi quy:</p> <pre class="language-python"><code>w_0 = w[0][0] w_1 = w[1][0] x0 = np.linspace(0, 10, 2) y0 = w_0 + w_1*x0 plt.plot(X.T, y.T, 'ro') plt.plot(x0, y0) plt.axis([0, 10, 40, 100]) plt.xlabel('Số năm') plt.ylabel('Tỷ lệ hoạt động') plt.show()</code></pre> <p><img style="width: 100%; display: block; margin-left: auto; margin-right: auto;" src="../../../public_files/9c98b278-6a4c-4a65-8bb1-ed30d7d178a4" alt="Huan-luyen-mo-hinh-machine-learning-dau-tien-2" /></p> <p style="text-align: justify;">Từ đồ thị b&ecirc;n tr&ecirc;n ta thấy rằng c&aacute;c điểm dữ liệu m&agrave;u đỏ nằm kh&aacute; gần đường thẳng dự đo&aacute;n m&agrave;u xanh. Vậy m&ocirc; h&igrave;nh Linear Regression hoạt động tốt với tập dữ liệu&nbsp;<em>huấn luyện&nbsp;</em>đ&atilde; cho.</p> <p style="text-align: justify;">Khi hoạt lực c&ograve;n $80 \%$ tức l&agrave;: $80=106.2-11.4 x$ hay $x=2.3$ năm, tức l&agrave; nếu ch&uacute;ng ta quy ước thuốc c&ograve;n tối thiểu $80 \%$ hoạt lực l&agrave; c&ograve;n hạn sử dụng th&igrave; hạn sử dụng của thuốc ở đ&acirc;y sẽ l&agrave; khoảng 2 năm.</p> <p style="text-align: justify;">Tiếp theo, ch&uacute;ng ta sẽ sử dụng thư viện scikit-learn của Python để t&igrave;m nghiệm v&agrave; so s&aacute;nh với kết quả theo c&ocirc;ng thức.</p> <pre class="language-python"><code>from sklearn import linear_model model = linear_model.LinearRegression(fit_intercept=False) model.fit(Xbar, y) print( 'M&ocirc; h&igrave;nh t&iacute;nh theo sklearn: ', model.coef_ ) print( 'M&ocirc; h&igrave;nh t&iacute;nh theo c&ocirc;ng thức: ', w.T)</code></pre> <p style="text-align: justify;">Kết quả thu được:</p> <pre class="language-python"><code>M&ocirc; h&igrave;nh t&iacute;nh theo sklearn: [[106.2 -11.4]] M&ocirc; h&igrave;nh t&iacute;nh theo c&ocirc;ng thức: [[106.2 -11.4]]</code></pre> <p style="text-align: justify;">Ch&uacute;ng ta thấy rằng hai kết quả thu được ở tr&ecirc;n l&agrave; như nhau! Hay n&oacute;i c&aacute;ch kh&aacute;c, c&aacute;c ph&acirc;n t&iacute;ch của ch&uacute;ng ta ở tr&ecirc;n l&agrave; đ&uacute;ng!</p> <p style="text-align: justify;">Mặc d&ugrave;, c&ograve;n kh&aacute; nhiều điều cần n&oacute;i về c&aacute;c m&ocirc; h&igrave;nh machine learning dạng hồi quy, đặc biệt l&agrave; trường hợp Hồi quy nhiều chiều hay hồi quy phi tuyến. Tuy nhi&ecirc;n, do thời lượng c&oacute; hạn cũng như mục đ&iacute;ch của b&agrave;i n&agrave;y chỉ để ch&uacute;ng ta nắm được cơ bản việc huấn luyện m&ocirc; h&igrave;nh machine learning l&agrave; như thế n&agrave;o. Do đ&oacute;, c&aacute;c vấn đề chi tiết hơn v&agrave; phức tạp hơn về Linear Regression sẽ được để gi&agrave;nh lại cho c&aacute;c b&agrave;i sau. Đến đ&acirc;y, ch&uacute;ng ta tổng kết một số điều đ&atilde; được học trong b&agrave;i n&agrave;y, đ&oacute; l&agrave;:</p> <ul style="text-align: justify;"> <li>C&aacute;c m&ocirc; h&igrave;nh machine learning sẽ được thu được th&ocirc;ng qua việc tối ưu h&oacute;a một h&agrave;m mục ti&ecirc;u (trong b&agrave;i ch&uacute;ng ta chọn h&agrave;m mục ti&ecirc;u c&oacute; c&ugrave;ng dạng với h&agrave;m mất m&aacute;t v&agrave; t&igrave;m c&aacute;ch cực tiểu h&oacute;a n&oacute;.</li> <li>Việc tối ưu n&agrave;y c&oacute; thể thực hiện bằng nhiều phương ph&aacute;p kh&aacute;c nhau (đ&acirc;y l&agrave; một trong những sự kh&aacute;c biệt cơ bản của c&aacute;c thuật to&aacute;n machine learning) trong đ&oacute; phương ph&aacute;p đơn giản nhất thường được thử l&agrave; t&igrave;m c&aacute;ch giải phương tr&igrave;nh đạo h&agrave;m bằng 0.</li> <li>Linear Regression l&agrave; một m&ocirc; h&igrave;nh đơn giản, do đ&oacute; dạng của đạo h&agrave;m (gradient) cũng như việc giải phương tr&igrave;nh đạo h&agrave;m bằng 0 cũng kh&aacute; đơn giản v&agrave; c&oacute; thể thu được c&ocirc;ng thức tường minh. Tuy v&acirc;y, t<em>rong hầu hết c&aacute;c trường hợp, ch&uacute;ng ta sẽ kh&ocirc;ng thể c&oacute; được kết quả đẹp thế n&agrave;y.&nbsp;</em>Trong những trường hợp đ&oacute;, c&aacute;c phương ph&aacute;p tối ưu xấp xỉ kh&aacute;c được sử dụng, đại diện l&agrave; Gradient Descent hay một số phương ph&aacute;p dạng tham lam&hellip;</li> </ul> <p style="text-align: justify;">Nếu c&oacute; g&igrave; chưa r&otilde;, h&atilde;y để lại b&igrave;nh luận b&ecirc;n dưới hoặc tham gia nh&oacute;m hỏi đ&aacute;p của <a href="https://www.facebook.com/groups/tek4.vn">TEK4.VN</a>.</p> <p style="text-align: justify;">&nbsp;</p> <hr /> <p style="text-align: center;"><em><strong>Fanpage Facebook:</strong>&nbsp;<a href="https://www.facebook.com/tek4.vn/">TEK4.VN</a></em>&nbsp;</p> <p style="text-align: center;"><em><strong>Tham gia cộng đồng để chia sẻ, trao đổi v&agrave; thảo luận:</strong>&nbsp;<a href="https://www.facebook.com/groups/tek4.vn/">TEK4.VN - Học Lập Tr&igrave;nh Miễn Ph&iacute;</a></em></p>