โดย: Kan Ouivirach
| Machine Learning
เล่น Machine Learning แบบชิลๆ กับ scikit-learn
ทำความรู้จักกับข้อมูล Iris Data Setการโหลดข้อมูลการเตรียมข้อมูลการสร้าง Machine Learning โมเดลการนำโมเดลไปจำแนกข้อมูล หรือทำนายผลการเรียนรู้ที่ดีที่สุดวิธีหนึ่งคือการลงมือทำ บทความนี้เราจะมาลองลงมือเล่น Machine Learning แบบชิลๆ กับ scikit-learn กัน ตั้งแต่การโหลดข้อมูล จนถึงการสร้างโมเดลเอาไปจำแนกข้อมูล หรือทำนายผลเลยhttps://scikit-learn.org/scikit-learn เป็น Machine Learning Library ในภาษา Python ที่เราสามารถเอาไปทำทั้ง Supervised Learning หรือ Unsupervised Learning ได้ (ไม่มี Reinforcement Learning นะ ทำไม?) แล้วเราถึงเลือกใช้ Library นี้มาลอง?เป็น Library ที่ออกแบบมาให้ง่ายต่อการใช้งาน มี Algorithm ใน Machine Learning ที่นิยมใช้กันอยู่ใน Library นี้มีเอกสารการใช้งานที่ดี อันนี้ดีงามจริงๆ เพราะว่ามีโค้ดตัวอย่างให้ด้วยมีแทบทุก Task ใน Machine Learning ให้ใช้ เช่น Classification, Regression, Clustering, Model Selection, Preprocessing และอื่นๆ อีกมากมายติดตั้งโดยการใช้คำสั่ง : pip install scikit-learnทำความรู้จักกับข้อมูล Iris Data Setรูปจาก UCI Machine Learning Repositoryขั้นตอนแรกสุดคือเราต้องมาทำความรู้จักกับข้อมูลที่เราจะเอามาเล่นก่อน เนื่องจากเราจะมาลองเล่นกันแบบชิลๆ เลยเอาข้อมูลดอก Iris มาก่อนเลย เป็นข้อมูลที่ง่าย และดูจะเป็นข้อมูลที่ผ่านมือทุกคนที่ทำงานในสายนี้มาแล้วเลยทีเดียว ซึ่งมันควรจะผ่านมือพวกเราด้วยเช่นกัน :Dโจทย์ของเราจากข้อมูลชุดนี้คือ เราจะต้องจำแนกจากข้อมูลให้ได้ว่าข้อมูลนั้นเป็นดอก Iris ชนิดไหน ระหว่าง Setosa, Versicolor หรือ Virginica ซึ่งข้อมูลที่เราจะได้มาจะมี ความยาวกับความกว้างของกลีบเลี้ยง (Sepal Length & Width) หน่วยเป็นเซนติเมตร (cm) และความยาวกับความกว้างของกลีบดอก (Petal Length & Width) หน่วยเป็นเซนติเมตร (cm) เช่นกันการโหลดข้อมูลความดีงามของ scikit-learn นั้นคือ เราสามารถลองเล่นข้อมูลมาตรฐานได้โดยไม่ต้องไปโหลดมาเอง ซึ่งข้อมูล Iris ก็รวมอยู่ในนั้น เราสามารถลองใช้ได้ตามนี้>>> from sklearn import neighbors, datasets>>> iris = datasets.load_iris()หน้าตาที่ได้ก็จะประมาณนี้>>> print(iris.data) [[5.1 3.5 1.4 0.2] [4.9 3. 1.4 0.2] [4.7 3.2 1.3 0.2] [4.6 3.1 1.5 0.2] [5. 3.6 1.4 0.2] [5.4 3.9 1.7 0.4] [4.6 3.4 1.4 0.3]…เราสามารถดูว่าข้อมูลแต่ละคอลัมน์คืออะไรได้ตามนี้>>> print(iris.feature_names)[‘sepal length (cm)’, ‘sepal width (cm)’, ‘petal length (cm)’, ‘petal width (cm)’]ค่าพวกนี้เราเรียกว่า Feature ได้ครับ Feature คือข้อมูลที่เราคิดว่าจะนำไปแยกแยะสิ่งต่างๆ ที่เราต้องการจำแนก ยกตัวอย่างเช่น ถ้าเราต้องการจำแนกว่าข้อมูลไหนคือรถยนต์ ข้อมูลไหนคือรถมอเตอร์ไซค์ Feature หนึ่งที่เราจะใช้ก็อาจจะเป็น จำนวนล้อ ครับ ในที่นี้ข้อมูล Iris เราก็จะมี Feature เป็นจำนวน 4 Feature นั่นเองส่วนข้อมูลชนิดของดอก Iris จะถูกเก็บอยู่ใน iris.target ครับ>>> print(iris.target)[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]ตัว scikit-learn จะแปลงค่ามาเป็นตัวเลขให้เราแล้ว พร้อมที่จะนำเอาไปสร้างโมเดล แต่ถ้าเราอยากรู้ว่าแต่ละตัวเลขหมายความว่าอะไร เราดูจาก iris.target_names ได้ครับ>>> print(iris.target_names)[‘setosa’ ‘versicolor’ ‘virginica’]โดย Setosa คือเลข 0 ส่วน Versicolor คือเลข 1 และ Virginica คือเลข 2 ตามลำดับ (index ของ List ใน Python เริ่มที่เลข 0)การเตรียมข้อมูลเพื่อให้ดูง่ายๆ จะขอเก็บ Feature ทั้ง 4 ค่าในตัวแปร X และข้อมูลชนิดของดอก Iris ในตัวแปร y ตามนี้>>> X, y = iris.data, iris.targetทีนี้เวลาที่เราจะสร้างโมเดล เราจะแบ่งออกเป็น 2 Phases โดย Phase ที่ 1 คือ Training และ Phase ที่ 2 คือ Prediction หรือ Testing ตามรูปด้านล่างครับรูป Supervised Classification จาก http://www.nltk.org/book/ch06.htmlตอนที่เราอยู่ Training Phase เราจะดึงเอา Feature จากข้อมูล (ทำ Feature Extracting) มาใส่ Machine Learning Algorithm ส่วนตอนที่เราอยู่ Testing Phase เราก็จะเอาข้อมูลที่ไม่เคยเห็นมาก่อน หรือข้อมูลที่เอาไว้ทดสอบ มาดึง Feature ด้วย วิธี Feature Extracting แบบเดียวกับที่เราทำใน Training Phase ย้ำนะครับ ต้องเป็นวิธี Feature Extracing แบบเดียวกันทีนี้เราจะต้องแบ่งข้อมูลออกเป็น 2 ส่วน สำหรับแต่ละ Phase ทำได้ดังนี้>>> from sklearn.model_selection import train_test_split>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)เรากำลังแบ่งข้อมูลสำหรับเอาไว้ทดสอบ (X_test กับ y_test) เป็นจำนวน 30% และที่เหลือเอาไว้สร้างโมเดล (X_train กับ y_train)การสร้าง Machine Learning โมเดลบทความนี้ขอเลือกใช้ k-nearest neighbors มาลองเล่น คร่าวๆ ก็คือว่า เรากำลังจะหาเพื่อนใกล้ๆ เรา (จำนวน k) แล้วดูว่าเพื่อนแบบไหนมีมากกว่ากัน เราก็จะไปกับเพื่อนกลุ่มนั้น ส่วนรายละเอียดเดี๋ยวจะมาเล่าให้อ่านในบทความต่อๆ ไปนะครับ :Dเราจะนำเอา X_train กับ y_train มาใช้ในขั้นตอนนี้ครับ ตามนี้เลย>>> from sklearn import neighbors>>> knn = neighbors.KNeighborsClassifier(n_neighbors=15)>>> knn.fit(X_train, y_train)KNeighborsClassifier(algorithm=’auto’, leaf_size=30, metric=’minkowski’, metric_params=None, n_jobs=1, n_neighbors=15, p=2, weights=’uniform’)จบ Training Phase.. ใช้โค้ดแค่ 3 บรรทัดเราก็ได้โมเดลเอาไปลองเล่นได้ล่ะครับ เย้~ บทความนี้เราเน้นชิลๆ ดังนั้นเราจะข้ามขั้นตอนพวก Evaluate หรือ Validate ไปก่อนนะครับการนำโมเดลไปจำแนกข้อมูล หรือทำนายผลขั้นตอนสุดท้ายของเราล่ะครับ เราจะนำโมเดลของเราไปใช้จำแนกข้อมูล หรือทำนายผล ขั้นตอนนี้เราจะเอา X_test กับ y_test มาใช้>>> from sklearn.metrics import accuracy_score>>> y_pred = knn.predict(X_test)>>> print(accuracy_score(y_test, y_pred))0.9555555555555556เรียบร้อยครับ ได้ความแม่นยำประมาณ 95.56%บทความนี้ไม่ได้กล่าวถึงขั้นตอนการติดตั้ง Environment ต่างๆ ให้ใช้งานนะครับ จุดประสงค์คืออยากจะให้เห็นภาพรวมว่าการทำ Machine Learning จะมีขั้นตอนประมาณไหนบ้าง ซึ่งจริงๆ ยังมีขั้นตอนอื่นอีกนะ เช่น Feature Engineering, Model Validation, Model Evaluation อะไรพวกนี้ สำหรับคนที่ไม่คุ้นกับโค้ดเลย ผมแนะนำให้ติดตั้ง Anaconda ครับ ซึ่งจะมี scikit-learn มาให้เรียบร้อยแล้ว เรากดใช้ Jupyter Notebook แล้วเอาโค้ดด้านบนไปรันได้เลยหวังว่าการเห็นภาพรวมแบบตั้งแต่ต้นจนจบ (end-to-end) แบบนี้ จะทำให้เข้าใจการทำ Machine Learning กันมากขั้นนะครับ