Inspiration
ทีมของเราสนใจการแข่งขันการสร้าง Machine Learning โดยได้มาเจอการแข่งขัน TMLCC จึงสนใจเป็นอย่างมาก ซึ่งโจทย์ปีนี้ คือ สร้างตัวแบบในการทำนายปริมาณก๊าซคาร์บอนไดออกไซด์ (CO2) ที่ MOFs สามารถดูดซับหรือกักเก็บไว้ได้ ซึ่งก๊าซคาร์บอนไดออกไซด์ (CO2) เป็นสาเหตุที่ทำให้เกิดภาวะการเปลี่ยนแปลงภูมิอากาศของโลก โดยนำเทคนิคการเรียนรู้ของเครื่อง (Machine Learning)
Model explaination
ทำการสร้างโมเดล Neural Network ที่แตกต่างกัน 3 โมเดล จากนั้นเอาค่าพยากรณ์ที่ทำนายได้แต่ในละโมเดลมา weight โดยใช้น้ำหนักเท่ากับ 0.7 0.2 และ 0.1
ทำการสร้างโมเดลแรกคือ Ensemble จาก 3 โมเดล ได้แก่ AdaBoost ที่มี base estimator คือ Decision tree จากโมเดล Bagging ที่มี base estimator คือ Decision tree และจากโมเดล Random Forest ส่วนโมเดลที่สอง คือ AdaBoost ที่มี base estimator คือ Decision tree จากนั้นทำการทำนายค่าจากทั้ง 2 โมเดล จากนั้นนำค่าพยากรณ์ที่ได้จากทั้ง 2 โมเดล และค่าพยากรณ์ที่ได้จากข้อ 1 ที่ได้กล่าวมา นำมา weight หาค่าพยากรณ์ โดยใช้น้ำหนัก คือ 0.1 0.25 และ 0.65 ตามลำดับ
ทำการสร้างโมเดล AdaBoost ที่มี base estimator คือ Decision tree จากนั้นทำการพยากรณ์ค่า นำค่าพยากรณ์ที่ได้ มา weight กับค่าพยากรณ์ที่ได้จากข้อ 1 โดยใช้น้ำหนัก คือ 0.3 และ 0.7 ตามลำดับ
ทำการสร้างโมเดลแรกคือ Ensemble จาก 3 โมเดล ได้แก่ AdaBoost ที่มี base estimator คือ Decision tree จากโมเดล Bagging ที่มี base estimator คือ Decision tree และจากโมเดล Random Forest จากนั้นนำโมเดล Ensemble ที่ได้มาพยากรณ์ค่า จากนั้นนำค่าพยากรณ์ที่ได้มา weight กับค่าพยากรณ์ที่ได้จากข้อ 1 โดยใช้น้ำหนัก คือ 0.09 และ 0.91 ตามลำดับ
ทำการสร้างโมเดลแรกคือ การทำ Ensemble 3 โมเดล จาก AdaBoost ที่มี base estimator คือ Decision tree จากโมเดล Bagging ที่มี base estimator คือ Decision tree และจากโมเดล Random Forest ส่วนโมเดลที่สอง คือ AdaBoost ที่มี base estimator คือ Decision tree จากนั้นทำการทำนายค่าจากทั้ง 2 โมเดล จากนั้นนำค่าพยากรณ์ที่ได้จากทั้ง 2 โมเดล และค่าพยากรณ์ที่ได้จากข้อ 1 นำมา weight หาค่าพยากรณ์ โดยใช้น้ำหนัก คือ 0.1 0.2 และ 0.7 ตามลำดับ
How we built it
ในขั้นตอนแรก จะทำการสำรวจข้อมูลที่ได้รับมา เราพบว่ามีข้อมูลที่ผิดปกติคือ คอลัมน์ surface area, volume และ void fraction ที่จะมีค่า 0,-1 และ คอลัมน์ heat adsorption มีค่าเป็น infinity แต่ทั้งคอลัมน์ volume void fraction และ heat absorptionมีจำนวนที่ผิดปกติไม่มาก เราเลยใช้วิธีตัดออก แต่ surface area มีจำนวนผิดปกติมากถึง 10000กว่า record ทำให้ถ้าตัดออก จะเหลือข้อมูลน้อยลงไปเยอะ เราเลยคิดวิธีแก้ไขดังนี้
- ตัดคอลัมน์ surface area ออก
- Impute surface area ด้วยค่าต่างๆ
- นำข้อมูลของ mofs มาคำนวณเป็น surface area
- ตัด surface area record ที่ผิดปกติออก
ซึ่งวิธีที่ 1 กับ 4 เราได้ลองทำแล้ว พบว่าผลลัพธ์ที่ได้จากโมเดลแย่ลงมาก เราจึงคิดว่า ควรนำข้อมูลของ mofsแต่ละตัวมาคำนวณเป็น surface area แต่เนื่องจากการดึงข้อมูลของmofs มาคำนวณใช้เวลานานมาก ระหว่างนั้นเราจึงทดลองใช้วิธี impute surface area ด้วย linear regression และ stochastic ซึ่งผลออกมาว่า linear ได้ผลที่ดีกว่าเราจึงใช้ข้อมูลเซ็ทนี้ในการทำโมเดลในระหว่างที่รอการดึงข้อมูลจริงๆของ mofs
หลังจากที่สามารถดึงข้อมูลมาได้จนครบแล้วเราได้ทำการเทียบว่า gsa หรือ vsa ที่มีความใกล้เคียงกับ surface area ที่มีอยู่ในdata setมากกว่ากัน พบว่า vsa มีความใกล้เคียงกว่ามาก เราจึงตัดสินใจเลือก vsa ในการ impute ข้อมูล surface areaที่ผิดปกติ
ในตอนแรก เราใช้แค่ feature ที่มีอยู่ใน data set ไม่ได้มีการหา feature เพิ่ม พบว่า featureที่มีอยู่น้อยเกินไป ทำให้ผลลัพธ์จากการทำโมเดลไม่ดีเท่าที่ควร เราจึงหา feature เพิ่มแต่การจะหา feature เพิ่มได้ ต้องใช้ smiles แต่เนื่องจากเราไม่สามารถหา libraryที่จะแปลง functional group เป็น smiles ได้ เราจึงเขียนฟังก์ชั่นใน python เพื่อแปลง functional group ไปเป็น smiles เอง โดยอิงหลักการจากวิธีแปลง functional group เป็น smiles เช่น OMe มี smile คือ CO- และ COOHมี smile คือ -C(=O)(O)เมื่อนำมารวมกัน OMe-COOH จะมี smile คือ COC(=O)(O) เป็นต้น เมื่อสามารถหา smiles ของMOFs ทุกตัวได้แล้ว เราจึงหาfeatureเพิ่ม โดยใช้library ทางเคมีต่างๆ ดังนี้ library rdkit ได้ฟีเจอร์ MolWt, MolLogP, NumValenceElectrons, HeavyAtomCount, NOCount, NumAliphaticRings, NumAromaticRings ,NumHAcceptors, NumHDonors, NumHeteroatoms, NumRotatableBonds
Library pubchempy ได้ฟีเจอร์ ดังนี้ MolecularFormula, MolecularWeight, CanonicalSMILES, IsomericSMILES, InChI, InChIKey, IUPACName, XLogP, ExactMass, MonoisotopicMass, TPSA, Complexity, Charge, HBondDonorCount, HBondAcceptorCount, RotatableBondCount, IsotopeAtomCount, AtomStereoCount, DefinedAtomStereoCount, UndefinedAtomStereoCount, BondStereoCount, DefinedBondStereoCount, UndefinedBondStereoCount, CovalentUnitCount
เมื่อลองนำมาทำโมเดล โดยที่ drop ตัวแปรที่เป็นชื่อต่างๆออก ทำให้ผลลัพธ์ของโมเดลดีขึ้นมาก
ในส่วนของการสร้างโมเดล เราได้แบ่งกันไปทำโมเดลต่างๆดังนี้
ทำการสร้างโมเดล Deep neural network ใช้ hyperband, random search ในการทำ hyperparameter tuning เมื่อได้ hyperparameter ที่ดีที่สุดจาก search มาแล้ว เราก็ได้มาลองเพิ่ม learning rate schedule, drop out , regularization และลองปรับ node, layer ต่างๆ เพื่อแก้ overfitting และทำให้โมเดลดีขึ้น จากนั้นลองทำ functional api ในการรวม 2 โมเดลเข้าด้วยกัน ซึ่งผลออกมายังไม่ดีเท่ากับการใช้ weight ระหว่างโมเดลโดยตรง
ทำการสร้างโมเดล Tree-based โดยโมเดลที่สร้าง ได้แก่ Decision tree, Random Forest, XGBoost, Gradient Boosting, Bagging โดยใช้ base estimator ที่หลากหลาย, AdaBoost โดยใช้ base estimator ที่หลากหลาย, Ensemble โดยใช้จาก Adaboost ที่ใช้ base estimator คือ Decision Tree จาก Bagging ที่ใช้ base estimator คือ Decision Tree และจาก Random Forest และได้มีการใช้ Grid Search และ Randomized Search ในในการหาพารามิเตอร์ที่เหมาะสม
ทำการสร้างโมเดล KNN-Regressor โดยทำการสเกลข้อมูลให้อยู่ในช่วง 0-1 จากนั้นหาค่า k ที่ทำให้ Root-squared mean error (rsme) มีค่าน้อยที่สุด จากนั้น นำค่า k มาสร้างตัวแบบ และปรับพารามิเตอร์ เพื่อให้ค่า mean absolute error (mae) มีค่าต่ำที่สุด และทำการสร้างโมเดล Ensemble โดยเลือกจาก Linear regression, AdaBoostRegressor, XGBoost, Randomforest, K-neighbors Regression มา 3 โมเดล เพื่อนำมาประกอบกัน จากนั้นทำการเฉลี่ยค่าที่ predict ได้
สร้างโมเดล Light GBM Regressor โดยทำการสเกลข้อมูลให้อยู่ในช่วง 0-1 จากนั้นหา จูนพารามิเตอร์ที่จะทำให้ Root-squared mean error (rsme) มีค่าน้อยที่สุด
ศึกษาในส่วนของ Library Ensemble จาก sklearn และทดลองใช้กับโมเดลที่ทีมได้ทำมาประกอบกันในหลายๆรูปแบบเพื่อหาโมเดลที่ดีที่สุดจากการ ensemble model และได้ไปศึกษาเกี่ยวกับ Library ที่เกี่ยวกับ automl โดยไปศึกษาดู benchmark ใน Library ต่างๆและได้ทดลองนำมาใช้กับข้อมูลเช่น Library autokeras, autosklearn, FLAML, h2o
จากที่กล่าวมาข้างต้น โมเดลที่แต่ละคนได้ทำการพยากรณ์ค่า CO2 มา จากนั้นเรานำโมเดลที่ดีที่สุดของแต่ละคนมาทำการ weight น้ำหนักของค่าพยากรณ์ เช่น สมาชิกคนแรกได้สร้างโมเดลทำนายค่า ได้ค่า log(MAE) = 1.23 สมาชิกคนที่ 2 สร้างโมเดลทำนายค่า ได้ค่า log(MAE) = 1.24 และสมาชิกคนที่ 3 สร้างโมเดลทำนายค่า ได้ค่า log(MAE) = 1.25 จากนั้นเราทำการ weight ค่าพยากรณ์ของแต่โมเดล อาทิ 0.65 0.25 0.1 โดยการที่เราทำ weight ค่าพยากรณ์แต่ละโมเดลนี้ ทำให้เราได้ค่า log(MAE) ที่น้อยลง เราจึงนำวิธีการนี้มาหาค่าทำนาย CO2
Challenges we ran into
เนื่องจากเป็นการแข่งขันด้าน ML ที่กลุ่มเราร่วมแข่งกันกันเป็นครั้งแรก อีกทั้งเป็นเรื่องเกี่ยวกับทางด้านเคมีที่กลุ่มเราไม่ค่อยมีความรู้มากนัก เนื่องจากพวกเราเรียนมาทางด้านสถิติ จึงต้องค้นหาความรู้ทางด้านเคมี เช่น การแปลง functional group เป็น smiles เพื่อหา feature เพิ่ม เราได้ไปค้นหาดูว่ามีฟังก์ชันใน python อะไรบ้างที่สามารถแปลง functional group เป็น smile ได้ ซึ่งเราไม่พบ เราจึงแก้ปัญหาด้วยการหาหลักการแปลง functional group เป็น smiles และเขียนฟังก์ชั่นในการแปลงเองโดยอิงจากหลักการที่กล่าวไปข้างต้น ทำให้เราสามารถแปลง functional group เป็น smiles ได้สำเร็จและทำให้เราได้ตัวแปรอื่นเพิ่มขึ้นเยอะมาก สามารถนำตัวแปรที่เพิ่มมาพัฒนาโมเดลได้มีประสิทธิภาพมากขึ้น นอกจากนี้ ยังพบปัญหาในการคำนวณ surface จากข้อมูล MOFs ซึ่งมีปริมาณมากและต้องใช้เวลานาน ทุกคนในทีมจึงแบ่งงานกันรันหา surface ทำให้ใช้เวลาน้อยลง
Accomplishments that we're proud of
ภาคภูมิใจที่ได้ลองหาสิ่งใหม่ ๆ ความรู้ใหม่ ๆ นอกห้องเรียน ได้ลองได้มาเจอปัญหาจริง ได้ลองมาสร้างโมเดลจริง เนื่องจากการแข่งครั้งนี้เป็นการแข่งขันด้าน machine learning ครั้งแรกของพวกเรา ถึงแม้ก่อนหน้านี้จะมีโอกาสได้ลองทำแบบฝึกหัดเรื่อง machine learning ในห้องเรียนมาบ้าง แต่ก็ยังต้องศึกษาเพิ่มเติมและพัฒนาทักษะเพิ่มมากขึ้น ในการแข่งขันครั้งนี้ทำให้พวกเราได้มีประสบการณ์ลงมือทำจริงและได้ค้นคว้าหาความรู้เพิ่มเติม เพื่อมาพัฒนาโมเดล อีกหนึ่งความภาคภูมิใจ คือ ความสามัคคีในการแข่งขันของคนในทีมที่ทำให้การแข่งขันนี้เสร็จลุล่วง ถึงแม้จะเจอปัญหาและอุปสรรคต่าง ๆ พวกเราก็ไม่ย่อท้อต่อปัญหาที่เกิดขึ้น ในระยะเวลา 1 เดือนที่ผ่านมา พวกเราสู้จนถึงที่สุด ช่วยกันฟันฝ่าอุปสรรคจนถึงเส้นชัยแห่งความพยายาม
What we learned
จากการได้ลงแข่งในครั้งนี้ ทางกลุ่มของพวกเราได้ความรู้ทางเคมีเพิ่มมากขึ้น โดยเฉพาะเรื่อง Metal-organic frameworks (MOFs) ได้รู้วิธีเขียนโปรแกรมแบบใหม่ๆ libraryต่างๆ ทั้งทาง modeling และทางเคมี มีทักษะในการ Explore และ Clean ข้อมูลเพื่อที่จะนำไปใช้ในการสร้างโมเดลทำนายผลให้มีประสิทธิภาพมากที่สุด ได้รู้จักตัวแบบหรือเทคนิคในการทำใหม่ๆ นอกจากนี้ยังได้ทักษะในการสร้างและพัฒนาตัวแบบเพิ่มขึ้นอีกด้วย
What's next for thunder storm
พัฒนาความรู้ในด้าน machine learning ต่อและเข้าร่วมการแข่งขันอื่นๆอีก
Log in or sign up for Devpost to join the conversation.