avatarPCP

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

7519

Abstract

<p id="776d">และเมื่อทำการใส่ค่าพารามิเตอร์จนเป็นที่น่าพอใจแล้ว ก็ให้ทำการรัน Code ซึ่งจะได้ผลสรุปของการตั้งค่าออกมาอย่างที่เห็นในรูปด้านล่าง</p><figure id="f44e"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*rTWoGekEG3rN6VgNghRHHw.gif"><figcaption>รูปที่ 3 รูปแสดงผลลัพธ์ของการ Setup ข้อมูล</figcaption></figure><p id="df68">ถ้าลองแอบมองตารางสรุปผลซักนิดก็จะเห็นว่า ค่าที่สามารถปรับได้นั้นมีเยอะมาก ๆ ซึ่งสามารถดูเพิ่มเติมได้ที่</p><div id="5168" class="link-block"> <a href="https://pycaret.org/preprocessing/"> <div> <div> <h2>Preprocessing - PyCaret</h2> <div><h3>PyCaret is a deployment ready Python library which means that as you perform an experiment, all steps are automatically…</h3></div> <div><p>pycaret.org</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/)"></div> </div> </div> </a> </div><h2 id="3874">Model Selection</h2><p id="05c9">หลังจากที่ทำการเตรียมข้อมูลและแบ่งชุด Train และ Test ด้วยการใช้ฟังก์ชัน Setup เรียบร้อยแล้ว ลำดับต่อไปก็ถึงเวลาที่จะ<b>สร้างโมเดล</b>ขึ้นมาซักที</p><p id="e3e0">อย่างที่เรารู้กันว่า <b>ไม่มีโมเดลไหนหรอกที่มันดีที่สุดในโลก</b>ตามทฤษฎี <b>No Free Lunch </b>มีแต่โมเดลที่เหมาะสมที่สุดในการนำไปใช้กับชุดข้อมูลนั้น ๆ ต่างหาก หากสนใจสามารถอ่านได้ที่บทความด้านล่างนี้</p><div id="c484" class="link-block"> <a href="https://medium.com/c-g-datacommunity/%E0%B8%82%E0%B8%AD%E0%B8%87%E0%B8%9F%E0%B8%A3%E0%B8%B5%E0%B9%84%E0%B8%A1%E0%B9%88%E0%B8%A1%E0%B8%B5%E0%B9%83%E0%B8%99%E0%B9%82%E0%B8%A5%E0%B8%81-%E0%B8%AA%E0%B8%B4%E0%B9%88%E0%B8%87%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%A1%E0%B8%B7%E0%B8%AD%E0%B9%83%E0%B8%AB%E0%B8%A1%E0%B9%88%E0%B8%AB%E0%B8%B1%E0%B8%94%E0%B9%83%E0%B8%8A%E0%B9%89-machine-learning-%E0%B8%84%E0%B8%A7%E0%B8%A3%E0%B8%A3%E0%B8%B9%E0%B9%89-539673bc474a"> <div> <div> <h2>ของฟรีไม่มีในโลก..! สิ่งที่มือใหม่หัดใช้ Machine Learning ควรรู้</h2> <div><h3>ว่าด้วยทฤษฎี No Free Lunch กับการใช้งาน Machine Learning ที่ต้องพึงระลึกไว้</h3></div> <div><p>medium.com</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/1*BSEaO6I0f1-jyLmfaFFarA.jpeg)"></div> </div> </div> </a> </div><p id="72ce">ในเมื่อยัง<b>ไม่แน่ใจ</b>ว่าควรใช้โมเดลไหนกับชุดข้อมูลที่เราเจออยู่ในขณะนี้ เจ้า Pycaret มันก็รู้ดี เลยมีฟังก์ชันเข้ามาช่วยโดยการ<b>ลิสต์โมเดลทั้งหมด</b>มาแล้ว<b>เปรียบเทียบ</b>ผลลัพธ์กันให้เห็นจะ ๆ เพียงแค่ใช้คำสั่ง <b><i>compare_models</i></b></p><div id="e205"><pre>top5_model = compare_models(<span class="hljs-built_in">sort</span> = <span class="hljs-string">'Accuracy'</span>, <span class="hljs-built_in">fold</span> = 5, n_select = 5)</pre></div><p id="9b9d">โดยคำสั่งนี้ จะนำโมเดลทั้งหมดมาลอง Train ด้วยชุดข้อมูลที่ Setup เอาไว้ก่อนหน้านี้ และมีการทำ K-Fold เพื่อวัดประสิทธิภาพของโมเดลให้โดยอัตโนมัติ พร้อมทั้งเรียงโมเดลให้ตามค่า Metrics ที่เราต้องการใช้งานอีกด้วย</p><p id="7367">และสุดท้าย หากมีการกำหนดพารามิเตอร์ <b><i>n_select</i></b> <b><i>= 5 </i></b>เข้าไป ฟังก์ชันนี้ก็จะให้โมเดลที่ดีที่สุดตามค่า Metrics นั้น ๆ ออกมา 5 โมเดล ซึ่งหากต้องการเรียกใช้โมเดลที่ดีที่สุดเพียงโมเดลเดียว ก็สามารถเรียกใช้ได้เลยโดยการระบุตำแหน่ง</p><div id="1836"><pre><span class="hljs-attribute">top5_model</span>[<span class="hljs-number">0</span>]</pre></div><p id="10b6">เมื่อทุกโมเดลถูกนำไปประเมินผลลัพธ์แล้ว ก็จะได้ตารางด้านล่างมาให้เชยชม</p><figure id="0699"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*wGKrXBTAayIHUiAP_q4kfQ.png"><figcaption>รูปที่ 4 รูปแสดงผลการเปรียบเทียบผลลัพธ์ของแต่ละโมเดล</figcaption></figure><p id="8c54"><b>ข้อควรระวัง</b>สำหรับการเลือกโมเดลจากตารางเปรียบเทียบคือ <b>ลำดับของโมเดล</b>อาจมีการ<b>เปลี่ยนแปลง</b>ได้เล็กน้อย ซึ่งมาได้จากหลายสาเหตุ ตั้งแต่การ Random เลือกชุดข้อมูลไปแบ่ง Fold ที่ไม่เหมือนกัน ไปจนถึงไฮเปอร์พารามิเตอร์ที่ถูกเลือกมาตอน Initialize โมเดลที่ต่างกันในแต่ละครั้ง จึงขอแนะนำให้<b>เลือกโมเดลมา 3–5 อันดับแรก</b> เพื่อนำไปทำการ Tuning ต่อไป ซึ่งหลังจาก Tuning เสร็จ ก็จะทำให้ลำดับของโมเดลมีการเปลี่ยนแปลงไปอีก</p><p id="dfb1">แต่ก็ใช่ว่าการนำโมเดลทั้งหมดมาเปรียบเทียบแบบนี้จะดีเสมอไป เพราะมันกินเวลามาก ยิ่งข้อมูลเยอะ ก็ยิ่งนานเข้าไปอีก…</p><figure id="61d7"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*2O4Qyy0YwYEC9PvFf7o1dg.png"><figcaption></figcaption></figure><p id="d1fd">และทางออกของความเจ็บปวดในการรอครั้งนี้ ก็มีทางแก้อยู่ใน Pycaret เช่นกัน เพราะฟังก์ชันที่ใช้ในการเปรียบเทียบโมเดลนี้ สามารถ<b>เลือก</b>โมเดลที่ต้องการนำมาเปรียบเทียบได้ ด้วยการใส่<b>ชื่อย่อ</b>ของโมเดลเข้าไปในพารามิเตอร์ที่ชื่อว่า <b><i>whitelist</i></b></p><div id="6c40"><pre><span class="hljs-attr">best_specific</span> = compare_models(whitelist = [‘dt’,’rf’,’xgboost’])</pre></div><p id="29a2">หรือจะเลือก<b>แบน</b>โมเดลไม่ให้ Pycaret เอามาเปรียบเทียบได้ด้วยการใช้พารามิเตอร์ที่ชื่อว่า <b><i>blacklist</i></b> (แหม่… ชื่อพารามิเตอร์แอบเหยียดผิวเบา ๆ)</p><div id="7cad"><pre><span class="hljs-attr">best_specific</span> = compare_models(blacklist = [‘catboost’,’svm’])</pre></div><p id="c9a9">แต่ถ้าใคร<b>มั่นใจ</b>แล้วว่าอยากได้โมเดลไหน <b>ไม่อยากได้การเปรียบเทียบ</b>ใด ๆ ก็สามารถเลือกสร้างโมเดลแบบระบุชื่อได้เลย ด้วยการใช้ฟังก์ชัน <b><i>create_model</i></b></p><div id="317c"><pre><span class="hljs-attr">model</span> = create_model(‘lightgbm’, fold = <span class="hljs-number">5</span>)</pre></div><p id="79ff">และผลลัพธ์ของขั้นตอนนี้ คือ<b>โมเดล</b>ที่เหมาะสมกับการนำไปใช้งานต่อไป</p><p id="274b">แอบบอกอีกนิด ทีเด็ดอีกอย่างหนึ่งของ Pycaret คือเราสามารถแสดงผลลัพธ์ของโมเดลนั้น ๆ ด้วยฟังก์ชันอย่าง <b><i>plot_model</i></b> ได้อีก ซึ่งก็ทำให้เราเข้าใจโมเดลของเรามากขึ้นไม่มากก็น้อย หรือจะลองใช้ฟังก์ชันนี้ใน<b>โมเดลก่อนที่จะทำการ Tuning</b> กับ<b>หลังทำการ Tuning</b> ดูก็เป็นความคิดที่ดีนะ</p><div id="e2da"><pre><span class="hljs-built_in">plot_model</span>(tuned_model, plot = 'confusion_matrix') # <span class="hljs-attribute">Left</span> Hand Side</pre></div><div id="78cb"><pre><span class="hljs-built_in">plot_model</span>(tuned_model, plot = 'feature') # <span class="hljs-attribute">Right</span> Hand Side</pre></div><figure id="fa00"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*Y1rlNsszR3oLbZN5QZP07w.png"><figcaption></figcaption></figure><figure id="a0c5"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*hD2HMvY1zhmFCD6VWj_mFw.png"><figcaption>รูปที่ 5 รูปแสดง Confusion Matrix (ซ้ายมือ) และ รูปที่ 6 รูปแสดง Feature Importance (ขวามือ)</figcaption></figure><div id="d7f4"><pre><span class="hljs-built_in">plot_model</span>(tuned_model, plot = 'auc') # <span class="hljs-attribute">Left</span> Hand Side</pre></div><div id="3925"><pre><span class="hljs-built_in">plot_model</span>(tuned_model, plot = 'pr') # <span class="hljs-attribute">Right</span> Hand Side</pre></div><figure id="1cf7"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*XXxj2sWok_IrQeMvX1HT3w.png"><figcaption></figcaption></figure><figure id="961e"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*1XKCBb5ZtKKR7zNWEdlQeA.png"><figcaption>รูปที่ 7 รูปแสดง ROC Curve (ซ้ายมือ) และ รูปที่ 8 รูปแสดง PR Curve (ขวามือ)</figcaption></figure><p id="af9e">แต่บางโมเดลในขณะนี้ก็ไม่สามารถนำมา plot ได้ด้วยฟังก์ชันนี้ได้ด้วยเหตุผลบางประการ จึงอาจต้องนำผลลัพธ์มา plot ด้วยตนเองหากต้องการรูปในแ # Options บบเดียวกัน</p><h2 id="5aec">Tune Model</h2><p id="f4b3">ขั้นตอนต่อไปหลังจากที่ได้โมเดลแล้ว ก็คือการนำโมเดลมา<b>ปรับค่าไฮเปอร์พารามิเตอร์</b>เพื่อให้ได้ผลลัพธ์ที่ดียิ่งขึ้น ซึ่งใน Pycaret ก็อำนวยความสะดวกให้โดยการใช้ฟังก์ชัน <b><i>tune_model</i></b></p><div id="87f3"><pre><span class="hljs-attribute">tuned_model</span> = tune_model(top5_model[<span class="hljs-number">2</span>], optimize = 'Accuracy', n_iter = <span class="hljs-number">30</span>, fold = <span class="hljs-number">5</span>)</pre></div><p id="277e">ฟังก์ชันนี้จะทำการ Random ค่าไฮเปอร์พารามิเตอร์เพื่อหาค่าที่ดีที่สุดและประเมินผลด้วยการใช้ K-Fold เหมือนอย่างเคย โดยที่ n_iter คือ<b>จำนวนครั้งในการสุ่ม</b>ค่าไฮเปอร์พารามิเตอร์ ยิ่งมีค่าเยอะก็ยิ่งดี แต่ก็ยิ่งใช้เวลานานขึ้นเช่นกัน</p><p id="b81e">และผลลัพธ์ที่ได้จากขั้นตอนนี้ คือโมเดลที่มีค่าไฮเปอร์พารามิเตอร์ที่เหมาะสม ที่ให้ค่า Metrics ที่กำหนดในพารามิเตอร์ <b><i>optimize</i></b> ได้ดีที่สุด ซึ่งในที่นี้กำหนดให้ Metrics เป็นค่า Accuracy นั่นเอง</p><p id="2aba">นอกจากค่า Accuracy แล้ว เจ้า Pycaret ยังมีทางเลือกในการประเมินผลโมเดลโดยใช้ค่าอื่น ๆ อีกเช่นกัน ดังนี้</p><ul><li><b>โมเดลประเภท Classification: </b>Accuracy, AUC, Recall, Precision, F1, Kappa, MCC</li><li><b>โมเดลประเภท Regression: </b>MAE, MSE, RMSE, R2, RMSLE, MAPE</li></ul><p id="ef97">ส่วนใครที่ไม่ชอบวิธีการปรับค่าไฮเปอร์พารามิเตอร์ด้วยการสุ่ม เจ้า Pycaret ก็มีทางเลือกให้อีก โดยการให้เรา<b>กำหนด</b>ค่าไฮเปอร์พารามิเตอร์ที่ต้องการเหมือนกับ Grid Search ยังไงยังงั้น</p><div id="4c3d"><pre>params = {<span class="hljs-string">'max_depth'</span>: np.<span class="hljs-built_in">random</span>.randint(<span class="hljs-number">1</span>, (<span class="hljs-built_in">len</span>(data.columns)*<span class="hljs-number">.85</span>),<span class="hljs-number">20</span>), <span class="hljs-string">'max_features'</span>: np.<span class="hljs-built_in">random</span>.randint(<span class="hljs-number">1</span>, <span class="hljs-built_in">len</span>(data.columns),<span class="hljs-number">20</span>), <span class="hljs-string">'min_samples_leaf'</span>: [<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>,<span class="hljs-number">6</span>], <span class="hljs-string">'criterion'</span>: [<span class="hljs-string">'gini'</span>, <span class="hljs-string">'entropy'</span>] } </pre></div><div id="7e80"><pre><span class="hljs-attr">tuned_dt_custom</span> = tune_model(dt, custom_grid = params)</pre></div><h2 id="65fb">Finalize</h2><p id="dd7f">เมื่อปรับค่าไฮเปอร์พารามิเตอร์ให้เหมาะสมเป็นที่เรียบร้อยแล้ว หลายครั้งหลายครา โมเดลก็จะถูก<b>นำไปใช้งาน</b>เลย ซึ่งก็ไม่ผิดอะไร</p><p id="1ec5">แต่สำหรับ Pycaret นั้น จะมีฟังก์ชันในการนำชุดข้อมูลทั้ง Train และ Test มารวมกันอีกครั้ง แล้วนำ<b>โมเดล</b>จาก<b>ขั้นตอนก่อนหน้า</b>มาทำการ<b>สร้างใหม่ด้วยข้อมูลทั้งหมด</b>ก่อนที่จะนำไปใช้จริง ด้วยการใช้ฟังก์ชัน <b><i>finalize_model</i></b></p><div id="4e85"><pre><span class="hljs-attr">final_model</span> = finalize_model(tuned_model)</pre></div><p id="bd10">และเมื่อได้โมเดลสุดท้ายมาแล้ว เราก็<b>พร้อม</b>ที่จะนำไปใช้ทำนายผลลัพธ์<b>ในงานจริง</b></p><p id="8e90">แต่เดี๋ยวก่อน… เจ้า Pycaret ยังมีฟังก์ชันเพิ่มเติมคือการทำ<b> Ensemble Method</b> หรือการนำโมเดลหลาย ๆ โมเดลมาช่วยกันทำนายผลลัพธ์ เพื่อให้ผลลัพธ์ที่ออกมานั้นถูกต้องมากยิ่งขึ้น ตรงนี้สามารถดูได้ที่ cell เกือบล่างสุดที่ notebook นี้ โดยสามารถกด <b>Copy &amp; Edit</b> ที่<b>มุมขวาบน</b>เพื่อนำไปทดลองใช้เองได้ตามต้องการ</p><div id="ef89" class="link-block"> <a href="https://www.kaggle.com/chalat/titanic-pycaret-classification-example"> <div> <div> <h2>Titanic: Pycaret Classification Example</h2> <div><h3>Explore and run machine learning code with Kaggle Notebooks | Using data from Titanic: Machine Learning from Disaster</h3></div> <div><p>www.kaggle.com</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/0*-Xu-8gHRhoQ1QvhX)"></div> </div> </div> </a> </div><h2 id="e7c6">Prediction</h2><p id="d6a4">สุดท้าย เมื่อได้โมเดลที่พึงพอใจแล้ว เราก็จะเอาโมเดลนั้นไปใช้งานจริงโดยใช้ฟังก์ชัน <b><i>predict_model</i></b> โดยต้องมีการ<b>กำหนดข้อมูลที่ต้องการให้ทำนาย</b>เข้าไปด้วย เพราะหากไม่ได้กำหนดนั้น ฟังก์ชันนี้จะใช้ข้อมูลชุด Test ชุดเดิมที่ถูกแบ่งเอาไว้ตั้งแต่ต้นมาทำนายผลลัพธ์</p><div id="c27d"><pre><span class="hljs-title">predictions</span> = predict_model(final_model, <span class="hljs-class"><span class="hljs-keyword">data</span>=test_data)</span></pre></div><p id="1e2d">และผลลัพธ์ของการทำนายของ Pycaret นั้นจะออกมามีรูปร่างหน้าตาอย่างที่เห็น</p><figure id="ef9b"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*-dGnttook1JnzAaPHD2L0Q.gif"><figcaption>รูปที่ 9 รูปแสดงผลลัพธ์ของการ Predict ด้วย Pycaret</figcaption></figure><p id="9d17">เรียกได้ว่าเป็นชุดข้อมูลที่ต้องการให้ทำนายทั้งชุด โดยมีคอลัมน์เพิ่มเติมคือ <b>คอลัมน์ Label </b>และ <b>Score </b>ที่โมเดลทำนายให้</p><h1 id="be1e">ส่งท้าย</h1><p id="b468">Pycaret ถือว่าเป็นอีก 1 เครื่องมือที่<b>ดี</b>และ<b>ฟรี</b> และยังมีความเป็นมิตรกับบุคคลทั่วไปที่ไม่ค่อยมีความเชี่ยวชาญทางด้านการเขียนโปรแกรมอีกด้วย แต่หากเป็นคนที่มีความเชี่ยวชาญอยู่แล้ว ก็อาจใช้ Pycaret เป็นตัวช่วยในการเลือกโมเดลที่เหมาะสมได้ เนื่องจากจะช่วยลดเวลาในการทำงานลงไปอีก</p><p id="71d6">และถ้าผู้อ่านเกิดรู้สึกสนใจขึ้นมา ก็สามารถเข้าไปดูวิธีการใช้งานอื่น ๆ ได้ที่ Official Website ที่นี่เลย</p><div id="4793" class="link-block"> <a href="https://pycaret.org/"> <div> <div> <h2>Home - PyCaret</h2> <div><h3>Whether its imputing missing values, transforming categorical data, feature engineering or even hyperparameter tuning…</h3></div> <div><p>pycaret.org</p></div> </div> <div> <div style="background-image: url(https://miro.readmedium.com/v2/resize:fit:320/0*MMlCTvTvz9lfhRr9)"></div> </div> </div> </a> </div><h1 id="71e3">Note</h1><ul><li>สิ่งที่น่าสนใจอีกอย่างหนึ่งของ Pycaret คือได้นำเอา <a href="https://mlflow.org/">MLflow</a> ซึ่งเป็น Library เพื่อการพัฒนา Machine Learning Model มาใส่เอาไว้ด้วย ดังนั้นจึงสามารถใช้ <a href="https://www.mlflow.org/docs/latest/tutorials-and-examples/tutorial.html">MLflow Tracking</a> เพื่อสร้างพื้นที่เก็บ Evaluation Metrics ต่าง ๆ เอาไว้ให้ผู้ใช้งานอย่างเราสามารถนำมาเปรียบเทียบผลลัพธ์ทีหลังได้อย่างง่ายดาย</li><li>แต่หากไม่ต้องการเริ่มการทำงานของ <b>MLflow Tracking</b> เอง ก็มีบริการดี ๆ จาก <a href="https://ui.neptune.ai/">Neptune.ai</a> ที่ให้พื้นที่ในการใช้งานบน Server ได้แบบฟรี ๆ ที่สามารถเก็บ Evaluation Metrics ลงไปได้เลยแบบไม่ต้องตั้งค่าใด ๆ ยิ่งไปกว่านั้น เว็บไซต์นี้ยังสามารถทำ Notebook Versioning ได้ แถมเรายังสามารถติดตั้ง Neptune.ai ลงไปเป็นส่วนเสริมของ Jupyter Notebook ได้อีก ชนิดที่เรียกได้ว่า คลิ๊กเมาส์ครั้งเดียวก็ Save เป็น Version นั้นให้เลยทันที</li><li>หากมีข้อผิดพลาดประการใดสามารถแนะนำโดยการเขียนความคิดเห็นไว้ข้างล่างนี้หรือส่ง e-mail มาที่ [email protected] ได้เลยครับ</li></ul><h1 id="724a">Reference</h1><ul><li><a href="https://pycaret.org/">Official Website</a></li><li><a href="https://towardsdatascience.com/announcing-pycaret-2-0-39c11014540e">Announcing PyCaret 2.0</a></li><li><a href="https://github.com/pycaret/pycaret/blob/master/tutorials/Binary%20Classification%20Tutorial%20Level%20Beginner%20-%20%20CLF101.ipynb">Pycaret Github</a></li></ul></article></body>

Pycaret — ผู้ช่วยยุคใหม่ที่จะทำให้การเลือกใช้ Machine Learning ง่ายขึ้น

วิธีการใช้งานเบื้องต้นของ Pycaret กับ Titanic Dataset ที่คุ้นเคย

TL;DR

  • Pycaret คือ Low-code Machine Learning Library ที่จะช่วยให้การเปรียบเทียบผลลัพธ์ของ Machine Learning Model แต่ละโมเดลนั้นรวดเร็วยิ่งขึ้น
  • Pycaret เป็น Library ที่รวมเอา Machine Learning Library อื่น ๆ เข้ามาอยู่ด้วยกัน ตัวอย่าง Library ที่นำมารวมด้วย เช่น scikit-learn, XGBoost, LightGMB
  • ผู้อ่านสามารถใช้งาน Pycaret ในการทำโจทย์ Classification แบบเบื้องต้นได้ทันทีที่อ่านบทความนี้จบ
Credit: https://pixabay.com/

Pycaret คืออะไร

Pycaret เป็น Low-Code Machine Learning Library ที่สามารถลด Code ในการทำ Machine Learning จากหลายสิบบรรทัดให้เหลือไม่ถึง 10 บรรทัดได้ เนื่องจากวิธีการทำ Machine Learning หลาย ๆ อย่างนั้น ถูกบรรจุควบรวมกลายมาเป็นตัวแปรสั้น ๆ ให้ผู้ใช้งานสามารถเลือกใช้ได้อย่างสะดวกที่สุด จนเรียกได้ว่าเป็นกึ่ง Auto ML ได้เลยทีเดียว

อยากใช้ต้องทำยังไง ?

หากต้องการใช้ Library อย่าง Pycaret นั้น สามารถติดตั้งได้ง่าย ๆ ผ่านคำสั่ง pip เหมือนที่ใช้กับ Library ตัวอื่น ๆ แต่ก่อนที่จะติดตั้ง Pycaret ในเครื่องคอมพิวเตอร์ส่วนตัวจะมีข้อแนะนำว่า ควรสร้าง Virtual Environment เพื่อติดตั้ง Pycaret โดยเฉพาะ เพื่อหลีกเลี่ยงข้อผิดพลาดที่อาจเกิดขึ้นได้จาก Version ที่ไม่ตรงกันของ Library ตัวอื่น ๆ ที่ Pycaret ต้องการใช้งาน โดยคำสั่งที่ใช้ในการติดตั้ง Library ตัวนี้คือ

!pip install pycaret

เพียงเท่านี้ Pycaret ของเราก็พร้อมที่จะทำงานไปด้วยกันกับ Library ตามรายละเอียดใน Github ได้ในทันทีที่ต้องการ

ทั้งนี้ หากผู้อ่านไม่สะดวกในการติดตั้ง Virtual Environment ในเครื่องตนเอง ก็สามารถ Copy & Edit Notebook ใน Kaggle เพื่อทำการทดลองใช้งานไปพร้อม ๆ กันได้ตามลิงก์ด้านล่าง

โดยตัวอย่างการใช้งานในครั้งนี้ ขอเลือกใช้ Dataset ยอดฮิตสำหรับผู้เริ่มต้นอย่าง Titanic ดังรูปที่ 1 ที่มีจุดประสงค์เพื่อทำนายหาผู้รอดชีวิตบนเรือลำนี้ เนื่องจากคนส่วนใหญ่มีความคุ้นเคยกับข้อมูลของ Dataset ชุดนี้ดีอยู่แล้ว

รูปที่ 1 รูปแสดงตัวอย่างข้อมูล Titanic

แต่เอ… แล้วที่บอกว่า Pycaret นั้นรวมเอา Machine Learning Library หลายตัวมาไว้ด้วยกันนั้น มันมีตัวไหนบ้างนะ?

วิธีการตรวจสอบนั้นง่ายมาก เพียงแค่เรียกใช้ Machine Learning ใน Pycaret ให้ถูกประเภท และเรียกดูโมเดลได้เลย ซึ่งในที่นี้จะเลือกเป็นโมเดลประเภทตามโจทย์ที่ต้องทำคือประเภท Classification จึงต้องใช้คำสั่งดังนี้

from pycaret.classification import *
models()

และผลลัพธ์ที่ได้ก็จะเป็นชื่อของโมเดลที่มีอยู่ใน Pycaret พร้อมบอกด้วยว่าโมเดลนั้นมาจาก Library ตัวไหน ในตารางนี้ให้ดูชื่อย่อของโมเดลทางซ้ายมือเอาไว้ เนื่องจากชื่อย่อนี้จะถูกนำไปใช้ตอนที่จะสร้างโมเดล

รูปที่ 2 รูปแสดงโมเดลที่มีอยู่ใน Pycaret

ข้อมูลพร้อมแล้ว โมเดลพร้อมแล้ว หากผู้อ่านพร้อมแล้ว ก็ไปลองเริ่มใช้งานกันเลย

เริ่มต้นการใช้งาน

Library ตัวนี้ ถูกออกแบบวิธีการใช้งานโดยอ้างอิงจากกระบวนการพัฒนาโมเดล กล่าวคือ จะเริ่มต้นตั้งแต่การเตรียมข้อมูล เลือกโมเดล ปรับค่าไฮเปอร์พารามิเตอร์ ทำนายผลลัพธ์ด้วยโมเดลที่สร้างขึ้น ตลอดจนถึงวิธีการทางเทคนิคต่าง ๆ เช่น การใช้เทคนิค Ensemble เพื่อนำผลลัพธ์ของหลาย ๆ โมเดลมาช่วยกันทำให้ความถูกต้องของการทำนายผลนั้นมีมากขึ้น

Setup

สิ่งแรกที่ขาดไม่ได้เลยสำหรับการใช้งาน Pycaret ก็คือการ Setup ข้อมูล หรือที่เราเรียกกันว่าการเตรียมข้อมูล ซึ่งถือว่าเป็นหนึ่งในสิ่งมหัศจรรย์ของ Pycaret เลยก็ว่าได้ เพราะแค่กำหนดข้อมูลตั้งต้นคู่กับชื่อคอลัมน์ที่เราต้องการทำนาย ก็สามารถนำไปใส่โมเดลเพื่อทำการทดลองได้แล้ว ซึ่งจะใช้คำสั่งง่าย ๆ ที่ว่า

clf = setup(data, target = ‘Survived’)

สิ่งที่เกิดขึ้นในคำสั่งนี้ ก็จะมีตั้งแต่การแทนค่า Missing Value โดยอัตโนมัติ แถมยังทำการแบ่งข้อมูลออกเป็นชุด Train และ Test ในอัตราส่วน 70:30 ให้ในทันทีเลยด้วย โดยการแทนค่าตัวแปรที่เป็น Numeric นั้น จะแทนด้วยค่า Mean ส่วนการแทนค่าตัวแปรที่เป็น Categorical นั้น จะแทนด้วยค่า Mode

แต่หากไม่พอใจในการแทนค่านี้ หรืออยากแบ่งอัตราส่วนของข้อมูลเป็นอัตราส่วนอื่น ก็สามารถเติมพารามิเตอร์เพิ่มเติมได้เป็น

clf = setup(data, target = ‘Survived’,
            train_size = 0.8,
            numeric_imputation = 'median',
            categorical_imputation = 'mode')

เท่านั้นยังไม่พอ ถ้าต้องการเตรียมข้อมูลเพิ่มอีกนิด อย่างการลบตัวแปรที่มี Multicollineariry เพื่อช่วยลดผลของตัวแปรที่อาจมีความสัมพันธ์กันมากเกินไป หรือทำ Feature Selection เพื่อเลือกเฉพาะตัวแปรที่สำคัญจริง ๆ เข้ามานั้น ก็สามารถเติมพารามิเตอร์เข้าไปได้อีกคือ

clf = setup(data, target = ‘Survived’,
            train_size = 0.8,
            numeric_imputation = 'median',
            categorical_imputation = 'mode',
            remove_multicollinearity = True,
            feature_selection = True)

โดยที่ทั้ง 2 พารามิเตอร์นั้นจะมีค่า Threshold หรือค่ากลางอยู่ในอีกพารามิเตอร์หนึ่ง ที่จะเป็นตัวกำหนดว่า จะให้คัดตัวแปรนั้น ๆ ออกไปตอนไหน

แต่หากไม่กำหนด ค่ากลางสำหรับ Multicollinearity และการทำ Feature Selection นั้นจะมีค่า 0.9 และ 0.8 ตามลำดับ (ส่วนทฤษฎีที่ใช้ขอให้ตามไปดูที่เว็บไซต์หลักเนื่องจากบทความนี้จะเน้นไปที่การใช้งานเพียงอย่างเดียว)

และเมื่อทำการใส่ค่าพารามิเตอร์จนเป็นที่น่าพอใจแล้ว ก็ให้ทำการรัน Code ซึ่งจะได้ผลสรุปของการตั้งค่าออกมาอย่างที่เห็นในรูปด้านล่าง

รูปที่ 3 รูปแสดงผลลัพธ์ของการ Setup ข้อมูล

ถ้าลองแอบมองตารางสรุปผลซักนิดก็จะเห็นว่า ค่าที่สามารถปรับได้นั้นมีเยอะมาก ๆ ซึ่งสามารถดูเพิ่มเติมได้ที่

Model Selection

หลังจากที่ทำการเตรียมข้อมูลและแบ่งชุด Train และ Test ด้วยการใช้ฟังก์ชัน Setup เรียบร้อยแล้ว ลำดับต่อไปก็ถึงเวลาที่จะสร้างโมเดลขึ้นมาซักที

อย่างที่เรารู้กันว่า ไม่มีโมเดลไหนหรอกที่มันดีที่สุดในโลกตามทฤษฎี No Free Lunch มีแต่โมเดลที่เหมาะสมที่สุดในการนำไปใช้กับชุดข้อมูลนั้น ๆ ต่างหาก หากสนใจสามารถอ่านได้ที่บทความด้านล่างนี้

ในเมื่อยังไม่แน่ใจว่าควรใช้โมเดลไหนกับชุดข้อมูลที่เราเจออยู่ในขณะนี้ เจ้า Pycaret มันก็รู้ดี เลยมีฟังก์ชันเข้ามาช่วยโดยการลิสต์โมเดลทั้งหมดมาแล้วเปรียบเทียบผลลัพธ์กันให้เห็นจะ ๆ เพียงแค่ใช้คำสั่ง compare_models

top5_model = compare_models(sort = 'Accuracy', fold = 5, n_select = 5)

โดยคำสั่งนี้ จะนำโมเดลทั้งหมดมาลอง Train ด้วยชุดข้อมูลที่ Setup เอาไว้ก่อนหน้านี้ และมีการทำ K-Fold เพื่อวัดประสิทธิภาพของโมเดลให้โดยอัตโนมัติ พร้อมทั้งเรียงโมเดลให้ตามค่า Metrics ที่เราต้องการใช้งานอีกด้วย

และสุดท้าย หากมีการกำหนดพารามิเตอร์ n_select = 5 เข้าไป ฟังก์ชันนี้ก็จะให้โมเดลที่ดีที่สุดตามค่า Metrics นั้น ๆ ออกมา 5 โมเดล ซึ่งหากต้องการเรียกใช้โมเดลที่ดีที่สุดเพียงโมเดลเดียว ก็สามารถเรียกใช้ได้เลยโดยการระบุตำแหน่ง

top5_model[0]

เมื่อทุกโมเดลถูกนำไปประเมินผลลัพธ์แล้ว ก็จะได้ตารางด้านล่างมาให้เชยชม

รูปที่ 4 รูปแสดงผลการเปรียบเทียบผลลัพธ์ของแต่ละโมเดล

ข้อควรระวังสำหรับการเลือกโมเดลจากตารางเปรียบเทียบคือ ลำดับของโมเดลอาจมีการเปลี่ยนแปลงได้เล็กน้อย ซึ่งมาได้จากหลายสาเหตุ ตั้งแต่การ Random เลือกชุดข้อมูลไปแบ่ง Fold ที่ไม่เหมือนกัน ไปจนถึงไฮเปอร์พารามิเตอร์ที่ถูกเลือกมาตอน Initialize โมเดลที่ต่างกันในแต่ละครั้ง จึงขอแนะนำให้เลือกโมเดลมา 3–5 อันดับแรก เพื่อนำไปทำการ Tuning ต่อไป ซึ่งหลังจาก Tuning เสร็จ ก็จะทำให้ลำดับของโมเดลมีการเปลี่ยนแปลงไปอีก

แต่ก็ใช่ว่าการนำโมเดลทั้งหมดมาเปรียบเทียบแบบนี้จะดีเสมอไป เพราะมันกินเวลามาก ยิ่งข้อมูลเยอะ ก็ยิ่งนานเข้าไปอีก…

และทางออกของความเจ็บปวดในการรอครั้งนี้ ก็มีทางแก้อยู่ใน Pycaret เช่นกัน เพราะฟังก์ชันที่ใช้ในการเปรียบเทียบโมเดลนี้ สามารถเลือกโมเดลที่ต้องการนำมาเปรียบเทียบได้ ด้วยการใส่ชื่อย่อของโมเดลเข้าไปในพารามิเตอร์ที่ชื่อว่า whitelist

best_specific = compare_models(whitelist = [‘dt’,’rf’,’xgboost’])

หรือจะเลือกแบนโมเดลไม่ให้ Pycaret เอามาเปรียบเทียบได้ด้วยการใช้พารามิเตอร์ที่ชื่อว่า blacklist (แหม่… ชื่อพารามิเตอร์แอบเหยียดผิวเบา ๆ)

best_specific = compare_models(blacklist = [‘catboost’,’svm’])

แต่ถ้าใครมั่นใจแล้วว่าอยากได้โมเดลไหน ไม่อยากได้การเปรียบเทียบใด ๆ ก็สามารถเลือกสร้างโมเดลแบบระบุชื่อได้เลย ด้วยการใช้ฟังก์ชัน create_model

model = create_model(‘lightgbm’, fold = 5)

และผลลัพธ์ของขั้นตอนนี้ คือโมเดลที่เหมาะสมกับการนำไปใช้งานต่อไป

แอบบอกอีกนิด ทีเด็ดอีกอย่างหนึ่งของ Pycaret คือเราสามารถแสดงผลลัพธ์ของโมเดลนั้น ๆ ด้วยฟังก์ชันอย่าง plot_model ได้อีก ซึ่งก็ทำให้เราเข้าใจโมเดลของเรามากขึ้นไม่มากก็น้อย หรือจะลองใช้ฟังก์ชันนี้ในโมเดลก่อนที่จะทำการ Tuning กับหลังทำการ Tuning ดูก็เป็นความคิดที่ดีนะ

plot_model(tuned_model, plot = 'confusion_matrix') # Left Hand Side
plot_model(tuned_model, plot = 'feature') # Right Hand Side
รูปที่ 5 รูปแสดง Confusion Matrix (ซ้ายมือ) และ รูปที่ 6 รูปแสดง Feature Importance (ขวามือ)
plot_model(tuned_model, plot = 'auc') # Left Hand Side
plot_model(tuned_model, plot = 'pr') # Right Hand Side
รูปที่ 7 รูปแสดง ROC Curve (ซ้ายมือ) และ รูปที่ 8 รูปแสดง PR Curve (ขวามือ)

แต่บางโมเดลในขณะนี้ก็ไม่สามารถนำมา plot ได้ด้วยฟังก์ชันนี้ได้ด้วยเหตุผลบางประการ จึงอาจต้องนำผลลัพธ์มา plot ด้วยตนเองหากต้องการรูปในแบบเดียวกัน

Tune Model

ขั้นตอนต่อไปหลังจากที่ได้โมเดลแล้ว ก็คือการนำโมเดลมาปรับค่าไฮเปอร์พารามิเตอร์เพื่อให้ได้ผลลัพธ์ที่ดียิ่งขึ้น ซึ่งใน Pycaret ก็อำนวยความสะดวกให้โดยการใช้ฟังก์ชัน tune_model

tuned_model = tune_model(top5_model[2], optimize = 'Accuracy', n_iter = 30, fold = 5)

ฟังก์ชันนี้จะทำการ Random ค่าไฮเปอร์พารามิเตอร์เพื่อหาค่าที่ดีที่สุดและประเมินผลด้วยการใช้ K-Fold เหมือนอย่างเคย โดยที่ n_iter คือจำนวนครั้งในการสุ่มค่าไฮเปอร์พารามิเตอร์ ยิ่งมีค่าเยอะก็ยิ่งดี แต่ก็ยิ่งใช้เวลานานขึ้นเช่นกัน

และผลลัพธ์ที่ได้จากขั้นตอนนี้ คือโมเดลที่มีค่าไฮเปอร์พารามิเตอร์ที่เหมาะสม ที่ให้ค่า Metrics ที่กำหนดในพารามิเตอร์ optimize ได้ดีที่สุด ซึ่งในที่นี้กำหนดให้ Metrics เป็นค่า Accuracy นั่นเอง

นอกจากค่า Accuracy แล้ว เจ้า Pycaret ยังมีทางเลือกในการประเมินผลโมเดลโดยใช้ค่าอื่น ๆ อีกเช่นกัน ดังนี้

  • โมเดลประเภท Classification: Accuracy, AUC, Recall, Precision, F1, Kappa, MCC
  • โมเดลประเภท Regression: MAE, MSE, RMSE, R2, RMSLE, MAPE

ส่วนใครที่ไม่ชอบวิธีการปรับค่าไฮเปอร์พารามิเตอร์ด้วยการสุ่ม เจ้า Pycaret ก็มีทางเลือกให้อีก โดยการให้เรากำหนดค่าไฮเปอร์พารามิเตอร์ที่ต้องการเหมือนกับ Grid Search ยังไงยังงั้น

params = {'max_depth': np.random.randint(1, (len(data.columns)*.85),20), 'max_features': np.random.randint(1, len(data.columns),20), 'min_samples_leaf': [2,3,4,5,6], 'criterion': ['gini', 'entropy'] }
tuned_dt_custom = tune_model(dt, custom_grid = params)

Finalize

เมื่อปรับค่าไฮเปอร์พารามิเตอร์ให้เหมาะสมเป็นที่เรียบร้อยแล้ว หลายครั้งหลายครา โมเดลก็จะถูกนำไปใช้งานเลย ซึ่งก็ไม่ผิดอะไร

แต่สำหรับ Pycaret นั้น จะมีฟังก์ชันในการนำชุดข้อมูลทั้ง Train และ Test มารวมกันอีกครั้ง แล้วนำโมเดลจากขั้นตอนก่อนหน้ามาทำการสร้างใหม่ด้วยข้อมูลทั้งหมดก่อนที่จะนำไปใช้จริง ด้วยการใช้ฟังก์ชัน finalize_model

final_model = finalize_model(tuned_model)

และเมื่อได้โมเดลสุดท้ายมาแล้ว เราก็พร้อมที่จะนำไปใช้ทำนายผลลัพธ์ในงานจริง

แต่เดี๋ยวก่อน… เจ้า Pycaret ยังมีฟังก์ชันเพิ่มเติมคือการทำ Ensemble Method หรือการนำโมเดลหลาย ๆ โมเดลมาช่วยกันทำนายผลลัพธ์ เพื่อให้ผลลัพธ์ที่ออกมานั้นถูกต้องมากยิ่งขึ้น ตรงนี้สามารถดูได้ที่ cell เกือบล่างสุดที่ notebook นี้ โดยสามารถกด Copy & Edit ที่มุมขวาบนเพื่อนำไปทดลองใช้เองได้ตามต้องการ

Prediction

สุดท้าย เมื่อได้โมเดลที่พึงพอใจแล้ว เราก็จะเอาโมเดลนั้นไปใช้งานจริงโดยใช้ฟังก์ชัน predict_model โดยต้องมีการกำหนดข้อมูลที่ต้องการให้ทำนายเข้าไปด้วย เพราะหากไม่ได้กำหนดนั้น ฟังก์ชันนี้จะใช้ข้อมูลชุด Test ชุดเดิมที่ถูกแบ่งเอาไว้ตั้งแต่ต้นมาทำนายผลลัพธ์

predictions = predict_model(final_model, data=test_data)

และผลลัพธ์ของการทำนายของ Pycaret นั้นจะออกมามีรูปร่างหน้าตาอย่างที่เห็น

รูปที่ 9 รูปแสดงผลลัพธ์ของการ Predict ด้วย Pycaret

เรียกได้ว่าเป็นชุดข้อมูลที่ต้องการให้ทำนายทั้งชุด โดยมีคอลัมน์เพิ่มเติมคือ คอลัมน์ Label และ Score ที่โมเดลทำนายให้

ส่งท้าย

Pycaret ถือว่าเป็นอีก 1 เครื่องมือที่ดีและฟรี และยังมีความเป็นมิตรกับบุคคลทั่วไปที่ไม่ค่อยมีความเชี่ยวชาญทางด้านการเขียนโปรแกรมอีกด้วย แต่หากเป็นคนที่มีความเชี่ยวชาญอยู่แล้ว ก็อาจใช้ Pycaret เป็นตัวช่วยในการเลือกโมเดลที่เหมาะสมได้ เนื่องจากจะช่วยลดเวลาในการทำงานลงไปอีก

และถ้าผู้อ่านเกิดรู้สึกสนใจขึ้นมา ก็สามารถเข้าไปดูวิธีการใช้งานอื่น ๆ ได้ที่ Official Website ที่นี่เลย

Note

  • สิ่งที่น่าสนใจอีกอย่างหนึ่งของ Pycaret คือได้นำเอา MLflow ซึ่งเป็น Library เพื่อการพัฒนา Machine Learning Model มาใส่เอาไว้ด้วย ดังนั้นจึงสามารถใช้ MLflow Tracking เพื่อสร้างพื้นที่เก็บ Evaluation Metrics ต่าง ๆ เอาไว้ให้ผู้ใช้งานอย่างเราสามารถนำมาเปรียบเทียบผลลัพธ์ทีหลังได้อย่างง่ายดาย
  • แต่หากไม่ต้องการเริ่มการทำงานของ MLflow Tracking เอง ก็มีบริการดี ๆ จาก Neptune.ai ที่ให้พื้นที่ในการใช้งานบน Server ได้แบบฟรี ๆ ที่สามารถเก็บ Evaluation Metrics ลงไปได้เลยแบบไม่ต้องตั้งค่าใด ๆ ยิ่งไปกว่านั้น เว็บไซต์นี้ยังสามารถทำ Notebook Versioning ได้ แถมเรายังสามารถติดตั้ง Neptune.ai ลงไปเป็นส่วนเสริมของ Jupyter Notebook ได้อีก ชนิดที่เรียกได้ว่า คลิ๊กเมาส์ครั้งเดียวก็ Save เป็น Version นั้นให้เลยทันที
  • หากมีข้อผิดพลาดประการใดสามารถแนะนำโดยการเขียนความคิดเห็นไว้ข้างล่างนี้หรือส่ง e-mail มาที่ [email protected] ได้เลยครับ

Reference

Pycaret
Titanic Dataset
Classification
Machine Learning
Recommended from ReadMedium