8 มกราคม 2559

Published มกราคม 08, 2559 by with 1 comment

เริ่มต้นการทำ Machine Learning ด้วย Scikit-learn

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปเริ่มต้นการทำ Machine Learning ด้วย Scikit-learn กันครับ


ก่อนอ่านบทความนี้แนะนำให้อ่านบทความ Machine Learning คืออะไร ? ก่อนครับ

Scikit-learn เป็นโมดูลสำหรับใช้ทำ Machine Learning และ Data Mining ในภาษาไพทอน
ใช้ 3-Clause BSD license
รองรับทั้ง Python 2 และ Python 3

สามารถติดตั้งได้โดยใช้คำสั่ง pip :
pip install scikit-learn

เมื่อติดตั้งเสร็จแล้วมาเริ่มต้นการทำ Machine Learning ด้วย Scikit-learn กันครับ
รูปภาพแสดงการทำงานของ Scikit-learn
test

โหลด dataset ตัวอย่าง


มาเริ่มต้นทำ ML กัน อย่างแรกต้องดึงข้อมูลเข้ามาใน python ก่อน เนื่องจากเราไม่ต้องการเสียเวลาสร้างข้อมูลใหม่ จึงดึง dataset ตัวอย่างที่มีอยู่มาใช้งาน ข้อมูลที่เราจะดึงเข้ามาคือ Iris dataset เป็นตัวอย่างฐานข้อมูลดอกไม้ Iris กว่า 150 ชนิด มาพร้อมด้วย sepal length (cm) , sepal width (cm) , petal length (cm) และ petal width (cm)

ดอก Iris setosa เป็นข้อมูลที่อยู่ใน Iris dataset 
ดอก Iris setosa เป็นข้อมูลที่อยู่ใน Iris dataset
เดติดภาพ วิกิพีเดีย โดย Radomil[/caption]

มีคุณสมบัติของข้อมูล 4 อย่าง ดังนี้











คุณสมบัติของข้อมูล (Features) ใน Iris dataset:

  1. sepal length in cm

  2. sepal width in cm

  3. petal length in cm

  4. petal width in cm

Target classes to predict:

  1. Iris Setosa

  2. Iris Versicolour

  3. Iris Virginica


ดึง Iris dataset เข้ามา
>>> from sklearn.datasets import load_iris
>>> iris = load_iris()
>>> type(iris)
<class 'sklearn.datasets.base.Bunch'>
>>> iris.keys()
dict_keys(['target', 'target_names', 'data', 'DESCR', 'feature_names'])

สามารถดึงข้อมูลมาใช้งานได้โดยใช้คำสั่ง .data
>>> iris.data
array([[ 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.9,  3. ,  5.1,  1.8]])

หากใช้คำสั่ง .data.shape เราก็สามารถรู้ array ของ (จำนวนตัวอย่าง,จำนวนคุณลักษณะ) ได้
>>> iris.data.shape
(150, 4)

การเรียนรู้แบบมีผู้สอน (Supervised Learning)


[caption id="" align="aligncenter" width="519"]รูปภาพแสดงแผนผังการเรียนรู้แบบมีผู้สอน Supervised Learning รูปภาพแสดงแผนผังการเรียนรู้แบบมีผู้สอน Supervised Learning[/caption]

Classification- K Nearest Neighbors


K nearest neighbors (kNN) เป็นหนึ่งในกระบวนการเรียนรู้ที่ง่ายที่สุด : รับค่าใหม่ เป็นข้อมูลที่ไม่รู้จัก โดยค้นหาในฐานข้อมูลที่อ้างอิงสิ่งที่มีคุณลักษณะใกล้เคียง และมอบหมายให้ predominant class
from sklearn import neighbors, datasets
iris = datasets.load_iris()
X, y = iris.data, iris.target # จำนวนตัวอย่าง,จำนวนคุณลักษณะ
knn = neighbors.KNeighborsClassifier(n_neighbors=1)
knn.fit(X, y)
# ดอกไม้ iris อะไร ที่มีขนาด 3cm x 5cm และมีขนาดกลีบเลี้ยง 4cm x 2cm
print(iris.target_names[knn.predict([[3, 5, 4, 2]])])
ผลลัพธ์

['virginica']

แล้วสามารถบันทึก Classification สิ่งที่ Scikit-learn ได้เรียนรู้ เพื่อให้สามารถเรียกใช้งานหลังจบงานได้ด้วยโมดูล pickle
from sklearn.externals import joblib
joblib.dump(knn, 'filename.pkl')
ดึงข้อมูลจาก Classification ที่บันทึกไว้ กลับมาใช้งานต่อ
knn = joblib.load('filename.pkl')

การเรียนรู้แบบไม่มีผู้สอน (Unsupervised learning)


เป็นการเรียนรู้ที่ไม่ใช้ labels ใด ๆ ใช้เพียงข้อมูลที่ได้รับ

Dimensionality reduction กับ PCA (Principal Components Analysis)


สรุปย่อ ๆ PCA คือ การหาแกนที่สำคัญเมื่ออ้างอิงจากข้อมูล
เป็นส่วนหนึ่งของ factor analysis แนะนำให้ศึกษา factor analysis ก่อนครับ

เริ่มต้น Dimensionality reduction กับ PCA
from sklearn import decomposition
pca = decomposition.PCA(n_components=2)
pca.fit(iris.data)
X = pca.transform(iris.data)

นำมาแสดงเป็นแผนภาพ
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=iris.target)
plt.show()
ผลลัพธ์
การเรียนรู้แบบไม่มีผู้สอน (Unsupervised learning) ในการทำ Machine Learning ด้วย Scikit-learn ในภาษา Python สีน้ำเงิน คือ Setosa สีเขียว คือ Versicolour สีแดง คือ Virginica

การจัดกลุ่ม (Clustering)


การจัดกลุ่ม (Clustering) เป็นวิธีการหนึ่งที่แบ่งข้อมูลออกเป็นกลุ่ม (cluster) โดยพิจารณาให้แต่ละแถวเสมือนเป็นวัตถุ แล้วจับกลุ่มให้กับวัตถุที่มีความคล้ายคลึงกันอยู่ใน cluster เดียวกัน วัตถุที่อยู่ต่าง cluster จะมีความคล้ายคลึงกันน้อยที่สุด
from sklearn.cluster import KMeans
km = KMeans(3)
km.fit(X)
print(km.cluster_centers_)
plt.scatter(X[:, 0], X[:, 1], c=iris.target)
plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], marker='o', s=100)
plt.show()

ผลลัพธ์
[[-2.64084076 -0.19051995]
[ 0.66443351 0.33029221]
[ 2.34645113 -0.27235455]]
การจัดกลุ่ม (Clustering) ด้วยการเรียนรู้แบบไม่มีผู้สอน (Unsupervised learning) ในการทำ Machine Learning ด้วย Scikit-learn ในภาษา Python จุดสีน้ำเงินใหญ่คือ cluster ที่ถูกแบ่ง

ยินดีด้วยครับตอนนี้คุณได้เป็นนักวิทยาศาสตร์ข้อมูล (Data Scientist) แล้ว :D

อ่านเอกสาร API เพิ่มเติมได้ที่ http://scikit-learn.org/stable/documentation.html
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

1 ความคิดเห็น:

แสดงความคิดเห็นได้ครับ :)