โครงการพยากรณ์โรคหัวใจชั้นนำประจำปี 2565
เผยแพร่แล้ว: 2021-05-26ยินดีต้อนรับสู่บทแนะนำทีละขั้นตอนของโครงการทำนายโรคหัวใจของเรา ที่นี่ คุณจะสร้างแบบจำลองการเรียนรู้ของเครื่องที่คาดการณ์ว่าผู้ป่วยจะได้รับการวินิจฉัยว่าเป็นโรคหัวใจหรือไม่
คุณควรคุ้นเคยกับพื้นฐานของการเรียนรู้ของเครื่องและการวิเคราะห์ข้อมูลเพื่อทำงานในโครงการนี้ โปรเจ็กต์นี้ต้องการให้คุณทำความคุ้นเคยกับอัลกอริธึม ML หลายตัว รวมถึง Random Forest, K-NN (K-neighbour ที่ใกล้ที่สุด) และอื่นๆ อีกมากมาย
เราจะทำการโต้แย้งข้อมูล กรอง และทดสอบอัลกอริธึม ML ที่แตกต่างกันหกแบบเพื่อค้นหาว่าอันใดให้ผลลัพธ์ที่ดีที่สุดสำหรับชุดข้อมูลของเรา เอาล่ะ:
สารบัญ
วัตถุประสงค์โครงการพยากรณ์โรคหัวใจ
เป้าหมายของโครงการทำนายโรคหัวใจของเราคือการพิจารณาว่าผู้ป่วยควรได้รับการวินิจฉัยว่าเป็นโรคหัวใจหรือไม่ ซึ่งเป็นผลลัพธ์ที่เป็นเลขฐานสอง ดังนั้น:
ผลบวก = 1 ผู้ป่วย จะ วินิจฉัยว่าเป็นโรคหัวใจ
ผลลบ = 0 ผู้ป่วย จะไม่ได้ รับการวินิจฉัยว่าเป็นโรคหัวใจ
เราต้องค้นหาว่าแบบจำลองการจัดประเภทใดมีความแม่นยำสูงสุดและระบุความสัมพันธ์ในข้อมูลของเรา สุดท้ายนี้ เราต้องพิจารณาด้วยว่าคุณลักษณะใดมีอิทธิพลมากที่สุดในการวินิจฉัยโรคหัวใจของเรา
คุณสมบัติ
เราใช้คุณสมบัติ 13 (X) ต่อไปนี้เพื่อกำหนดตัวทำนายของเรา (Y):
- อายุ.
- เพศ: 1 = ชาย, 0 = หญิง.
- (cp) ประเภทอาการเจ็บหน้าอก (4 ค่า – Ordinal) ค่าที่ 1 : เจ็บหน้าอกทั่วไป ค่าที่ 2 : เจ็บหน้าอกผิดปรกติ ค่าที่ 3 : ไม่เจ็บหน้าอก ค่าที่ 4 : ไม่มีอาการ
- (trestbps) พักความดันโลหิต
- (ชล) เซรั่มคอเลสเตอรอล
- (Fbs) – น้ำตาลในเลือดขณะอดอาหาร > 120 มก./ดล.
- (retecg) – ผลการตรวจคลื่นไฟฟ้าหัวใจขณะพัก
- (ทาลัช) – อัตราการเต้นของหัวใจสูงสุดที่ทำได้
- (exang) – โรคหลอดเลือดหัวใจตีบที่เกิดจากการออกกำลังกาย
- (oldpeak) – โรคซึมเศร้าที่เกิดจากการออกกำลังกายสัมพันธ์กับการพักผ่อน
- (ความชัน) – ความชันของส่วน ST ของการออกกำลังกายสูงสุด
- (ca) – จำนวนเรือหลักที่ระบายสีด้วยฟลูออโรสโคปี
- (ธาล) – อัตราการเต้นของหัวใจสูงสุดที่ทำได้ (ลำดับ), 3 = ปกติ, 6 = ข้อบกพร่องคงที่, 7 = ข้อบกพร่องที่ย้อนกลับได้
ขั้นตอนที่ #1: Data Wrangling
ก่อนอื่นเราจะดูชุดข้อมูลที่เรากำลังทำงานด้วยโดยแปลงให้อยู่ในรูปแบบที่เรียบง่ายและเข้าใจได้ง่ายขึ้น จะช่วยให้เราใช้ข้อมูลได้อย่างเหมาะสมยิ่งขึ้น
นำเข้า numpy เป็น np
นำเข้าแพนด้าเป็น pd
นำเข้า matplotlib เป็น plt
นำเข้า seaborn เป็น sns
นำเข้า matplotlib.pyplot เป็น plt
filePath = '/Users/upgrad/Downloads/datasets-33180-43520-heart.csv'
ข้อมูล = pd.read_csv (filePath)
ข้อมูลหัว(5)
อายุ | เพศ | cp | trestbps | ชล | fbs | restecg | ทาลัช | exang | oldpeak | ความลาดชัน | ca | ตาล | เป้า | |
0 | 63 | 1 | 3 | 145 | 233 | 1 | 0 | 150 | 0 | 2.3 | 0 | 0 | 1 | 1 |
1 | 37 | 1 | 2 | 130 | 250 | 0 | 1 | 187 | 0 | 3.5 | 0 | 0 | 2 | 1 |
2 | 41 | 0 | 1 | 130 | 204 | 0 | 0 | 172 | 0 | 1.4 | 2 | 0 | 2 | 1 |
3 | 56 | 1 | 1 | 120 | 236 | 0 | 1 | 178 | 0 | 0.8 | 2 | 0 | 2 | 1 |
4 | 57 | 0 | 0 | 120 | 354 | 0 | 1 | 163 | 1 | 0.6 | 2 | 0 | 2 | 1 |
เช่นเดียวกับโค้ดด้านบนช่วยให้เราแสดงข้อมูลในรูปแบบตาราง เราจะใช้โค้ดต่อไปนี้สำหรับการโต้แย้งข้อมูลเพิ่มเติม:
พิมพ์(“(แถว, คอลัมน์): ” + str(data.shape))
data.columns
รหัสด้านบนจะแสดงจำนวนแถวและคอลัมน์ทั้งหมด และชื่อคอลัมน์ในชุดข้อมูลของเรา จำนวนแถวและคอลัมน์ทั้งหมดในข้อมูลของเราคือ 303 และ 14 ตามลำดับ ตอนนี้เราจะหาจำนวนค่าที่ไม่ซ้ำกันสำหรับตัวแปรทุกตัวโดยใช้ฟังก์ชันต่อไปนี้:
data.nuique(แกน=0
ในทำนองเดียวกัน ฟังก์ชันต่อไปนี้จะสรุปค่าเฉลี่ย การนับ ส่วนเบี่ยงเบนมาตรฐาน ค่าต่ำสุดและค่าสูงสุดของตัวแปรตัวเลข:
data.describe()
ขั้นตอนที่ #2: ดำเนินการ EDA
ตอนนี้เราได้เสร็จสิ้นการโต้แย้งข้อมูลแล้ว เราสามารถดำเนินการวิเคราะห์ข้อมูลเชิงสำรวจได้ ต่อไปนี้คือภารกิจหลักที่เราจะดำเนินการในขั้นตอนนี้ของโครงการทำนายโรคหัวใจของเรา:
ค้นหาความสัมพันธ์
เราจะสร้างเมทริกซ์สหสัมพันธ์ที่ช่วยให้เราเห็นความสัมพันธ์ระหว่างตัวแปรต่างๆ:
corr = data.corr()
plt.subplots(figsize=(15,10))
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))
sns.heatmap(corr, xticklabels=corr.columns,
yticklabels=corr.columns,
annot=จริง
cmap=sns.diverging_palette(220, 20, as_cmap=True))
หากต้องการค้นหาความสัมพันธ์ระหว่างคุณลักษณะในทันที เรายังสามารถสร้างแผนภาพคู่ เราจะใช้แผนภาพคู่ขนาดเล็กที่มีเฉพาะตัวแปรต่อเนื่องเพื่อดูความสัมพันธ์ให้ลึกซึ้งยิ่งขึ้น:
ข้อมูลย่อย = data[['age','trestbps','chol','thalach','oldpeak']]
sns.pairplot (ข้อมูลย่อย)
การใช้ไวโอลินและโครงกล่อง
ด้วยแผนภาพไวโอลินและกล่อง เราสามารถดูสถิติพื้นฐานและการกระจายข้อมูลของเราได้ คุณสามารถใช้เพื่อเปรียบเทียบการกระจายของตัวแปรเฉพาะในหมวดหมู่ต่างๆ จะช่วยให้เราระบุค่าผิดปกติในข้อมูลได้เช่นกัน ใช้รหัสต่อไปนี้:
plt.figure(figsize=(12,8))
sns.violinplot(x= 'target', y= 'oldpeak',hue=”sex”, inner='quartile',data= data )
plt.title("ระดับธาลัคเทียบกับโรคหัวใจ",fontsize=20)
plt.xlabel("เป้าหมายโรคหัวใจ", fontsize=16)
plt.ylabel("ระดับธาลัค", ขนาดตัวอักษร=16)
ในโครงเรื่องไวโอลินและกล่องแรก เราพบว่าผู้ป่วยที่เป็นบวกมีค่ามัธยฐานที่ต่ำกว่าสำหรับภาวะซึมเศร้า ST มากกว่าผู้ป่วยที่เป็นลบ เราจะใช้โครงเรื่องเพื่อเปรียบเทียบระดับภาวะซึมเศร้า ST กับโรคหัวใจ
plt.figure(figsize=(12,8))
sns.boxplot(x= 'target', y= 'thalach',hue=”sex”, data=data )
plt.title("ระดับความหดหู่ของ ST เทียบกับโรคหัวใจ", fontsize=20)
plt.xlabel("เป้าหมายโรคหัวใจ",fontsize=16)
plt.ylabel("อาการซึมเศร้าที่เกิดจากการออกกำลังกายสัมพันธ์กับการพัก", ขนาดตัวอักษร = 16)
ที่นี่ผู้ป่วยที่เป็นบวกมีค่ามัธยฐานของระดับภาวะซึมเศร้า ST สูงกว่าเมื่อเปรียบเทียบกับผู้ป่วยที่เป็นลบ
การกรองข้อมูล
ตอนนี้เราจะกรองข้อมูลตามผู้ป่วยโรคหัวใจทั้งด้านบวกและด้านลบ เราจะเริ่มด้วยการกรองข้อมูลตามผู้ป่วยโรคหัวใจที่เป็นบวก:
pos_data = data[data['target']==1]
pos_data.describe()
ในทำนองเดียวกัน เราจะกรองข้อมูลตามผู้ป่วยโรคหัวใจเชิงลบ:
pos_data = data[data['target']==0]
pos_data.describe()
ขั้นตอนที่ #3: การใช้อัลกอริธึมการเรียนรู้ของเครื่อง
การตระเตรียม
ที่นี่ เราจะเตรียมข้อมูลสำหรับการฝึกอบรมโดยกำหนดคุณสมบัติให้กับ X และคอลัมน์สุดท้ายให้กับตัวทำนาย Y:
X = data.iloc[:, :-1].values
Y = data.iloc[:, -1}.values
จากนั้น เราจะแบ่งข้อมูลออกเป็นสองชุด ชุดการฝึกและชุดทดสอบ:
จาก sklearn.model_selection นำเข้า train_test_split
x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.2, random_state = 1)
สุดท้าย เราจะปรับข้อมูลให้เป็นมาตรฐาน เพื่อให้การกระจายมีค่าเฉลี่ย 0:
จาก sklearn.preprocessing นำเข้า StandardScaler
sc = StandardScaler ()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)
การฝึกโมเดล
ในส่วนนี้ เราจะใช้อัลกอริธึมการเรียนรู้ของเครื่องหลายตัวและค้นหาอัลกอริธึมที่มีความแม่นยำสูงสุด:
แบบจำลองที่ 1: Logistic Regression
จาก sklearn.metrics นำเข้าการจัดหมวดหมู่_report
จาก sklearn.linear_model นำเข้า LogisticRegression
model1 = LogisticRegression(random_state=1) # รับอินสแตนซ์ของ model
model1.fit(x_train, y_train) # รถไฟ/Fit รุ่น
y_pred1 = model1.predict(x_test) # รับการคาดการณ์ y
พิมพ์ (classification_report(y_test, y_pred1)) # ความแม่นยำของเอาต์พุต
ความแม่นยำของรุ่นนี้คือ 74%
รุ่นที่ 2: K-NN (K-เพื่อนบ้านที่ใกล้ที่สุด)
จาก sklearn.metrics นำเข้าการจัดหมวดหมู่_report
จาก sklearn.neighbours นำเข้า KNeighboursClassifier
model2 = KNeighboursClassifier() # รับอินสแตนซ์ของ model
model2.fit(x_train, y_train) # รถไฟ/Fit รุ่น
y_pred2 = model2.predict(x_test) # รับการคาดการณ์ y
พิมพ์ (classification_report(y_test, y_pred2)) # ความถูกต้องของเอาต์พุต
ความแม่นยำของรุ่นนี้คือ 75%
รุ่นที่ 3: รองรับ Vector Machine (SVM)
จาก sklearn.metrics นำเข้าการจัดหมวดหมู่_report
จาก sklearn.svm นำเข้า SVC
model3 = SVC(random_state=1) # รับอินสแตนซ์ของ model
model3.fit(x_train, y_train) # รถไฟ/Fit รุ่น
y_pred3 = model3.predict(x_test) # รับการคาดการณ์ y
พิมพ์ (classification_report(y_test, y_pred3)) # ความแม่นยำของเอาต์พุต
ความแม่นยำของรุ่นนี้คือ 75%
รุ่นที่ 4: Naive Bayes Classifier
จาก sklearn.metrics นำเข้าการจัดหมวดหมู่_report
จาก sklearn.naive_bayes นำเข้า GaussianNB
model4 = GaussianNB() # รับอินสแตนซ์ของ model
model4.fit(x_train, y_train) # รถไฟ/Fit รุ่น
y_pred4 = model4.predict(x_test) # รับการคาดการณ์ y
พิมพ์ (classification_report(y_test, y_pred4)) # ความถูกต้องของเอาต์พุต
ความแม่นยำของโมเดลนี้คือ 77%
รุ่นที่ 5: ป่าสุ่ม
จาก sklearn.metrics นำเข้าการจัดหมวดหมู่_report
จาก sklearn.ensemble นำเข้า RandomForestClassifier
model6 = RandomForestClassifier(random_state=1)# รับอินสแตนซ์ของ model
model6.fit(x_train, y_train) # รถไฟ/Fit รุ่น
y_pred6 = model6.predict(x_test) # รับการคาดการณ์ y
พิมพ์ (classification_report(y_test, y_pred6)) # ความถูกต้องของเอาต์พุต
โมเดลนี้มีความแม่นยำสูงสุด 80%
รุ่นที่ 6: XGBoost
จาก xgboost นำเข้า XGBClassifier
model7 = XGBClassifier (สุ่มสถานะ = 1)
model7.fit(x_train, y_train)
y_pred7 = model7.predict(x_test)
พิมพ์(classification_report(y_test, y_pred7))
ความแม่นยำของรุ่นนี้คือ 69%
หลังจากทดสอบอัลกอริธึม ML ต่างๆ เราพบว่าอัลกอริธึมที่ดีที่สุดคือ Random Forest เนื่องจากให้ความแม่นยำสูงสุด 80%
โปรดจำไว้ว่าเปอร์เซ็นต์ความแม่นยำใดๆ ที่สูงกว่า 80% นั้นดีเกินกว่าจะเป็นจริง และอาจเป็นเพราะการใส่มากเกินไป นั่นคือเหตุผลที่ 80% เป็นจำนวนที่เหมาะสมที่สุดในการเข้าถึง
ขั้นตอนที่ #4: ค้นหาคะแนนคุณสมบัติ
ที่นี่ เราจะพบคะแนนคุณสมบัติ ซึ่งช่วยให้เราตัดสินใจที่สำคัญโดยบอกเราว่าคุณลักษณะใดมีประโยชน์มากที่สุดสำหรับแบบจำลองของเรา:
#รับความสำคัญ
ความสำคัญ = model6.feature_importances_
# สรุปความสำคัญของคุณสมบัติ
สำหรับฉัน v ในการแจกแจง (สำคัญ):
print('คุณลักษณะ: %0d คะแนน: %.5f' % (i,v))
เราพบว่าลักษณะเด่นสี่อันดับแรกคือประเภทอาการเจ็บหน้าอก (cp) อัตราการเต้นของหัวใจสูงสุดที่ทำได้ (ธาลัค) จำนวนหลอดเลือดหลัก (ca) และภาวะซึมเศร้าที่เกิดจากการออกกำลังกายสัมพันธ์กับการพักผ่อน (oldpeak)
บทสรุป
ยินดีด้วย คุณทำโครงการทำนายโรคหัวใจสำเร็จแล้ว เรามีคุณลักษณะ 13 ประการ ซึ่งเราพบว่าสิ่งที่สำคัญที่สุดคือประเภทอาการเจ็บหน้าอกและอัตราการเต้นของหัวใจสูงสุดที่ทำได้
เราทดสอบอัลกอริธึม ML ที่แตกต่างกันหกแบบ และพบว่าอัลกอริธึมที่แม่นยำที่สุดคือ Random Forest คุณควรทดสอบโมเดลนี้ด้วยชุดทดสอบและดูว่าโมเดลนี้ทำงานได้ดีเพียงใด
ในทางกลับกัน หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับแมชชีนเลิร์นนิงและ AI เราขอแนะนำให้ดู หลักสูตร AI ของ เรา คุณจะได้เรียนโดยตรงจากผู้เชี่ยวชาญในอุตสาหกรรมและทำงานในโครงการอุตสาหกรรมที่ให้คุณทดสอบความรู้ของคุณ ตรวจสอบพวกเขาหากคุณสนใจอาชีพด้านการเรียนรู้ของเครื่องและ AI
หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับแมชชีนเลิร์นนิง โปรดดูที่ IIIT-B & upGrad's Executive PG Program in Machine Learning & AI ซึ่งออกแบบมาสำหรับมืออาชีพที่ทำงานและมีการฝึกอบรมที่เข้มงวดมากกว่า 450 ชั่วโมง กรณีศึกษาและการมอบหมายมากกว่า 30 รายการ IIIT -B สถานะศิษย์เก่า 5+ โครงการหลักที่ปฏิบัติได้จริง & ความช่วยเหลืองานกับ บริษัท ชั้นนำ
แมชชีนเลิร์นนิงช่วยภาคการดูแลสุขภาพอย่างไร
ปัจจุบันมีการใช้แมชชีนเลิร์นนิงที่น่าสนใจมากมายในภาคการดูแลสุขภาพ เหนือสิ่งอื่นใด การใช้งานหลักประการหนึ่งคือการตรวจหาและวินิจฉัยโรค เริ่มต้นจากการตรวจหาโรคทางพันธุกรรมที่หายากจนถึงระยะเริ่มต้นของมะเร็ง แมชชีนเลิร์นนิงได้พิสูจน์แล้วว่าช่วยได้มากในเรื่องนี้ มีการใช้งานอื่นๆ อีกมากมาย เช่น การค้นหายา การวินิจฉัยด้วยภาพ การรักษาบันทึกด้านสุขภาพที่ชาญฉลาด ยาป้องกัน เช่น การปรับเปลี่ยนพฤติกรรม การทำนายการระบาดของโรคและการกลับเป็นซ้ำ การปรับปรุงการฉายรังสี การวิจัยทางคลินิกที่มีประสิทธิภาพ และการทดลองกับผู้ป่วย และอื่นๆ
ฉันจะเป็นนักวิทยาศาสตร์ข้อมูลด้านการดูแลสุขภาพได้อย่างไร
เนื่องจากอุตสาหกรรมการดูแลสุขภาพเป็นหนึ่งในแหล่งข้อมูลที่ใหญ่ที่สุดในโลก ความต้องการนักวิทยาศาสตร์ข้อมูลด้านการดูแลสุขภาพจึงคาดว่าจะเพิ่มขึ้น การผสมผสานระหว่างศาสตร์ด้านการดูแลสุขภาพและวิทยาศาสตร์ข้อมูลเป็นเส้นทางที่มีแนวโน้มและเกิดผล และนักวิทยาศาสตร์ด้านข้อมูลด้านสุขภาพที่ต้องการจะใช้ประโยชน์จากสถานการณ์นี้ได้ วิทยาศาสตร์ข้อมูลการดูแลสุขภาพเป็นสาขาที่ค่อนข้างใหม่ เป็นการผสมผสานระหว่างสถิติ คณิตศาสตร์ ชีวสารสนเทศ วิทยาการคอมพิวเตอร์ และระบาดวิทยา พื้นฐานและชุดทักษะในการเป็นนักวิทยาศาสตร์ข้อมูลนั้นเหมือนกัน แต่คุณจะเน้นที่ข้อมูลและแอปพลิเคชันด้านการดูแลสุขภาพเท่านั้น ความรู้เกี่ยวกับการเขียนโปรแกรมคอมพิวเตอร์โดยใช้ Python, R และ SAS จะเป็นประโยชน์ มหาวิทยาลัยชั้นนำระดับโลกเปิดสอนหลักสูตรระดับสูงกว่าปริญญาตรีเฉพาะทางในสาขาวิทยาศาสตร์ข้อมูลด้านการดูแลสุขภาพ
แพทย์จำเป็นต้องรู้วิทยาศาสตร์ข้อมูลหรือไม่?
ด้วยปัญญาประดิษฐ์และวิทยาศาสตร์ข้อมูลที่กำลังเข้าสู่กระแสหลักอย่างรวดเร็ว สิ่งเหล่านี้เป็นมากกว่าคำศัพท์เฉพาะในภาคการดูแลสุขภาพ ความสำคัญอย่างใหญ่หลวงของเทคโนโลยีเหล่านี้ในการดึงข้อมูลที่เป็นประโยชน์ทางคลินิกจากชุดข้อมูลขนาดใหญ่กำลังสนับสนุนให้แพทย์และแพทย์ให้ความสนใจในสาขาเหล่านี้ใหม่ ความรู้ด้านวิทยาศาสตร์ข้อมูลช่วยเพิ่มข้อได้เปรียบให้กับแพทย์ เนื่องจากแพทย์สามารถวินิจฉัยโรคหายากได้อย่างรวดเร็วและแม่นยำโดยใช้ข้อมูลหลายพารามิเตอร์และชุดข้อมูลขนาดใหญ่ที่ได้รับจากการเฝ้าติดตามอย่างต่อเนื่อง AI ช่วยวินิจฉัยโดยใช้เทคนิคการสร้างภาพข้อมูลที่มีประสิทธิภาพ และช่วยให้พวกเขาเห็นคุณค่าของความสำคัญทางสถิติของการศึกษาทางคลินิก