บทความ

ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่

ปรับ Parameters ของโมเดล ML ด้วย GridSearchCV ใน Scikit-Learn

ปรับ Parameters ของโมเดล ML ด้วย GridSearchCV ใน Scikit-Learn

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

from sklearn import datasets
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
X = iris.data
y = iris.target
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
print(scores)

แล้วถ้าเราต้องการที่จะ Vary ค่าต่างๆ เราอาจจะใช้ Loop ได้ประมาณนี้

from sklearn import datasets
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
X = iris.data
y = iris.target
n_neighbors = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
weights = ['uniform', 'distance']
algorithms = ['auto', 'kd_tree']
score_collection = []
for n in n_neighbors:
for w in weights:
for a in algorithms:
knn = KNeighborsClassifier(n_neighbors=n, weights=w, algorithm=a)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
score_collection.append(scores)

print(score_collection)

แล้วถ้าเราอยากรู้ว่าค่า Parameters ชุดไหนที่ทำให้โมเดลเราได้ผลที่ดีที่สุด เราก็อาจจะต้องเก็บ Index ของแต่ละรอบไว้ และเขียนโค้ดเพื่อหาว่ารอบไหนที่ให้ผลที่ดีที่สุดให้ผลดีที่สุด แต่ถ้าเราใช้ GridSearchCV ก็จะได้ประมาณนี้

from sklearn import datasets
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
X = iris.data
y = iris.target
param_grid = dict(
n_neighbors=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
weights=['uniform', 'distance'],
algorithm=['auto', 'kd_tree']
)
knn = KNeighborsClassifier()
clf = GridSearchCV(knn, param_grid=param_grid, cv=10)
clf.fit(X, y)
print(clf.best_params_)

โค้ดเราดูเป็นระเบียบมากขึ้นเยอะ 😎 ถ้าเราอยากจะ Vary ค่า Parameter เพิ่ม เราก็แค่เพิ่มเข้าไปใน dict นั้นพอ ไม่ต้องไปเพิ่ม Loop แบบตัวอย่างด้านบน

วิธี GridSearchCV ยังมีข้อดีอีกข้อคือ เราสามารถเอาผลลัพธ์ที่ได้ไปทำนายผลต่อได้ครับ

clf.predict([[3, 5, 4, 2],])

ชีวิตสบายขึ้นไม่รู้กี่เท่า 😚

ทีนี้ถ้าข้อมูลเราเยอะมากๆ การที่จะทำให้วิธีวนลูปวิธีแรกทำงานได้เร็วขึ้น หรือเอาไปแยก Process ทำงาน ก็อาจจะต้องเหนื่อยเขียนโค้ดปรับๆ กัน ทีนี้ทีม Databricks ได้พัฒนาต่อยอด GridSearchCV ให้สามารถมารันบน Apache Spark ได้

เราแค่แก้ตรง Import!! ไม่ต้องมาแก้โค้ดตรงส่วนที่เขียน GridSearchCV เลย เด็ดมาก! 🎉 ตามนี้เลยครับ โค้ดส่วนที่แก้ไขคือส่วนที่เป็นตัวหนา

from sklearn import datasets
from spark_sklearn import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
iris = datasets.load_iris()
X = iris.data
y = iris.target
param_grid = dict(
n_neighbors=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
weights=['uniform', 'distance'],
algorithm=['auto', 'kd_tree']
)
knn = KNeighborsClassifier()
clf = GridSearchCV(knn, param_grid=param_grid, cv=10)
clf.fit(X, y)
print(clf.best_params_)

Happy Tuning ครับ 🎉


Kan Ouivirach | Machine Learning

04/05/2019