บทความ Machine Learning
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: Kan Ouivirach
| Machine Learning
ลด Dimension ด้วย Principal Component Analysis (PCA)
บทความนี้จะมาดูวิธีลด Dimension กันด้วย Principal Component Analysis หรือ PCA กันครับ ออกตัวก่อนว่าบทความนี้ไม่ได้ตั้งใจจะมาอธิบาย PCA นะครับ แต่อยากจะมาให้เห็นว่ามันสามารถเอาไปลด Dimension ได้นะ ลดแล้วข้อมูลจะหน้าตาประมาณไหน 😚ทำไมต้องลด? บาง Dimension อาจจะไม่จำเป็นในการสร้างโมเดลก็เป็นได้ครับ แต่เราไม่แน่ใจว่าจะตัดออกดีไหมอะไรแบบนี้ แล้วก็ถ้ายิ่งมี Dimension เยอะๆ เราอาจจะเจอปัญหา Curse of Dimensionality ก็เป็นได้ คือยิ่งถ้าเรามี Dimension ที่เยอะขึ้น สิ่งที่จะเกิดตามมาคือข้อมูลของเราจะ Sparse มันจะแหว่งๆ ขาดๆ หายๆ ทำให้ส่งผลต่อโมเดลของเราวิธีลด Dimension ก็มีหลายวิธีครับ วิธีที่ใช้กันเยอะก็คงจะไม่พ้น PCA นั่นเอง เรามาเขียนโค้ดไปทำความเข้าใจกันไปดีกว่าครับในบทความนี้จะขอใช้ข้อมูล 2D นะครับ เพื่อความง่าย และเราสามารถพลอตกราฟได้ จะทำให้เข้าใจได้มากขึ้น เรามาเริ่มด้วยการ Import สิ่งที่จำเป็นต้องใช้กันก่อน%matplotlib inlineimport numpy as npimport matplotlib.pyplot as pltเราจะใช้ Numpy สร้างข้อมูลขึ้นมาดู และใช้ Matplotlib เพื่อพลอตกราฟ ส่วน %matplotlib inline เอาไว้สำหรับคนที่ใช้ Jupyter Notebook แล้วอยากให้กราฟขึ้นมาแสดงผลที่ Notebook ของเราครับผมจะสร้างข้อมูล 2 มิติขึ้นมาแบบสุ่มตามนี้mean = [0, 0]cov = [[1, 0], [10, 10]]X = np.random.multivariate_normal(mean, cov, 100)plt.plot(X[:, 0], X[:, 1], 'o', alpha=0.5)plt.axis('equal')กราฟข้อมูล 2 มิติสิ่งที่ PCA นั้นจะพยายามทำ คือมันจะพยายามหาแกนที่สำคัญในข้อมูลของเราที่สามารถอธิบายการกระจายตัวของข้อมูลของเราได้from sklearn.decomposition import PCApca = PCA(n_components=2)pca.fit(X)print(pca.explained_variance_)print(pca.components_)ได้ผลตามนี้ผลที่ได้จากการรัน PCAค่าพวกนี้บอกอะไร? ลองเอามาพลอตดูครับplt.plot(X[:, 0], X[:, 1], 'o', alpha=0.5)for length, vector in zip(pca.explained_variance_, pca.components_): v = vector * 3 * np.sqrt(length) plt.plot([0, v[0]], [0, v[1]], '-k', linewidth=3)plt.axis('equal');จะได้ผลตามนี้กราฟที่นำเอาค่า explained variance กับ components ที่ได้จาก PCA มาพลอตจากรูปข้างต้นจะเห็นได้ว่ามี 2 เวคเตอร์ ทั้ง 2 เวคเตอร์นี้กำลังบอกถึง Direction ของข้อมูล และเวคเตอร์ที่ยาวกว่าจะบอกถึง “ความสำคัญ” ของ Direction ของข้อมูลนั้นๆ ตรงนี้หมายความว่า จริงๆ แล้วเราสามารถเลือกเฉพาะ Direction ที่สำคัญๆ ได้ครับ เราจะตัด Direction ของข้อมูลที่ไม่สำคัญทิ้งไปก็ได้ ข้อมูลที่ไม่สำคัญอาจจะหมายถึงข้อมูลนั้นมี Information ที่น้อย และอาจจะไม่จำเป็นสำหรับการนำเอาไปใช้งานต่อวิธีตัดทิ้งล่ะ? เราตัดโดยการเลือกเก็บข้อมูลส่วนใหญ่ไว้ได้ครับ เช่น เราเลือกเก็บข้อมูล 95% ไว้ จะเขียนโค้ดได้ตามนี้pca = PCA(0.95)X_trans = pca.fit_transform(X)หรือเราจะเลือกเป็นจำนวน Component ก็ได้ ในที่นี้ทั้งหมดมี 2 Components เราอาจจะเลือกแค่ 1pca = PCA(n_components=1)X_trans = pca.fit_transform(X)ค่า X_trans ในที่นี้คือข้อมูลที่สำคัญ 95% ครับ ซึ่งจะมีอยู่ 1 มิติ (จากเดิมมี 2 มิติ) บางคนอาจจะสงสัยว่าจริงๆ เอาตัด Column ทิ้งไปหรือเปล่า คำตอบคือไม่ใช่ครับ จริงๆ แล้วเรา Transform ข้อมูลให้เหลือ 1 มิติ ลองดูโค้ดกับรูปประกอบด้านล่างX_new = pca.inverse_transform(X_trans)plt.plot(X[:, 0], X[:, 1], 'o', alpha=0.2)plt.plot(X_new[:, 0], X_new[:, 1], 'bo', alpha=0.8)plt.axis('equal');ผลที่ได้คือกราฟที่เรา Transform ข้อมูลลงไปบนแกนสำคัญที่เราเลือกจะเห็นได้ว่าเรา Transform ข้อมูล หรือ Project ข้อมูลลงไปบนแกนสำคัญที่เราเลือกนั่นเองก็จะประมาณนี้ครับ การใช้งาน PCA เพื่อลด Dimension ของข้อมูล ลองไปศึกษากันต่อดูนะครับ ทำงานด้านนี้ไม่ช้าก็เร็ว ยังไงก็ได้เจอกับ PCA แน่นอน 😎
โดย: Kan Ouivirach
| Machine Learning
โมเดลแบบ Parametric กับ Nonparametric ต่างกันอย่างไร?
มีอยู่หลายครั้งที่เราอ่านจะไปอ่านเจอคำๆ ว่า Parametric กับ Nonparametric เรามาลองทำความรู้จักกับโมเดลทั้ง 2 ประเภทนี้กัน ดูแล้วทั้ง 2 ประเภทนี้ต่างกันอย่างไรบ้าง?โมเดลแบบ Parametricเป็นโมเดลที่เรามีจำนวน Parameters ที่จำกัด คือไม่ว่าเราจะมีจำนวนข้อมูลเท่าไหร่ จำนวน Parameters ก็จะมีอยู่แค่นั้นครับ ยกตัวอย่างโมเดลที่ง่ายที่สุดก็คงเป็น Linear Regression ที่มีข้อมูลแค่ 1 Dimension ตัว Parameter ที่เราจำเป็นต้องหาก็คือค่า Weight (w) และค่าจุดตัดแกน Y (b) ลองดูสมการด้านล่างนี้ประกอบy = w*x + bส่วนข้อมูลที่เราจะนำเข้ามาสอนก็คือค่า x กับ y ครับ โมเดลแบบ Parametric มีข้อดีที่เห็นชัดๆ เลยครับคือเราไม่จำเป็นต้องเก็บข้อมูลไว้หลังจากที่สอนโมเดลเสร็จ เราสามารถนำเอา Parameter ที่ได้ไปใช้งานต่อได้เลยโมเดลแบบ Nonparametricเป็นโมเดลที่ไม่ได้กำหนดตายตัวว่าจะใช้ฟังก์ชั่นในการ Map ข้อมูลแบบไหน แล้วก็สมมุติเอาว่าการกระจายตัวของข้อมูลไม่สามารถนิยามได้ในเซตของ Parameters ที่มีจำนวนจำกัด โมเดลแบบ Nonparametric นี้จะเน้นใช้ประโยชน์จากข้อมูลเป็นหลัก โมเดลที่ง่ายที่สุดก็คือ k-Nearest Neighbors (k-NNs) นั่นเอง มีความต่างกับ Linear Regression ค่อนข้างชัดเจนที่ว่า k-NNs นั้นจำเป็นที่ต้องมีข้อมูลทั้งหมดไว้เพื่อที่จะ Predict อะไรสักอย่าง และ k-NNs ไม่ได้ใช้ข้อมูลพวกนั้นมาปรับค่า Parameter ใดๆ ในตัวอัลกอริธึ่มของมันเองเลย ข้อเสียก็ตอนที่ข้อมูลมีขนาดใหญ่มากๆ โมเดลของเราก็จะใหญ่ตามไปด้วย ซึ่งเราก็ต้องไปหาวิธีเก็บข้อมูลให้ Efficient มากขึ้นด้วยข้อแตกต่างระหว่างโมเดลทั้ง 2 แบบ จริงๆ มีอีกนะ บทความนี้แค่อยากจะนำเสนอในมุมง่ายๆ ที่เห็นชัดๆ จะได้สามารถไปศึกษาเพิ่มเติมได้ หวังว่าจะพอแยกแยะออกนะครับ 😙
โดย: Kan Ouivirach
| Machine Learning
การวาง Project Structure สำหรับงานด้าน Machine Learning
เวลาที่เราทำโปรเจคอะไรสักอย่าง คำถามประมาณว่า “เราจะมีโฟลเดอร์อะไรบ้าง?” หรือ “เราจะวาง Project Structure เราอย่างไรดี?” จะแว็บเข้ามาในหัวเสมอ ซึ่งจริงๆ มันก็ไม่ใช่ปัญหาใหญ่โตอะไรหรอกครับ แต่บางทีก็ทำให้เรารำคาญอยู่บ่อยๆ ได้ พอดีตอนที่ผมเรียนอยู่ ได้ไปเจอบทความของ Ali Eslami เค้าเขียนเรื่องนี้ไว้ และผมก็ใช้ Structure แบบนี้มาจนถึงทุกวันนี้ครับ เลยอยากจะมาบอกเล่ากันหน่อยหน้าตาของ Project Structure จะเป็นประมาณนี้project/ ├─ code/ ├─ data/ │ ├─ input/ │ ├─ working/ │ └─ output ├─ demos/ └─ tests/โดยแต่ละ Folder มีความหมายตามนี้project ก็คือชื่อโปรเจคของเรานั่นเองdata เป็นโฟลเดอร์ที่เอาไว้เก็บ Dataset ของเรา ซึ่งในโฟลเดอร์นี้ก็จะแบ่งออกเป็น 3 ส่วนด้วยกัน คือ inputเป็นโฟลเดอร์เก็บข้อมูลแบบ Raw และเราจะไม่แก้ไขใดๆ เลยในโฟลเดอร์นี้ ส่วน workingเป็นโฟลเดอร์เก็บไฟล์อะไรก็ตามที่โค้ดหรือโมเดลของเราสร้างขึ้นมา ไฟล์ในโฟลเดอร์นี้จะมีการเปลี่ยนแปลงแทบตลอดเวลา และ output จะเป็นโฟลเดอร์ที่เอาไว้เก็บผลลัพธ์จากโค้ดหรือโมเดลของเราส่วน demos กับ tests ก็ตามชื่อเช่นกัน เอาไว้สำหรับเอาไปนำเสนอผลงาน และเอาไว้ทำสอบผลงาน ซึ่ง 2 โฟลเดอร์นี้อาจจะเก็บแค่สคริป เช่น Bash ที่เอาโมเดลมารันแสดงผลก็ได้ครับข้อดีแยกส่วนของโค้ดกับส่วนของข้อมูลออกจากกันทำให้ง่ายต่อการแชร์โค้ดให้กับคนอื่น และปรับเปลี่ยน Dataset ในภายหลังง่ายต่อการแยก Dataset ออกมาจาก Version Control เพราะเราสามารถจะเขียน Configuration ให้ไม่ต้องเอาโฟลเดอร์ data เข้าไปใน Version Control ได้การแบ่งย่อยโฟลเดอร์ในโฟลเดอร์ data ทำให้เรา Reproduce งานออกมาได้เป็นระเบียบมากขึ้น เราจะรู้ตัวเองว่าอะไรก็ตามที่อยู่ใน input เราจะไม่แก้ อะไรก็ตามที่อยู่ใน working เราสามารถลบทิ้งได้โดยไม่ต้องกังวล และอะไรก็ตามที่อยู่ใน output เราจะเอาไปนำเสนอผลงานส่วน demos กับ tests อาจจะมีสคริปที่ซ้ำๆ กัน แต่ก็ช่วยทำให้เราแยกโฟกัสของเราได้ง่ายขึ้นครับ ว่าเรากำลังจะทดสอบหรือเรากำลังจะนำเสนอผลงานตามไปอ่านต้นฉบับกันได้ที่ Patterns for Research in Machine Learning ครับ เค้าไม่ได้เขียนแค่เรื่องของ Project Structure นะ ยังมีส่วนเสริมในเรื่องของการแยกส่วน Options กับส่วน Parameters ออกจากกันอีกด้วยใช้ Project Structure แบบกันไหน มาพูดคุยกันได้นะครับ 🤓
โดย: Kan Ouivirach
| Machine Learning
ค่า Hyperparameter ใน Machine Learning คือ?
ในโลกของ Machine Learning จะมี Parameter ชนิดหนึ่งอยู่ที่เรียกว่า Hyperparameter ครับ ทำไมเราถึงต้องรู้จักมันล่ะ? มันคืออะไรหนอ? 🤔เวลาที่เราสร้างโมเดล Machine Learning ขึ้นมา เราจะป้อนข้อมูลเข้าไปเพื่อสอนโมเดลของเรา ซึ่งจริงๆ แล้วการสอนเนี่ย มันก็คือการที่เราหาค่า Parameter ต่างๆ ของโมเดลที่เหมาะสมกับข้อมูลที่เราป้อนเข้าไป หรือเราอาจจะพูดได้ว่าค่า Parameter พวกนี้เป็นค่าที่ได้มาจากข้อมูลนั่นเอง ค่าพวกนี้ก็เช่นค่า Weight ใน Neural Networkค่า Coefficient ใน Linear Regressionแต่ทีนี้เรายังมีค่า Parameter อีกจำพวกหนึ่งด้วย เป็นค่าที่เราหาไม่ได้จากข้อมูล ซึ่ง Parameter พวกนี้เราจะเรียกว่า “Hyperparameter” ซึ่งส่วนใหญ่แล้วเราก็จะกำหนดค่าไว้ก่อนที่เราจะนำโมเดลเข้าขั้นตอนการเรียนรู้ (Model Training) ค่าพวกนี้ก็จะมีประโยชน์คือทำให้โมเดลของเรามีประสิทธิภาพมากขึ้นครับ ถ้าเราสามารถหาค่าที่ดีมาได้ตัวอย่างของ Hyperparameter มีอะไรบ้าง?ค่า Learning Rate ที่เอาไว้สอน Neural Networkค่า k ใน k-Nearest Neighbors หรือใน k-Means Clusteringจะเห็นได้ว่าค่าพวกนี้เราต้องเซตเอาไว้ก่อนที่เราจะสอนโมเดลครับเราจะได้ค่า Hyperparameter มาได้อย่างไร?เนื่องจากเราไม่สามารถหาค่านี้ได้จากข้อมูลของเรา สิ่งที่เราพอจะได้ทำก็จะประมาณนี้ทำ Cross Validation กับหลายๆ ค่า Hyperparameter ครับหา Domain Export มาดูข้อมูล ช่วยกำหนดค่าให้วัดดวง!ผมแนะนำวิธีแรกนะครับ 😂 เราสามารถเขียนโปรแกรมแล้วปล่อยให้โปรแกรมรันไปได้ ผมมองว่ามันคือการทำแนว Trial & Error ครับ ในการหาค่า Hyperparameter ที่ดีที่สุดคิดว่าน่าจะพอเห็นถึงความแตกต่างระหว่าง Parameter ธรรมดากับ Hyperparameter นะครับ 😎 ดังนั้นเนี่ยตอนที่เราสอนโมเดลของเรา เราก็อย่างลืมลองปรับ Hyperparameter เป็นหลายๆ ค่าด้วยนะ พยายามหาค่าที่ทำให้โมเดลของเราได้ผลที่ดีที่สุด
โดย: Kan Ouivirach
| Machine Learning
การจัดการ Imbalanced Data ใน Machine Learning
Imbalanced data เป็นปัญหาด้วยเหรอ? ทำไมถึงต้องสนใจด้วยไปจัดการมันด้วย?เป็นครับ! ต้องสนใจด้วย! ปัญหานี้เป็นปัญหาที่เจอตลอดเวลากับแทบจะทุกชุดข้อมูลเลยก็ว่าได้ และจะเป็นปัญหามากกับการทำ Classification เพราะว่าสิ่งที่จะเกิดขึ้นก็คือว่า จำนวน Class ที่เราจะทำนายหรือจะจำแนกมีไม่เท่ากันทำให้ความแม่นยำตอนที่เราจะทำนายหรือจำแนกมีค่าคลาดเคลื่อนไป ไม่น่าเชื่อถือ ค่า Null Accuracy จะสูงมาก อาจจะมากกว่า 90% เลยด้วยซ้ำถ้าใครงงว่า Null Accuracy คืออะไร ลองอ่าน ใช้ Null Accuracy เป็น Baseline ในการวัดผลโมเดลของเรา ก่อนเนอะทีนี้เรามาดูวิธีจัดการกันบ้าง บทความนี้จะมาเสนอวิธี 2 วิธีครับ ที่เราไม่ต้องไปยุ่งกับตัวข้อมูลเลยวิธีแรก.. จัดให้เป็นปัญหา Anomaly Detection ซะจากที่เราพยายามจะใช้วิธี Classification ในการแก้ปัญหา ให้เราเปลี่ยนวิธีคิดครับ ซึ่งว่ากันง่ายๆ เลย ก็ประมาณว่าให้เราจับเอาคลาสที่มีจำนวนมากที่สุด แล้วบอกว่ามันคือ Normal Profile (Pattern) ซะ แล้วนอกนั้นคือ Abnormal หมด ยกตัวอย่างๆ ถ้าสมมุติว่าเราต้องการที่จะจำแนกว่าอีเมลไหนเป็นสแปมหรือไม่ใช่สแปม แล้วเรามีข้อมูล 100 อีเมล เป็นสแปม 2 อีเมล แล้วอีก 98 เป็นอีเมลที่ไม่ใช่สแปมสิ่งที่เราจะทำก็คือให้เราโมเดลแค่ 98 อีเมลที่ไม่ใช่สแปมพอครับ แล้วคิดซะว่ามันคือ Normal Profile แล้วอะไรที่ไม่ใช่ Normal เราก็ตอบว่ามันคือสแปมครับการทำที่ง่ายสุดน่าจะเป็นการนำเอา Normal Profile มาทำ Clustering ครับ แล้วกำหนด Threshold เอาว่า ถ้าระยะห่างระหว่างข้อมูลที่เข้ามาใหม่เกิด Threshold ที่เรากำหนดไว้ เราก็พิจารณาว่าข้อมูลนั้นเป็นสแปมครับผมวิธีที่ 2.. เอา Metric อื่นมาช่วยในการวัดผลโมเดลในกรณีของ Imbalanced Data เราจะใช้ค่า Accuracy อย่างเดียวมาวัดผลไม่ได้ เนื่องจาก Null Accuracy มีค่าสูงเกินไป เราจะหา Metric อื่นมาช่วยในการวัดผลของเราครับ Metric นั้นคือค่า Area Under Curve (AUC) ครับผม ซึ่งค่า AUC นี่จะได้มาจากกราฟ Receiver Operating Characteristic (ROC) กราฟนี้จะมีลักษณะตามรูปด้านล่างนี้ครับรูป ROC จาก Wikiจากรูปถ้าโมเดลเราดี กราฟมันจะโค้งเข้ามุมซ้ายบนครับ คือมีค่า True Positive Rate (TPR) สูง และมีค่า False Positive Rate (FPR) ต่ำ ทีนี้ค่า AUC มันก็คือค่าพื้นที่ใต้กราฟนี่แหละ ถ้าโมเดลเราจำแนกหรือทำนายแม่น ค่า AUC นี้ก็จะมีค่าเข้าใกล้ 1 ครับผมค่า AUC นี่จะออกมาเป็นความน่าจะเป็นที่โมเดลเราจะสามารถแบ่งจำแนก Class ของเราได้ดีขนาดไหนครับ คือเราอาจจะได้ค่า Accuracy ประมาณ 98% แต่ได้ค่า AUC ประมาณ 0.1 ก็เป็นได้ครับ คือมี FPR สูงมากนั่นเอง หน้าที่ของเราคือหาวิธีทำให้ค่า AUC มันสูงขึ้นมาให้ได้ครับ 💪จริงๆ ก็ยังมีวิธีอื่นอีกนะครับ เช่นการ Upsampling หรือ Downsampling ข้อมูลของเรา แต่วิธี 2 วิธีจะเป็นการเพิ่มข้อมูลของเราขึ้นมา (อย่างมีหลักการ) ซึ่งก็สามารถไปใช้ได้เช่นกันโดยไม่ผิดอะไรครับ สุดท้ายถ้าโมเดลของเราให้ผลออกมาดี น่าเชื่อถือ ก็น่าจะแฮปปี้กันทุกฝ่าย 🤗
โดย: Kan Ouivirach
| Machine Learning
ปัญหา Regression ต่างกับ Classification อย่างไร?
ทั้งปัญหา Regression และปัญหา Classification ทั้งคู่อยู่จัดอยู่ในการเรียนรู้แบบ Supervised Learning เราลองมาดูปัญหาทีละปัญหากันว่ามันคืออะไรกันบ้างนะปัญหา Regressionลองนึกถึงแอพพลิเคชั่นที่เราใช้กันในปัจจุบันเช่น เราอาจจะมีระบบทำนายการเติบโต ทำนายยอดขาย ทำนายราคาสินค้าหรือบ้าน รวมไปถึงการทำนายระดับความดันเลือด ระบบพวกนี้จะมีสิ่งที่เหมือนกันก็คือเราจะมีข้อมูลและเราจะนำข้อมูลนั้นๆ ไปทำนายค่าๆ หนึ่งในอนาคต ทีนี้ประเด็นสำคัญคือ ค่าๆ หนึ่งในอนาคตเนี่ย จะเป็นค่าแบบ Continuous ครับให้โค้ดเป็นคนอธิบายครับ สมมุติว่าผมมีข้อมูลของเวลาที่ใช้ในการอ่านหนังสือและคะแนนสอบที่ได้ของนักเรียน ผมก็จะสามารถที่จะพอทำนายได้ว่า เช่นถ้ามีนักเรียนคนหนึ่งใช้เวลาอ่านหนังสือ 3.2 ชม. นักเรียนคนนั้นควรจะได้คะแนนประมาณเท่าไหร่ สังเกตตรงว่าค่าคะแนน ซึ่งค่านี้เป็นแบบ Continuousimport pandas as pddf = pd.DataFrame(data={ 'hours': [2.5, 5.1, 3.2, 8.5, 3.5, 9.2, 8.9, 6.9, 7.8, 2.7], 'scores': [21, 47, 27, 75, 30, 88, 95, 76, 86, 25]})dfข้อมูลจำนวนชั่วโมงที่ใช้ในการอ่านหนังสือกับคะแนนสอบที่ได้ผมจะลองมาสร้างโมเดล Regression ครับ ในที่นี้ขอใช้ Linear Regression นะครับ เป็น Regression ที่ง่ายที่สุดX = df[['hours']]y = df.scoresfrom sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train, y_train)ลองเทสดูregressor.predict(X_test)ได้ผลประมาณนี้ผลที่ได้จากโมเดล Regression (Linear Regression)จะเห็นได้ว่าถ้านักเรียนคนหนึ่งใช้เวลาอ่านหนังสือ 3.2 ชั่วโมง เค้าน่าจะได้คะแนนประมาณ 28.97 ส่วนถ้านักเรียนอีกคนหนึ่งใช้เวลาอ่านหนังสือประมาณ 7.8 ชั่วโมง เค้าน่าจะได้คะแนนประมาณ 76.72นี่แหละครับปัญหา Regression เป็นปัญหาที่เราอยากจะทำนายค่าในอนาคต หรือค่าที่เราอยากจะประมาณการเป็น Continuousปัญหา Classificationมาดูปัญหา Classification กันบ้าง มีข้อแตกต่างจาก Regression ก็คือ.. ค่าที่เราจะทำนายจะเป็นค่าแบบ Discrete ครับ! ต่างกันแค่นี้จริงเหรอ? 🤔จริงครับ! แค่นี้แหละ เรามาใช้โค้ดเป็นคนอธิบายเช่นเดิม ผมต้องการสร้างโมเดลขึ้นมาเพื่อทำนายว่าคนๆ นี้เป็นเป็นโรคมะเร็งเต้านมหรือเปล่า (Healthy controls หรือ Patients) สังเกตตรงว่าค่าที่จะทำนายนี้ จะเป็นแบบ Discreteสำหรับข้อมูลชุดนี้เค้ากำหนดให้เลข 1 คือ Healthy controls ส่วนเลข 2 คือ Patientsimport pandas as pddf = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/00451/dataR2.csv')df.head()อ่านข้อมูล Breast Cancer จาก UCI Machine Learning Repositoryต่อไปเราจะสร้างโมเดล Classification ขึ้นมาครับ ขอใช้ k-Nearest Neighbors (k-NNs) เนอะX = df.drop('Classification', axis='columns')y = df.Classificationfrom sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)from sklearn import neighborsknn = neighbors.KNeighborsClassifier(n_neighbors=5)knn.fit(X_train, y_train)แล้วเราลองเทสดูknn.predict(X_test)ได้ผลลัพธ์ผลที่ได้จากโมเดล Classification (k-NNs)ผลลัพธ์ทางด้านบนจะออกมาเป็นแบบ Discrete ครับ คือถ้าไม่ตอบว่า Healthy controls ก็จะตอบว่า Patients นั่นเองClassification เป็นปัญหาที่เราอยากจะทำนายค่าในอนาคต หรือที่เราอยากจะจำแนกเป็น Discreteสรุปสั้นๆRegression กับ Classification จะต่างกันที่ตรงค่าที่เราอยากจะทำนายหรือจำแนกครับ ถ้าค่านั้นเป็นแบบ Continuous เราควรจะจัดเป็นปัญหา Regression ส่วนถ้าเป็น Discrete ก็จะเป็นปัญหา Classification ดังนั้นเวลาที่เราเจอคำถามทาง Business หรือ Use Case ที่เราจะนำไปใช้ ก็อยากให้คิดก่อนว่าเราจะใช้ Regression หรือ Classification ครับ 😎
โดย: Kan Ouivirach
| Machine Learning
ใช้ Null Accuracy เป็น Baseline ในการวัดผลโมเดลของเรา
ในกรณีที่เราสร้างโมเดลขึ้นมาเพื่อทำนายผลอะไรสักอย่าง เราก็อยากที่จะวัดผลโมเดลนั้นๆ ว่ามีประสิทธิภาพดีแค่ไหน ส่วนใหญ่แล้วเราก็จะเลือกค่าที่คำนวณง่ายๆ มาอย่างเช่นค่า Accuracy เป็นต้นค่า Accuracy คือ ค่าอัตราส่วนระหว่างจำนวนข้อมูลที่เราทำนายถูก กับจำนวนที่เราต้องการจะทำนายทั้งหมดเช่น สมมุติว่า เรามีข้อมูลที่เราอยากจะทำนายว่าลูกค้าคนไหนของเราจะยกเลิกการใช้บริการของเราหรือเปล่าอยู่เป็นจำนวน 100 ข้อมูล และเราทำนายว่า 75 คนจะยกเลิก และ 75 คนนั้นยกเลิกจริงๆ ดังนั้นค่า Accuracy ของโมเดลของเราก็คือ 75% แล้วถ้าเราทำนายว่ามี 75 คนที่จะยกเลิก แต่ว่ามียกเลิกจริงๆ คือ 50 คน ก็แปลว่าค่า Accuracy ของโมเดลคือ 50% 🤓ทีนี้คำถามที่เราจะต้องถามตัวเองก็คือว่า “ค่า Accuracy เท่าไหร่ถึงจะดี?” ถ้าให้ตอบแบบไม่คิดเลยก็จะตอบประมาณว่า 90% ขึ้นไปครับ ดีแน่นอน!🛑 ช้าก่อน! วางเหยือกเบียร์ลงแล้วหายใจลึกๆ สัก 1–2 ที จริงๆ แล้วเราไม่ควรตอบไปทันทีแบบนั้น สิ่งที่เราควรทำคือย้อนกลับมาดูข้อมูลของเรา และคำนวณค่า Null Accuracy ก่อนครับแล้วค่า Null Accuracy คืออะไร?Baseline accuracy that can be achieved by always predicting the most frequent classตามนั้นเลยครับ มาดูตัวอย่างการคำนวณดีกว่าจะได้เห็นภาพกันมากขึ้นยกตัวอย่างเช่นผมมีข้อมูลอยู่ 100 ข้อมูล และมีจำนวนคนที่ยกเลิกการใช้บริการจริงๆ อยู่ 90 และมีจำนวนคนที่ใช้บริการอยู่ 10 คน ถ้าผมบอกว่าให้โมเดลของผมมีคำตอบเดียวคือทำนายว่าทุกคนยกเลิกการใช้บริการ (เพราะจำนวนคนที่ยกเลิกการใช้บริการมีมากกว่า) ผมก็จะได้ค่า Accuracy คือ 90% แล้วครับ ซึ่งค่า Accuracy นี้แหละ เราเรียกว่าค่า Null Accuracy 😎แปลว่าถ้าเราสร้างโมเดลของเราขึ้นมา ไม่ว่าจะใช้โมเดลอะไรก็ตาม ถ้าได้ค่า Accuracy ไม่เกินค่า Null Accuracy ก็แปลว่าโมเดลนั้นยังทำงานได้ไม่ดีจริง และห้ามนำไปใช้งานจริงครับอาจจะเกิดผลเสียต่อธุรกิจได้สรุปสั้นๆ ว่าค่า Null Accuracy เนี่ย นอกจากจะช่วยวัดผลโมเดลของเราได้แบบไวๆ แล้วยังจะช่วยเป็น Baseline ให้เรารู้ว่าเราควรจะทำโมเดลให้ดียิ่งขึ้นไปอีกหรือไม่ ลองเอาไปใช้กันดูนะครับ ส่วนตัวผมนี่คำนวณค่านี้ตลอดเลย เวลาที่สร้างโมเดลขึ้นมาเพื่อทำนายผล 🎉
โดย: Kan Ouivirach
| Machine Learning
เอาผลของโมเดลมารวมกันแบบนี้ก็ได้เหรอ? มาเรียนรู้เทคนิคง่ายๆ อย่าง Ensemble กัน
ลองนึกถึงเวลาที่เราตัดสินใจจะทำอะไรสักอย่าง เช่น การเลือกซื้อสินค้าสักอย่างหนึ่ง เราคงจะไม่ได้เชื่อทุกอย่างที่เซลส์บอก เราก็คงจะไปตามอ่านรีวีว หรือไม่ก็สอบถามจากเพื่อนๆ ก่อน จนสุดท้ายได้ข้อสรุปของตัวเองมาจึงถึงตัดสินใจที่จะซื้อสินค้านั้นๆเทคนิค Ensemble (อ่านว่า ออน-ซั่ม-เบิล) ใน Machine Learning ก็มีแนวคิดที่คล้ายๆ กัน ซึ่งแนวคิดนั้นก็จะประมาณว่าการตัดสินใจสุดท้ายจะมาจากหลายๆ โมเดลทที่เราสร้าง ซึ่งการทำแบบนี้มีจุดประสงค์เพื่อเพิ่มประสิทธิภาพในการทำนายผลนั่นเองถ้าสมมุติว่าเรามี 5 โมเดล แล้วมีโค้ดประมาณนี้ เราก็เทรนทั้ง 5 โมเดลนั้นเลย# instantiatemodel_1 = tree.DecisionTreeClassifier()model_2 = KNeighborsClassifier()model_3 = LogisticRegression()model_4 = GaussianNB()model_5 = SGDClassifier()# fitmodel_1.fit(X_train, y_train)model_2.fit(X_train, y_train)model_3.fit(X_train, y_train)model_4.fit(X_train, y_train)model_5.fit(X_train, y_train)ส่วนขั้นตอนที่เราจะทำ Prediction นั้น จะมีวิธีทำ 3 วิธีง่ายๆ ที่เราสามารถเอาไปลองใช้ได้ครับMax VotingAveragingWeighted Averagingวิธีแรก Max Votingค่าอะไรที่โมเดลเราตอบมามีจำนวนมากสุด เราก็ตอบค่านั้น 😃 ยกตัวอย่างเป็นโค้ดที่ใช้ Scikit-Learn ดีกว่า ประมาณนี้เลย# predictresults = np.array([ model_1.predict_proba(X_test), model_2.predict_proba(X_test), model_3.predict_proba(X_test), model_4.predict_proba(X_test), model_5.predict_proba(X_test),])mode(results)ใช้ค่า Mode ตอบได้ครับ หรือใครจะเขียนโค้ดให้นับจำนวนก็ได้เช่นกันวิธีที่ 2 Averagingตอบโดยใช้ค่าเฉลี่ย# predictresults = np.array([ model_1.predict_proba(X_test), model_2.predict_proba(X_test), model_3.predict_proba(X_test), model_4.predict_proba(X_test), model_5.predict_proba(X_test),])results.mean()วิธีที่ 3 Weighted Averageวิธีนี้จะคล้ายๆ กับ วิธีที่ 2 แต่จะเป็นการให้ค่า Weight กับแต่ละโมเดลตามนี้# predictresults = np.array([ model_1.predict_proba(X_test) * 0.55, model_2.predict_proba(X_test) * 0.1, model_3.predict_proba(X_test) * 0.15, model_4.predict_proba(X_test) * 0.1, model_5.predict_proba(X_test) * 0.1,])results.sum()ซึ่ง Weight ทุกตัวให้รวมกันให้ได้ 1 นะครับการใช้เทคนิค Ensemble นี้มีโอกาสที่เราจะได้โมเดลที่มีประสิทธิภาพมากขึ้นครับ ซึ่งเป็นอีกเทคนิคหนึ่งที่คนส่วนใหญ่ใช้กันอย่างแพร่หลาย ลองเอาไปใช้ดูนะครับ 😎
โดย: Kan Ouivirach
| Machine Learning
สร้าง Machine Learning โมเดลมาทำ Image Recognition
Image Recogniton คือความสามารถของโปรแกรมในการระบุได้ว่าวัตถุ สถานที่ ผู้คน หรือข้อความต่างๆ ในรูปภาพ ว่าคืออะไร อยู่ที่ไหน ใครเป็นใคร และข้อความนั้นเขียนว่าอะไรถ้าเราอยากจะลองสร้าง (traditional) Machine Learning โมเดลขึ้นมาสักตัวหนึ่งเอามาทำ Image Recognition เราต้องทำอย่างไรบ้างนะ? ปกติแล้วเวลานำข้อมูลเข้าไปสอนโมเดล ข้อมูลนั้นๆ จะอยู่ในรูปแบบ Tabular เนอะ คือแบ่งเป็น Column แต่ละ Column ก็จะมีค่าตัวเลขต่างๆ ทีนี้ถ้าเรามีข้อมูลเป็นรูปภาพล่ะ?ไม่ต้องคิดมากเลยครับ เราก็แปลงรูปให้เป็นข้อมูลแบบ Tabular เลย เช่นถ้ารูปขนาด 2x2 เราก็แปลงให้เป็น Vector ขนาด 1x4 ตามรูปข้างล่างนี้เลยครับแปลงรูป 2x2 ให้เป็น Vector ขนาด 1x4โดยเราจะเอาแถวที่ 2 เป็นต้นไป ขึ้นมาต่อด้านหลังของแถวที่ 1 ไปเรื่อยๆ ครับ เท่านี้เราก็จะมีข้อมูแบบ Tabular ที่ Represent รูป 1 รูปแล้วเรียบร้อย 🎉ถ้ารูปมีขนาดไม่เท่ากัน? วิธีแก้คือเราต้องทำให้ขนาดของรูปทุกรูปเท่ากันก่อนก็พอ ทีนี้ก็แล้วแต่ว่าเราจะ Crop รูป หรือ Resize รูปครับผมเรามาลองเล่นกันบ้างดีกว่า จะได้เข้าใจมากขึ้นครับ เราจะนำข้อมูล Optical Recognition of Handwritten Digits จากเว็บ UCI Machine Learning Repository มาสร้างโมเดลกันPhoto by Green Chameleon on Unsplashโหลดข้อมูลมาก่อนครับimport pandas as pddigits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)digits_train.head()ข้อมูลที่ได้หน้าตาจะประมาณนี้ครับลักษณะข้อมูล Optical Recognition of Handwritten Digitsจะเห็นได้ว่า UCI ได้แปลงข้อมูลให้เรามาแล้ว แต่ถ้าเราจับข้อมูลมาเรียงกลับมาเป็นรูปขนาด 8x8 จะได้แบบนี้first_digit = digits_train.loc[0, :][:-1].values.reshape(8, 8)first_digitแปลงข้อมูล Tabular (Feature Vector) ให้กลับมาอยู่ในรูปขนาด 8x8ถ้าอยากเห็นเป็นรูปจริงๆ เราสามารถใช้ Matplotlib ช่วยได้ครับ%matplotlib inlineimport matplotlib.pyplot as pltplt.figure(1, figsize=(3, 3))plt.imshow(first_digit, cmap=plt.cm.gray_r, interpolation='nearest')plt.show()ใช้ Matplotlib ช่วยแสดงค่าจากอาเรย์ 8x8 ออกมาเป็นรูปภาพถึงแม้ว่าบทความนี้จะแปลงข้อมูลจาก Tabular เป็นรูปขนาด 8x8 แต่จริงๆ เราก็สามารถแปลงรูปขนาด 8x8 ให้อยู่ในรูปแบบของ Feature Vector ขนาด 1x64 ได้ไม่ยากครับ แปลงไปแปลงกลับไม่โกง 😝ทีนี้ขั้นตอนการสร้างโมเดล เราก็สามารถทำตามปกติได้เลยครับ เพราะข้อมูลอยู่ในรูปแบบของ Tabular แล้ว โค้ดทั้งหมดมีตามนี้เลยครับ 👇 (ใช้โมเดล SVM)import pandas as pdfrom sklearn import svmdigits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)X_train = digits_train.drop([64], axis=1)y_train = digits_train[64]clf = svm.SVC()clf.fit(X_train, y_train)digits_test = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tes', header=None)X_test = digits_test.drop([64], axis=1)y_test = digits_test[64]y_pred_class = clf.predict(X_test)clf.score(X_test, y_test)เป็นอันเสร็จสิ้น ที่เหลือก็เป็นขั้นตอนการปรับให้โมเดลของเราเก่งขึ้นครับผม 😎
โดย: Kan Ouivirach
| Machine Learning
ใช้ Pickle เซฟและโหลด ML โมเดลใน Scikit-Learn ไปใช้งานต่อ
คำถาม? เวลาที่เราสอนโมเดลเสร็จแล้ว อยากเอาโมเดลนี้ไปใช้งานต่อที่อื่น หรือเอาไป deploy ใช้บน server เพื่อใช้งานจริงๆ ต้องทำอย่างไร?คำถามนี้เจอค่อนข้างบ่อย เมื่อก่อนอาจจะยังไม่ค่อยมีคำถามนี้เพราะว่า Machine Learning ยังอยู่ฝั่ง Academia ซะเป็นส่วนใหญ่ แต่ปัจจุบันนี้ออกมาทางฝั่ง Industry เยอะมากแล้ว และแน่นอนว่าจะต้องมีการใช้งานโมเดลจริงๆ จังๆ ไม่ใช่แค่สอนโมเดล ดูผลการทดลองแล้วก็จบเนอะ 😎แน่นอนว่าเราไม่ควรไปสอนโมเดลอีกรอบบน server เพราะน่าใช้เวลานานมาก ถ้าเป็นโมเดลเล็กๆ ก็อาจจะใช้เวลา 2–3 วินาที แต่ในชีวิตจริง เราน่าจะใช้เวลาในการเทรนประมาณ 2–3 ชม. หรือ อาจจะเป็นอาทิตย์ก็เป็นได้ 😱บทความนี้จะมาสอนให้เราสามารถสอนโมเดลใน Scikit-Learn ครั้งเดียว แล้วเซฟไปใช้งานที่ไหนต่อก็ได้ครับ เรามาสร้างโมเดล K-means แบบง่ายๆ กันimport pandas as pdfrom sklearn import clusterdata = { 'data': [2, 3, 4, 10, 12, 20, 30, 11, 25]}df = pd.DataFrame(data)kmeans = cluster.KMeans(n_clusters=2)kmeans.fit(df)พอเสร็จแล้วเราจะได้ Centroid มาcentroids = kmeans.cluster_centers_print(centroids)จุด Centroid ที่ได้จาก K-meansถ้าเราอยากนำโมเดล (ตัวแปร kmeans) ไปใช้งานต่อ เราจะใช้ตัวช่วยที่ชื่อว่า Pickle ครับ วิธีใช้ก็ตามนี้import picklef = open('kmeans.pkl', 'wb')pickle.dump(kmeans, f)f.close()เราจะเปิดไฟล์มาเขียนให้เป็น Binary mode และสั่ง pickle.dump ครับ เสร็จแล้วเราก็จะได้ไฟล์ kmeans.pkl เอาไปใช้ที่ไหนก็ได้!!วิธีเอาไปใช้ก็เอาไฟล์นั้นขึ้นไปวางบน server ครับ หรือที่เราเรียกกันว่า Model Deployment นั่นแหละ ทีนี้การโหลดโมเดลขึ้นมาใช้งาน เราก็จะใช้ Pickle เช่นกัน ตามนี้ครับimport picklef = open('kmeans.pkl', 'rb')stored_kmeans = pickle.load(f)f.close()ยืนยันสักหน่อยว่าเราได้โมเดลเดียวกันprint(stored_kmeans.cluster_centers_)จุด Centroid ที่ได้จาก K-means ที่เราโหลดขึ้นมาใหม่น่าจะพอเห็นภาพกันนะครับ 😉

พบบทสัมภาษณ์ได้ที่นี่เร็ว ๆ นี้

พบDigital Skill บนสื่อ ได้ที่นี่เร็ว ๆ นี้