บทความ
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: 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 ครับ 🎉
โดย: Pii
| Blockchain
บล็อคเชนกับการกระจายฐานข้อมูล(distributed ledgers)
เทคโนโลยีบล็อคเชนในความหมายสั้นๆก็คือการกระจายฐานข้อมูลที่เหมือนกันออกมาหลายจุด ครอบครองโดยหลายองค์กร เพื่อความโปร่ง สามารถตรวจสอบได้ง่าย(เพราะมีหลายชุดให้เทียบกัน) และมีความยืดหยุ่นสูง การประยุกต์ใช้บล็อคเชนจะทำให้เราไม่ต้องพึ่งพาและเชื่อใจให้องค์กรใดองค์กรหนึ่งดูแลรักษาข้อมูลสำคัญของเราและข้อมูลที่เกิดจากเราเหมือนแต่ก่อน เราจะสามารถเข้าถึงและควบคุมจัดการดูแลข้อมูลเหล่านี้ด้วยเราเองได้มากกว่าแต่ก่อนบล็อคเชนนั้นจริงๆแล้วมีแนวคิดมาจากฐานข้อมูลประเภทบัญชี(ledgers)ที่เราต่างรู้จักกันเป็นอย่างดี เช่น บัญชีธนาคาร บัญชีบัตรเครดิต และบัญชีรายรับรายจ่ายภาครัฐ ฐานข้อมูลบัญชีที่ถูกเก็บดูแลโดยองค์กรใดองค์กรหนึ่งเหล่านี้มีคุณสมบัติข้อดีหลายอย่าง เช่น การควบคุมคนที่จะเขียนข้อมูลเพิ่มลงในฐานข้อมูล(จำกัดสิทธิ์) ประสิทธิภาพและความเร็วในการเขียนและอ่านข้อมูล(รู้ว่าฐานข้อมูลตั้งอยู่ที่ไหน) และความสามารถในการควบคุมแก้ไขเข้าถึงข้อมูลเหล่านั้น เราเรียกการแก้ไขข้อมูลบัญชี 1 รายการว่า 1 transaction ข้อมูลในแต่ละ transaction จะต้องเขียน(insert)ให้ครบถ้วนเพื่อให้ตัวเลขทั้งหมดถูกต้อง transaction แต่ละอันจะต้องไม่ถูกแก้ไขหลังจากเขียนเสร็จไปแล้ว หรือถ้าสามารถแก้ไขได้จะต้องมีขั้นตอนตรวจสอบที่มีมาตรฐานมากเพียงพอ ปัจจุบันการกระจายฐานข้อมูลประเภทบัญชี(distributed ledgers)มีแนวโน้มเป็นที่นิยมมากขึ้นเรื่อยๆ ซึ่งฐานกระจายเหล่านี้ไม่ต้องพึ่งองค์กรใดองค์กรหนึ่งในการดูแลข้อมูลทั้งหมด องค์กรที่มีส่วนในการร่วมถือครองฐานข้อมูลเหล่านี้จะต้องตกลงเงื่อนไขในการใช้งานร่วมกัน เช่น การใช้ public/private key ในการสั่งเขียนข้อมูลเพิ่มลงในระบบ ซึ่งระบบก็จะรู้ว่าใครเป็นคนสั่งให้เขียนและคนๆนั้นมีสิทธิ์ที่จะเขียนหรือไม่ ระบบฐานกระจายนี้จะช่วยให้องค์กรที่มีส่วนร่วมสามารถเข้าถึงข้อมูลได้สะดวกรวดเร็วและประหยัดขึ้น(เทียบกับการต้องร้องขอเอาจากองค์กรอื่น) มีความน่าเชื่อถือมากขึ้น(ไม่ใช่นึกจะแก้ตัวเลขอะไรก็แก้ได้เลย) และปลอดภัยมากขึ้น(คนแฮกต้องแฮกหลายที่) อย่างไรก็ตามการอ่านข้อมูลล่าสุดจากระบบฐานกระจายดังกล่าวจะช้ากว่าฐานเดี่ยวมาก เพราะต้องคอยตรวจสอบจากฐานอื่นว่าข้อมูลตรงกันหรือไม่ และรวมไปถึงการที่ฐานแต่ละฐานจะได้รับข้อมูลล่าสุดจริงๆไม่พร้อมกันในทันที นิยามของการเป็นฐานกระจาย(distributed ledgers)อย่างแท้จริงคือการมีฐานที่แชร์ข้อมูลกันกระจายตัวอยู่ในพื้นที่ต่างๆทั่วโลก มีระบบตรวจสอบสิทธิ์คนเขียนข้อมูลตามข้อตกลงร่วม มีระบบแชร์ข้อมูลระหว่างฐานที่มีประสิทธิภาพ และมีระบบตรวจสอบความถูกต้อง(การเทียบข้อมูลระหว่างฐาน)ทางคณิตศาสตร์(cryptographic infrastructure)ที่มีประสิทธิภาพบล็อคเชนคือ ฐานกระจาย(distributed ledgers)รูปแบบหนึ่ง ที่มีการเก็บข้อมูล(data structure)แบบเฉพาะในชื่อ blockchain และใช้ข้อตกลงในการเขียนข้อมูลแบบ Prove of Work
โดย: 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 ครับผม 😙
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 6)
หลังจากที่ได้ทำความรู้จักกับอีกหนึ่ง Feature ใน MQTT — LWT หรือ Last Will Testment กันไปแล้วนะคะ จะเห็นว่า LWT สามารถเข้ามาช่วยเราจัดการกับการปัญหาการเชื่อมต่อขาดๆหายๆได้อย่างไร แล้วถ้าเอามาจับคู่กับ Retained Message ก็จะยิ่งช่วยเพิ่มประสิทธิภาพให้กับ MQTT ขึ้นมาอีกเยอะเลยค่ะ และในบทความที่แล้วเราก็ยังค้างกันอยู่ที่ Keep Alive ค่ะ ว่าคืออะไร เกี่ยวข้องกับ LWT Message ยังไง วันนี้มาทำความรู้จักกันค่ะMQTT Keep Alive เป็นอีก Feature นึง ของ MQTT ค่ะ ซึ่งมีบทบาทสำคัญเลยสำหรับ Mobile Network ค่ะอย่างที่ทราบนะคะว่า MQTT ใช้การเชื่อมแต่แบบ TCP/IP ซึ่งมีความน่าเชื่อถือสูง มีการการันตีว่าการส่งข้อมูลจะถึงมือผู้รับแน่นอน ไม่มีผิดเพี้ยนแต่…..ในระหว่างการเชื่อมต่อนี้(ระหว่าง Broker และ Client) อาจจะมีฝ่ายใดฝ่ายนึงเกิดหลุด sync กันไปค่ะ (out of synchronization) อย่างเช่น ถ้าเกิดฝ่ายใดฝ่ายนึงเกิด crash ขึ้นมา ไม่สามารถทำงานได้ตามปกติค่ะ โดยที่อีกฝ่ายไม่สามารถรับรู้ได้เลยว่า อีกฝั่งนึงนั้นได้ตายไปแล้ว ก็จะยังคงส่งข้อความไปให้เรื่อยๆ และรอรับ ACK Message ซึ่งสภาวะแบบนี้ใน TCP จะเรียกว่า half-open connection ค่ะ ซึ่งถือว่าเป็นปัญหาสำคัญเลยคะดังนั้น MQTT จึงได้นำ Keep Alive เข้ามาช่วยแก้ปัญหา half-open connection ตรงนี้ค่ะ หรืออย่างน้อยก็สามารถบอกได้ว่าเกิดภาวะ half-open connection ขึ้น Keep Alive จะช่วยเชคและการันตีว่าการเชื่อมต่อระหว่าง Broker และ Client นั้นยังเปิดอยู่Client จะเป็นคนกำหนด ค่า Keep Alive ซึ่งจะกำหนดไว้ในช่วงเริ่มแรกที่ทำการขอเชื่อมต่อกับ Broker ค่านี้มีหน่วยเป็นวินาทีค่ะ (สามารถตั้งค่าได้มากสุด 18 ชั่วโม 12 นาที 15 วินาที หรือ 65535 วินาที ค่ะ) ซึ่งการที่ Client เป็นคนกำหนด Keep Alive เองจะช่วยให้ Client สามารถปรับค่า Keep Alive ให้ตรงกับความแรงของสัญญาณเนทเวิคของตัวเองได้หลังจากทำการเชื่อมต่อ ในระหว่างนี้หาก Client ไม่ทำการส่ง Control Message ใดๆ เช่น PUBLISH, PINGREQ, หรือ DISCONNECT ให้กับ Broker ​ไม่เกินระยะเวลาที่กำหนดใน Keep Alive ตัว Broker จะยังไม่ถือว่า Client ได้ตัดขาดการเชื่อมต่อไป ยังถือว่าการเชื่อมต่อกับ Client นี้ยังเปิดอยู่ แต่ Client จะต้องส่ง PINGREQ ไปให้ Broker นะค่ะ (ไม่ใช่หายไปเลยนะ) ซึ่ง Client จะส่ง PINGREQ เมื่อไหร่ก็ได้ค่ะ ซึ่ง Broker เองก็ต้องตอบกลับด้วย PINGRESP นะคะ เพื่อที่จะให้ Client มั่นใจว่า ​Broker เองก็อยังอยู่ดีค่ะ ยังมีการเชื่อมต่อกับ Client อยู่แต่สำหรับ Broker หากว่าไม่มี Message หรือว่า PINGREQ จาก Client ส่งมาภายใน 1.5 * Keep Alive Period แล้วละก็ Broker จะทำการ Disconnect ไปเลยค่ะ และจะส่ง LWT Message ให้ค่ะ(ถ้า Client ได้กำหนด LWT ไว้นะคะ)โดยปกติแล้วใน MQTT ถ้า Broker เจอว่ามี half-open connection ค้างอยู่ Broker จะจัดการด้วยสิ่งที่เรียกว่า Client Take-over ค่ะ นั่นคือ Broker จะทำการ Disconnect การเชื่อมต่อก่อนหน้านี้กับ Cleint ตัวนี้ หลังจากนั้นก็จะทำการเชื่อมต่อให้ Client ตัวนี้ใหม่ค่ะ เพื่อให้มั่นใจว่าปัญหา half-open connection นี้จะไม่เป็นอุปสรรคต่อ Client ที่ถูก Disconnect ไป แล้วต้องการอยากจะกลับมา Connect ใหม่ค่ะอ้างอิงจาก MQTT Essentials Part 10: Keep Alive and Client Take-Over
โดย: 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 ครับ ;)
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 5)
มาต่อกันกับอีก Feature นึง ของ MQTT ค่ะ ซึ่งก็คือ Last Will and Testament ค่ะเนื่องจาก MQTT มักจะถูกนิยมนำมาใช้ในเคสที่ Network ไม่มีความเสถียรสักเท่าไหร่ อย่างเช่น สัญญาณไม่แรงและแกว่งเป็นต้นค่ะ ในเคสที่สัญญาณไม่เสถียรแบบนี้ การเชื่อมต่อระหว่าง Broker และ Client ต้องมีปัญหาแน่นอนค่ะ บางครั้งการเชื่อมต่อก็อาจจะขาดหายไปดื้อๆแบบไม่ตั้งใจ ซึ่งอาจจะเกิดจากปัญหาที่ตัวสัญญาณเอง หรือ แบตเตอรีหมด และเป็นไปได้อีกหลายสาเหตุค่ะ การขาดหายของสัญญาณแบบนี้จะเรียกว่า Ungracefully Disconnect ค่ะ ไม่มีการแจ้งเตือนมาก่อนว่าจะ Disconnect ค่ะ เพราะปกติแล้ว ใน MQTT การจะ Disconnect (แบบมีมารยาท และ ตั้งใจที่จะตัดการเชื่อมต่อ) จะต้องมีการส่ง MQTT Disconnect Message ค่ะ เรียกอีกอย่างก็ Gracefully Disconnect ค่ะ ดังนั้น Broker จึงจำเป็นต้องทราบค่ะ ว่าการขาดหายของการเชื่อมต่อระหว่าง Broker และ Cleint นั้นเป็นการ Disconnect แบบไหน ตั้งใจ (Gracefully) หรือ ไม่ตั้งใจ (Ungracefully) เพื่อที่ Broker จะได้จัดการกับสถานการณ์ได้อย่างถูกต้องค่ะหากมีการเชื่อมต่อของ Client ตัวใดตัวนึงขาดหายไปแบบ Ungracefully ตัว Broker จะใช้ Last Will and Testament (LWT) แจ้งไปยัง Client อื่นๆที่เหลือ เพื่อบอกกล่าวว่า Client ตัวนี้ได้ Offline ไปแล้วค่ะClient แต่ละตัว สามารถฝาก Last Will Message ให้กับ Broker ได้ ในระหว่างที่เริ่มทำการ Connect กับ Broker ซึ่งตัว Last Will Message นี้ก็คือ MQTT Message ธรรมดาทั่วไปนี่แหละค่ะ ข้างในก็จะมี Topic, Retained Message Flag, QoS, และ Payload อย่างเช่นในรูป Fig 1 ข้างล่างค่ะFig 1. MQTT Connect MessageBroker จะรับฝาก Last Will Message ไว้จนกว่าจะมีการ Disconnect จาก Client นั้นๆค่ะ ซึ่งถ้าการ Disconnect เป็นแบบ Ungracefully ตัว Broker ก็จะทำการส่ง Last Will Message นี้ให้กับ Client ที่เหลือที่ได้ทำการ Subscribe ตรงกับ Topic ที่ระบุไว้ใน Last Will Message ค่ะ แล้วเคสไหนที่ Broker ถือว่าเปนการ Ungracefully Disconnect ลองมาดูกันค่ะ ว่ามีเคสไหนบ้างเมื่อ Broker เจอว่ามี Error เกิดขึ้นของ I/O หรือ Network เมื่อไม่มี Message ใดๆ จาก Client ส่งมาในช่วงเวลาที่กำหนด หรือ Keep Alive Period (Keep Alive คืออะไร? ในบทความถัดไป มาทำความรู้จักกันค่ะ….)เมื่อพบว่า Client ไม่มีการส่ง Disconnect Message มาให้ก่อนที่จะมีการปิดการเชื่อมต่อไปเมื่อ Broker เองเป็นคนตัดการปิดการเชื่อมต่อเนื่องจาก Error ของ MQTT Protocol เองแต่ถ้าหากมีการส่ง MQTT Disconnect Message — Gracefully Disconnect (Fig 2) ตัว Broker ก็จะลบ Last Will Message ที่เก็บไว้ให้ทิ้งค่ะFig 2. MQTT Disconnect Messageจะเห็นว่า LWT มีความบทบาทสำคัญในการแจ้งเตือน Client ตัวอื่นๆ โดยเฉพาะ Client ที่ได้ทำการ Subscribe ไว้กับ Client ตัวที่ได้ขาดการติดต่อไปแบบ Ungracefully DisconnectLWT มักจะถูกนำมาใช้คู่กับ Retained Message เพื่อทำการเก็บ State ล่าสุด(ของ Topic ใด Topic นึง) ของ Client ไว้ ถึงตรงนี้อาจจะยังนึกไม่ออกนะคะ ว่าจะเอา LWT และ Retained Message มาใช้เก็บ State ล่าสุดยังไง ลองมาดูตัวอย่างค่ะ…..Client1 เริ่มทำการเชื่อมต่อกับ Broker ด้วยการส่ง Connect Message ให้ Broker และ ใน Connect Message นี้ก็ระบุ payload ของ lastWillMessageไว้ว่า ‘Offline’ และ มีการเซท lastwillRetain ให้เป็น true และ มี lastWillTopic เป็น ‘client1/status’ (เลื่อนขึ้นไปดู ตัวอย่าง Connect Message ได้นะค่ะ — Fig 1)หลังจากทำการเชื่อมต่อเรียบร้อย Client ก็สามารถเริ่ม Publish ข้อความที่มี Payload ว่า ‘Online’ และ retaionFlag เซทเป็น true ไปที่ Topic ที่ตั้งไว้ตอนทำการเชื่อมต่อค่ะ (client1/status) ซึ่งในระหว่างนี้หากไม่มีการ Disconnect เกิดขึ้น Client ที่ได้ทำการเข้ามา Subscribe ใหม่ที่ Topic นี้ (client1/status) จะได้รับ Retained Message ที่มี Payload ว่า ‘Online’แต่หากว่าการเชื่อมต่อ ระหว่าง Client1 และ Broker มีการ Ungracefully Disconnect เกิดขึ้น Broker จะทำการ Publish LWT Message (ซึ่งมี Payload ว่า ‘Offline’) แทน Retained Message เดิม (ซึ่งมี Payload ว่า ‘Online’) นั่นหมายความว่าถ้ามี Client เข้ามา Subscribe หลังจากที่ Client1 ขาดการติดต่อไป จะได้รับ Message ที่มี Payload ว่า Offline ถึงตรงนี้แล้วพอจะนึกภาพออกแล้วใช่มั้ยคะ ว่าคู่บัดดี้ LWT Message และ Retained Message เข้ามาช่วยจัดการเกี่ยวกับ State ล่าสุดของ Topic ได้ยังไงในบทความถัดไป เราจะพูดถึงเรื่อง Keep Alive ค่ะ ซึ่งนี่ก็เป็น Feature เด่นอีกอย่างนึงของ MQTT ที่จะช่วยให้ Broker รู้ถึงสถานะของ Client ได้ค่ะ ว่า Online อยู่ หรือ Offline ไปแล้วอ้างอิงจาก MQTT Essentials Part 9: Last Will and Testament
โดย: 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 ดังนั้นค่านี้ควรจะปรับให้เหมาะสมเองครับโดยการทดลองหรืออะไรก็แล้วแต่
โดย: Pii
| Blockchain
อนาคตอีเธอเรียมจากปากนายวิทาลิค
เมื่อไม่นานมานี้ผมมีโอกาสนั่งย่อยความเห็นเกี่ยวกับทิศทางและความเป็นไปได้ของอีเธอเรียมจากมุมมองของนายวิทาลิค บูเทอริน(Vitalik Buterin) ซึ่งเป็น 1 ในผู้ร่วมก่อตั้งบล็อคเชนอีเธอเรียมขึ้นมา สัมภาษณ์ในวันที่ 20 มีนาคม พ.ศ. 2562 ประเด็นต่างๆค่อนข้างน่าสนใจมากสำหรับคนที่ติดตามเทคโนโลยีและวงการบล็อคเชนอยู่ในขณะนี้ครับคำถาม: อีเธอเรียมกำลังถูกเหรียญสกุลอื่นๆไล่ตามขึ้นมาจริงหรือไม่?เขายอมรับตามตรงว่าปัจจุบันมีเหรียญหลายตัวที่น่าสนใจและดูมีศักยภาพ การพัฒนาอีเธอเรียมเองไม่สามารถจะเร่งรัดได้ตามต้องการทีเดียว โปรเจคต่างๆบนอีเธอเรียมยังมีไม่มากพอ การพัฒนาโปรเจคเหล่านี้จะดีขึ้นเรื่อยๆเมื่อมีตัวอย่างโปรเจคที่สำเร็จมากขึ้น เพื่อที่นักพัฒนาจะได้สามารถเรียนรู้วิธีการจากตัวอย่างเหล่านี้ ถ้าหากวันนึงอีเธอเรียมถูกแทนที่ด้วยบล็อคเชนอื่น เช่น Zcash หรือ Ethereum Classic วิทาลิคบอกว่าเป็นธรรมดาที่เทคโนโลยีจะต้องถูกเปลี่ยนไปตามความต้องการของผู้ใช้ แต่ว่าถ้าวันนั้นบล็อคเชนที่ขึ้นมาแทนอีเธอเรียมคือ Tron เขาคงจะหมดศรัทธาในวงการนี้เลยทีเดียวคำถาม: มีข่าวว่านักพัฒนาอีเธอเรียมได้ค่าแรงน้อยเกินไปจริงหรือไม่? เขาให้ความเห็นสั้นๆว่าองค์กรพัฒนาอีเธอเรียมยังควบคุมทุกอย่างได้อย่างไม่มีปัญหาอะไร และถ้าสมมุติว่าไม่มีใครบ่นเรื่องค่าจ้างเลยสักคนเดียว แสดงว่าองค์กรจ่ายค่าแรงให้มากเกินไปคำถาม: มูลค่าของเหรียญอีเธอเรียมมีผลกระทบใดต่อองค์กร หรือเหล่านักพัฒนาบ้างหรือไม่? เขาตอบตรงๆว่าในวงการนี้มีหลายโปรเจคที่ปั่นราคาขึ้นลงไปมามากมายในช่วงที่ผ่านมา ซึ่งสำหรับโปรเจคที่ตั้งใจพัฒนาเทคโนโลยีเพื่อตอบโจทย์คนใช้จริงๆ อย่างอีเธอเรียมนั้นไม่มีผลกระทบมากเท่าโปรเจคปั่น แต่สุดท้ายแล้วถ้ามูลค่ามันสูงโปรเจคต่างๆก็จะดำเนินไปได้ราบรื่นกว่าคำถาม: คิดยังไงกับพวกฟองสบู่โปรเจค ICO บนอีเธอเรียมทั้งหลายที่ผ่านมา? วิทาลิคบอกว่ายังไงโปรเจคพวกนี้ก็ต้องมีคนทำอยู่ดี ต่อให้ไม่ใช่บนอีเธอเรียม เขาเซ็งกับพวกประเภทที่มาขอถ่ายเซลฟี่กับเขา แล้วก็เอารูปเขาไปใช้ในฐานะ advisor ของโปรเจคเหล่านั้นมากกว่า คำถาม: การระดมทุนโปรเจคด้วยระบบอีเธอเรียมถือว่าผิดกฎหมายหรือไม่?เขาตอบว่าองค์กรอีเธอเรียมมีทีมนักกฎหมายพร้อมอยู่แล้ว ไม่จำเป็นต้องกังวนในเรื่องนี้คำถาม: มีความเห็นเรื่องการทำลายธุรกิจผูกขาดด้วยบล็อคเชนว่าอย่างไร? เขาเล่าสั้นๆว่าบล็อคเชนจะทำให้บริษัทขนาดเล็กหลายบริษัทสามารถทำงานร่วมกันเพื่อโค่นบริษัทที่ผูกขาดขนาดใหญ่ได้ โดยที่บริษัทขนาดเล็กเหล่านั้นก็ไม่ได้มีสถานะเป็นบริษัทผูกขาดแต่อย่างใดสุดท้ายวิทาลิคให้ความเห็นว่าอีเธอเรียมต่างจากบิทคอยน์ที่มีคนวางกฎ กำหนดทิศทางที่เทคโนโลยีควรจะเป็น ควรดำเนินเดินไป บิทคอยน์เป็นเหมือนทฤษฎีหรืองานวิจัยดิบที่เมื่อพิสูจน์ได้ว่าทำได้ก็ปล่อยมันออกมาทั้งแบบนั้นเลย ทำให้มีปัญหาในเรื่องมุมมองและความเห็นต่างของนักพัฒนา
โดย: 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 เผื่ออยากเอาไปลองรันเล่น
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 4)
Message ที่ถูก Publish ใน MQTT จะไม่สามารถทราบได้ว่า Client ที่ Subscribe ไว้นั้น จะได้รับ Message หรือไม่ แต่ Client ที่เป็น Publisher นี้ รู้แน่นอนว่า Message ถูกส่งไปให้ Broker ได้ถูกรับเรียบร้อยแล้ว เช่นเดียวกัน Client ที่เป็น Subscriber เอง ก็ไม่สามารถจะรู้ได้ว่า Publisher จะส่ง Message มาให้เมื่อไหร่ (เพราะ Client จะไม่สามารถติดต่อกันได้โดยตรงค่ะ ต้องมี Broker มาคั่นกลาง) ซึ่งอาจจะแค่ไม่กี่วินาที หรือ อาจจะนานหลายชั่วโมง จึงมีการนำ Retained Message เข้ามาช่วยแก้ปัญหานี้ค่ะRetained Message ก็คือ MQTT Message นี่แหละค่ะ แต่ว่าจะถูก Publish มาพร้อมค่า retainFlag ที่ตั้งว่าไว้เป็น True ค่ะ ซึ่ง Broker จะทำการเก็บ payload และ QoS ของ Message สำหรับ Topic นี้ไว้ แล้วถ้ามี Client เข้ามาทำการ Subscribe ตรงกับ Topic ที่มี Retained Message เก็บไว้ Broker ก็จะส่ง Message นี้ ให้ Client โดยทันทีค่ะ ซึ่งในแต่ละ Topic นั้น Broker จะทำการเก็บ Retained Message ไว้แค่ค่าสุดท้ายค่าเดียวนะคะไม่เพียงแต่ Client ที่ทำการ Subscribe ใน Topic ที่ตรงกับ Retained Message ที่ Broker เก็บไว้นะคะ ถ้าหากว่า Client ทำการ Subscribe ใน Topic ที่มีเครื่องหมาย Wildcard (#) ร่วมใน Topic นั้นด้วย Client ก็จะได้รับ Retained Message ของ Topic นั้นเช่นกันค่ะตัวอย่างของการ RetainClient A ได้ทำการ Publish Retained Message ไปที่ Topic myhome/livingroom/temperature หลังจากนั้น Client B ได้เข้ามาทำการ Subscribe ที่ Topic myhome/# ทันทีที่ Subscribe เรียบร้อยแล้ว Client B จะได้รับ Retained Message (จาก Topic myhome/livingroom/temperature) ทันทีค่ะ ซึ่ง Client B สามารถรู้ได้ว่านี่คือ Retained Message โดยดูจาก retainFlag ที่ Broker ส่งมาให้ค่ะจะเห็นว่า ข้อดี ของ Retained Message ก็คือ การที่ Client สามารถรับรู้ได้ทันทีหลังจากที่ได้เข้ามาทำการ Subscribe ว่าตอนนี้ สถานะ ของ Topic นี้เป็นยังไง โดยที่ไม่ต้องรอให้ถึงจนกว่า Pusblisher จะทำการส่ง Message อีกครั้ง ซึ่ง Retained Message นี้ไม่จำเป็นว่าจะเป็น Message ล่าสุดที่ถูกส่งมานะคะ แต่ต้องเป็น Message ล่าสุดที่ถูกส่งมาพร้อมค่า retainFlag เป็น True ค่ะการลบค่าที่ระบบ Retain เอาไว้ถ้าหากว่าเราต้องการที่จะลบ Retained Message นี้ออก ก็ทำได้ง่ายๆเลยค่ะ เราแค่จัดการให้ Publisher ส่ง Message ที่ไม่มี payload (มี payload เป็น 0 Byte) พร้อมกับค่า retainFlag เท่ากับ True ค่ะ แค่นี้ Broker ก็จำทำการลบ Retained Message ของ Topic นั้นๆออกให้ค่ะ หลังจากนี้ Client ที่เข้ามาทำการ Subscribe ก็จะไม่ได้รับ Retained Message ค่ะการประยุกต์ใช้งานฟีเจอร์ RetainRetained Message เหมาะสมจะนำมาใช้เมื่อเราต้องการให้ Client ใหม่ ที่มา Subscribe ได้รับค่าอัพเดทล่าสุด อย่างเช่น เมื่อต้องการรู้ว่าอุปกรณ์นั้น Offline หรือ Online อยู่ค่ะ ถ้าหากไม่นำ Retained Message เข้ามาใช้ Client ก็จะต้องรอจนกว่าจะมีการ Publish อีกครั้งนึงค่ะ

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

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

หมวดหมู่

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

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

Tags

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

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

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