บทความ
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: Kan Ouivirach
| Machine Learning
การวาง Project Structure สำหรับงานด้าน Machine Learning
เวลาที่เราทำโปรเจคอะไรสักอย่าง คำถามประมาณว่า “เราจะมีโฟลเดอร์อะไรบ้าง?” หรือ “เราจะวาง Project Structure เราอย่างไรดี?” จะแว็บเข้ามาในหัวเสมอ ซึ่งจริงๆ มันก็ไม่ใช่ปัญหาใหญ่โตอะไรหรอกครับ แต่บางทีก็ทำให้เรารำคาญอยู่บ่อยๆ ได้ พอดีตอนที่ผมเรียนอยู่ ได้ไปเจอบทความของ Ali Eslami เค้าเขียนเรื่องนี้ไว้ และผมก็ใช้ Structure แบบนี้มาจนถึงทุกวันนี้ครับ เลยอยากจะมาบอกเล่ากันหน่อยหน้าตาของ Project Structure จะเป็นประมาณนี้project/ ├─ code/ ├─ data/ │ ├─ input/ │ ├─ working/ │ └─ output ├─ demos/ └─ tests/โดยแต่ละ Folder มีความหมายตามนี้project ก็คือชื่อโปรเจคของเรานั่นเองdata เป็นโฟลเดอร์ที่เอาไว้เก็บ Dataset ของเรา ซึ่งในโฟลเดอร์นี้ก็จะแบ่งออกเป็น 3 ส่วนด้วยกัน คือ inputเป็นโฟลเดอร์เก็บข้อมูลแบบ Raw และเราจะไม่แก้ไขใดๆ เลยในโฟลเดอร์นี้ ส่วน workingเป็นโฟลเดอร์เก็บไฟล์อะไรก็ตามที่โค้ดหรือโมเดลของเราสร้างขึ้นมา ไฟล์ในโฟลเดอร์นี้จะมีการเปลี่ยนแปลงแทบตลอดเวลา และ output จะเป็นโฟลเดอร์ที่เอาไว้เก็บผลลัพธ์จากโค้ดหรือโมเดลของเราส่วน demos กับ tests ก็ตามชื่อเช่นกัน เอาไว้สำหรับเอาไปนำเสนอผลงาน และเอาไว้ทำสอบผลงาน ซึ่ง 2 โฟลเดอร์นี้อาจจะเก็บแค่สคริป เช่น Bash ที่เอาโมเดลมารันแสดงผลก็ได้ครับข้อดีแยกส่วนของโค้ดกับส่วนของข้อมูลออกจากกันทำให้ง่ายต่อการแชร์โค้ดให้กับคนอื่น และปรับเปลี่ยน Dataset ในภายหลังง่ายต่อการแยก Dataset ออกมาจาก Version Control เพราะเราสามารถจะเขียน Configuration ให้ไม่ต้องเอาโฟลเดอร์ data เข้าไปใน Version Control ได้การแบ่งย่อยโฟลเดอร์ในโฟลเดอร์ data ทำให้เรา Reproduce งานออกมาได้เป็นระเบียบมากขึ้น เราจะรู้ตัวเองว่าอะไรก็ตามที่อยู่ใน input เราจะไม่แก้ อะไรก็ตามที่อยู่ใน working เราสามารถลบทิ้งได้โดยไม่ต้องกังวล และอะไรก็ตามที่อยู่ใน output เราจะเอาไปนำเสนอผลงานส่วน demos กับ tests อาจจะมีสคริปที่ซ้ำๆ กัน แต่ก็ช่วยทำให้เราแยกโฟกัสของเราได้ง่ายขึ้นครับ ว่าเรากำลังจะทดสอบหรือเรากำลังจะนำเสนอผลงานตามไปอ่านต้นฉบับกันได้ที่ Patterns for Research in Machine Learning ครับ เค้าไม่ได้เขียนแค่เรื่องของ Project Structure นะ ยังมีส่วนเสริมในเรื่องของการแยกส่วน Options กับส่วน Parameters ออกจากกันอีกด้วยใช้ Project Structure แบบกันไหน มาพูดคุยกันได้นะครับ 🤓
โดย: Kan Ouivirach
| Machine Learning
ค่า Hyperparameter ใน Machine Learning คือ?
ในโลกของ Machine Learning จะมี Parameter ชนิดหนึ่งอยู่ที่เรียกว่า Hyperparameter ครับ ทำไมเราถึงต้องรู้จักมันล่ะ? มันคืออะไรหนอ? 🤔เวลาที่เราสร้างโมเดล Machine Learning ขึ้นมา เราจะป้อนข้อมูลเข้าไปเพื่อสอนโมเดลของเรา ซึ่งจริงๆ แล้วการสอนเนี่ย มันก็คือการที่เราหาค่า Parameter ต่างๆ ของโมเดลที่เหมาะสมกับข้อมูลที่เราป้อนเข้าไป หรือเราอาจจะพูดได้ว่าค่า Parameter พวกนี้เป็นค่าที่ได้มาจากข้อมูลนั่นเอง ค่าพวกนี้ก็เช่นค่า Weight ใน Neural Networkค่า Coefficient ใน Linear Regressionแต่ทีนี้เรายังมีค่า Parameter อีกจำพวกหนึ่งด้วย เป็นค่าที่เราหาไม่ได้จากข้อมูล ซึ่ง Parameter พวกนี้เราจะเรียกว่า “Hyperparameter” ซึ่งส่วนใหญ่แล้วเราก็จะกำหนดค่าไว้ก่อนที่เราจะนำโมเดลเข้าขั้นตอนการเรียนรู้ (Model Training) ค่าพวกนี้ก็จะมีประโยชน์คือทำให้โมเดลของเรามีประสิทธิภาพมากขึ้นครับ ถ้าเราสามารถหาค่าที่ดีมาได้ตัวอย่างของ Hyperparameter มีอะไรบ้าง?ค่า Learning Rate ที่เอาไว้สอน Neural Networkค่า k ใน k-Nearest Neighbors หรือใน k-Means Clusteringจะเห็นได้ว่าค่าพวกนี้เราต้องเซตเอาไว้ก่อนที่เราจะสอนโมเดลครับเราจะได้ค่า Hyperparameter มาได้อย่างไร?เนื่องจากเราไม่สามารถหาค่านี้ได้จากข้อมูลของเรา สิ่งที่เราพอจะได้ทำก็จะประมาณนี้ทำ Cross Validation กับหลายๆ ค่า Hyperparameter ครับหา Domain Export มาดูข้อมูล ช่วยกำหนดค่าให้วัดดวง!ผมแนะนำวิธีแรกนะครับ 😂 เราสามารถเขียนโปรแกรมแล้วปล่อยให้โปรแกรมรันไปได้ ผมมองว่ามันคือการทำแนว Trial & Error ครับ ในการหาค่า Hyperparameter ที่ดีที่สุดคิดว่าน่าจะพอเห็นถึงความแตกต่างระหว่าง Parameter ธรรมดากับ Hyperparameter นะครับ 😎 ดังนั้นเนี่ยตอนที่เราสอนโมเดลของเรา เราก็อย่างลืมลองปรับ Hyperparameter เป็นหลายๆ ค่าด้วยนะ พยายามหาค่าที่ทำให้โมเดลของเราได้ผลที่ดีที่สุด
โดย: Kan Ouivirach
| Machine Learning
การจัดการ Imbalanced Data ใน Machine Learning
Imbalanced data เป็นปัญหาด้วยเหรอ? ทำไมถึงต้องสนใจด้วยไปจัดการมันด้วย?เป็นครับ! ต้องสนใจด้วย! ปัญหานี้เป็นปัญหาที่เจอตลอดเวลากับแทบจะทุกชุดข้อมูลเลยก็ว่าได้ และจะเป็นปัญหามากกับการทำ Classification เพราะว่าสิ่งที่จะเกิดขึ้นก็คือว่า จำนวน Class ที่เราจะทำนายหรือจะจำแนกมีไม่เท่ากันทำให้ความแม่นยำตอนที่เราจะทำนายหรือจำแนกมีค่าคลาดเคลื่อนไป ไม่น่าเชื่อถือ ค่า Null Accuracy จะสูงมาก อาจจะมากกว่า 90% เลยด้วยซ้ำถ้าใครงงว่า Null Accuracy คืออะไร ลองอ่าน ใช้ Null Accuracy เป็น Baseline ในการวัดผลโมเดลของเรา ก่อนเนอะทีนี้เรามาดูวิธีจัดการกันบ้าง บทความนี้จะมาเสนอวิธี 2 วิธีครับ ที่เราไม่ต้องไปยุ่งกับตัวข้อมูลเลยวิธีแรก.. จัดให้เป็นปัญหา Anomaly Detection ซะจากที่เราพยายามจะใช้วิธี Classification ในการแก้ปัญหา ให้เราเปลี่ยนวิธีคิดครับ ซึ่งว่ากันง่ายๆ เลย ก็ประมาณว่าให้เราจับเอาคลาสที่มีจำนวนมากที่สุด แล้วบอกว่ามันคือ Normal Profile (Pattern) ซะ แล้วนอกนั้นคือ Abnormal หมด ยกตัวอย่างๆ ถ้าสมมุติว่าเราต้องการที่จะจำแนกว่าอีเมลไหนเป็นสแปมหรือไม่ใช่สแปม แล้วเรามีข้อมูล 100 อีเมล เป็นสแปม 2 อีเมล แล้วอีก 98 เป็นอีเมลที่ไม่ใช่สแปมสิ่งที่เราจะทำก็คือให้เราโมเดลแค่ 98 อีเมลที่ไม่ใช่สแปมพอครับ แล้วคิดซะว่ามันคือ Normal Profile แล้วอะไรที่ไม่ใช่ Normal เราก็ตอบว่ามันคือสแปมครับการทำที่ง่ายสุดน่าจะเป็นการนำเอา Normal Profile มาทำ Clustering ครับ แล้วกำหนด Threshold เอาว่า ถ้าระยะห่างระหว่างข้อมูลที่เข้ามาใหม่เกิด Threshold ที่เรากำหนดไว้ เราก็พิจารณาว่าข้อมูลนั้นเป็นสแปมครับผมวิธีที่ 2.. เอา Metric อื่นมาช่วยในการวัดผลโมเดลในกรณีของ Imbalanced Data เราจะใช้ค่า Accuracy อย่างเดียวมาวัดผลไม่ได้ เนื่องจาก Null Accuracy มีค่าสูงเกินไป เราจะหา Metric อื่นมาช่วยในการวัดผลของเราครับ Metric นั้นคือค่า Area Under Curve (AUC) ครับผม ซึ่งค่า AUC นี่จะได้มาจากกราฟ Receiver Operating Characteristic (ROC) กราฟนี้จะมีลักษณะตามรูปด้านล่างนี้ครับรูป ROC จาก Wikiจากรูปถ้าโมเดลเราดี กราฟมันจะโค้งเข้ามุมซ้ายบนครับ คือมีค่า True Positive Rate (TPR) สูง และมีค่า False Positive Rate (FPR) ต่ำ ทีนี้ค่า AUC มันก็คือค่าพื้นที่ใต้กราฟนี่แหละ ถ้าโมเดลเราจำแนกหรือทำนายแม่น ค่า AUC นี้ก็จะมีค่าเข้าใกล้ 1 ครับผมค่า AUC นี่จะออกมาเป็นความน่าจะเป็นที่โมเดลเราจะสามารถแบ่งจำแนก Class ของเราได้ดีขนาดไหนครับ คือเราอาจจะได้ค่า Accuracy ประมาณ 98% แต่ได้ค่า AUC ประมาณ 0.1 ก็เป็นได้ครับ คือมี FPR สูงมากนั่นเอง หน้าที่ของเราคือหาวิธีทำให้ค่า AUC มันสูงขึ้นมาให้ได้ครับ 💪จริงๆ ก็ยังมีวิธีอื่นอีกนะครับ เช่นการ Upsampling หรือ Downsampling ข้อมูลของเรา แต่วิธี 2 วิธีจะเป็นการเพิ่มข้อมูลของเราขึ้นมา (อย่างมีหลักการ) ซึ่งก็สามารถไปใช้ได้เช่นกันโดยไม่ผิดอะไรครับ สุดท้ายถ้าโมเดลของเราให้ผลออกมาดี น่าเชื่อถือ ก็น่าจะแฮปปี้กันทุกฝ่าย 🤗
โดย: Kan Ouivirach
| Machine Learning
ปัญหา Regression ต่างกับ Classification อย่างไร?
ทั้งปัญหา Regression และปัญหา Classification ทั้งคู่อยู่จัดอยู่ในการเรียนรู้แบบ Supervised Learning เราลองมาดูปัญหาทีละปัญหากันว่ามันคืออะไรกันบ้างนะปัญหา Regressionลองนึกถึงแอพพลิเคชั่นที่เราใช้กันในปัจจุบันเช่น เราอาจจะมีระบบทำนายการเติบโต ทำนายยอดขาย ทำนายราคาสินค้าหรือบ้าน รวมไปถึงการทำนายระดับความดันเลือด ระบบพวกนี้จะมีสิ่งที่เหมือนกันก็คือเราจะมีข้อมูลและเราจะนำข้อมูลนั้นๆ ไปทำนายค่าๆ หนึ่งในอนาคต ทีนี้ประเด็นสำคัญคือ ค่าๆ หนึ่งในอนาคตเนี่ย จะเป็นค่าแบบ Continuous ครับให้โค้ดเป็นคนอธิบายครับ สมมุติว่าผมมีข้อมูลของเวลาที่ใช้ในการอ่านหนังสือและคะแนนสอบที่ได้ของนักเรียน ผมก็จะสามารถที่จะพอทำนายได้ว่า เช่นถ้ามีนักเรียนคนหนึ่งใช้เวลาอ่านหนังสือ 3.2 ชม. นักเรียนคนนั้นควรจะได้คะแนนประมาณเท่าไหร่ สังเกตตรงว่าค่าคะแนน ซึ่งค่านี้เป็นแบบ Continuousimport pandas as pddf = pd.DataFrame(data={ 'hours': [2.5, 5.1, 3.2, 8.5, 3.5, 9.2, 8.9, 6.9, 7.8, 2.7], 'scores': [21, 47, 27, 75, 30, 88, 95, 76, 86, 25]})dfข้อมูลจำนวนชั่วโมงที่ใช้ในการอ่านหนังสือกับคะแนนสอบที่ได้ผมจะลองมาสร้างโมเดล Regression ครับ ในที่นี้ขอใช้ Linear Regression นะครับ เป็น Regression ที่ง่ายที่สุดX = df[['hours']]y = df.scoresfrom sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)from sklearn.linear_model import LinearRegression regressor = LinearRegression() regressor.fit(X_train, y_train)ลองเทสดูregressor.predict(X_test)ได้ผลประมาณนี้ผลที่ได้จากโมเดล Regression (Linear Regression)จะเห็นได้ว่าถ้านักเรียนคนหนึ่งใช้เวลาอ่านหนังสือ 3.2 ชั่วโมง เค้าน่าจะได้คะแนนประมาณ 28.97 ส่วนถ้านักเรียนอีกคนหนึ่งใช้เวลาอ่านหนังสือประมาณ 7.8 ชั่วโมง เค้าน่าจะได้คะแนนประมาณ 76.72นี่แหละครับปัญหา Regression เป็นปัญหาที่เราอยากจะทำนายค่าในอนาคต หรือค่าที่เราอยากจะประมาณการเป็น Continuousปัญหา Classificationมาดูปัญหา Classification กันบ้าง มีข้อแตกต่างจาก Regression ก็คือ.. ค่าที่เราจะทำนายจะเป็นค่าแบบ Discrete ครับ! ต่างกันแค่นี้จริงเหรอ? 🤔จริงครับ! แค่นี้แหละ เรามาใช้โค้ดเป็นคนอธิบายเช่นเดิม ผมต้องการสร้างโมเดลขึ้นมาเพื่อทำนายว่าคนๆ นี้เป็นเป็นโรคมะเร็งเต้านมหรือเปล่า (Healthy controls หรือ Patients) สังเกตตรงว่าค่าที่จะทำนายนี้ จะเป็นแบบ Discreteสำหรับข้อมูลชุดนี้เค้ากำหนดให้เลข 1 คือ Healthy controls ส่วนเลข 2 คือ Patientsimport pandas as pddf = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/00451/dataR2.csv')df.head()อ่านข้อมูล Breast Cancer จาก UCI Machine Learning Repositoryต่อไปเราจะสร้างโมเดล Classification ขึ้นมาครับ ขอใช้ k-Nearest Neighbors (k-NNs) เนอะX = df.drop('Classification', axis='columns')y = df.Classificationfrom sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)from sklearn import neighborsknn = neighbors.KNeighborsClassifier(n_neighbors=5)knn.fit(X_train, y_train)แล้วเราลองเทสดูknn.predict(X_test)ได้ผลลัพธ์ผลที่ได้จากโมเดล Classification (k-NNs)ผลลัพธ์ทางด้านบนจะออกมาเป็นแบบ Discrete ครับ คือถ้าไม่ตอบว่า Healthy controls ก็จะตอบว่า Patients นั่นเองClassification เป็นปัญหาที่เราอยากจะทำนายค่าในอนาคต หรือที่เราอยากจะจำแนกเป็น Discreteสรุปสั้นๆRegression กับ Classification จะต่างกันที่ตรงค่าที่เราอยากจะทำนายหรือจำแนกครับ ถ้าค่านั้นเป็นแบบ Continuous เราควรจะจัดเป็นปัญหา Regression ส่วนถ้าเป็น Discrete ก็จะเป็นปัญหา Classification ดังนั้นเวลาที่เราเจอคำถามทาง Business หรือ Use Case ที่เราจะนำไปใช้ ก็อยากให้คิดก่อนว่าเราจะใช้ Regression หรือ Classification ครับ 😎
โดย: Kan Ouivirach
| Machine Learning
ใช้ Null Accuracy เป็น Baseline ในการวัดผลโมเดลของเรา
ในกรณีที่เราสร้างโมเดลขึ้นมาเพื่อทำนายผลอะไรสักอย่าง เราก็อยากที่จะวัดผลโมเดลนั้นๆ ว่ามีประสิทธิภาพดีแค่ไหน ส่วนใหญ่แล้วเราก็จะเลือกค่าที่คำนวณง่ายๆ มาอย่างเช่นค่า Accuracy เป็นต้นค่า Accuracy คือ ค่าอัตราส่วนระหว่างจำนวนข้อมูลที่เราทำนายถูก กับจำนวนที่เราต้องการจะทำนายทั้งหมดเช่น สมมุติว่า เรามีข้อมูลที่เราอยากจะทำนายว่าลูกค้าคนไหนของเราจะยกเลิกการใช้บริการของเราหรือเปล่าอยู่เป็นจำนวน 100 ข้อมูล และเราทำนายว่า 75 คนจะยกเลิก และ 75 คนนั้นยกเลิกจริงๆ ดังนั้นค่า Accuracy ของโมเดลของเราก็คือ 75% แล้วถ้าเราทำนายว่ามี 75 คนที่จะยกเลิก แต่ว่ามียกเลิกจริงๆ คือ 50 คน ก็แปลว่าค่า Accuracy ของโมเดลคือ 50% 🤓ทีนี้คำถามที่เราจะต้องถามตัวเองก็คือว่า “ค่า Accuracy เท่าไหร่ถึงจะดี?” ถ้าให้ตอบแบบไม่คิดเลยก็จะตอบประมาณว่า 90% ขึ้นไปครับ ดีแน่นอน!🛑 ช้าก่อน! วางเหยือกเบียร์ลงแล้วหายใจลึกๆ สัก 1–2 ที จริงๆ แล้วเราไม่ควรตอบไปทันทีแบบนั้น สิ่งที่เราควรทำคือย้อนกลับมาดูข้อมูลของเรา และคำนวณค่า Null Accuracy ก่อนครับแล้วค่า Null Accuracy คืออะไร?Baseline accuracy that can be achieved by always predicting the most frequent classตามนั้นเลยครับ มาดูตัวอย่างการคำนวณดีกว่าจะได้เห็นภาพกันมากขึ้นยกตัวอย่างเช่นผมมีข้อมูลอยู่ 100 ข้อมูล และมีจำนวนคนที่ยกเลิกการใช้บริการจริงๆ อยู่ 90 และมีจำนวนคนที่ใช้บริการอยู่ 10 คน ถ้าผมบอกว่าให้โมเดลของผมมีคำตอบเดียวคือทำนายว่าทุกคนยกเลิกการใช้บริการ (เพราะจำนวนคนที่ยกเลิกการใช้บริการมีมากกว่า) ผมก็จะได้ค่า Accuracy คือ 90% แล้วครับ ซึ่งค่า Accuracy นี้แหละ เราเรียกว่าค่า Null Accuracy 😎แปลว่าถ้าเราสร้างโมเดลของเราขึ้นมา ไม่ว่าจะใช้โมเดลอะไรก็ตาม ถ้าได้ค่า Accuracy ไม่เกินค่า Null Accuracy ก็แปลว่าโมเดลนั้นยังทำงานได้ไม่ดีจริง และห้ามนำไปใช้งานจริงครับอาจจะเกิดผลเสียต่อธุรกิจได้สรุปสั้นๆ ว่าค่า Null Accuracy เนี่ย นอกจากจะช่วยวัดผลโมเดลของเราได้แบบไวๆ แล้วยังจะช่วยเป็น Baseline ให้เรารู้ว่าเราควรจะทำโมเดลให้ดียิ่งขึ้นไปอีกหรือไม่ ลองเอาไปใช้กันดูนะครับ ส่วนตัวผมนี่คำนวณค่านี้ตลอดเลย เวลาที่สร้างโมเดลขึ้นมาเพื่อทำนายผล 🎉
โดย: Pii
| Blockchain
อนาคตการขุดบิทคอยน์
มีคนคำนวนไว้เล่นๆว่า การขุดบิทคอยน์ขึ้นมาบนโลกทั้งหมดตลอด 10 กว่าปีนี้ ใช้พลังงานพอๆกับรถและยานพาหนะทั้งหมดในประเทศอเมริกาใช้ใน 3 วันในวงการนักขุดเหรียญบิทคอยน์นี้ นักขุดทั่วไปน่าจะรู้จักเครื่องขุดบิทคอยน์ที่ชื่อ Antminer กันทุกคนAntminerAntminer ถือเป็นเครื่องขุดที่มีประสิทธิภาพสูงมากที่สุดซีรี่ย์นึงเลยทีเดียว ในสมัย 2 ปีแรกของบิทคอยน์ การขุดยังไม่ต้องใช้พลังงานมากเท่าทุกวันนี้(คำตอบ Hash, Difficulty, สั้นกว่าก็เลยคำนวนได้เร็วกว่า) คอมพิวเตอร์ทั่วไปก็สามารถใช้ขุดได้ แต่เมื่อเวลาผ่านไป Difficulty หรือความยากของ Hash ของบิทคอยน์ก็ถูกปรับเพิ่มขึ้นเรื่อยๆตาม Hashrate หรือความเร็วในการหาคำตอบของเหมืองทั่วโลก ถ้าเราเทียบด้วยพลังงานที่เท่ากัน Antminer สามารถขุดได้ดีกว่ามีประสิทธิภาพมากกว่าคอมพิวเตอร์ทั่วไป ทำให้เป็นที่นิยมในวงการมากด้วยวิธีการขุดที่ใช้พลังงานมหาศาลนี้ต่อเนื่องตลอดเวลา ทำให้บิทคอยน์ถูกมองว่าเป็นเทคโนโลยีที่สิ้นเปลือง ใช้พลังงานอย่างมากไปโดยไม่เกิดประโยชน์อะไร เป็นที่มาของต้นกำเนิดบล็อคเชนอื่นๆที่ทำงานบนอัลกอริทึมที่ต่างออกไป เช่น proof-of-stake เป็นต้นในระยะยาวต่อไปข้างหน้าของการขุดบิทคอยน์ นอกจากการที่ถูกมองว่าเป็นความสิ้นเปลืองแล้ว บริษัทผู้ผลิตเครื่องขุดที่มีประสิทธิภาพอย่าง Antminer นั้น มีเพียง Bitmain ผู้ผลิต Antminer นั่นเอง ในช่วงขาลงของตลาดเหรียญในปี 2018 Bitmain ได้รับผลกระทบค่อนข้างมาก จำเป็นต้องลดจำนวนพนักงานและมีรายงานว่าบริษัทไม่สามารถผลิตเครื่องขุดรุ่นใหม่สุดเป็นจำนวนมากๆได้แล้วแต่ถึงแม้ว่า Bitmain จะเลิกผลิตเครื่องขุดไปเลยก็ตาม การขุดบิทคอยน์ก็ยังสามารถขุดได้ด้วยการ์ดจอที่ถูกพัฒนาขึ้นเรื่อยๆในทุกวันนี้ได้ ตลาดการ์ดจอในปี 2017 มีการเติบโตสูงมากจากการถูกซื้อไปใช้ขุดบิทคอยน์และเหรียญต่างๆ แต่ถึงจะขายดีขึ้นมากก็ตาม บริษัทผู้ผลิตการ์ดจออย่าง nVidia, AMD และ MSI ก็ไม่ได้มีท่าทีจะผลิตสินค้ามาเพื่อรองรับตลาดเหรียญคริปโตโดยเฉพาะวิธีการปรับ Difficulty ของบิทคอยน์ที่ทำให้หาคำตอบได้เร็วขึ้นหรือช้าลง จะถูกคำนวนจาก Hashrate ในทุกๆ 2016 บล็อค(หาคำตอบ Hash เจอ 2016 ครั้งปรับ Difficulty 1 ที) หมายความว่า Difficulty จะยากยิ่งขึ้นไปเรื่อยๆตามความสามารถของเครื่องขุดนั่นเอง การแข่งขันในการขุดบิทคอยน์จึงดุเดือดมาก การปรับ Hardware เครื่องขุดให้เร็วพอเป็นสิ่งที่หลีกเลี่ยงไม่ได้ พลังงานแสงแดดหรือ Solar Energy ถือเป็นกุญแจสำคัญในอนาคตต่อจากนี้สำหรับการขุดบิทคอยน์เลยทีเดียว พลังงานที่ใช้ในการขุดบิทคอยน์ตั้งแต่เกิด 10 กว่าปีจากข้างต้นที่บอกว่า ใช้พลังงานเทียบเท่ากับรถและยานพาหนะทั้งหมดในประเทศอเมริกาใช้ใน 3 วัน สามารถเทียบได้กับพลังงานแสงอาทิตย์ที่ส่องมาที่โลกเพียง 1 วินาทีเท่านั้น ถึงแม้ว่าในความเป็นจริงจะเป็นไปไม่ได้ที่จะใช้พลังงานแสงแดดทั้งหมดที่ส่องมาได้ แต่ก็นับได้ว่าเป็นปัจจัยที่มองข้ามไม่ได้ทีเดียว วันนี้ข้อได้เปรียบสำหรับนักขุดบิทคอยน์คือการเข้าถึงแหล่งพลังงานที่ใช้ในการขุดได้ยิ่งมากและยิ่งประหยัดกว่าคนอื่นเท่าไหร่ ก็ยิ่งได้เปรียบเท่านั้น
โดย: Kan Ouivirach
| Machine Learning
เอาผลของโมเดลมารวมกันแบบนี้ก็ได้เหรอ? มาเรียนรู้เทคนิคง่ายๆ อย่าง Ensemble กัน
ลองนึกถึงเวลาที่เราตัดสินใจจะทำอะไรสักอย่าง เช่น การเลือกซื้อสินค้าสักอย่างหนึ่ง เราคงจะไม่ได้เชื่อทุกอย่างที่เซลส์บอก เราก็คงจะไปตามอ่านรีวีว หรือไม่ก็สอบถามจากเพื่อนๆ ก่อน จนสุดท้ายได้ข้อสรุปของตัวเองมาจึงถึงตัดสินใจที่จะซื้อสินค้านั้นๆเทคนิค Ensemble (อ่านว่า ออน-ซั่ม-เบิล) ใน Machine Learning ก็มีแนวคิดที่คล้ายๆ กัน ซึ่งแนวคิดนั้นก็จะประมาณว่าการตัดสินใจสุดท้ายจะมาจากหลายๆ โมเดลทที่เราสร้าง ซึ่งการทำแบบนี้มีจุดประสงค์เพื่อเพิ่มประสิทธิภาพในการทำนายผลนั่นเองถ้าสมมุติว่าเรามี 5 โมเดล แล้วมีโค้ดประมาณนี้ เราก็เทรนทั้ง 5 โมเดลนั้นเลย# instantiatemodel_1 = tree.DecisionTreeClassifier()model_2 = KNeighborsClassifier()model_3 = LogisticRegression()model_4 = GaussianNB()model_5 = SGDClassifier()# fitmodel_1.fit(X_train, y_train)model_2.fit(X_train, y_train)model_3.fit(X_train, y_train)model_4.fit(X_train, y_train)model_5.fit(X_train, y_train)ส่วนขั้นตอนที่เราจะทำ Prediction นั้น จะมีวิธีทำ 3 วิธีง่ายๆ ที่เราสามารถเอาไปลองใช้ได้ครับMax VotingAveragingWeighted Averagingวิธีแรก Max Votingค่าอะไรที่โมเดลเราตอบมามีจำนวนมากสุด เราก็ตอบค่านั้น 😃 ยกตัวอย่างเป็นโค้ดที่ใช้ Scikit-Learn ดีกว่า ประมาณนี้เลย# predictresults = np.array([ model_1.predict_proba(X_test), model_2.predict_proba(X_test), model_3.predict_proba(X_test), model_4.predict_proba(X_test), model_5.predict_proba(X_test),])mode(results)ใช้ค่า Mode ตอบได้ครับ หรือใครจะเขียนโค้ดให้นับจำนวนก็ได้เช่นกันวิธีที่ 2 Averagingตอบโดยใช้ค่าเฉลี่ย# predictresults = np.array([ model_1.predict_proba(X_test), model_2.predict_proba(X_test), model_3.predict_proba(X_test), model_4.predict_proba(X_test), model_5.predict_proba(X_test),])results.mean()วิธีที่ 3 Weighted Averageวิธีนี้จะคล้ายๆ กับ วิธีที่ 2 แต่จะเป็นการให้ค่า Weight กับแต่ละโมเดลตามนี้# predictresults = np.array([ model_1.predict_proba(X_test) * 0.55, model_2.predict_proba(X_test) * 0.1, model_3.predict_proba(X_test) * 0.15, model_4.predict_proba(X_test) * 0.1, model_5.predict_proba(X_test) * 0.1,])results.sum()ซึ่ง Weight ทุกตัวให้รวมกันให้ได้ 1 นะครับการใช้เทคนิค Ensemble นี้มีโอกาสที่เราจะได้โมเดลที่มีประสิทธิภาพมากขึ้นครับ ซึ่งเป็นอีกเทคนิคหนึ่งที่คนส่วนใหญ่ใช้กันอย่างแพร่หลาย ลองเอาไปใช้ดูนะครับ 😎
โดย: Laris
| IoT
รู้จัก Home Assistant (ตอนที่ 4)
สวัสดีค่ะท่านผู้อ่านทุกท่านวันนี้เราจะกลับมาพบกับ Home Assistant กันอีกครั้งนะคะ จากบทความก่อน เราเริ่มติดตั้งและปรับแต่งกันไปบ้างแล้ว อย่างเช่นพวกสวิตซ์ (Switch) เปิดปิดไฟต่างๆ มีใครพอจะนึกออกบ้างไหมคะว่าถ้าเรามีสวิตช์ หลอดไฟ หรือเซ็นเซอร์ จำนวนมากๆ มันจะเป็นเกิดเหตุการณ์ยังไง? ถ้าใครนึกไม่ออกลองดูภาพข้างล่างนี้ค่ะภาพตัวอย่างของ Sensor ที่ไม่มีกลุ่มค่ะเข้าใจเลยใช่ไหมคะว่าถ้าเรามีจำนวนอุปกรณ์มากๆ หรือถ้าเราต้องการจัดหมวดหมู่ของอุปกรณ์ โดยแบ่งกันไปเป็นห้อง หรือชั้นต่างๆ หากอุปกรณ์มีเยอะมากๆ ก็คงจะปวดหัวน่าดูเลยนะคะ Home Assistant Group Componentวันนี้เรามาเรียนรู้วิธีการจัดการเรื่องพวกนี้ด้วย Group กันนะคะ หน้าตาของ Group ก็จะหน้าตาประมาณนี้ค่ะ สวยงามตามท้องเรื่องตัวอย่างของ Home Assistant ที่มีการจัด Groupสำหรับบทความนี้ Group เป็นสิ่งที่จะมาช่วยเราแก้ปัญหาและอัพเกรดเลเวลของเราเพิ่มขึ้นค่ะ แต่เราจะต้องมารู้จัก Home Assistant เพิ่มขึ้นกันอีกนิดนะคะ ซึ่งสิ่งที่เราจะต้องเรียนรู้กันต่อไปก็คือ Entities, Groups และ Viewsค่ะเริ่มต้นสร้าง Groupก่อนที่เราจะสร้าง และเพิ่มอุปกรณ์เข้าไปใน Group นั้น เราต้องเข้าใจ Default groups กันก่อนนะคะ เดี๋ยวจะงงกันไปก่อน ว่าทำไมหลอดไฟ (Light) ของสวิตช์ (Switch) ของเราไปโผล่ใน Group ได้ยังไง?Default groupsใน Home Assistant จะมี Default Group ด้วย ซึ่งบาง Component จะสร้าง Group พิเศษขึ้นมาซึ่งทั้งหมดจะขึ้นต้นด้วยชื่อแบบนี้ group.all_ ซึ่งหน้าตาก็จะประมาณข้างล่างนี้ค่ะgroup.all_switchesgroup.all_lightsgroup.all_devicesgroup.all_scriptsGroup.all_automationsซึ่งเราสามารถดูได้จากกด Developer Tools → Statesแสดงข้อมูล Entity ทั้งหมดจากกลุ่ม Lightเมื่อเราใช้งาน Component ประเภทหลอดไฟ (Light) หรือประเภทสวิตช์ (Switch) มันจะถูกเพิ่มเข้าไปใน Group ประเภทของตัวเองอัตโนมัติ (Lights, Switches) แต่อาจจะเรียงลำดับไม่ถูกใจเรา ถ้าอยากให้จัดเรียงอยู่ตำแหน่งให้ได้ดั่งใจ ให้ใช้ order เข้ามาช่วยตาม Configuration ข้างล่างเลยนะคะhttps://gist.github.com/hassy-bloggy/bbc510167417755ecdd547366c95dc17การแสดงผลจาก Group Switchโดยปกติแล้วทุกๆ Group จะถูกเรียกมาให้แสดงในแท็ป HOME ค่ะ แต่หากว่าเรามีการสร้าง default_view และ view: true ภายใต้ Group จะถือว่าเราต้องการสร้างหน้า Home เองทั้งหมด (Override หน้า Home เดิม)เมื่อได้ข้อมูลดังนี้แล้วเราลองเล่นในแบบต่างๆ ตาม Configuration นี้ดูนะคะhttps://gist.github.com/hassy-bloggy/5beb3c0dd7acdc869728c8840f79a7d8ผลลัพธ์จะออกแบบมาเป็นหน้า Application ที่มี Tab โผล่มาอีก 2 อันคือ Room 1 และ Room 3 ส่วน Room 2 จะไม่แสดงเป็น Tab แต่จะแสดงเป็น Group ในหน้า Default View แทนอย่าเพิ่งงงนะคะ เรามาดูภาพกันดีกว่าค่ะ ซึ่งเราจะได้ผลลัพธ์ออกมาแบบนี้เมื่อเราปรับ Configuration ในส่วนที่เป็น default_view แล้วกำหนด view: truegroup: default_view: view: true icon: mdi:home entities: - group.room_2 - light.mock_laris_light_00a - light.mock_laris_light_00b - switch.laris_plug_00aUI แสดงผลตาม Configuration ของหน้า Homeหลังจากพูดถึงหน้า default_viewไปแล้ว เราก็จะมาดูค่า Configuration ของ แท็บ Room 1 กันบ้างนะคะ แทบจะเหมือนกันเลย เพียงแค่ตั้งค่า view: trueเพื่อให้แสดงเป็น Tab ขึ้นมาอีกหนึ่งอันข้างบนRoom 1: view: true entities: - light.mock_laris_light_00c - light.mock_laris_light_00d - switch.laris_plug_00bUI แสดงผลตาม Configuration ของหน้า Room 1จะเห็นว่าเราสามารถสร้าง Tab ใหม่ได้ง่ายๆ โดยการกำหนด view: trueเราก็จะได้หน้า หรือ Tab ใหม่ขึ้นมาเลยEntity Idแต่ทำมาถึงตรงนี้สงสัยกันมั้ยคะว่าจะเอาชื่อ Entity Id มาใส่ Configuration ได้จากที่ไหน?คำตอบอยู่ที่ไอคอน State <>หลังจากกดเข้ามาหน้า State แล้วเราจะพบกับ Entity Id ของทุกอุปกรณ์ใน Home Assistant ของเราค่ะหน้า Developer Tools → State แสดง Entity Id ของระบบในหน้า Developer Tools จะบอกชื่อ Friendly Name และ Entity Id เราก๊อบส่วนที่เป็น Entity Id มาใช้ได้เลยค่ะ เมื่อเอามาทำ Group เราก็จะได้ Configuration ออกมาประมาณนี้ (แบบข้างบนเลยค่ะ)group: default_view: view: true icon: mdi:home entities: - light.mock_laris_light_00a - light.mock_laris_light_00b - switch.laris_plug_00a - group.room_2 Room 1: view: true # icon: mdi:ninja entities: - switch.laris_plug_00b - light.mock_laris_light_00c - light.mock_laris_light_00d Room 2: view: false entities: - switch.laris_plug_00b - light.mock_laris_light_00c - light.mock_laris_light_00d Room 3: view: true entities: - group.room_2 - light.mock_laris_light_00aเป็นยังไงกันบ้างคะ หลังจากที่เราปรับแต่ง Group กันไปอย่างเข้มข้นแล้ว ตอนนี้ Smart Home App เราคงจะมีสีสัน และน่าสนใจมากขึ้นแล้วใช่ไหมคะคราวหน้าเราจะเริ่มไปลุยกันเรื่องอื่นกันบ้างแล้วนะคะ แล้วพบกันตอนหน้าค่ะ
โดย: Kan Ouivirach
| Machine Learning
สร้าง Machine Learning โมเดลมาทำ Image Recognition
Image Recogniton คือความสามารถของโปรแกรมในการระบุได้ว่าวัตถุ สถานที่ ผู้คน หรือข้อความต่างๆ ในรูปภาพ ว่าคืออะไร อยู่ที่ไหน ใครเป็นใคร และข้อความนั้นเขียนว่าอะไรถ้าเราอยากจะลองสร้าง (traditional) Machine Learning โมเดลขึ้นมาสักตัวหนึ่งเอามาทำ Image Recognition เราต้องทำอย่างไรบ้างนะ? ปกติแล้วเวลานำข้อมูลเข้าไปสอนโมเดล ข้อมูลนั้นๆ จะอยู่ในรูปแบบ Tabular เนอะ คือแบ่งเป็น Column แต่ละ Column ก็จะมีค่าตัวเลขต่างๆ ทีนี้ถ้าเรามีข้อมูลเป็นรูปภาพล่ะ?ไม่ต้องคิดมากเลยครับ เราก็แปลงรูปให้เป็นข้อมูลแบบ Tabular เลย เช่นถ้ารูปขนาด 2x2 เราก็แปลงให้เป็น Vector ขนาด 1x4 ตามรูปข้างล่างนี้เลยครับแปลงรูป 2x2 ให้เป็น Vector ขนาด 1x4โดยเราจะเอาแถวที่ 2 เป็นต้นไป ขึ้นมาต่อด้านหลังของแถวที่ 1 ไปเรื่อยๆ ครับ เท่านี้เราก็จะมีข้อมูแบบ Tabular ที่ Represent รูป 1 รูปแล้วเรียบร้อย 🎉ถ้ารูปมีขนาดไม่เท่ากัน? วิธีแก้คือเราต้องทำให้ขนาดของรูปทุกรูปเท่ากันก่อนก็พอ ทีนี้ก็แล้วแต่ว่าเราจะ Crop รูป หรือ Resize รูปครับผมเรามาลองเล่นกันบ้างดีกว่า จะได้เข้าใจมากขึ้นครับ เราจะนำข้อมูล Optical Recognition of Handwritten Digits จากเว็บ UCI Machine Learning Repository มาสร้างโมเดลกันPhoto by Green Chameleon on Unsplashโหลดข้อมูลมาก่อนครับimport pandas as pddigits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)digits_train.head()ข้อมูลที่ได้หน้าตาจะประมาณนี้ครับลักษณะข้อมูล Optical Recognition of Handwritten Digitsจะเห็นได้ว่า UCI ได้แปลงข้อมูลให้เรามาแล้ว แต่ถ้าเราจับข้อมูลมาเรียงกลับมาเป็นรูปขนาด 8x8 จะได้แบบนี้first_digit = digits_train.loc[0, :][:-1].values.reshape(8, 8)first_digitแปลงข้อมูล Tabular (Feature Vector) ให้กลับมาอยู่ในรูปขนาด 8x8ถ้าอยากเห็นเป็นรูปจริงๆ เราสามารถใช้ Matplotlib ช่วยได้ครับ%matplotlib inlineimport matplotlib.pyplot as pltplt.figure(1, figsize=(3, 3))plt.imshow(first_digit, cmap=plt.cm.gray_r, interpolation='nearest')plt.show()ใช้ Matplotlib ช่วยแสดงค่าจากอาเรย์ 8x8 ออกมาเป็นรูปภาพถึงแม้ว่าบทความนี้จะแปลงข้อมูลจาก Tabular เป็นรูปขนาด 8x8 แต่จริงๆ เราก็สามารถแปลงรูปขนาด 8x8 ให้อยู่ในรูปแบบของ Feature Vector ขนาด 1x64 ได้ไม่ยากครับ แปลงไปแปลงกลับไม่โกง 😝ทีนี้ขั้นตอนการสร้างโมเดล เราก็สามารถทำตามปกติได้เลยครับ เพราะข้อมูลอยู่ในรูปแบบของ Tabular แล้ว โค้ดทั้งหมดมีตามนี้เลยครับ 👇 (ใช้โมเดล SVM)import pandas as pdfrom sklearn import svmdigits_train = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra', header=None)X_train = digits_train.drop([64], axis=1)y_train = digits_train[64]clf = svm.SVC()clf.fit(X_train, y_train)digits_test = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tes', header=None)X_test = digits_test.drop([64], axis=1)y_test = digits_test[64]y_pred_class = clf.predict(X_test)clf.score(X_test, y_test)เป็นอันเสร็จสิ้น ที่เหลือก็เป็นขั้นตอนการปรับให้โมเดลของเราเก่งขึ้นครับผม 😎
โดย: Laris
| IoT
รู้จัก Home Assistant (ตอนที่ 3)
สวัสดีค่ะ หลังจากที่คราวที่แล้ว พูดถึง MQTT และ Home Assistant และ MQTT Connector กันไปบ้างแล้ว วันนี้เราจะมาพูดถึงในส่วนของการส่งข้อมูลจากอุปกรณ์ และนำไปแสดงผลใน Home Assistant กันนะคะหลังจากที่ทบทวนการปรับแต่งโค๊ดกันในส่วนข้อมูลของอุปกรณ์ และข้อมูล MQTT กันไปแล้ว คราวนี้เราจะมาเชื่อม Hardware ของเราเข้ากับ Home Assistant กันคะกลับมาที่ฝั่ง Arduino ให้เปิดตัวอย่าง basic_mqtt เพื่อเริ่มต้นทบทวนบทความที่ผ่านมากันนะคะFile → Examples → CMMC MQTT Connector → basic_mqttเริ่มจากทบทวนของเก่ากันก่อนให้เราใช้ Library CMMC MQTT Connector กันเหมือนเดิม แก้ Device Name และ MQTT และ Prefix กันก่อนค่ะ_config.h หน้าจอปรับแต่งข้อมูล MQTTหลังจากนั้นก็เข้า HomeAssistant เพื่อปรับแต่งค่า MQTT ให้เหมือนกันค่ะ เริ่มเข้าผ่านทางหน้า Configuration → Integrationsได้เลยเลือก MQTT และกด Configureปรับแต่งค่า Brokerหลังจากนั้นเราก็ไปปรับแต่งค่าใน configuration.yaml เพื่อให้รองรับการเปิด-ปิดหลอดไฟค่ะ โดยเราจะกำหนดค่าตามข้างล่างนี้คะsource codeหลังจากนั้น ก็เปิด HomeAssistant ขึ้นมาก็จะเจอ UI สำหรับเปิดปิดหลอดไฟโผล่ขึ้นมาค่ะ เท่านี้เราก็จะควบคุมอุปกรณ์ผ่านหน้าเว็ปกันได้แล้วนะคะการแสดงผลของ Home Assistant บน iOSลองสั่ง เปิด — ปิด ไฟกันดูก่อนค่ะ ซึ่งทางผู้เขียน จะใช้ mosquitto-clients เข้ามา monitor ข้อมูลที่วิ่งไปวิ่งมาระหว่าง อุปกรณ์ และ Broker ด้วยคำสั่งmosquitto_sub -t "MYAPP/#" -h broker.hivemq.com -vmosquitto_sub -t "MYAPP/#" -h broker.hivemq.com -vจะเห็นว่าเพียงไม่กี่ขั้นตอน เราก็สามารถเปิดปิดไฟผ่านแอปได้แล้วค่ะ ไม่ยากใช่มั้ยคะ ถ้าใครยังงงๆอยู่ เราค่อยๆไปกันเรื่อยๆนะคะ เดี๋ยวเราจะทำโจทย์ที่เป็นการประยุกต์ที่เห็นภาพขึ้นเรื่อยๆนะคะ คราวหน้าเรามาลองเล่นกับการจัด group และการแสดงผลค่าจาก Sensor กันค่ะ

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

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