บทความ Machine Learning
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: 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 ที่เราโหลดขึ้นมาใหม่น่าจะพอเห็นภาพกันนะครับ 😉
โดย: Kan Ouivirach
| Machine Learning
ปรับ Parameters ของโมเดล ML ด้วย GridSearchCV ใน Scikit-Learn
ปกติเวลาที่เราอยากจะปรับโมเดล หรือหา Parameters ที่ดีที่สุดของโมเดลที่เหมาะสมกับข้อมูลที่เรานำมาสอน เราจะใช้วิธี Cross Validation และกำหนดว่าเราจะ Vary ค่าต่างๆ ของ Parameters ของเราอย่างไร หน้าตาโค้ดของเราก็จะประมาณนี้from sklearn import datasetsfrom sklearn.model_selection import cross_val_scorefrom sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()X = iris.datay = iris.targetknn = KNeighborsClassifier(n_neighbors=5)scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')print(scores)แล้วถ้าเราต้องการที่จะ Vary ค่าต่างๆ เราอาจจะใช้ Loop ได้ประมาณนี้from sklearn import datasetsfrom sklearn.model_selection import cross_val_scorefrom sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()X = iris.datay = iris.targetn_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 datasetsfrom sklearn.model_selection import GridSearchCVfrom sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()X = iris.datay = iris.targetparam_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 ได้databricks/spark-sklearnScikit-learn integration package for Apache Spark. Contribute to databricks/spark-sklearn development by creating an…github.comเราแค่แก้ตรง Import!! ไม่ต้องมาแก้โค้ดตรงส่วนที่เขียน GridSearchCV เลย เด็ดมาก! 🎉 ตามนี้เลยครับ โค้ดส่วนที่แก้ไขคือส่วนที่เป็นตัวหนาfrom sklearn import datasetsfrom spark_sklearn import GridSearchCVfrom sklearn.neighbors import KNeighborsClassifieriris = datasets.load_iris()X = iris.datay = iris.targetparam_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
มาเล่น Sentiment Analysis โดยใช้ Python กัน
How is it going? Positive, Neutral, or Negative?เกริ่นก่อน Sentiment Analysis เนี่ย มันคือกระบวนการที่เราสามารถบอกและแยกแยะอารมณ์ที่แสดงออกมาในข้อความหนึ่งๆ ซึ่งในข้อความนั้นๆ อาจจะออกมาเป็นแง่บวก (positive) แง่ลบ (negative) หรือแบบเฉยๆ (neutral) ก็ได้ปัญหาของเราคือ ถ้าเรามีข้อมูลประมาณด้านล่างนี้ เราจะเอาไปสร้างโมเดล Sentiment Analysis อย่างไร?ข้อมูล Feedback จากระบบหนึ่งเอ๊ะ ที่เราเรียนมาข้อมูลมันจะออกแนวแบ่งเป็น Column ไม่ใช่เหรอ แต่ละ Column คือ 1 Feature ไม่ใช่เหรอ แล้วถ้าเป็นข้อความแบบนี้เราจะทำอย่างไรดีนะ 🤔มีวิธี Preprocessing อยู่หลายแบบครับ แบบที่ง่ายๆ ที่เราจะมาลองกันในบทความนี้เรียกว่า Bag-of-words model ครับผม ขอเอาตัวอย่างจากใน Wiki มาอธิบายนะครับ ถ้าข้อความเราคือJohn likes to watch movies. Mary likes movies too.เราจะแปลงให้อยู่ในรูปแบบของ JSON ได้แบบนี้bag_of_words_1 = {"John": 1, "likes": 2, "to": 1, "watch": 1, "movies": 2, "Mary":1, "too": 1}สังเกตไหมว่าจริงๆ แล้วมันคือการนับคำนั่นเอง!! 😎 แล้วแต่ละ Key คือคำที่อยู่ในข้อความ และ Value คือจำนวนคำๆ นั้นในข้อความนั่นเอง ถ้ายังไม่คุ้น ลองมาดูในรูปแบบที่เราคุ้นเคยกันดีกว่าBag of Words จากข้อความ “John likes to watch movies. Mary likes movies too.”Key ใน JSON เราสามารถมองเป็นหัว Column ได้เลย ถ้ายังมึนๆ อยู่ ลองดูรูปด้านล่างนี้ครับ น่าจะช่วยให้เข้าใจมากขึ้น 👍รูป Bag of Words จาก https://slideplayer.com/slide/7073400/ทีนี้ปัญหาของเราก็จะอยู่ที่ว่าเราจะเลือกคำอะไรบ้างเอามาสร้างโมเดล ซึ่งตรงจุดนี้เป็นจุดที่ยากที่สุดครับ.. วิธีการเลือกคำนี่สามารถเป็นอีกศาสตร์หนึ่งได้เลย ศาสตร์นั้นคือ Natural language processing ครับผม ลองไปศึกษาเพิ่มเติมกันดูเนอะกลับมาที่ข้อมูลเราบ้าง เราจะใช้ตัวช่วยนับ CountVectorizer จาก Scikit-Learn ครับ ง่ายมาก! ตามนี้เลยimport pandas as pdfrom sklearn.feature_extraction.text import CountVectorizertext = [ 'Promptly answer to my request.', 'great turnaround time!', 'Fast response and great service!', 'As usual you took the request and completed in as few steps as possible and well done!', 'Very quick turnaround time and great communication. Thank you!', 'Really quick turnaround. Thanks!!', 'reduce the turn around time and increase/upgrade the interaction ability between the client and the pronto team during the building of the website.', 'Better turn around time for changes and updates. Better copywriting talents for web content rewrite requests.', 'Get back to us faster', 'Be more careful when fixing our site to not break the other coding on other pages', 'All of the information for this listing is already on the website that Pronto built. It is disappointing that this has taken so many tries to get right.', 'slow communication regarding SEO questions, emailing SEO team direct has been slower that going through my account rep- vague and incomplete answers wasting time', 'The time difference and language barrier are my main complaints. Otherwise our website looks great.', 'Process is way too slow. Working with another country seems to really slow things down alot.',]label = [ 'positive', 'positive', 'positive', 'positive', 'positive', 'positive', 'neutral', 'neutral', 'neutral', 'neutral', 'negative', 'negative', 'negative', 'negative',]df = pd.DataFrame(data={ 'text': text, 'label': label})vectorizer = CountVectorizer(stop_words='english')X_train = df.texty_train = df.labelX_train_vectorized = vectorizer.fit_transform(X_train)เพียงเท่านี้เราจะได้ข้อมูลของเราอยู่ในรูปแบบที่เราต้องการแล้ววววข้อมูลข้อความหลังจากที่ทำ Bag of Wordsถ้าเราอยากดูว่า CounterVectorizer เลือกคำอะไรมาให้เราบ้าง เราจะสั่งฟังก์ชั่น get_feature_names ตามนี้กับตัว vectorizer ของเราครับคำที่ CountVectorizer เลือกมาเท่านี้เราก็สามารถนำเข้าโมเดลของเราได้แล้วครับ จัดกันเลย~ ลอง Naive Bayes ละกัน# importfrom sklearn import naive_bayes# instantiateclf = naive_bayes.MultinomialNB()# fitclf.fit(X_train_vectorized, y_train)แล้วถ้าเราอยากจะลองทดสอบกับข้อความใหม่ เพื่อดูว่าจะเป็น Positive, Neutral หรือ Negative สิ่งที่เราต้องทำก่อนคือ เราต้องแปลงข้อความใหม่นั้นให้อยู่ใน Bag of Words แบบเดียวกับที่เราเอาเข้าไปสอนโมเดลของเราก่อนครับ ซึ่งวิธีการแปลงเราจะ “ต้อง” เอาตัว vectorizer ที่เราสร้างไว้กับข้อมูลที่ใช้สอนมาใช้ตรงนี้ครับ จุดนี้สำคัญเลย“เราแปลงข้อมูลที่เราใช้สอนด้วยวิธีไหน เราต้องแปลงข้อมูลที่เราจะใช้ทดสอบด้วยวิธีเดียวกัน”ทำได้ตามนี้ (ข้อความแรกเป็น Positive ข้อความที่ 2 เป็น Neutral ส่วนข้อความที่ 3 เป็น Negative)# positive, neutral, negativeX_test = [ 'Fast service! Thank you', 'wish it could have been resolved sooner as it was simple', 'Cannot get my website where I want because repeated requests are misunderstood, requests are simply not honored.',]X_test_vectorized = vectorizer.transform(X_test)ตัวแปร X_test_vectorized จะเป็นตัวแปรที่แปลงข้อความ 3 ข้อความนั้นให้อยู่ในรูปแบบของ Bag of Words ให้เรา ต่อจากนี้เราก็เอาไปทดสอบกับโมเดลของเราได้เลยโค้ดส่วนการสร้างโมเดล Sentiment Analysisเราเพิ่งจะสร้างโมเดลทำ Sentiment Analysis ไปเรียบร้อยแล้ว 🎉ผลที่ได้ออกมาก็ดูพอไปวัดไปวาได้ครับ แต่อย่าเพิ่งเชื่อถือมากไปนะ 😂 เราควรปรับโมเดลของเราให้ดีขึ้นเรื่อยๆ ทำให้น่าเชื่อถือมากขึ้น ข้อมูลเพิ่ม เลือกคำให้ดีขึ้น ทำ Cross Validation ทำ ฯลฯขอให้สนุกกับการทำ Sentiment Analysis ครับผม 😙
โดย: Kan Ouivirach
| Machine Learning
Visualize โมเดล Tree ใน Scikit-Learn
เวลาที่เราสร้างโมเดลประเภท Tree อย่างเช่น Decision Tree จะมีข้อดีอย่างหนึ่งคือโมเดลพวกนี้สามารถนำมาวาดรูปให้คนอ่านรู้เรื่องได้ (จริงๆ โมเดลอื่นก็วาดรูปได้นะ แต่ไม่ user friendly เท่ากับโมเดลประเภท Tree) ถ้าเราใช้ Scikit-Learn แล้วเราอยากจะดูว่าโมเดลเราหน้าตาเป็นแบบไหน เราจะทำอย่างไร?เริ่มด้วยการสร้างโมเดลแบบ Tree สักโมเดลหนึ่งมาก่อน ขอเป็น Decision Tree ละกันเนอะ เขียนโค้ดได้ตามนี้เลยfrom sklearn import tree, datasetsfrom sklearn.metrics import accuracy_scorefrom sklearn.model_selection import train_test_splitiris = datasets.load_iris()X, y = iris.data, iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)clf = tree.DecisionTreeClassifier()clf.fit(X_train, y_train)y_pred = clf.predict(X_test)print(accuracy_score(y_test, y_pred))ทีนี้ใน Module ที่ชื่อ tree ที่เรา import มาตอนแรกจะมีฟังก์ชั่นชื่อ export_graphviz ครับ เราจะใช้ฟังก์ชั่นนี้แหละสร้าง Graph ออกมา โดยฟังก์ชั่นนี้ใช้ Graphviz ครับ ซึ่งใช้ไฟล์ DOT language ในการอธิบายหน้าตาของ Graphให้เราเขียนโค้ดเพิ่มเพื่อเรียกใช้ export_graphviz ตามนี้tree.export_graphviz(clf,out_file=’tree.dot’,feature_names=iris.feature_names,class_names=iris.target_names,filled=True,rounded=True)เราจะใส่โมเดลที่เราสอน (clf) เข้าไป ตั้งชื่อ output file ว่า tree.dot ในไฟล์นั้นจะมีชื่อ feature (feature_names=iris.feature_names) มีชื่อ class (class_names=iris.target_names) แต่ละโหนดจะมีสี (filled=True) แล้วก็แต่ละโหนดจะเป็นสี่เหลี่ยมมนๆ (rounded=True)หลังจากรันโค้ดด้านบนเสร็จเราก็จะได้ไฟล์ tree.dot ออกมา หน้าตาเนื้อหาในไฟล์ก็จะประมาณนี้รูปแสดงข้อมูลในไฟล์ tree.dotอ่านไม่ค่อยรู้เรื่องเนอะ >_< เรามาทำให้เป็นรูปกันดีกว่า ให้เราติดตั้ง Graphviz ก่อนครับ ถ้าเป็นเครื่อง Mac ก็สั่งbrew install graphvizแต่ถ้าใช้เครื่องแบบอื่นลองตามไปดูวิธีที่หน้า Download ได้เลยครับผม พอติดตั้งเสร็จ เราสามารถแปลงเป็นไฟล์ PNG โดยใช้คำสั่งdot -Tpng tree.dot -o tree.pngเปิดรูปมาดูควรจะเห็นตามรูปด้านล่างนี้เลยครับรูปโมเดล Decision Tree กับข้อมูล Irisทีนี้ใครที่ทำโมเดลประเภทนี้ก็สามารถเอารูปนี้ไปช่วยเรื่อง communication ได้แล้ว~ เด็ด!ถ้าใครอยากเห็นโค้ดเต็มๆ สามารถดูได้ที่ intro-to-machine-learning/tree.ipynb ครับ ;)
โดย: Kan Ouivirach
| Machine Learning
มารู้จัก Mean Shift Clustering กัน
บทความก่อนหน้านี้เราพูดถึงวิธี Clustering กันไปแล้ววิธีหนึ่งคือ K-Means บทความนี้เรามารู้จักวิธี Clustering อีกวิธีหนึ่งที่ชื่อว่า Mean shift กันครับข้อแตกต่างระหว่าง Mean Shift กับ K-Meansที่เห็นได้ชัดๆ คือMean shift เป็น density-based clustering ส่วน k-means เป็น centroid-based clustering กล่าวคือ Mean shift จะใช้คอนเซปของ kernel density estimation (KDE) ในการหาตัวแทนกลุ่มของข้อมูล หรือ centroid ในขณะที่ k-means จะใช้ค่าเฉลี่ยระหว่างจุดกับ centroid ในการขยับ centroid ไปเรื่อยๆMean shift ไม่จำเป็นต้องรู้จำนวนกลุ่มของข้อมูลก่อน ส่วน k-means จำเป็นที่ต้องรู้ก่อน แต่ Mean shift ก็มีค่า parameter ที่เราต้องปรับเองตามการใช้งานครับ เค้าเรียกกันว่า kernel bandwidthหลักการทำงานของ Mean Shiftให้จุดทุกจุดเป็น cluster ของตัวมันเองก่อนเลย ถ้ามี 10 จุดข้อมูล ก็แปลว่าเรามี 10 clusters ก่อนเลยครับให้เราเลือก kernel ที่เหมาะสมกับข้อมูล ซึ่งโดยปกติแล้วจะเป็นฟังก์ชั่น Gaussian ครับ ตามสูตรของ Gaussian แล้ว เราจะได้ว่า kernel bandwidth ของเราคือ standard deviation นั่นเอง :Dคัดลอกจุดทุกจุดเก็บไว้ก่อนเป็น 2 ชุดข้อมูล แล้วนำจุดทุกจุดในชุดข้อมูลใดข้อมูลหนึ่ง ผมเรียกว่าเป็นข้อมูลชุดที่ 1 กับข้อมูลชุดที่ 2 ละกัน แล้วทำไมต้องแยกเป็น 2 ชุด? นี่เป็นเหตุผลทางด้านการเขียนโปรแกรมล้วนๆ ครับ :Pเสร็จแล้วเราจะมา estimate กับจุดทุกจุดในข้อมูลชุดที่ 2 โดยใช้ kernel ที่เราเลือกมากับจุดทุกจุดในข้อมูลชุดที่ 1 ครับ หรือพูดง่ายๆ ว่าเราใช้จุดทุกจุดในการอัพเดท cluster แต่ละ cluster ครับ ซึ่งจุดแต่ละจุดในข้อมูลชุดที่ 2 จะถูก estimate แล้วจะค่อยๆ เลื่อนเข้าสู่จุด convergence หรือจุดสูงสุดของ Gaussian (นึกภาพระฆังคว่ำ) แล้วเราอัพเดท cluster อย่างไรล่ะ? ขอยกไปอธิบายคร่าวๆ ต่อด้านล่างหลังจากที่ converge แล้ว ถ้าข้อมูลของเรามีการกระจายตัวหน้าตาแบบมี 3 ระฆังคว่ำ (หรือ 3 clusters) จุดข้อมูลของเราก็จะย้ายไปสู่จุดสูงสุดของ 3 ระฆังคว่ำนั้นโดยอัตโนมัติเองครับท้ายที่สุดคือการ assign จุดเหล่านั้นว่าควรจะอยู่ cluster ไหน ยังจำข้อมูลที่เราคัดลอกไว้ในข้อ 3 ได้ใช่ไหมครับ? เราก็เอาจุดเหล่านั้นมาทีละจุด เทียบระยะห่างระหว่างจุดสูงสุดของระฆังคว่ำที่เราได้มา จุดไหนใกล้ก็ assign จุดนั้นให้เข้าไปกับระฆังอันนั้นครับเป็นอันเสร็จสิ้น!สำหรับการ shift หรืออัพเดทค่า mean (เป็นเหตุผลที่เค้าเรียกว่า mean shift) ทำได้โดยใช้เทคนิค gradient ascent ครับ ซึ่งจริงๆ คือ gradient descent แต่แค่มีทิศตรงข้าม ลองดูสมการในรูป 1 ด้านล่างนี้ครับ เป็นรูปจากงานวิจัยของ Dorin Comaniciu กับ Peter Meerรูปพจน์ของ Mean Shiftสมการที่ 17 นี้เป็นพจน์ของ mean shift ครับ ซึ่งเราสามารถนำเอาส่วนที่ผมตีกรอบเส้นประสีแดงมาเป็นค่า mean ที่โดน shift แล้ว ส่วนฟังก์ชั่น g ในทีนี้ก็คือ kernel ของเรานั่นเอง ซึ่งในงานวิจัยนี้เค้าพิสูจน์ว่ามันเพียงพอสำหรับการ converge ลองตามไปอ่านกันดูนะครับ math เยอะสะใจดี >_<การเลือกค่า kernel bandwidth นั้นมีผลต่อจำนวน cluster ที่เราจะได้ ถ้าเราใช้ค่า bandwidth ที่ต่ำมากๆ เราอาจจะได้จำนวน cluster เท่ากับจำนวนจุดเลยก็ได้ แต่ถ้าเราเลือกค่าที่สูงเกินไป เราอาจจะได้แค่ 1 cluster ดังนั้นค่านี้ควรจะปรับให้เหมาะสมเองครับโดยการทดลองหรืออะไรก็แล้วแต่
โดย: Kan Ouivirach
| Machine Learning
เทคนิคง่ายๆ ในการเลือก Feature สำหรับโมเดล Machine Learning
การเลือก Feature หรือ Feature Selection เป็นอีกขั้นตอนหนึ่งในการสร้างโมเดล Machine Learning ซึ่งขั้นตอนนี้แม้จะเป็นขั้นตอนย่อยแต่ก็มีส่วนช่วยอย่างมากในการทำให้โมเดลของเรามีประสิทธิภาพมากขึ้นควรเลือก Feature แบบไหน?เราควรเลือก Feature ที่สามารถบอกความแตกต่างของสิ่งที่เราจะจำแนกได้ครับ That’s it! เรื่องนี้บางทีก็ง่ายครับ บางทีก็ยาก 😂 ดูตัวอย่างง่ายๆ กันดีกว่า ลองนึกถึงว่าถ้าเราต้องการสร้างโมเดลเพื่อจำแนกมอเตอร์ไซค์กับรถยนต์ Feature ที่เราควรเลือก.. “จำนวนล้อ” ครับ เพราะว่าจำนวนล้อเนี่ยเราสามารถแยกมอเตอร์ไซค์กับรถยนต์ได้น่าจะเกือบ 100% (ที่ไม่เต็มร้อย เพราะว่าอาจจะมีมอเตอร์ไซค์ที่มี 4 ล้อ) แล้ว Feature ที่เราไม่ควรเลือกก็อย่างเช่นพวก สีรถ อะไรแบบนี้ ลองนึกดูครับ ถ้ามีเพื่อนมาบอกเราว่า สิ่งของนั้นๆ มีสีแดง 🤦‍♂ เราจะบอกไม่ได้เลยว่ามันเป็นมอเตอร์ไซค์หรือรถยนต์เทคนิคในการเลือก Feature (หรือ Feature Selection)เทคนิค #1 ครับ ใช้ Domain Knowledge! นั่นก็คือ ใช้ความรู้ของมนุษย์นั่นเอง อย่างเรื่องจำแนกมอเตอร์ไซค์กับรถยนต์ เราจะเลือกใช้จำนวนล้อก่อนเลย ไม่ต้องมัวมานั่งดูข้อมูลเทคนิค #2 เราจะใช้ Count Plot ครับ เฉพาะกับข้อมูลที่เป็น Categorical นะครับ อย่างเช่น เพศ หรือ การศึกษาอะไรแบบนี้ เทียบกับ Label หรือ Class ที่เราจะจำแนกข้อมูล ทำอย่างไร? เราจะใช้ตัวอย่างข้อมูล Titanic กันข้อมูลของ Titanic เนี่ย เราต้องการที่จะทำนายกว่าคนประเภทไหนที่รอดชีวิตบ้าง ถ้าเราอยากรู้ว่า เพศ นี่เป็น Feature ที่เราควรเลือกหรือเปล่า เราจะเอามาทำ Count Plot ตามนี้ครับCount Plot ระหว่าง Sex กับ Survivedแบบนี้แปลว่าดีครับ เพราะอะไร? จาก Plot ที่เราได้จะเห็นว่าจำนวนที่ไม่รอดชีวิต มีจำนวนของเพศชายมีจำนวนมากกว่าเพศหญิง และจำนวนที่รอดชีวิตมีจำนวนเพศหญิงมากกว่าเพศชาย ดังนั้นเราควรเลือกเพศมาเป็นข้อมูลในการสร้างโมเดลของเราแล้วถ้าเราลองเลือก Feature อื่นมา Plot บ้างล่ะ? ลองเลือก Embarked ละกันCount Plot ระหว่าง Embarked กับ Survivedแบบนี้แปลว่า? เราอาจจะเลือกใช้ Embarked ในการสร้างโมเดลของเราหรือไม่เลือกก็ได้ครับ Feature นี้ไม่ชัดเจนเท่า Sex ถ้าเป็นผมก็อาจจะลองสร้างโมเดลทั้งแบบที่มี Embarked กับไม่มี Embarked ครับ แล้วเอามาเทียบผลลัพธ์กันเทคนิค #3 ใช้ Box Plot กับข้อมูลที่เป็น Continuous ครับ เรายังคงอยู่กับข้อมูล Titanic กัน ลองเลือก Age มา Plot ดูBox Plot ระหว่าง Age กับ Survivedถ้าเราเป็น Box เท่าๆ กันแบบนี้เลยแปลว่าอะไร? แปลว่าค่า Age นี่ใช้จำแนกว่าใครจะรอดหรือไม่รอดไม่ดีเท่าไหร่ครับ ลองมาดูอีกค่ากัน ค่า FareBox Plot ระหว่าง Fare กับ Survivedค่า Fare นี่แหละครับที่สามารถพอจะจำแนกได้ว่าใครรอดหรือไม่รอด จะเป็นได้ว่า Box ของแต่ละอันมีความต่างกัน แบบคนที่ไม่รอดจะมี Box ที่อยู่ต่ำกว่าแบบของคนที่รอด แต่! ตรงนี้ต้องระวังด้วยนะครับ สังเกตจุดดำๆ ด้านบนของ Box แต่ละอัน จุดดำๆ พวกนั้นเราเรียกว่า Outlier ครับ จริงๆ แล้วเราควรที่จะกำจัดสิ่งพวกนี้ออกก่อน บทความนี้อยากจะแค่เสนอเทคนิคในการเลือก Feature เฉยๆ นะครับ เรื่องตัด Outlier นี่ลองไปทำกันเองดูนะ 😙เป็นไงกันบ้างครับทั้ง 3 เทคนิคง่ายๆ ไม่ได้ออกแรงอะไรมากมาย แต่ก็เป็นส่วนช่วยให้โมเดลของเราประสิทธิภาพมากขึ้นมากกกกก แนะนำให้ใช้ทุกครั้งนะครับผมปล. โค้ดสั้นๆ อยู่ที่ Feature Selection Techniques เผื่ออยากเอาไปลองรันเล่น
โดย: Kan Ouivirach
| Machine Learning
Clustering Analysis
การทำ Clustering Analysis คือการที่เราพยายามที่จะจัดกลุ่มของข้อมูลที่มีลักษณะคล้ายๆ กันให้อยู่กลุ่มเดียวกัน การทำแบบนี้ช่วยให้เรารู้สึกข้อมูลนั้นๆ มากขึ้น และยังสามารถช่วยให้เราตัดสินใจอะไรบางอย่างได้ดีขึ้นอีกด้วยลองนึกถึงตัวอย่างทางธุรกิจสักตัวอย่างหนึ่ง สมมุติว่าเราต้องการที่จะส่ง Campaign อีเมลไปให้กลุ่มลูกค้าที่ชื่นชอบและสนใจสินค้าที่เกี่ยวกับ Computer วิธีหนึ่งที่เราจะทำได้ก็คือเอาข้อมูลลูกค้ามาแล้วก็จัดกลุ่มเอง หรือ Filter เอง วิธีนี้ก็ดีในระดับหนึ่งครับ ถ้าเรารู้จักข้อมูลของเราดีพอ แล้วเราก็รู้ว่าเราต้องการอะไร แล้วถ้าในกรณีที่เราไม่รู้ล่ะ? การทำ Clustering จะช่วยเราในเรื่องนี้ แล้วเราก็จะเห็นด้วยว่าข้อมูลของเราแต่ละข้อมูลมีความสัมพันธ์กันอย่างไรบ้างอีกด้วย ซึ่งจริงๆ แล้วเหมือนกับเรากำลังทำ Exploratory Analysis นั่นเอง ;)เรามาทำความรู้จักกับเทคนิคหนึ่งในการทำ Clustering กัน เทคนิคนั้นชื่อ K-Means ครับ K-Means เนี่ย เราจัดอยู่ในการเรียนรู้แบบ Unsupervised Learning ครับผม เพราะว่าเราไม่ต้องบอก หรือไม่ต้อง Supervise ตัวอัลกอริธึมว่าคำตอบคืออะไรเราเริ่มมาทำความรู้จัก K-Means กันจากชื่อของมัน K-Means ครับ เราแปลแบบง่ายๆ กันคือ เราต้องกำหนด K หรือ จำนวนกลุ่มที่เราต้องแบ่งก่อน เสร็จแล้วจุดศูนย์กลาง (Centroid) ของกลุ่มนั้นๆ เราจะใช้ค่า Mean ส่วนขั้นตอนการทำงาน ผมลองวาดออกมาเป็นรูปด้านล่างนี้ครับรูปขั้นตอนการทำงานของ K-Meansสมมุติว่าเรามีข้อมูล 1 Dimension (1D) ตามนี้d = {2, 4, 10, 12, 3, 20, 30, 11, 25}และกำหนดค่า K เป็น 2ขั้นตอนแรก Initializeขั้นตอนนี้ทำแค่ครั้งเดียว เราจะกำหนดค่า Centroid เริ่มต้นมา 2 ค่า (เนื่องจากเรากำหนดค่า K เป็น 2) สมมุติว่าเรากำหนดว่า จุด Centroid แรก (m1) มีค่า 2 และจุด Centroid ที่ 2 (m2) มีค่า 4ขั้นตอนที่ 2 Assignเราจะดูข้อมูลแต่ละตัวใน {2, 4, 10, 12, 3, 20, 30, 11, 25} ว่าแต่ละค่ามีค่าใกล้เคียง หรือระยะห่างจากข้อมูลนั้นไปยังจุด m1 หรือ m2 ถ้าข้อมูลนั้นๆ ใกล้กับจุด m1 เราก็จะให้จุดนั้นอยู่กลุ่มเดียวกับ m1 ให้ทำแบบนี้จนครบทุกจุด ใน d (ถ้าสมมุติว่าได้ค่าระยะห่างเท่ากัน ก็ให้เลือกกลุ่มใดกลุ่มหนึ่งได้เลย)ขั้นตอนที่ 3 Update Centroidsหลังจากที่เรา Assign ทุกจุดแล้ว เราจะปรับค่า Centroid เพื่อให้ได้ Centroid ค่าใหม่ การปรับค่านี้เราก็จะหาค่าเฉลี่ย (Mean) กับข้อมูลทุกตัวในกลุ่มนั้นๆขั้นตอนที่ 4 Converge?ขั้นตอนนี้เป็นการเช็คเฉยๆ ว่าข้อมูลมีการย้ายกลุ่มหรือไม่ ถ้ามีการย้ายกลุ่มเกิดขึ้น เราก็จะย้อนกลับไปที่ขั้นตอนที่ 2 ทำไปเรื่อยๆ จนกว่าจะไม่มีการย้ายข้อมูลจะเห็นได้ว่าเรามีการทำซ้ำๆ เกิดขึ้นจนกว่าเราจะได้กลุ่มข้อมูลที่คงตัวครับ :D ลองดูตารางข้างล่างนี้ประกอบเนอะจะเห็นได้ว่ารอบที่ 5 เรามี Centroid ปัจจุบันเป็นค่าเดียวกับ Centroid ใหม่ ตรงนี้แหละครับ ที่เราบอกได้ว่ามัน Converge และเราสามารถจบการทำงานได้เลย สุดท้ายเราจะได้กลุ่มแรก {2, 3, 4, 10, 12, 11} ที่มี Centroid มีค่าเท่ากับ 7กลุ่มที่ 2 {20, 30, 25} ที่มี Centroid มีค่าเท่ากับ 25ถ้าอยากเขียนโค้ด? จัดไปครับ ตามนี้เลยhttps://gist.github.com/zkan/77a8bf05b7b2105337d3f7b457e73efeผลที่ได้ก็ตามนี้ครับ*หมายเหตุ จากตัวอย่างข้างบนผมใช้ตัวเลขนะครับ จะได้คำนวณง่ายๆ แต่ในปัญหาจริงๆ ข้อมูลจะไม่ได้มาเป็นตัวเลขเสมอไป งานของเราก็คือเราต้อง Preprocess ข้อมูลพวกนี้ก่อน ให้มาอยู่ในรูปที่เราสามารถคำนวณได้นั่นเองครับ แล้วก็ข้อมูลจริงๆ ไม่ได้มีแค่ 1D มันจะมาเป็นหลายๆ D เสมอ :D เราก็ค่อยไปหาการคำนวณระยะห่างของข้อมูลให้เหมาะสมกับจำนวน D ครับ
โดย: Kan Ouivirach
| Machine Learning
การจัดการ Missing Data
ทำไมเราถึงต้องมาดูการจัดการ Missing Data (ข้อมูลที่หายไป) กันด้วยนะ? เกี่ยวอะไรกับ Machine Learning เหรอ?เรื่องนี้เกี่ยวข้องโดยตรงกับ Machine Learning เลยครับ โดยเฉพาะตอนที่เรากำลังที่จะสร้างโมเดล Machine Learning เพราะอะไรถึงเกี่ยวล่ะ? มาดูข้อมูลง่ายๆ กันครับ เช่น ถ้าเราต้องการที่จะสร้างโมเดลทำนายความสูงของคนจากอายุ เราก็อาจจะมีข้อมูลประมาณนี้แล้วเราก็อาจจะสร้างโมเดล Linear Regression กับข้อมูลชุดนี้ แล้วเอาโมเดลไปทำนายว่าอายุ 23 น่าจะมีความสูงเท่าไหร่ ก็ดูไม่มีปัญหาอะไรในโลกความเป็นจริงข้อมูลเราอาจจะมีไม่ครบ หรือเราทำแบบสอบถามไปแล้วเค้าไม่ตอบ หน้าตาข้อมูลก็จะมีประมาณนี้ข้อมูลความสูงที่อายุ 21 ของเราหายไป ซึ่งตรงนี้เราจะไม่สามารถสร้างโมเดลได้ครับ เนื่องจากสมการทางคณิตศาสตร์ของ Machine Learning โมเดล (รวมไปถึงสมการคณิตศาสตร์อื่นๆ) จะไม่มีการเอาค่าว่างๆ ไปคำนวณร่วมกับค่าเลขอื่นๆ ลองสมการง่ายๆ ดูก็ได้ครับ อ่ะ ไหนลองหาผลรวมของความสูงหน่อย? เราจะ.. 160 + ? + 175.5 + 173 เอ่อ.. คำนวณไม่ได้ นั่นแหละครับ Machine Learning ก็เหมือนกันวิธีแก้ Missing Data นี่มีหลายวิธี วิธีที่ง่ายที่สุดแบบแทบไม่ต้องใช้ความคิดเลยคือลบแถวที่มี Missing Dta นั้นทิ้งไปเลย! :joy: วิธีนี้ก็อาจจะทำให้ผลของโมเดลดีขึ้นก็ได้นะ อย่ามองข้ามๆแต่ว่าบทความนี้อยากจะพูดถึงวิธี Mean/Median/Mode Imputation Imputation ครับ ชื่อนี่อาจจะดูหรูหน่อย ถ้าเราเรียกแบบบ้านๆ ก็คือเราแทนค่า Missing Data ด้วยค่า Mean/Median/Mode นั่นเอง~ถ้าเราแทนค่าด้วย Mean เราจะได้ตามนี้ (160 + 175.5 + 173) / 3ถ้าเราแทนค่าด้วย Mode เราจะได้ตามนี้ (ในที่นี้แค่เลือกสักค่ามาแทนครับ เนื่องจากค่า 160, 175.5 และ 173 มีจำนวนเท่ากัน)ถ้าเราแทนค่าด้วย Median เราก็จะได้ตามนี้ (เรียงข้อมูลก่อน 160, 173, 175.5 เลือกค่ากลางคือ 173)เท่านี้เราจะได้ข้อมูลครบแล้วครับ พร้อมที่จะเอาไปสร้างโมเดลต่อไปแล้ววิธีไหนให้ผลดีที่สุด? จะตอบได้ก็ต่อเมื่อเราได้ลองสร้างโมเดลจากข้อมูลแต่ละแบบ แล้ววัดผลว่าแบบให้ผลดีที่สุดครับข้อควรระวัง ไม่ใช่ว่าถ้า Median Imputation ให้ผลดีที่สุด เราจะสามารถนำเอาวิธี Median Imputation ไปใช้กับข้อมูลอื่นได้เลยนะครับ ข้อมูลอื่นก็เป็นส่วนของข้อมูลอื่น เรายังคงต้องทดลองกับหลายๆ วิธีอยู่ดี ;)
โดย: Kan Ouivirach
| Machine Learning
วัดประสิทธิภาพของโมเดล (Two-Class Prediction)
การที่เราสร้างโมเดลๆ หนึ่งขึ้นมาทำนายผลนั้น การวัดประสิทธิภาพของโมเดลเป็นสิ่งที่สำคัญ และจำเป็นต้องทำเพื่อเราจะได้รู้ว่าโมเดลนั้นๆ ดีแค่ไหนก่อนที่เราจะทำไปใช้งานจริง บทความนี้เลยอยากจะเขียนถึงการวัดผลโดยใช้ปัญหาที่เรียกว่า Two-Class Prediction หรือ Binary Classification ซึ่งเป็นการวัดประสิทธิภาพที่เรานิยมใช้กัน ตัวอย่างของปัญหานี้ก็อย่างเช่น การตรวจจับสแปมหรือไม่ ถ้าเป็นก็ตอบ Yes ถ้าไม่เป็นก็ตอบ No เป็นต้นโดยเราจะบอกว่าผลลัพธ์ที่ได้ว่าเป็นคลาส Positive หรือ Negative มีได้ 4 แบบ คือTrue Positive (TP) หมายความว่า เราได้ผลลัพธ์จากการทำนายคือ p และค่าจริงๆ ก็คือ p ด้วยFalse Positive (FP) หมายความว่า เราได้ผลลัพธ์จากการทำนายคือ p แต่ว่าค่าจริงๆ แล้วคือ nTrue Negative (TN) หมายความว่า เราได้ผลลัพธ์จากการทำนายคือ n และค่าจริงๆ ก็คือ n ด้วยFalse Negative (FN) หมายความว่า เราได้ผลลัพธ์จากการทำนายคือ n แต่ว่าค่าจริงๆ แล้วคือ pค่า TN จะกลับกันกับ TP และ FN จะกลับกันกับ FP ตามลำดับอ่านแล้วอาจจะสับสน อย่าเพิ่งปิดบทความนี้ครับ >_< ใจเย็นๆ ขอผมยกตัวอย่างมาอธิบายเพิ่มเติมก่อนนะครับ จะได้เห็นภาพมากขึ้น สมมุติว่าเราต้องการจะทำนายว่า พฤติกรรมของคนๆ นี้ผิดปกติหรือไม่? หรืออีกนัยหนึ่งคือ เราต้องการที่จะตรวจจับพฤติกรรมที่ผิดปกติของคนๆ หนึ่งในที่นี้จะได้ว่า พฤติกรรมที่ผิดปกติคือคลาส Positive ส่วนพฤติกรรมปกติคือคลาส Negative จะได้ว่าTP คือ ระบบเราตรวจจับได้ว่าคนๆ นี้ผิดปกติ (p) และ คนๆ นี้ได้มีพฤติกรรมผิดปกติจริงๆ (p)FP คือ ระบบเราตรวจจับได้ว่าคนๆ นี้ผิดปกติ (p) แต่ว่า จริงๆ แล้ว เค้าไม่ได้ทำอะไรผิดเลย (n)TN คือ ระบบเราไม่ได้ตรวจจับอะไรเลย (n) และ คนๆ นี้ก็ไม่ได้ทำผิด (n)FN คือ ระบบเราไม่ได้ตรวจจับอะไรเลย (n) แต่ว่า คนๆ นี้ จริงๆ แล้วเค้ามีพฤติกรรมที่ผิดปกติ! (p)พอนึกออกรึเปล่าครับ? เอาอีกสักตัวอย่างเนอะ อย่างถ้าเราเขียนโมเดลระบบตรวจจับสแปมเมล ถ้าเจอสแปมเมลให้ลบทิ้งเลย (ระบบ Aggressive หน่อยๆ)ในที่นี้จะได้ว่า เมลที่เป็นสแปมคือคลาส Positive ส่วนเมลปกติคือคลาส NegativeTP คือ ระบบทำนายว่าเมลนี้เป็นสแปม (p) และ มันก็เป็นสแปมจริงๆ (p)FP คือ ระบบทำนายว่าเมลนี้เป็นสแปม (p) แต่ว่า จริงๆ แล้วเมลนี้เป็นเมลปกติ เช่น ข่าวสารทั่วไป เมลเกี่ยวกับงานต่างๆ (n)TN คือ ระบบทำนายว่าเมลนี้เป็นเมลปกติ (n) และ เมลนี้ก็ปกติจริงๆ (n)FN คือ ระบบทำนายว่าเมลนี้เป็นเมลปกติ (n) แต่ว่า จริงๆ แล้วมันเป็นสแปม! (p)ค่าที่ได้จาก 2 ตัวอย่างข้างต้นนี้ สามารถช่วยให้เราวิเคราะห์และนำไปพัฒนาโมเดลให้ดียิ่งขึ้นได้อีก จากตัวอย่างแรกจะเห็นได้ว่าค่า FN นั้นสำคัญมาก ถ้าค่า FN เราสูงไปแสดงว่า เราตรวจจับคนร้ายไม่ได้เลย และจากตัวอย่างที่สองจะเห็นได้ว่าค่า FP นั้นสำคัญ เนื่องจากเป็นระบบแนวโหดที่เวลาเจอสแปมแล้วจะลบทิ้งเลย ดังนั้นถ้าค่า FP สูง ระบบเราก็อาจจะลบเมลสำคัญๆ ของเราทิ้งไปนั่นเองที่เขียนมาด้านบนอาจจะจำยากหน่อย ว่าแบบไหนจะเรียก False Positive หรือแบบไหนเราจะเรียกว่า False Negative ผมวิธีจำง่ายๆ มาเสนอครับ ตามนี้เลยให้ดูก่อนว่าเป็น Positive หรือ Negative โดย Positive คือ โมเดลของเราทำนายว่ามันเป็น Positive (เป็นคนร้ายหรือเป็นสแปม)แล้วเราค่อยดูว่า True หรือ False ครับ ถ้า True คือ ที่ โมเดลของเราทำนายไปนั้น ถูกต้องแล้ว ถ้า False คือ โมเดลเราทำนายผิดเวลาเราตรวจหาอะไรก็ให้สิ่งนั้นเป็น Positive เช่น จะตรวจหาสแปม เราก็ให้สแปมเป็น Positive แล้วถ้าระบบเราทำนายว่าเป็นสแปมจริงๆ ก็แปลว่าเราได้ค่า True Positive ถ้าระบบเราทำนายว่าไม่ใช่สแปม แต่จริงๆ เป็นสแปม ก็แปลว่าเราได้ False Positive นั่นเองหวังว่าจะได้ประโยชน์กันนะครับ
โดย: Kan Ouivirach
| Machine Learning
Cross Validation กับ ML
บทความนี้เราจะมาทำให้โมเดล Machine Learning ของเราน่าเชื่อถือโดยใช้เทคนิคที่เรียกว่า Cross Validation กัน โดยทั่วไปแล้ว เราจะนำเอาเทคนิคนี้มาวัด Performance ของโมเดล เลือกโมเดลที่ดีที่สุดแล้ว นอกจากนี้เรายังนำเอา เทคนิคนี้มาช่วยป้องกันปัญหา Overfitting ที่ได้เขียนถึงในบทความ ปัญหา Overfitting ใน Machine Learning คืออะไร [link ไปบทความเก่า] อีกด้วยนะเมื่อก่อนคำถามที่ผมโดนถามบ่อยๆ เป็นคำถามแรกๆ เลย (หลายๆ คนก็น่าจะโดนถามเหมือนกัน) ตอนที่นำเสนอผลที่ได้จากโมเดล คือ “ได้ทำ Cross Validation มาหรือยัง?” ถ้าคำตอบคือยัง ก็แปลว่าเราไม่ต้องนำเสนอต่อล่ะ T Tเทคนิคนี้จึงเป็นเทคนิคที่สำคัญมาก ที่ทุกคนควรรู้และทำให้เป็นถ้าจะมาสายนี้ครับ เรามาทำความรู้จักกับมันกันดีกว่าชื่อวิธีการที่ใช้กันโดยทั่วไปคือ k-fold Cross Validation โดยที่ค่า k จะเป็นตัวเลขหนึ่งที่เราจะเลือกมาเพื่อแบ่งเป็นจำนวนของกลุ่มข้อมูล เช่น ถ้า k = 5 เราก็จะแบ่งข้อมูลออกเป็น 5 กลุ่ม (หรือ fold) นั่นเองสรุปขั้นตอนโดยรวมจะประมาณนี้สลับข้อมูลแบบ randomแบ่งข้อมูลออกเป็นกลุ่มตามจำนวน k ที่กำหนด สมมุติว่าเราแบ่งออกเป็น 5 กลุ่ม เพื่อให้เข้าใจง่ายขึ้นจะแสดงข้อมูลแต่ละกลุ่มเป็นตัวเลขแบบนี้ [1, 2, 3, 4, 5]เราจะนำข้อมูล 4 กลุ่ม เช่น [2, 3, 4, 5] ไปสอนโมเดล และอีก 1 กลุ่มที่เหลือ [1] ไปทดสอบโมเดล จดผลลัพธ์ไว้ เช่น จดค่า Accuracy ไว้พอเสร็จแล้ว รอบถัดไปเราก็จะนำข้อมูล [1, 3, 4, 5] ไปสอน และอีก 1 กลุ่มที่เหลือ [2] ไปทดสอบโมเดลทำแบบนี้วนไปจนกว่าเราจะได้ทดสอบกับกลุ่มข้อมูลครบทั้ง 5 กลุ่มพอทำครบเราก็จะนำเอาค่า Accuracy หรือค่าอื่นๆ ที่เราจดไว้มาหาค่าเฉลี่ย แล้วเราก็จะได้ Performance ของโมเดลของเราไปนำเสนอเป็นที่เรียบร้อย ^^ ถ้าเราอยากปรับปรุงโมเดลของเรา เราก็ทำ Cross Validation แบบนี้อีก แล้วดูว่าค่าเฉลี่ยที่เราได้มามีค่ามากขึ้นหรือเปล่า ถ้ามากขึ้นก็แปลว่าโมเดลเราดีขึ้นนั่นเองจะเห็นได้ว่าการทำแบบนี้ทำให้ข้อมูลผ่านโมเดลของเราทั้งหมด ลดความลำเอียงของโมเดลของเรา และทำให้โมเดลนั้นน่าเชื่อถือมากขึ้นเผื่อมีใครอยากลอง บทความก่อนหน้านี้เราลองเล่น Machine Learning โดยใช้ scikit-learn [link ไปบทความเก่า] ทีนี้ถ้าเราอยากลองทำ Cross Validation ล่ะ? ก็ทำได้ตามนี้เลย>>> from sklearn.cross_validation import cross_val_score>>> knn = KNeighborsClassifier(n_neighbors=5)>>> scores = cross_val_score(knn, X, y, cv=10, scoring=’accuracy’)>>> print(scores)[ 1. 0.93333333 1. 1. 0.86666667 0.933333330.93333333 1. 1. 1. ]จะเห็นได้ว่าเราไม่จำเป็นต้องแบ่งเป็น Training Data หรือ Test Data ก่อน เราสามารถโยนข้อมูลทั้งหมดทั้ง X และ y เข้าไปยัง cross_val_score ได้เลย โดยฟังก์ชั่นนี้จะไปแบ่งกลุ่มข้อมูลให้เราเองสุดท้ายถ้าอยากหาค่าเฉลี่ย เราก็>>> print(scores.mean())0.966666666667สุดท้ายแล้วก็อยากฝากไว้ครับว่าอย่าใจร้อนเอาโมเดลของเราไปใช้งานจริง ถ้าเห็นว่าผลของมันออกมาดี ซึ่งผลที่ออกมาดี อาจจะเป็นเพราะโมเดลของเรา Overfit ก็เป็นได้ อยากให้เสริมความมั่นใจด้วยการทำ Cross Validation กันก่อนทุกครั้งนะครับ :)

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

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

หมวดหมู่

พบหมวดหมู่ ได้ที่นี่เร็ว ๆ นี้

พบหมวดหมู่ ได้ที่นี่เร็ว ๆ นี้

Tags

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้

พบคำสำคัญ ได้ที่นี่เร็ว ๆ นี้