tek4

Cách Dùng Scikit-Learn – Tự Học TensorFlow

by - September. 21, 2021
Kiến thức
<blockquote> <p style="text-align: justify;">Ch&agrave;o mừng c&aacute;c bạn quay trở lại với loạt b&agrave;i&nbsp;<a href="../../tu-hoc-tensorflow-deep-learning-cho-nguoi-moi-bat-dau/" target="_blank" rel="noopener">Tự Học Tensorflow</a>&nbsp;của&nbsp;<a href="../../" target="_blank" rel="noopener">tek4.vn</a>. B&agrave;i viết n&agrave;y sẽ giới thiệu đến c&aacute;c bạn Scikit-learn l&agrave; g&igrave; v&agrave; c&aacute;ch d&ugrave;ng n&oacute;. Bắt đầu th&ocirc;i!</p> </blockquote> <p style="text-align: justify;">Xem th&ecirc;m b&agrave;i viết trước:&nbsp;<a href="../../apache-spark-machine-learning-voi-pyspark-va-mllib/" target="_blank" rel="noopener">Apache Spark &ndash; Machine learning với PySpark v&agrave; MLlib</a></p> <h3 id="ftoc-heading-1" class="ftwp-heading" style="text-align: justify;">Scikit-learn l&agrave; g&igrave;?</h3> <p style="text-align: justify;">Scikit-learn l&agrave; một thư viện Python m&atilde; nguồn mở d&agrave;nh cho học m&aacute;y. Thư viện n&agrave;y hỗ trợ c&aacute;c thuật to&aacute;n hiện đại như KNN, XGBoost, random forest, SVM v&agrave; một số thuật to&aacute;n kh&aacute;c. Scikit-learn được sử dụng rộng r&atilde;i trong c&aacute;c cuộc thi kaggle cũng như trong c&aacute;c c&ocirc;ng ty c&ocirc;ng nghệ nổi tiếng. N&oacute; gi&uacute;p tiền xử l&yacute;, giảm chiều dữ liệu (lựa chọn tham số), ph&acirc;n loại, hồi quy, ph&acirc;n cụm v&agrave; model selection.</p> <p style="text-align: justify;">Scikit-learning c&oacute; t&agrave;i liệu tốt nhất về tất cả c&aacute;c thư viện m&atilde; nguồn mở. N&oacute; cung cấp một biểu đồ tương t&aacute;c&nbsp;<a href="https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html" target="_blank" rel="noopener">tại đ&acirc;y</a></p> <p style="text-align: justify;"><img style="width: 100%;" src="../../../public_files/62da0a83-80af-44c0-b312-f1c554dcedb3" alt="cach-dung-scikit-learn-tu-hoc-tensorflow-2" /></p> <p style="text-align: justify;">Scikit-learn kh&ocirc;ng kh&oacute; sử dụng v&agrave; mang lại hiệu quả tuyệt vời. Tuy nhi&ecirc;n, scikit learning kh&ocirc;ng hỗ trợ t&iacute;nh to&aacute;n song song. C&oacute; thể chạy một thuật to&aacute;n Deep learning với n&oacute; nhưng kh&ocirc;ng phải l&agrave; giải ph&aacute;p tối ưu, đặc biệt nếu bạn biết c&aacute;ch sử dụng TensorFlow.</p> <h3 id="ftoc-heading-2" class="ftwp-heading" style="text-align: justify;">Tải xuống v&agrave; c&agrave;i đặt scikit-learn</h3> <p style="text-align: justify;"><strong>T&ugrave;y chọn 1: AWS</strong></p> <p style="text-align: justify;">Scikit-learn c&oacute; thể được sử dụng qua AWS. Để sử dụng phi&ecirc;n bản d&agrave;nh cho nh&agrave; ph&aacute;t triển, h&atilde;y sử dụng lệnh trong Jupyter</p> <div id="urvanov-syntax-highlighter-610ff0f052057174360475" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>import sys !{sys.executable} -m pip install git+git://github.com/scikit-learn/scikit-learn.git</code></pre> </div> </div> <p style="text-align: justify;"><strong>T&ugrave;y chọn 2: Sử dụng Anaconda</strong></p> <p style="text-align: justify;">C&aacute;c nh&agrave; ph&aacute;t triển của scikit đ&atilde; ph&aacute;t h&agrave;nh một phi&ecirc;n bản development để giải quyết c&aacute;c vấn đề phổ biến gặp phải với phi&ecirc;n bản hiện tại. Ch&uacute;ng ta sẽ thấy thuận tiện hơn khi sử dụng phi&ecirc;n bản d&agrave;nh cho nh&agrave; ph&aacute;t triển thay v&igrave; phi&ecirc;n bản hiện tại.</p> <p style="text-align: justify;">Nếu bạn đ&atilde; c&agrave;i đặt scikit-learn với m&ocirc;i trường conda, vui l&ograve;ng l&agrave;m theo c&aacute;c bước dưới đ&acirc;y để cập nhật l&ecirc;n phi&ecirc;n bản d&agrave;nh cho nh&agrave; ph&aacute;t triển.</p> <p style="text-align: justify;"><strong>Bước 1) K&iacute;ch hoạt m&ocirc;i trường tensorflow</strong></p> <pre class="language-python"><code>source activate hello-tf</code></pre> <p style="text-align: justify;"><strong>Bước 2) Loại bỏ scikit lean bằng lệnh conda</strong></p> <pre class="language-python"><code>conda remove scikit-learn</code></pre> <p style="text-align: justify;"><strong>Bước 3) C&agrave;i đặt phi&ecirc;n bản d&agrave;nh cho nh&agrave; ph&aacute;t triển scikit learn c&ugrave;ng với c&aacute;c thư viện cần thiết.</strong></p> <pre class="language-python"><code>conda install -c anaconda gitpip install Cythonpip install h5pypip install git+git://github.com/scikit-learn/scikit-learn.git</code></pre> <p style="text-align: justify;"><strong>Lưu &yacute;:</strong>&nbsp;Windows được sử dụng sẽ cần c&agrave;i đặt Microsoft Visual C ++ 14. Bạn c&oacute; thể lấy n&oacute;<a href="https://www.techspot.com/downloads/6776-visual-c-redistributable-package.html" target="_blank" rel="noopener">&nbsp;từ đ&acirc;y</a></p> <h3 id="ftoc-heading-3" class="ftwp-heading" style="text-align: justify;">Học m&aacute;y với scikit-learn</h3> <p style="text-align: justify;">B&agrave;i viết n&agrave;y được chia th&agrave;nh hai phần:</p> <ol style="text-align: justify;"> <li>Học m&aacute;y với scikit-learn</li> <li>L&agrave;m thế n&agrave;o để tin tưởng m&ocirc; h&igrave;nh của bạn với LIME</li> </ol> <p style="text-align: justify;">Phần đầu ti&ecirc;n tr&igrave;nh b&agrave;y chi tiết c&aacute;ch x&acirc;y dựng pipeline, tạo m&ocirc; h&igrave;nh v&agrave; điều chỉnh c&aacute;c si&ecirc;u tham số trong khi phần thứ hai cung cấp t&iacute;nh năng tốt nhất về model selection.</p> <h4 id="ftoc-heading-4" class="ftwp-heading" style="text-align: justify;"><strong>Bước 1) Import dữ liệu</strong></h4> <p style="text-align: justify;">Trong b&agrave;i viết n&agrave;y, ch&uacute;ng ta sẽ sử dụng tập dữ liệu adult dataset. Để biết th&ocirc;ng tin cơ bản về tập dữ liệu n&agrave;y, h&atilde;y tham khảo nếu bạn muốn biết th&ecirc;m về thống k&ecirc; m&ocirc; tả (descriptive statistics), vui l&ograve;ng sử dụng c&aacute;c c&ocirc;ng cụ Dive v&agrave; Overview.</p> <p style="text-align: justify;">H&atilde;y import tập dữ liệu với Pandas. Lưu &yacute; rằng bạn cần chuyển đổi kiểu của c&aacute;c biến li&ecirc;n tục ở định dạng float.</p> <p style="text-align: justify;">Tập dữ liệu n&agrave;y bao gồm t&aacute;m biến ph&acirc;n loại:</p> <p style="text-align: justify;">C&aacute;c biến ph&acirc;n loại được liệt k&ecirc; trong CATE_FEATURES</p> <ul style="text-align: justify;"> <li>workclass</li> <li>education</li> <li>marital</li> <li>occupation</li> <li>relationship</li> <li>race</li> <li>sex</li> <li>native_country</li> </ul> <p style="text-align: justify;">V&agrave; s&aacute;u biến li&ecirc;n tục:</p> <p style="text-align: justify;">C&aacute;c biến li&ecirc;n tục được liệt k&ecirc; trong CONTI_FEATURES</p> <ul style="text-align: justify;"> <li>age</li> <li>fnlwgt</li> <li>education_num</li> <li>capital_gain</li> <li>capital_loss</li> <li>hours_week</li> </ul> <p style="text-align: justify;">Lưu &yacute; rằng điền danh s&aacute;ch bằng tay để bạn c&oacute; &yacute; tưởng tốt hơn về những cột ch&uacute;ng ta đang sử dụng. Một c&aacute;ch nhanh hơn để tạo danh s&aacute;ch ph&acirc;n loại hoặc li&ecirc;n tục l&agrave; sử dụng:</p> <div id="urvanov-syntax-highlighter-610ff0f052073851632186" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>## List Categorical CATE_FEATURES = df_train.iloc[:,:-1].select_dtypes('object').columns print(CATE_FEATURES) ## List continuous CONTI_FEATURES = df_train._get_numeric_data() print(CONTI_FEATURES)</code></pre> </div> <div class="urvanov-syntax-highlighter-main">Đ&acirc;y l&agrave; code để import dữ liệu:</div> </div> <div id="urvanov-syntax-highlighter-610ff0f052077517646777" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code># Import dataset import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] ### Define continuous list CONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week'] ### Define categorical list CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country'] ## Prepare the data features = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train[CONTI_FEATURES] =df_train[CONTI_FEATURES].astype('float64') df_train.describe()</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <table style="border-collapse: collapse; width: 100%;" border="1"> <tbody> <tr> <td style="width: 12.7971%;">&nbsp;</td> <td style="width: 6.62393%;"><strong>age</strong></td> <td style="width: 10.2564%;"><strong>fnlwgt</strong></td> <td style="width: 20.9402%;"><strong>education_num</strong></td> <td style="width: 16.7735%;"><strong>capital_gain</strong></td> <td style="width: 16.0256%;"><strong>capital_loss</strong></td> <td style="width: 16.5598%;"><strong>hours_week</strong></td> </tr> <tr> <td style="width: 12.7971%;"><strong>count</strong></td> <td style="width: 6.62393%;">32561.000000</td> <td style="width: 10.2564%;">3.256100e+04</td> <td style="width: 20.9402%;">32561.000000</td> <td style="width: 16.7735%;">32561.000000</td> <td style="width: 16.0256%;">32561.000000</td> <td style="width: 16.5598%;">32561.000000</td> </tr> <tr> <td style="width: 12.7971%;"><strong>mean</strong></td> <td style="width: 6.62393%;">38.581647</td> <td style="width: 10.2564%;">1.897784e+05</td> <td style="width: 20.9402%;">10.080679</td> <td style="width: 16.7735%;">1077.648844</td> <td style="width: 16.0256%;">87.303830</td> <td style="width: 16.5598%;">40.437456</td> </tr> <tr> <td style="width: 12.7971%;"><strong>std</strong></td> <td style="width: 6.62393%;">13.640433</td> <td style="width: 10.2564%;">1.055500e+05</td> <td style="width: 20.9402%;">2.572720</td> <td style="width: 16.7735%;">7385.292085</td> <td style="width: 16.0256%;">402.960219</td> <td style="width: 16.5598%;">12.347429</td> </tr> <tr> <td style="width: 12.7971%;"><strong>min</strong></td> <td style="width: 6.62393%;">17.000000</td> <td style="width: 10.2564%;">1.228500e+04</td> <td style="width: 20.9402%;">1.000000</td> <td style="width: 16.7735%;">0.000000</td> <td style="width: 16.0256%;">0.000000</td> <td style="width: 16.5598%;">1.000000</td> </tr> <tr> <td style="width: 12.7971%;"><strong>25%</strong></td> <td style="width: 6.62393%;">28.000000</td> <td style="width: 10.2564%;">1.178270e+05</td> <td style="width: 20.9402%;">9.000000</td> <td style="width: 16.7735%;">0.000000</td> <td style="width: 16.0256%;">0.000000</td> <td style="width: 16.5598%;">40.000000</td> </tr> <tr> <td style="width: 12.7971%;"><strong>50%</strong></td> <td style="width: 6.62393%;">37.000000</td> <td style="width: 10.2564%;">1.783560e+05</td> <td style="width: 20.9402%;">10.000000</td> <td style="width: 16.7735%;">0.000000</td> <td style="width: 16.0256%;">0.000000</td> <td style="width: 16.5598%;">40.000000</td> </tr> <tr> <td style="width: 12.7971%;"><strong>75%</strong></td> <td style="width: 6.62393%;">48.000000</td> <td style="width: 10.2564%;">2.370510e+05</td> <td style="width: 20.9402%;">12.000000</td> <td style="width: 16.7735%;">0.000000</td> <td style="width: 16.0256%;">0.000000</td> <td style="width: 16.5598%;">45.000000</td> </tr> <tr> <td style="width: 12.7971%;"><strong>max</strong></td> <td style="width: 6.62393%;">90.000000</td> <td style="width: 10.2564%;">1.484705e+06</td> <td style="width: 20.9402%;">16.000000</td> <td style="width: 16.7735%;">99999.000000</td> <td style="width: 16.0256%;">4356.000000</td> <td style="width: 16.5598%;">99.000000</td> </tr> </tbody> </table> </div> <div class="urvanov-syntax-highlighter-main">Bạn c&oacute; thể kiểm tra số lượng gi&aacute; trị unique của c&aacute;c đặc trưng native_country, thấy rằng chỉ c&oacute; một hộ gia đ&igrave;nh đến từ Holand-Netherlands. Hộ gia đ&igrave;nh n&agrave;y sẽ kh&ocirc;ng cung cấp cho ch&uacute;ng ta bất kỳ th&ocirc;ng tin n&agrave;o, nhưng sẽ th&ocirc;ng qua một lỗi trong qu&aacute; tr&igrave;nh đ&agrave;o tạo.</div> </div> <div id="urvanov-syntax-highlighter-610ff0f05207e808822062" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>df_train.native_country.value_counts()</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>United-States 29170 Mexico 643 ? 583 Philippines 198 Germany 137 Canada 121 Puerto-Rico 114 El-Salvador 106 India 100 Cuba 95 England 90 Jamaica 81 South 80 China 75 Italy 73 Dominican-Republic 70 Vietnam 67 Guatemala 64 Japan 62 Poland 60 Columbia 59 Taiwan 51 Haiti 44 Iran 43 Portugal 37 Nicaragua 34 Peru 31 France 29 Greece 29 Ecuador 28 Ireland 24 Hong 20 Cambodia 19 Trinadad&amp;amp;Tobago 19 Thailand 18 Laos 18 Yugoslavia 16 Outlying-US(Guam-USVI-etc) 14 Honduras 13 Hungary 13 Scotland 12 Holand-Netherlands 1 Name: native_country, dtype: int64</code></pre> </div> </div> <div id="urvanov-syntax-highlighter-610ff0f052082490494916" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main">Bạn c&oacute; thể loại trừ h&agrave;ng kh&ocirc;ng c&oacute; th&ocirc;ng tin n&agrave;y khỏi tập dữ liệu</div> </div> <div id="urvanov-syntax-highlighter-610ff0f052087177321095" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap">&nbsp;</div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-python"><code>## Drop Netherland, because only one row df_train = df_train[df_train.native_country != "Holand-Netherlands"]</code></pre> </div> </div> <p style="text-align: justify;">Tiếp theo, h&atilde;y lưu trữ vị tr&iacute; của c&aacute;c đặc trưng li&ecirc;n tục trong một danh s&aacute;ch. Bạn sẽ cần n&oacute; trong bước tiếp theo để x&acirc;y dựng pipeline.</p> <p style="text-align: justify;">Đoạn code dưới đ&acirc;y sẽ lặp qua tất cả c&aacute;c t&ecirc;n cột trong&nbsp;CONTI_FEATURES&nbsp;v&agrave; lấy vị tr&iacute; của n&oacute; (tức l&agrave; số của n&oacute;) rồi nối n&oacute; v&agrave;o một danh s&aacute;ch c&oacute; t&ecirc;n l&agrave;&nbsp;conti_features.</p> <div id="urvanov-syntax-highlighter-610ff0f05208a004209627" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>## Get the column index of the categorical features conti_features = [] for i in CONTI_FEATURES: position = df_train.columns.get_loc(i) conti_features.append(position) print(conti_features)</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>[0, 2, 10, 4, 11, 12]</code></pre> </div> </div> <div id="urvanov-syntax-highlighter-610ff0f05208e522056456" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main">Đoạn code dưới đ&acirc;y thực hiện c&ocirc;ng việc tương tự như tr&ecirc;n nhưng đối với biến ph&acirc;n loại.</div> </div> <div id="urvanov-syntax-highlighter-610ff0f052092514995932" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>## Get the column index of the categorical features categorical_features = [] for i in CATE_FEATURES: position = df_train.columns.get_loc(i) categorical_features.append(position) print(categorical_features)</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>[1, 3, 5, 6, 7, 8, 9, 13]</code></pre> </div> </div> <div id="urvanov-syntax-highlighter-610ff0f052095887569478" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main">Bạn c&oacute; thể xem tập dữ liệu. Lưu &yacute; rằng, mỗi đặc trưng ph&acirc;n loại l&agrave; một chuỗi. Bạn kh&ocirc;ng thể cung cấp một m&ocirc; h&igrave;nh c&oacute; gi&aacute; trị chuỗi, v&igrave; thế cần chuyển đổi tập dữ liệu bằng c&aacute;ch sử dụng một biến giả (dummy variable).</div> </div> <div id="urvanov-syntax-highlighter-610ff0f052099243585986" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>df_train.head(5)</code></pre> </div> <div class="urvanov-syntax-highlighter-main">Tr&ecirc;n thực tế, bạn cần tạo một cột cho mỗi nh&oacute;m đặc trưng. Đầu ti&ecirc;n, bạn c&oacute; thể chạy đoạn code dưới đ&acirc;y để t&iacute;nh tổng số cột cần thiết.</div> </div> <div id="urvanov-syntax-highlighter-610ff0f05209c501964666" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>print(df_train[CATE_FEATURES].nunique(), 'There are',sum(df_train[CATE_FEATURES].nunique()), 'groups in the whole dataset')</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>workclass 9 education 16 marital 7 occupation 15 relationship 6 race 5 sex 2 native_country 41 dtype: int64 There are 101 groups in the whole dataset</code></pre> </div> </div> <div id="urvanov-syntax-highlighter-610ff0f05209f476125963" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main">To&agrave;n bộ tập dữ liệu chứa 101 nh&oacute;m như tr&ecirc;n. V&iacute; dụ, c&aacute;c đặc trưng của &nbsp;workclass c&oacute; ch&iacute;n nh&oacute;m. Bạn c&oacute; thể h&igrave;nh dung t&ecirc;n của c&aacute;c nh&oacute;m bằng c&aacute;c code sau.</div> </div> <p style="text-align: justify;">Unique()&nbsp;trả về c&aacute;c gi&aacute; trị duy nhất của c&aacute;c đối tượng ph&acirc;n loại.</p> <div id="urvanov-syntax-highlighter-610ff0f0520a3778483421" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>for i in CATE_FEATURES: print(df_train[i].unique())</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>['State-gov' 'Self-emp-not-inc' 'Private' 'Federal-gov' 'Local-gov' '?' 'Self-emp-inc' 'Without-pay' 'Never-worked'] ['Bachelors' 'HS-grad' '11th' 'Masters' '9th' 'Some-college' 'Assoc-acdm' 'Assoc-voc' '7th-8th' 'Doctorate' 'Prof-school' '5th-6th' '10th' '1st-4th' 'Preschool' '12th'] ['Never-married' 'Married-civ-spouse' 'Divorced' 'Married-spouse-absent' 'Separated' 'Married-AF-spouse' 'Widowed'] ['Adm-clerical' 'Exec-managerial' 'Handlers-cleaners' 'Prof-specialty' 'Other-service' 'Sales' 'Craft-repair' 'Transport-moving' 'Farming-fishing' 'Machine-op-inspct' 'Tech-support' '?' 'Protective-serv' 'Armed-Forces' 'Priv-house-serv'] ['Not-in-family' 'Husband' 'Wife' 'Own-child' 'Unmarried' 'Other-relative'] ['White' 'Black' 'Asian-Pac-Islander' 'Amer-Indian-Eskimo' 'Other'] ['Male' 'Female'] ['United-States' 'Cuba' 'Jamaica' 'India' '?' 'Mexico' 'South' 'Puerto-Rico' 'Honduras' 'England' 'Canada' 'Germany' 'Iran' 'Philippines' 'Italy' 'Poland' 'Columbia' 'Cambodia' 'Thailand' 'Ecuador' 'Laos' 'Taiwan' 'Haiti' 'Portugal' 'Dominican-Republic' 'El-Salvador' 'France' 'Guatemala' 'China' 'Japan' 'Yugoslavia' 'Peru' 'Outlying-US(Guam-USVI-etc)' 'Scotland' 'Trinadad&amp;amp;Tobago' 'Greece' 'Nicaragua' 'Vietnam' 'Hong' 'Ireland' 'Hungary']</code></pre> </div> </div> <div id="urvanov-syntax-highlighter-610ff0f0520a6616899961" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main">Do đ&oacute;, tập dữ liệu huấn luyện sẽ chứa 101 + 7 cột. Bảy cột cuối c&ugrave;ng l&agrave; c&aacute;c đặc trưng li&ecirc;n tục. Scikit-learn c&oacute; thể đảm nhận việc chuyển đổi. N&oacute; được thực hiện theo hai bước:</div> </div> <ul style="text-align: justify;"> <li>Đầu ti&ecirc;n, bạn cần chuyển chuỗi th&agrave;nh ID. V&iacute; dụ: State-gov sẽ c&oacute; ID 1, Self-emp-not-inc ID 2, v.v. H&agrave;m LabelEncoder thực hiện việc n&agrave;y cho bạn.</li> <li>Chuyển từng ID th&agrave;nh một cột mới. Như đ&atilde; đề cập trước đ&acirc;y, tập dữ liệu c&oacute; 101 nh&oacute;m ID. Do đ&oacute;, sẽ c&oacute; 101 cột thu thập tất cả c&aacute;c nh&oacute;m của đặc trưng ph&acirc;n loại. Scikit-learn c&oacute; một h&agrave;m gọi l&agrave;&nbsp;OneHotEncoder&nbsp;thực hiện thao t&aacute;c n&agrave;y.</li> </ul> <h4 id="ftoc-heading-5" class="ftwp-heading" style="text-align: justify;">Bước 2) Tạo train/test set</h4> <p style="text-align: justify;">B&acirc;y giờ tập dữ liệu đ&atilde; sẵn s&agrave;ng, ch&uacute;ng ta c&oacute; thể chia n&oacute; th&agrave;nh 80/20. 80 phần trăm cho tập huấn luyện v&agrave; 20 phần trăm cho tập kiểm tra.</p> <p style="text-align: justify;">Bạn c&oacute; thể sử dụng train_test_split. Đối số đầu ti&ecirc;n l&agrave; khung dữ liệu chứa c&aacute;c đặc trưng v&agrave; đối số thứ hai l&agrave; khung dữ liệu chứa c&aacute;c nh&atilde;n tương ứng. Chỉ định k&iacute;ch thước của bộ thử nghiệm bằng test_size.</p> <div id="urvanov-syntax-highlighter-610ff0f0520ac156704245" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(df_train[features], df_train.label, test_size = 0.2, random_state=0) X_train.head(5) print(X_train.shape, X_test.shape)</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>(26048, 14) (6512, 14)</code></pre> </div> </div> <h4 id="ftoc-heading-6" class="ftwp-heading" style="text-align: justify;">Bước 3) X&acirc;y dựng pipeline</h4> <p style="text-align: justify;">Pipeline gi&uacute;p cho việc cung cấp m&ocirc; h&igrave;nh nhất qu&aacute;n với dữ liệu. &Yacute; tưởng đằng sau l&agrave; đưa dữ liệu th&ocirc; v&agrave;o một &lsquo;pipeline&rsquo; để thực hiện c&aacute;c operations. V&iacute; dụ: với tập dữ liệu hiện tại, bạn cần chuẩn h&oacute;a c&aacute;c biến li&ecirc;n tục v&agrave; chuyển đổi dữ liệu ph&acirc;n loại. Lưu &yacute; rằng bạn c&oacute; thể thực hiện bất kỳ operation n&agrave;o b&ecirc;n trong pipeline. V&iacute; dụ: nếu bạn c&oacute; &lsquo;NA&rsquo;s&rsquo; trong tập dữ liệu, bạn c&oacute; thể thay thế ch&uacute;ng bằng gi&aacute; trị trung b&igrave;nh hoặc trung vị. Bạn cũng c&oacute; thể tạo c&aacute;c biến mới.</p> <div id="urvanov-syntax-highlighter-610ff0f0520b4670882306" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelEncoder from sklearn.compose import ColumnTransformer, make_column_transformer from sklearn.pipeline import make_pipeline from sklearn.linear_model import LogisticRegression</code></pre> </div> <div class="urvanov-syntax-highlighter-main">Pipeline sẽ thực hiện hai hoạt động trước khi cung cấp logistic classifier:</div> </div> <ol style="text-align: justify;"> <li>Chuẩn h&oacute;a biến: `StandardScaler () &rdquo;</li> <li>Chuyển đổi c&aacute;cđặc trưng ph&acirc;n loại: OneHotEncoder (sparse=False)</li> </ol> <p style="text-align: justify;">Bạn c&oacute; thể thực hiện hai bước bằng c&aacute;ch sử dụng make_column_transformer. H&agrave;m n&agrave;y kh&ocirc;ng khả dụng trong phi&ecirc;n bản hiện tại của scikit-learning (0.19). Phi&ecirc;n bản hiện tại kh&ocirc;ng thể thực hiện &nbsp;label encoder v&agrave; one hot encoder trong pipeline. Đ&oacute; l&agrave; một l&yacute; do khiến ch&uacute;ng ta sẽ quyết định sử dụng phi&ecirc;n bản d&agrave;nh cho nh&agrave; ph&aacute;t triển.</p> <p style="text-align: justify;">Make_column_transformer rất dễ sử dụng. Bạn cần x&aacute;c định những cột n&agrave;o để &aacute;p dụng ph&eacute;p biến đổi v&agrave; hoạt động của ph&eacute;p biến đổi n&agrave;o. V&iacute; dụ: để chuẩn h&oacute;a đặc trưng li&ecirc;n tục, bạn c&oacute; thể l&agrave;m:</p> <ul style="text-align: justify;"> <li>Conti_features, StandardScaler () b&ecirc;n trong make_column_transformer. <ul> <li>Conti_features: danh s&aacute;ch với biến li&ecirc;n tục</li> <li>StandardScaler: chuẩn h&oacute;a biến</li> </ul> </li> </ul> <p style="text-align: justify;">Đối tượng OneHotEncoder b&ecirc;n trong make_column_transformer tự động m&atilde; h&oacute;a nh&atilde;n.</p> <div id="urvanov-syntax-highlighter-610ff0f0520b9978448385" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>preprocess = make_column_transformer( (conti_features, StandardScaler()), ### Need to be numeric not string to specify columns name (categorical_features, OneHotEncoder(sparse=False)) )</code></pre> </div> <div class="urvanov-syntax-highlighter-main">Bạn c&oacute; thể kiểm tra xem pipeline c&oacute; hoạt động với fit_transform hay kh&ocirc;ng. Tập dữ liệu phải c&oacute; shape như sau: 26048, 107</div> </div> <div id="urvanov-syntax-highlighter-610ff0f0520bd201331525" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>preprocess.fit_transform(X_train).shape</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>(26048, 107)</code></pre> </div> </div> <p style="text-align: justify;">Data transformer đ&atilde; sẵn s&agrave;ng để sử dụng. Bạn c&oacute; thể tạo pipeline với make_pipeline. Khi dữ liệu được chuyển đổi, bạn c&oacute; thể cung cấp hồi quy logistic.</p> <div id="urvanov-syntax-highlighter-610ff0f0520c3721065722" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>model = make_pipeline( preprocess, LogisticRegression())</code></pre> </div> <div class="urvanov-syntax-highlighter-main">Việc đ&agrave;o tạo một m&ocirc; h&igrave;nh với scikit-learning l&agrave; điều b&igrave;nh thường.</div> </div> <div id="urvanov-syntax-highlighter-610ff0f0520c6096332708" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>model.fit(X_train, y_train) print("logistic regression score: %f" % model.score(X_test, y_test))</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>logistic regression score: 0.850891</code></pre> </div> </div> <div id="urvanov-syntax-highlighter-610ff0f0520ca279911670" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-main">Cuối c&ugrave;ng, bạn c&oacute; thể dự đo&aacute;n c&aacute;c lớp với Pred_proba. N&oacute; trả về x&aacute;c suất cho mỗi lớp.</div> </div> <div id="urvanov-syntax-highlighter-610ff0f0520cd757666945" class="urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate" style="text-align: justify;" data-settings=" minimize scroll-mouseover"> <div class="urvanov-syntax-highlighter-plain-wrap"> <pre class="language-python"><code>model.predict_proba(X_test)</code></pre> </div> <div class="urvanov-syntax-highlighter-main"> <pre class="language-markup"><code>array([[0.83576663, 0.16423337], [0.94582765, 0.05417235], [0.64760587, 0.35239413], ..., [0.99639252, 0.00360748], [0.02072181, 0.97927819], [0.56781353, 0.43218647]])</code></pre> </div> </div> <h4 id="ftoc-heading-7" class="ftwp-heading" style="text-align: justify;">Bước 4) Sử dụng pipeline</h4> <p style="text-align: justify;">Một c&aacute;ch để đ&aacute;nh gi&aacute; m&ocirc; h&igrave;nh c&oacute; thể l&agrave; thay đổi k&iacute;ch thước của tập huấn luyện v&agrave; đ&aacute;nh gi&aacute; c&aacute;c hoạt động. Bạn c&oacute; thể lặp lại phương ph&aacute;p n&agrave;y mười lần để xem c&aacute;c chỉ số về điểm số. Tuy nhi&ecirc;n, n&oacute; phải thực hiện qu&aacute; nhiều c&ocirc;ng việc.</p> <p style="text-align: justify;">Thay v&agrave;o đ&oacute;, scikit-learning cung cấp một h&agrave;m để thực hiện điều chỉnh tham số v&agrave; x&aacute;c nhận ch&eacute;o.</p> <p style="text-align: justify;"><strong>Cross-validation &ndash; X&aacute;c thực ch&eacute;o</strong></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>