Python เป็นภาษาที่ได้รับความนิยมในงาน Machine Learning เพราะใช้งานง่ายและมีไลบรารีที่ทรงพลัง เช่น NumPy และ Pandas สำหรับจัดการข้อมูล Matplotlib และ Seaborn สำหรับวิเคราะห์ข้อมูล และ Scikit-Learn สำหรับสร้างโมเดล Machine Learning
บทเรียนนี้จะพาคุณไปรู้จักขั้นตอนสำคัญ ตั้งแต่การเตรียมข้อมูล การสร้างโมเดล การฝึกสอน และการประเมินผล ด้วยตัวอย่างที่เข้าใจง่าย เพื่อช่วยให้คุณเข้าใจ Machine Learning มากยิ่งขึ้น
พื้นฐานที่ควรรู้ก่อน Machine Learning
- Python Basics
พื้นฐาน Python เช่น
การใช้ตัวแปร (variables), ลูป (loops), ฟังก์ชัน (functions), และ list comprehension - NumPy และ Pandas
การจัดการข้อมูล (Data Manipulation) และการคำนวณ (Numerical Computing) - Matplotlib และ Seaborn
การวิเคราะห์ข้อมูลด้วยการวาดกราฟ (Data Visualization)
- ความเข้าใจพื้นฐานเกี่ยวกับ Machine Learning Machine Learning แบ่งออกเป็น 3 ประเภทหลัก
- Supervised Learning: มีข้อมูลพร้อมคำตอบ เช่น การทำนายราคาบ้าน
- Unsupervised Learning: ไม่มีคำตอบ เช่น การจัดกลุ่มลูกค้า
- Reinforcement Learning: เรียนรู้จากการลองผิดลองถูก เช่น การควบคุมหุ่นยนต์
- คำศัพท์สำคัญ
- Feature: ตัวแปรอิสระ (Input)
- Label/Target: ตัวแปรเป้าหมาย (Output)
- Model: แบบจำลองที่เรียนรู้จากข้อมูล
- Training และ Testing: การแบ่งข้อมูลเพื่อฝึกสอนและทดสอบ
Scikit-Learn เป็นไลบรารียอดนิยมสำหรับการสร้างและใช้งาน Machine Learning โมเดลใน Python ไลบรารีนี้ใช้งานง่าย ครอบคลุมตั้งแต่การเตรียมข้อมูล การสร้างโมเดล ไปจนถึงการประเมินผล
- โครงสร้างพื้นฐานของ Scikit-Learn
การทำงานของ Scikit-Learn สามารถแบ่งออกเป็นขั้นตอนหลักๆ ดังนี้- เตรียมข้อมูล (Prepare Data)
จัดการข้อมูลในรูปแบบที่เหมาะสม เช่น NumPy หรือ Pandas - แบ่งชุดข้อมูล (Train-Test Split)
ใช้ train_test_split() เพื่อแยกข้อมูลสำหรับฝึกสอนและทดสอบ - สร้างและฝึกโมเดล (Build and Train the Model)
ใช้คลาสจาก Scikit-Learn เช่น LinearRegression, KNeighborsClassifier - ทำนายผล (Make Predictions)
ใช้ model.predict() เพื่อทำนายผล - ประเมินผล (Evaluate Model)
ใช้ Metrics เช่น accuracy_score, mean_squared_error
- เตรียมข้อมูล (Prepare Data)
- ตัวอย่างโค้ดพื้นฐานใน Scikit-Learn
- Linear Regression
ตัวอย่างนี้เป็นการทำนายข้อมูลอย่างง่ายด้วย Linear Regression โดย Linear Regression จะเป็นความสัมพันธ์ของตัวแปรหรือสิ่งที่เรากำลังสนใจ ซึ่งจะถูกใช้กับการคำนวณค่าที่เป็นตัวเลข เพื่อหาความสัมพันธ์หรือทำนายข้อมูลต่าง ๆผลลัพธ์ที่ได้ อธิบายผลลัพธ์โค้ด: เลือกทั้งหมด
# นำเข้าไลบรารี import numpy as np from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # เตรียมข้อมูล X = np.array([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]]) # Feature y = np.array([25,35,40,42,51,60,62,72,78,90]) # Target # แบ่งข้อมูลออกเป็นชุดฝึกสอนและชุดทดสอบ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # สร้างโมเดล Linear Regression model = LinearRegression() # ฝึกโมเดลด้วยข้อมูลชุดฝึกสอน model.fit(X_train, y_train) # ทำนายผลลัพธ์ด้วยข้อมูลชุดทดสอบ y_pred = model.predict(X_test) # ประเมินผลลัพธ์ mse = mean_squared_error(y_test, y_pred) print(f"Mean Squared Error: {mse}") # แสดงค่าพารามิเตอร์ของโมเดล print(f"ค่าความชัน (Slope): {model.coef_}") print(f"จุดตัดแกน y (Intercept): {model.intercept_}")
- Mean Squared Error (MSE): เป็นตัววัดความแตกต่างระหว่างค่าที่คาดการณ์ (y_pred) กับค่าจริง (y) ยิ่งค่า MSE ต่ำ แสดงว่าโมเดลมีความแม่นยำมากขึ้น
- ค่าความชัน (Slope): เป็นอัตราการเพิ่มขึ้นของ y ต่อการเปลี่ยนแปลงของ X
เช่น ถ้าความชัน = 7.44 หมายความว่า เมื่อค่า X เพิ่มขึ้น 1 หน่วย ค่า y จะเพิ่มขึ้นประมาณ 7.44 หน่วย - จุดตัดแกน y (Intercept): เป็นค่าของ y เมื่อ X = 0
- K-Nearest Neighbors (KNN)
ตัวอย่างนี้ใช้โมเดล KNN เพื่อจำแนกข้อมูลใน Iris Dataset
Iris Dataset เป็นตัวอย่างของดอกไม้ 3 ประเภท (Iris Setosa, Iris Versicolour, และ Iris Virginica) เป็นตาราง แต่ละตัวอย่างประกอบด้วยความยาวของใบ (sepal length) ความยาวของกลีบดอกไม้ (petal length) และประเภทของดอกไม้ มีทั้งหมด 50 ตัวอย่าง รวมทั้งหมด 150 ตัวอย่างวิธีทำงานของ KNN คือโค้ด: เลือกทั้งหมด
# นำเข้าไลบรารี from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # โหลดข้อมูล Iris dataset iris = load_iris() X = iris.data # Features y = iris.target # Labels # แบ่งข้อมูลออกเป็นชุดฝึกสอนและชุดทดสอบ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # สร้างโมเดล K-Nearest Neighbors model = KNeighborsClassifier(n_neighbors=7) # ฝึกโมเดล model.fit(X_train, y_train) # ทำนายผลลัพธ์ y_pred = model.predict(X_test) # ประเมินผล accuracy = accuracy_score(y_test, y_pred) print(f"ความแม่นยำ (Accuracy): {accuracy * 100:.2f}%")
- กำหนดค่า K ก่อน โดยที่ K เป็นจำนวนเพื่อนบ้านใกล้ตัวที่อยากจะพิจารณา
- หาตัวอย่างที่อยู่ใกล้กับจุดทดสอบที่สุดมา K ตัว
- ดูว่าใน K ตัวอย่างนี้เป็นดอกไม้ประเภทไหนมากที่สุด จำแนกจุดทดสอบเป็นประเภทนั้น
ง่ายมาก พูดง่ายๆคือให้จุดใกล้ตัว "โหวต" ว่าควรเป็นประเภทไหนนั่นเอง จากตัวอย่างสมมติ K=1 ก็หาจุดที่ใกล้จุดทดสอบที่สุดมาหนึ่งจุด จากภาพจุดนั้นเป็นสีเขียว ก็เลยตอบว่าตัวอย่างทดสอบเป็นดอกไม้ประเภท Versicolour
วิธีหนึ่งในการเลือกค่า K ที่ดีที่สุดคือการทำ cross validation แนวคิดคือเราจะแบ่งข้อมูลที่ได้มาเป็นสองส่วน ชุดฝีกสอนกับชุดทดสอบ เลือกค่า K ที่ทำให้จำนวนตัวอย่างในชุดทดสอบถูกจำแนกผิดประเภทน้อยที่สุด
- Linear Regression
- การประเมินผล: Cross-Validation
Scikit-Learn มีฟังก์ชันสำหรับการตรวจสอบโมเดลด้วย Cross-Validation เพื่อประเมินประสิทธิภาพโมเดล
Cross-Validation เป็นวิธีการที่ใช้ในการประเมินประสิทธิภาพของโมเดล Machine Learning โดยการแบ่งชุดข้อมูลเป็นหลายๆ ชุดย่อย (folds) เพื่อให้ได้ค่าประเมินที่มั่นคงและลดความเสี่ยงจากการ Overfitting หรือ Underfitting ที่อาจเกิดขึ้นจากการแบ่งข้อมูลแค่ชุดเดียว วิธีนี้ช่วยให้มั่นใจว่าโมเดลมีความสามารถทั่วไป (generalization) ที่ดีในข้อมูลที่ไม่เคยเห็นมาก่อน
โค้ด: เลือกทั้งหมด
from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris # โหลดข้อมูล iris = load_iris() X = iris.data y = iris.target # สร้างโมเดล Random Forest model = RandomForestClassifier() # ประเมินโมเดลด้วย Cross-Validation (k=5) scores = cross_val_score(model, X, y, cv=5) print(f"คะแนน Cross-Validation: {scores}") print(f"คะแนนเฉลี่ย: {scores.mean():.2f}")
- เครื่องมือสำคัญใน Scikit-Learn
- Data Preprocessing
เป็นขั้นตอนหลังจาก Clean data เป็นการเตรียมข้อมูลของเราให้พร้อมนำไปใช้กับ Machine Learning Model เช่น การเลือก Feature หรือ การแปลงข้อความเป็นตัวเลข (ซึ่ง ML โมเดลต้องการ Input ที่เป็นตัวเลขเท่านั้น) ซึ่งต่างจาก Clean data ตรงที่ Clean data จะเน้นไปที่การทำให้ข้อมูลถูกต้องเช่น การจัดการกับข้อมูลประเภท Nan or NULL หรือจัดการกับ Outlier data
การปรับข้อมูลก่อนใช้งาน เช่น การ Normalize, Scaling
ตัวอย่างโค้ดโค้ด: เลือกทั้งหมด
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
- Model Selection
เลือกโมเดลที่เหมาะสม เช่น- การทำนาย: LinearRegression, RandomForestRegressor
- การจำแนกประเภท: KNeighborsClassifier, SVM
- Model Evaluation
ตัวชี้วัดความแม่นยำ เช่น Accuracy, Precision, Recall
ตัวอย่างโค้ดโค้ด: เลือกทั้งหมด
from sklearn.metrics import accuracy_score, confusion_matrix accuracy = accuracy_score(y_test, y_pred) print(f"ความแม่นยำ: {accuracy}")
- Data Preprocessing
สรุป
การเรียนรู้ Machine Learning ด้วย Python และ Scikit-Learn สามารถนำไปปรับใช้กับงานในอนาคตได้หลายด้าน โดยเฉพาะในงานที่เกี่ยวข้องกับการวิเคราะห์ข้อมูล, การทำนาย (Prediction), หรือการจำแนกประเภท (Classification). ตัวอย่างเช่น:
- พัฒนาโมเดลทำนาย: ใช้ Scikit-Learn เพื่อพัฒนาโมเดลสำหรับทำนายข้อมูลในงานต่างๆ เช่น การทำนายยอดขาย, คาดการณ์สต็อกสินค้า, หรือการทำนายพฤติกรรมของลูกค้า
- การจำแนกประเภทข้อมูล: ใช้โมเดลในการจำแนกประเภทข้อมูล เช่น การจำแนกประเภทของดอกไม้ใน Iris Dataset หรือการจำแนกประเภทของอีเมลเป็น spam หรือไม่
- การประเมินและปรับปรุงโมเดล: สามารถใช้เทคนิคต่างๆ เช่น Cross-Validation เพื่อประเมินโมเดลและปรับปรุงประสิทธิภาพ โดยไม่พึ่งพาการแบ่งข้อมูลเพียงครั้งเดียว
- การปรับใช้กับงานธุรกิจ: Scikit-Learn สามารถนำไปใช้ในการพัฒนาเครื่องมือที่ช่วยตัดสินใจธุรกิจ เช่น การคัดกรองลูกค้าที่มีโอกาสสูงในการซื้อสินค้า หรือการคาดการณ์อัตราการลาออกของพนักงาน
https://www.borntodev.com/2021/08/26/ทำความรู้จัก-linear-regression-algorithm/
https://notebook.community/wittawatj/ipynb/notebooks/iris-knn-analysis
https://medium.com/mmp-li/data-preprocessing-นั้นสำคัญอย่างไร-แล้วจะทำเมื่อไหร่-69306f880e68