2022년 최고의 심장병 예측 프로젝트

게시 됨: 2021-05-26

심장 질환 예측 프로젝트의 단계별 자습서에 오신 것을 환영합니다. 여기에서 환자가 심장병 진단을 받을 수 있는지 여부를 예측하는 기계 학습 모델을 만듭니다.

이 프로젝트에서 작업하려면 기계 학습 및 데이터 분석의 기본 사항에 익숙해야 합니다. 이 프로젝트를 수행하려면 Random Forest, K-NN(K-최근접 이웃) 및 기타 여러 가지를 비롯한 여러 ML 알고리즘에 익숙해야 합니다.

데이터 랭글링, 필터링을 수행하고 6가지 ML 알고리즘을 테스트하여 데이터 세트에 대한 최적의 결과를 제공하는 알고리즘을 찾습니다. 의 시작하자:

목차

심장질환예측사업의 목적

우리의 심장 질환 예측 프로젝트의 목표는 환자가 심장 질환으로 진단되어야 하는지 여부를 결정하는 것입니다. 이는 이진 결과이므로 다음과 같습니다.

양성 결과 = 1, 환자 심장병으로 진단됩니다.

음성 결과 = 0, 환자심장 질환 으로 진단되지 않습니다 .

어떤 분류 모델이 가장 정확도가 높은지 찾고 데이터에서 상관 관계를 식별해야 합니다. 마지막으로, 우리는 또한 어떤 특징이 심장병 진단에 가장 영향력이 있는지 결정해야 합니다.

특징

예측 변수(Y)를 결정하기 위해 다음 13가지 기능(X)을 사용합니다.

  1. 나이.
  2. 성별: 1 = 남성, 0 = 여성.
  3. (cp) 흉통 유형(4값 - Ordinal), 첫 번째 값: 전형적인 협심증, 두 번째 값: 비정형 협심증, 세 번째 값: 협심증이 아닌 통증, 네 번째 값: 무증상.
  4. (trestbps) 안정시 혈압.
  5. (콜) 혈청 콜레스테롤.
  6. (Fbs) – 공복 혈당 > 120 mg/dl.
  7. (retecg) – 안정시 심전도 결과.
  8. (thalach) – 달성한 최대 심박수.
  9. (exang) – 운동 유발 협심증.
  10. (oldpeak) – 휴식에 비해 운동으로 인한 ST 우울증.
  11. (기울기) – 피크 운동 ST 세그먼트의 기울기.
  12. (ca) - 형광투시로 착색된 주요 혈관의 수.
  13. (thal) – 달성된 최대 심박수(서수), 3 = 정상, 6 = 고정 결함, 7 = 가역적 결함.

1단계: 데이터 랭글링

먼저 작업 중인 데이터세트를 더 간단하고 이해하기 쉬운 형식으로 변환하여 살펴보겠습니다. 데이터를 보다 적절하게 사용하는 데 도움이 됩니다.

numpy를 np로 가져오기

pandas를 pd로 가져오기

matplotlib를 plt로 가져오기

씨본을 sns로 가져오기

matplotlib.pyplot을 plt로 가져오기

파일 경로 = '/사용자/업그레이드/다운로드/데이터 세트-33180-43520-heart.csv'

데이터 = pd.read_csv(파일 경로)

data.head(5)

나이 섹스 cp trestbps fbs 재테크 탈라크 엑상 올드피크 경사 캘리포니아 표적
0 63 1 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
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

위의 코드가 데이터를 표 형식으로 표시하는 데 도움이 된 것처럼 추가 데이터 랭글링에 다음 코드를 사용합니다.

print("(행, 열): " + str(data.shape))

data.columns

위의 코드는 데이터 세트의 총 행과 열 수와 열 이름을 보여줍니다. 데이터의 총 행과 열 수는 각각 303개와 14개입니다. 이제 다음 함수를 사용하여 모든 변수에 대한 고유 값의 수를 찾습니다.

data.nunique(축=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,

주석 = 사실,

cmap=sns.diverging_palette(220, 20, as_cmap=True))

기능 간의 즉각적인 상관 관계를 찾기 위해 쌍 그림을 만들 수도 있습니다. 관계를 더 자세히 살펴보기 위해 연속형 변수만 있는 작은 쌍 그림을 사용합니다.

subData = 데이터[['나이','trestbps','chol','thalach','oldpeak']]

sns.pairplot(하위 데이터)

바이올린과 박스 플롯 사용하기

바이올린과 상자 플롯을 사용하여 데이터의 기본 통계 및 분포를 볼 수 있습니다. 이를 사용하여 여러 범주에 걸친 특정 변수의 분포를 비교할 수 있습니다. 데이터의 이상값도 식별하는 데 도움이 됩니다. 다음 코드를 사용하십시오.

plt.Figure(figsize=(12,8))

sns.violinplot(x= '대상', y= 'oldpeak', 색조=”성별”, inner='사분위수', 데이터= 데이터)

plt.title("Thalach 수치 대 심장병", fontsize=20)

plt.xlabel("심장 질환 대상", fontsize=16)

plt.ylabel("Thalach 레벨", fontsize=16)

첫 번째 Violin and Box 그림에서 양성 환자는 음성 환자보다 ST 우울증의 중앙값이 더 낮습니다. 따라서 ST 우울증 수준과 심장병을 비교하기 위해 플롯을 사용할 것입니다.

plt.Figure(figsize=(12,8))

sns.boxplot(x= 'target', y= 'thalach',hue=”sex”, data=data )

plt.title("ST 우울증 수치 vs. 심장병", fontsize=20)

plt.xlabel("심장 질환 대상", fontsize=16)

plt.ylabel("휴식에 비해 운동으로 유발된 ST 저하", fontsize=16)

여기에서 양성 환자는 음성 환자에 비해 ST 우울증 수준의 중앙값이 더 높았습니다.

데이터 필터링

이제 양성 및 음성 심장병 환자에 따라 데이터를 필터링합니다. 긍정적인 심장 질환 환자를 기준으로 데이터를 필터링하는 것으로 시작하겠습니다.

pos_data = 데이터[데이터['대상']==1]

pos_data.describe()

마찬가지로 음성 심장병 환자에 따라 데이터를 필터링합니다.

pos_data = 데이터[데이터['대상']==0]

pos_data.describe()

3단계: 기계 학습 알고리즘 사용

준비

여기에서 특성을 X에 할당하고 마지막 열을 예측 변수 Y에 할당하여 훈련용 데이터를 준비합니다.

X = data.iloc[:, :-1].값

Y = data.iloc[:, -1}.값

그런 다음 데이터를 훈련 세트와 테스트 세트의 두 세트로 나눕니다.

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 = 1)

마지막으로 분포의 평균이 0이 되도록 데이터를 정규화합니다.

sklearn.preprocessing 가져오기 StandardScaler에서

sc = StandardScaler()

x_train = sc.fit_transform(x_train)

x_test = sc.transform(x_test)

모델 훈련

이 섹션에서는 여러 기계 학습 알고리즘을 사용하고 가장 높은 정확도를 제공하는 알고리즘을 찾습니다.

첫 번째 모델: 로지스틱 회귀

sklearn.metrics 가져오기 분류 보고서에서

sklearn.linear_model에서 LogisticRegression 가져오기

model1 = LogisticRegression(random_state=1) # 모델의 인스턴스 가져오기

model1.fit(x_train, y_train) # 모델 훈련/맞춤

y_pred1 = model1.predict(x_test) # y개의 예측값을 얻습니다.

print(classification_report(y_test, y_pred1)) # 출력 정확도

이 모델의 정확도는 74%였습니다.

두 번째 모델: K-NN(K-최근접 이웃)

sklearn.metrics 가져오기 분류 보고서에서

sklearn.neighbours에서 KNeighboursClassifier 가져오기

model2 = KNeighboursClassifier() # 모델의 인스턴스 가져오기

model2.fit(x_train, y_train) # 모델 훈련/맞춤

y_pred2 = model2.predict(x_test) # y개의 예측값을 얻습니다.

print(classification_report(y_test, y_pred2)) # 출력 정확도

이 모델의 정확도는 75%였습니다.

3차 모델: 서포트 벡터 머신(SVM)

sklearn.metrics 가져오기 분류 보고서에서

sklearn.svm 가져오기 SVC에서

model3 = SVC(random_state=1) # 모델의 인스턴스 가져오기

model3.fit(x_train, y_train) # 모델 훈련/맞춤

y_pred3 = model3.predict(x_test) # y개의 예측값을 얻습니다.

print(classification_report(y_test, y_pred3)) # 출력 정확도

이 모델의 정확도는 75%였습니다.

네 번째 모델: 나이브 베이즈 분류기

sklearn.metrics 가져오기 분류 보고서에서

sklearn.naive_bayes에서 GaussianNB 가져오기

model4 = GaussianNB() # 모델의 인스턴스 가져오기

model4.fit(x_train, y_train) # 모델 훈련/맞춤

y_pred4 = model4.predict(x_test) # y개의 예측값을 얻습니다.

print(classification_report(y_test, y_pred4)) # 출력 정확도

이 모델의 정확도는 77%였습니다.

5번째 모델: 랜덤 포레스트

sklearn.metrics 가져오기 분류 보고서에서

sklearn.ensemble에서 RandomForestClassifier 가져오기

model6 = RandomForestClassifier(random_state=1)# 모델의 인스턴스 가져오기

model6.fit(x_train, y_train) # 모델 훈련/맞춤

y_pred6 = model6.predict(x_test) # y개의 예측값을 얻습니다.

print(classification_report(y_test, y_pred6)) # 출력 정확도

이 모델은 80%의 가장 높은 정확도를 보였습니다.

6번째 모델: XGBoost

xgboost에서 가져오기 XGBClassifier

model7 = XGBClassifier(random_state=1)

model7.fit(x_train, y_train)

y_pred7 = model7.predict(x_test)

print(classification_report(y_test, y_pred7))

이 모델의 정확도는 69%였습니다.

다양한 ML 알고리즘을 테스트한 후 80%의 최적 정확도를 제공하는 Random Forest가 가장 좋은 것으로 나타났습니다.

80%보다 높은 정확도 백분율은 사실이라고 하기에는 너무 좋은 것이며 과적합 때문일 수 있습니다. 그렇기 때문에 80%가 도달하기에 최적의 숫자입니다.

4단계: 기능 점수 찾기

여기에서 우리 모델에 가장 유용한 기능을 알려줌으로써 중요한 결정을 내리는 데 도움이 되는 기능 점수를 찾을 수 있습니다.

# 중요성을 얻다

중요도 = model6.feature_importances_

# 기능 중요도 요약

열거(중요)에서 i,v에 대해:

print('기능: %0d, 점수: %.5f' % (i,v))

우리는 상위 4가지 기능이 흉통 유형(cp), 달성된 최대 심박수(시상), 주요 혈관 수(ca) 및 휴식에 비해 운동으로 인한 ST 저하(oldpeak)임을 발견했습니다.

결론

축하합니다. 이제 심장 질환 예측 프로젝트를 성공적으로 완료하셨습니다. 13가지 기능이 있었는데 그 중 가장 중요한 기능은 흉통 유형과 달성한 최대 심박수였습니다.

우리는 6가지 다른 ML 알고리즘을 테스트했으며 가장 정확한 알고리즘이 랜덤 포레스트라는 것을 발견했습니다. 테스트 세트로 이 모델을 테스트하고 이 모델이 얼마나 잘 작동하는지 확인해야 합니다.

반면에 머신 러닝과 AI에 대해 더 알고 싶다면 AI 과정 을 확인하는 것이 좋습니다 . 산업 전문가로부터 직접 연구하고 지식을 테스트할 수 있는 산업 프로젝트에서 작업합니다. 기계 학습 및 AI 분야의 경력에 ​​관심이 있다면 확인하십시오.

머신 러닝에 대해 자세히 알아보려면 IIIT-B & upGrad의 기계 학습 및 AI 경영자 PG 프로그램을 확인하세요. 이 프로그램은 일하는 전문가를 위해 설계되었으며 450시간 이상의 엄격한 교육, 30개 이상의 사례 연구 및 과제, IIIT를 제공합니다. -B 동문 자격, 5개 이상의 실용적인 실습 캡스톤 프로젝트 및 최고의 기업과의 취업 지원.

머신 러닝이 의료 부문에 어떻게 도움이 됩니까?

오늘날 의료 부문에서 머신 러닝의 흥미로운 용도가 많이 있습니다. 무엇보다도 주요 용도 중 하나는 질병의 감지 및 진단입니다. 희귀 유전 질환을 발견하는 것부터 암의 초기 단계에 이르기까지 머신 러닝은 이와 관련하여 큰 도움이 되는 것으로 입증되었습니다. 약물 발견, 영상 진단, 스마트 건강 기록 유지, 행동 수정과 같은 예방 의학, 질병 발병 및 재발 예측, 방사선 요법 개선, 효율적인 임상 연구 및 환자 시험 등과 같은 많은 다른 용도가 있습니다.

의료 데이터 과학자가 되려면 어떻게 해야 하나요?

의료 산업은 세계에서 가장 방대한 데이터 소스 중 하나라는 점을 감안할 때 의료 데이터 과학자에 대한 수요는 증가할 것으로 예상됩니다. 건강 관리와 데이터 과학의 융합은 유망하고 유익한 길이며, 야심 찬 건강 데이터 과학자는 이러한 상황을 활용할 수 있습니다. 의료 데이터 과학은 비교적 새로운 분야입니다. 통계, 수학, 생물 정보학, 컴퓨터 과학 및 역학이 혼합되어 있습니다. 데이터 과학자가 되기 위한 기초와 기술은 동일하지만 의료 데이터 및 애플리케이션에만 초점을 맞출 것입니다. Python, R 및 SAS를 사용한 컴퓨터 프로그래밍 지식이 도움이 될 것입니다. 최고의 글로벌 대학은 의료 데이터 과학 분야의 전문 대학원 프로그램을 제공합니다.

의사가 데이터 과학을 알아야 합니까?

AI와 데이터 과학이 빠르게 주류로 진입함에 따라 이는 의료 분야에서 단순한 유행어가 아닙니다. 방대한 양의 데이터 세트에서 임상적으로 유용한 정보를 추출하는 이러한 기술의 엄청난 중요성은 의사와 의사가 이 분야에 새로운 관심을 갖도록 장려하고 있습니다. 데이터 사이언스를 알면 의사들이 다중 매개변수 정보와 지속적인 모니터링을 통해 얻은 방대한 데이터 세트를 사용하여 희귀 질환을 빠르고 정확하게 진단할 수 있기 때문에 의사에게 추가적인 이점을 제공합니다. AI는 효과적인 데이터 시각화 기술을 통해 진단을 돕고 임상 연구의 통계적 중요성을 인식하도록 돕습니다.