И. Импорт библиотек

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline

import os
print(os.listdir())

import warnings
warnings.filterwarnings('ignore')

II. Импорт и понимание нашего набора данных

dataset = pd.read_csv("heart.csv")

Проверка его как объекта dataframe в pandas

type(dataset)

(панды.core.frame.DataFrame)

Форма набора данных

(303, 14)

Распечатка нескольких столбцов

dataset.head(5)

dataset.sample(5)

Описание

dataset.describe()

dataset.info()

К счастью, у нас нет пропущенных значений

Давайте лучше разберемся в наших столбцах:

info = ["age","1: male, 0: female","chest pain type, 1: typical angina, 2: atypical angina, 3: non-anginal pain, 4: asymptomatic","resting blood pressure"," serum cholestoral in mg/dl","fasting blood sugar > 120 mg/dl","resting electrocardiographic results (values 0,1,2)"," maximum heart rate achieved","exercise induced angina","oldpeak = ST depression induced by exercise relative to rest","the slope of the peak exercise ST segment","number of major vessels (0-3) colored by flourosopy","thal: 3 = normal; 6 = fixed defect; 7 = reversable defect"]



for i in range(len(info)):
    print(dataset.columns[i]+":\t\t\t"+info[i])

Анализ «целевой» переменной

dataset["target"].describe()

dataset["target"].unique()
array([1, 0])

Очевидно, что это проблема классификации, поскольку целевая переменная имеет значения "0" и "1"

Проверка корреляции между столбцами

print(dataset.corr()["target"].abs().sort_values(ascending=False))

Это показывает, что большинство столбцов умеренно коррелируют с целевым значением, но "fbs" коррелирует очень слабо.

Исследовательский анализ данных (EDA)

Во-первых, анализ целевой переменной:

y = dataset["target"]

sns.countplot(y)


target_temp = dataset.target.value_counts()

print(target_temp)

rint("Percentage of patience without heart problems: "+str(round(target_temp[0]*100/303,2)))
print("Percentage of patience with heart problems: "+str(round(target_temp[1]*100/303,2)))

Процент терпеливых без проблем с сердцем: 45,54
Процент терпеливых с проблемами сердца: 54,46

Мы проанализируем признаки «пол», «cp», «fbs», «restecg», «exang», «slope», «ca» и «thal».

Анализ функции «Секс»

dataset["sex"].unique()

Мы замечаем, что, как и ожидалось, функция «пол» имеет 2 уникальные функции.

sns.barplot(dataset["sex"],y)

Мы заметили, что у женщин чаще возникают проблемы с сердцем, чем у мужчин.

Анализ функции «Тип боли в груди»

dataset["cp"].unique()

массив([3, 2, 1, 0])

Как и ожидалось, функция CP имеет значения от 0 до 3

sns.barplot(dataset["cp"],y)

Мы замечаем, что боль в груди «0», т.е. у пациентов с типичной стенокардией гораздо реже возникают проблемы с сердцем.

Анализ функции FBS

dataset["fbs"].describe()

dataset["fbs"].unique()

массив ([1, 0])

sns.barplot(dataset["fbs"],y)

Здесь нет ничего экстраординарного

Анализ функции restecg

dataset["restecg"].unique()

массив ([0, 1, 2])

sns.barplot(dataset["restecg"],y)

Мы понимаем, что люди с регрессом «1» и «0» гораздо чаще страдают сердечными заболеваниями, чем с регрессом «2».

Анализ функции «exang»

dataset["exang"].unique()

массив ([0, 1])

sns.barplot(dataset["exang"],y)

Люди с exang = 1, то есть стенокардией, вызванной физической нагрузкой, гораздо реже имеют проблемы с сердцем.

Анализ функции наклона

dataset["slope"].unique()

массив ([0, 2, 1])

sns.barplot(dataset["slope"],y)

Мы видим, что наклон «2» вызывает сердечную боль гораздо больше, чем наклон «0» и «1».

Анализ признака «ca»

Количество крупных сосудов (0–3), окрашенных при флюороскопии

dataset["ca"].unique()

массив ([0, 2, 1, 3, 4])

sns.countplot(dataset["ca"])

sns.barplot(dataset["ca"],y)

ca=4 имеет поразительно большое количество пациентов с сердечно-сосудистыми заболеваниями

Анализ функции thal

dataset["thal"].unique()

массив([1, 2, 3, 0])

sns.barplot(dataset["thal"],y)

sns.distplot(dataset["thal"])

IV. Сплит "Тренировочный тест"

rom sklearn.model_selection import train_test_split

predictors = dataset.drop("target",axis=1)
target = dataset["target"]

X_train,X_test,Y_train,Y_test = train_test_split(predictors,target,test_size=0.20,random_state=0)
X_train.shape

(242, 13)

X_test.shape

(61, 13)

Y_train.shape

(242, )

Y_test.shape

(61, )

V. Подгонка модели

from sklearn.metrics import accuracy_score

Логистическая регрессия

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()

lr.fit(X_train,Y_train)

Y_pred_lr = lr.predict(X_test)
Y_pred_lr.shape

(61, )

score_lr = round(accuracy_score(Y_pred_lr,Y_test)*100,2)

print("The accuracy score achieved using Logistic Regression is: "+str(score_lr)+" %")

Оценка точности, достигнутая с помощью логистической регрессии, составляет: 85,25 %.

Наивный Байес

from sklearn.naive_bayes import GaussianNB

nb = GaussianNB()

nb.fit(X_train,Y_train)

Y_pred_nb = nb.predict(X_test)
Y_pred_nb.shape

(61, )

score_nb = round(accuracy_score(Y_pred_nb,Y_test)*100,2)

print("The accuracy score achieved using Naive Bayes is: "+str(score_nb)+" %")

Показатель точности, достигнутый с использованием наивного Байеса, составляет: 85,25 %.

SVM

from sklearn import svm

sv = svm.SVC(kernel='linear')

sv.fit(X_train, Y_train)

Y_pred_svm = sv.predict(X_test)
Y_pred_svm.shape

(61, )

core_svm = round(accuracy_score(Y_pred_svm,Y_test)*100,2)

print("The accuracy score achieved using Linear SVM is: "+str(score_svm)+" %")

Показатель точности, достигнутый с помощью Linear SVM, составляет: 81,97 %.

K Ближайшие соседи

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=7)
knn.fit(X_train,Y_train)
Y_pred_knn=knn.predict(X_test)
Y_pred_knn.shape

(61, )

core_knn = round(accuracy_score(Y_pred_knn,Y_test)*100,2)

print("The accuracy score achieved using KNN is: "+str(score_knn)+" %")

Оценка точности, достигнутая с помощью KNN, составляет: 67,21 %.

Древо решений

from sklearn.tree import DecisionTreeClassifier

max_accuracy = 0


for x in range(200):
    dt = DecisionTreeClassifier(random_state=x)
    dt.fit(X_train,Y_train)
    Y_pred_dt = dt.predict(X_test)
    current_accuracy = round(accuracy_score(Y_pred_dt,Y_test)*100,2)
    if(current_accuracy>max_accuracy):
        max_accuracy = current_accuracy
        best_x = x
        
#print(max_accuracy)
#print(best_x)


dt = DecisionTreeClassifier(random_state=best_x)
dt.fit(X_train,Y_train)
Y_pred_dt = dt.predict(X_test)
print(Y_pred_dt.shape)

(61, )

score_dt = round(accuracy_score(Y_pred_dt,Y_test)*100,2)

print("The accuracy score achieved using Decision Tree is: "+str(score_dt)+" %")

Оценка точности, достигнутая с помощью дерева решений, составляет: 81,97 %.

Случайный лес

from sklearn.ensemble import RandomForestClassifier

max_accuracy = 0


for x in range(2000):
    rf = RandomForestClassifier(random_state=x)
    rf.fit(X_train,Y_train)
    Y_pred_rf = rf.predict(X_test)
    current_accuracy = round(accuracy_score(Y_pred_rf,Y_test)*100,2)
    if(current_accuracy>max_accuracy):
        max_accuracy = current_accuracy
        best_x = x
        
#print(max_accuracy)
#print(best_x)

rf = RandomForestClassifier(random_state=best_x)
rf.fit(X_train,Y_train)
Y_pred_rf = rf.predict(X_test)
Y_pred_rf.shape

(61, )

score_rf = round(accuracy_score(Y_pred_rf,Y_test)*100,2)

print("The accuracy score achieved using Decision Tree is: "+str(score_rf)+" %")

Оценка точности, достигнутая с помощью дерева решений, составляет: 95,08 %.

XGBoost

import xgboost as xgb

xgb_model = xgb.XGBClassifier(objective="binary:logistic", random_state=42)
xgb_model.fit(X_train, Y_train)

Y_pred_xgb = xgb_model.predict(X_test)
Y_pred_xgb.shape

(61, )

score_xgb = round(accuracy_score(Y_pred_xgb,Y_test)*100,2)

print("The accuracy score achieved using XGBoost is: "+str(score_xgb)+" %")

Оценка точности, достигнутая с помощью XGBoost, составляет: 85,25 %.

Нейронная сеть

from keras.models import Sequential
from keras.layers import Dense
# https://stats.stackexchange.com/a/136542 helped a lot in avoiding overfitting

model = Sequential()
model.add(Dense(11,activation='relu',input_dim=13))
model.add(Dense(1,activation='sigmoid'))

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(X_train,Y_train,epochs=300)

Y_pred_nn = model.predict(X_test)
Y_pred_nn.shape

(61, 1)

rounded = [round(x[0]) for x in Y_pred_nn]

Y_pred_nn = rounded
score_nn = round(accuracy_score(Y_pred_nn,Y_test)*100,2)

print("The accuracy score achieved using Neural Network is: "+str(score_nn)+" %")

#Note: Accuracy of 85% can be achieved on the test set, by setting epochs=2000, and number of nodes = 11. 

Оценка точности, достигнутая с использованием нейронной сети, составляет: 80,33 %.

VI. Вывести окончательный балл

scores = [score_lr,score_nb,score_svm,score_knn,score_dt,score_rf,score_xgb,score_nn]
algorithms = ["Logistic Regression","Naive Bayes","Support Vector Machine","K-Nearest Neighbors","Decision Tree","Random Forest","XGBoost","Neural Network"]    

for i in range(len(algorithms)):
    print("The accuracy score achieved using "+algorithms[i]+" is: "+str(scores[i])+" %")

sns.set(rc={'figure.figsize':(15,8)})
plt.xlabel("Algorithms")
plt.ylabel("Accuracy score")

sns.barplot(algorithms,scores)

Прогнозирование сердечно-сосудистых заболеваний выполняется с использованием различных алгоритмов машинного обучения. После импорта необходимых библиотек и загрузки набора данных скрипт проводит исследовательский анализ данных (EDA), чтобы получить представление о распределении данных. Особое внимание уделяется взаимосвязи между различными характеристиками и наличием или отсутствием сердечных заболеваний. Характеристики «пол», «cp», «fbs», «restecg», «exang», «slope», «ca» и «thal» анализируются с использованием гистограмм и графиков подсчета. Впоследствии набор данных разбивается на наборы для обучения и тестирования, и к данным подгоняются несколько моделей классификации, включая логистическую регрессию, наивную байесовскую модель, SVM, KNN, дерево решений, случайный лес, XGBoost и нейронную сеть. Показатели точности этих моделей оцениваются на тестовом наборе. Модель Random Forest превосходит другие, достигая показателя точности примерно 95,08%. В целом, сценарий обеспечивает ценную информацию о данных и выделяет алгоритм Random Forest как наиболее эффективный для прогнозирования сердечных заболеваний в этом контексте.