โครงการพยากรณ์โรคหัวใจชั้นนำประจำปี 2565

เผยแพร่แล้ว: 2021-05-26

ยินดีต้อนรับสู่บทแนะนำทีละขั้นตอนของโครงการทำนายโรคหัวใจของเรา ที่นี่ คุณจะสร้างแบบจำลองการเรียนรู้ของเครื่องที่คาดการณ์ว่าผู้ป่วยจะได้รับการวินิจฉัยว่าเป็นโรคหัวใจหรือไม่

คุณควรคุ้นเคยกับพื้นฐานของการเรียนรู้ของเครื่องและการวิเคราะห์ข้อมูลเพื่อทำงานในโครงการนี้ โปรเจ็กต์นี้ต้องการให้คุณทำความคุ้นเคยกับอัลกอริธึม ML หลายตัว รวมถึง Random Forest, K-NN (K-neighbour ที่ใกล้ที่สุด) และอื่นๆ อีกมากมาย

เราจะทำการโต้แย้งข้อมูล กรอง และทดสอบอัลกอริธึม ML ที่แตกต่างกันหกแบบเพื่อค้นหาว่าอันใดให้ผลลัพธ์ที่ดีที่สุดสำหรับชุดข้อมูลของเรา เอาล่ะ:

สารบัญ

วัตถุประสงค์โครงการพยากรณ์โรคหัวใจ

เป้าหมายของโครงการทำนายโรคหัวใจของเราคือการพิจารณาว่าผู้ป่วยควรได้รับการวินิจฉัยว่าเป็นโรคหัวใจหรือไม่ ซึ่งเป็นผลลัพธ์ที่เป็นเลขฐานสอง ดังนั้น:

ผลบวก = 1 ผู้ป่วย จะ วินิจฉัยว่าเป็นโรคหัวใจ

ผลลบ = 0 ผู้ป่วย จะไม่ได้ รับการวินิจฉัยว่าเป็นโรคหัวใจ

เราต้องค้นหาว่าแบบจำลองการจัดประเภทใดมีความแม่นยำสูงสุดและระบุความสัมพันธ์ในข้อมูลของเรา สุดท้ายนี้ เราต้องพิจารณาด้วยว่าคุณลักษณะใดมีอิทธิพลมากที่สุดในการวินิจฉัยโรคหัวใจของเรา

คุณสมบัติ

เราใช้คุณสมบัติ 13 (X) ต่อไปนี้เพื่อกำหนดตัวทำนายของเรา (Y):

  1. อายุ.
  2. เพศ: 1 = ชาย, 0 = หญิง.
  3. (cp) ประเภทอาการเจ็บหน้าอก (4 ค่า – Ordinal) ค่าที่ 1 : เจ็บหน้าอกทั่วไป ค่าที่ 2 : เจ็บหน้าอกผิดปรกติ ค่าที่ 3 : ไม่เจ็บหน้าอก ค่าที่ 4 : ไม่มีอาการ
  4. (trestbps) พักความดันโลหิต
  5. (ชล) เซรั่มคอเลสเตอรอล
  6. (Fbs) – น้ำตาลในเลือดขณะอดอาหาร > 120 มก./ดล.
  7. (retecg) – ผลการตรวจคลื่นไฟฟ้าหัวใจขณะพัก
  8. (ทาลัช) – อัตราการเต้นของหัวใจสูงสุดที่ทำได้
  9. (exang) – โรคหลอดเลือดหัวใจตีบที่เกิดจากการออกกำลังกาย
  10. (oldpeak) – โรคซึมเศร้าที่เกิดจากการออกกำลังกายสัมพันธ์กับการพักผ่อน
  11. (ความชัน) – ความชันของส่วน ST ของการออกกำลังกายสูงสุด
  12. (ca) – จำนวนเรือหลักที่ระบายสีด้วยฟลูออโรสโคปี
  13. (ธาล) – อัตราการเต้นของหัวใจสูงสุดที่ทำได้ (ลำดับ), 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 ช่วยวินิจฉัยโดยใช้เทคนิคการสร้างภาพข้อมูลที่มีประสิทธิภาพ และช่วยให้พวกเขาเห็นคุณค่าของความสำคัญทางสถิติของการศึกษาทางคลินิก