จำแนกผู้ป่วยตามคุณลักษณะทางชีวกลศาสตร์6ส่วนของผู้ป่วยกระดูกและข้อ โดยใช้ machine learning Random Forest Classifier ใน Python
Tags: ai, python
Published: 2024-04-15 23:37:03

ในปัจจุบันการจำแนกสิ่งต่างๆสำคัญเป็นอย่างมากเพื่อให้สามารถจัดการกับสิ่งนั้นได้อย่างรวดเร็วและมีประสิทธิภาพ ดังนั้นการจำแนกข้อมูลข้อผู้ป่วยกระดูกและข้อจึงจำเป็นต้องใช้เครื่องมือประเภทจัดกลุ่มข้อมูลจำนวนมากมารวมกันเพื่อทำนายผลลัพธ์และแม่นยำต่อกการวินิจฉัยโรค เราจึงเลือกใช้โมเดล”Random Forest Classifier”ในโมเดลนี้เหมาะกับงานวิเคราะห์ข้อมูลหลากหลายประเภทและการจัดกลุ่มเป้าหมาย
            บทความนี้ เราจะมาดูการทำงานจำแนกผู้ป่วยโดยใช้โมเดล machine learning Random Forest Classifier ใน Python กัน เริ่มจากเราจะใช้ Google Colab ในการรันโค้ดทั้งหมดและใช้ dataset ของกลุ่มตัวอย่างผู้ป่วย เราได้มาจาก https://www.kaggle.com/datasets/uciml/biomechanical-features-of-orthopedic-patients/data 
            ข้อมูลจะประกอบกันด้วยทั้งหมด2ไฟล์ โดยไฟล์ column_3C_weka.csv จะเป็นข้อมูลการจัดกลุ่มของทั้งหมด3ประเภท ได้แก่ คนปกติจำนวน100ราย ผู้ป่วยโรคหมอนรองกระดูกเคลื่อนทับเส้นประสาทจำนวน60รายและผู้ป่วยโรคกระดูกสันหลังเคลื่อนจำนวน150ราย ในไฟล์ต่อมา column_2C_weka.csv จะเป็นข้อมูที่จะกลุ่มผู้ป่วยที่เป็นโรคหมอนรองกระดูกเคลื่อนทับเส้นประสาทและผู้ป่วยโรคกระดูกสันหลังเคลื่อนรวมเข้าด้วยกันจำนวน210รายและแยกกลุ่มคนปกติออกมาจำนวน100ราย
            โดยผู้ป่วยในแต่ละรายนั้นจะถูกจำแนกตามคุณลักษณะทางชีวกลศาสตร์6ส่วนของของผู้ป่วยกระดูกและข้อ6ส่วนได้แก่ 1) pelvic incidence 2)pelvic tilt 3)lumbar lordosis angle 4)sacral slope 5)pelvic radius 6)grade of spondylolisthesis

**ขั้นตอนที่1 : ทำการนำเข้า libraries ที่จำเป็นต้องใช้หมดลงใน Google Colab**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ypwrv80l24tqgz05pc59.png)

**ขั้นตอนที่2 : โหลดข้อมูล Dataset ลงใน Google Colab**
ข้อมูลDatasetทั้งหมดของผู้ป่วยสามารถดาวน์โหลดได้ที่ https://www.kaggle.com/datasets/uciml/biomechanical-features-of-orthopedic-patients/data ต่อมาเราจะทำการนำไฟล์Datasetนำเข้าไปยังGoogle Colab
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g8vkkz7wapi0w2pc4vq2.png)

**ขั้นตอนที่3 : ทำการโหลดข้อมูลจาก DataFrame และวิเคราะห์ข้อมูลใน Python**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mmx3oanxqyz7elbf4c2a.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m9hi63ox0gyppjjldnyu.png)
เราจะตั้งชื่อตัวแปร df1,df2 ไว้เป็นที่เก็บข้อมูลของDataFrameจากไฟล์ CSVที่จะเก็บข้อมูลไว้คนละชุด
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iwbpxk1bidpq6naq3b48.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vipmonrcm5coyr0belge.png)
ต่อมาเราจะใช้head เมธดแสดงข้อมูลตัวอย่าง5อันดับแรกของ df1,df2
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zarl4qwgheyhsjho1sn7.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8xh1dsnfniukukbwiu5i.png)
และทำการใช้คำสั่งcolumnsทั้งสองตัวแปรเพื่อแสดงชื่อคอลัมน์ทั้งหมดจากข้อมูลที่เราได้เลือกที่จะพัฒนาในตัวแปรdf1และใช้ตัวแปรdf2เป็นชุดข้อมูลทดสอบั้งหมด

**ขั้นตอนที่4 : การจัดการข้อมูล**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/llcvu8xsv7p3503ysia9.png)
ทำการจัดข้อมูลโดยแยกข้อมูลลักษณะของผู้ป่วยและข้อมูลของผลลัพธ์ออกมาจากDataFrameของตัวแปรdf1มาเก็บไว้ในตัวแปร x และ y โดย x จะเก็บข้อมูลColumn1, Column2, Column3 และy เก็บข้อมูลคอลัมน์ Target

**ขั้นตอนที่5 : การตรวจสอบและเปลี่ยนค่า y ให้เป็นไปตามเงื่อนไข**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z72v58upp1enydaj4a7q.png)
โดยตามเงื่อนไขของ y จะค้นหาค่าที่ตรงกับHerniaและSpondylolisthesisเมื่อเจอค่าที่ตรงกับเงื่อนไขจะเปลี่ยนให้เป็น abnormalวนไปเรื่อยๆจนว่าจะครบทั้งหมดภายในy
 
**ขั้นตอนที่6 : การเตรียมข้อมูลสำหรับโมเดล Machine Learning**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3qcdncquardzpo10qojc.png)
เราจะเริ่มจากการแปลงข้อมูลจากข้อความเป็นตัวเลข ด้วยการสร้างตัวแปรencode โดยใช้คลาส LabelEncoder และ encoder.transform(y) แปลงค่าจากข้อความเป็นตัวเลขจากตัวแปรที่สร้างขึ้นไว้ encoder.fit(y) แล้วนำเลขที่แปลงได้ไปเก็บไว้ที่ encoded_y
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0b4kl2zu93u0s74jtct2.png)
และต่อมาเราจะทำการแบ่งข้อมูลออกเป็น2ชุดโดยการสุ่มตามฟังก์ชัน train_test_split เราจะเก็บข้อมูลตัวเลขที่ใช้สำหรับฝึกไว้ใน x ส่วน y_train และ y_test จะเป็นเวกเตอร์ที่เก็บค่าตัวเลขที่แปลงจาก y สำหรับชุดฝึกและชุดทดสอบตามลำดับ ดังโค้ดต่อไปนี้
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2r8krcoge7m7madesqar.png)

**ขั้นตอนที่7 : จำแนกข้อมูลโดยใช้โมเดล Random Forest Classifier**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5q993e8bzxawwmk85tdh.png)
จากบรรทัดนี้เราจะimport โมเดล Random Forest Classifier จาก scikit-learn
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bdj80hy4u9mkuvijg66q.png)
ต่อมาเราจะทำการสร้างโมเดล Random Forest Classifier ทำการกำหนดจำนวนต้นไม้จำนวน100ต้นและตั้งค่า random_state เพื่อให้ผลลัพธ์ซ้ำได้
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a0kyk4flff2yhs5wlp7o.png)
เรียกใช้ฟังก์ชั่น Train ในโมเดล โดย X_train จะเป็น DataFrame และ y_train จะเป็น Series หรือ ndarray เริ่มการทำนายผลลัพธ์บนข้อมูลชุดTest

**ขั้นตอนที่8 : ประเมินประสิทธิภาพของโมเดล**
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n4cl7tafdfareveqpur2.png)
เริ่มจากการ import ฟังก์ชั่นการคำนวณประสิทธิภาพของโมเดล accuracy_score (ความแม่นยำ) และ f1_score (F1 Score) คำนวณความแม่นยำของโมเดลโดยเปรียบเทียบผลการทำนายกับค่า label แล้วนำไปคำนวณ F1 Score ของโมเดล สุดท้ายแสดงผลลัพธ์ของความแม่นยำ (Accuracy) และ F1 Score ได้ผลลัพธ์ดังนี้
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mngie10vxchn1r6xvpwv.png)

**สรุปผล**
เราจะเห็นได้ว่า การที่เรานำโมเดล Random Forest Classifier เข้ามาใช้ในการคำนวณหามีค่าความแม่นยำและคะแนนของF1มากถึง96% ทำให้เห็นว่าเป็นแนวทางที่ดีในการนำข้อมูลออกจำแนกไม่ว่าจะเป็นการลดเวลาในการจัดกลุ่ม และโมเดลนี้ยังนำไปพัฒนาให้มีเปอร์เซ็นต์ข้อผิดพลาดลดน้อยลงกว่านี้ได้อีกในอนาคต

**References**
https://www.kaggle.com/datasets/uciml/biomechanical-features-of-orthopedic-patients/data