Полный код и набор данных вы можете найти здесь.

1. Введение

Это немного отличается от обычных работ Kaggle, которые вы увидите, где большинство из них строят модель с использованием необработанного метода или, можно сказать, традиционного метода. Основная проблема этого метода заключается в том, что большое количество времени тратится на обработку данных, выбор функций, выбор модели, настройку гиперпараметров и т. д. Но в настоящее время существует множество Auto Ml, которые можно легко установить и используется эффективно. Многие трудоемкие работы можно легко выполнить с помощью пары строк. Точность модели в большинстве случаев будет выше, чем у модели, выполненной традиционным методом.

Об используемых нами наборах данных.

Эта база данных содержит 76 атрибутов, но все опубликованные эксперименты относятся к использованию подмножества из 14 из них. В частности, база данных Кливленда — единственная, которая до сих пор использовалась исследователями машинного обучения. Поле «цель» относится к наличию болезни сердца у пациента. Это целое число от 0 (отсутствие присутствия) до 4.

Как правило, эти наборы данных предоставляют ряд переменных вместе с целевым состоянием наличия или отсутствия болезни сердца

Это для тех, кому нужна очень точная, совершенная модель с меньшей головной болью.

Это не для тех, кто пытается изучать модели, глубоко вникая в каждый алгоритм машинного обучения.

2. Установка необходимых пакетов

Прежде чем мы перейдем к части кодирования, сначала импортируйте необходимые пакеты.

!pip install pycaret
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt #Data visualization 
import seaborn as sns #Data visualization

pycaret : AutoML, который мы здесь используем, называется pycaret.

numpy: библиотека, используемая для линейной алгебры.

pandas : библиотека, используемая для обработки данных, ввода/вывода файлов CSV (например, pd.read_csv

matplotlib: библиотека, используемая для визуализации данных.

seaborn: библиотека, используемая для визуализации данных.

3. Получение данных

Мы можем получить наборы данных, используя библиотеку pandas.

# Getting the datasets to "datasets" variable
dataset = pd.read_csv("../input/heart-disease-uci/heart.csv")
# Showing first 5 rows.
dataset.head()

4. Информация об атрибутах

Это чистый, простой для понимания набор данных. Однако значение некоторых заголовков столбцов не очевидно. Вот что они означают,

age: возраст человека в годах.

пол: пол человека (1 = мужской, 0 = женский).

cp: боль в груди (значение 1: типичная стенокардия, значение 2: атипичная стенокардия, значение 3: неангинозная боль, значение 4: бессимптомное течение)

trestbps: артериальное давление человека в покое (мм рт. ст. при поступлении в больницу).

холестерин: уровень холестерина человека в мг/дл.

fbs: уровень сахара в крови человека натощак (> 120 мг/дл, 1 = правда; 0 = ложь)

restecg: измерение электрокардиограммы в покое (0 = норма, 1 = наличие аномалии ST-T, 2 = выявление вероятной или достоверной гипертрофии левого желудочка по критериям Эстеса)

талах: максимальная частота сердечных сокращений человека, достигнутая

exang: стенокардия, вызванная физической нагрузкой (1 = да; 0 = нет)

старый пик: депрессия ST, вызванная физической нагрузкой, по сравнению с состоянием покоя («ST» относится к положениям на графике ЭКГ. Подробнее см. здесь)

наклон: наклон сегмента ST пикового упражнения (значение 1: наклон вверх, значение 2: плоский, значение 3: наклон вниз)

ca: количество крупных сосудов (0–3).

thal: заболевание крови, называемое талассемией (3 = норма, 6 = постоянный дефект, 7 = обратимый дефект).

цель: болезнь сердца (0 = нет, 1 = да)

Проверка данных сбалансированы или нет

Как мы видим, 45% и 54% — это сбалансированные данные.

Это один из самых важных шагов, о котором большинство новичков забывают. Если имеющиеся у нас наборы данных несбалансированы, мы не можем использовать показатель точности в качестве окончательного фактора, определяющего качество нашей модели машинного обучения.

countNoDisease = len(dataset[dataset.target == 0])
countHaveDisease = len(dataset[dataset.target == 1])
print("Percentage of Patients Haven't Heart Disease: {:.2f}%".format((countNoDisease / (len(dataset.target))*100)))
print("Percentage of Patients Have Heart Disease: {:.2f}%".format((countHaveDisease / (len(dataset.target))*100)))
Percentage of Patients Haven't Heart Disease: 45.54%
Percentage of Patients Have Heart Disease: 54.46%

5. Визуализация наборов данных (чтобы мы могли лучше понять наборы данных)

sns.countplot(x="target", data=dataset, palette="bwr")
plt.show()

Сравнение тех, у кого есть и нет болезни сердца.

sns.countplot(x='sex', data=dataset, palette="mako_r")
plt.xlabel("Sex (0 = female, 1= male)")
plt.show()

Этот график показывает количество мужчин и женщин в наших наборах данных.

countFemale = len(dataset[dataset.sex == 0])
countMale = len(dataset[dataset.sex == 1])
print("Percentage of Female Patients: {:.2f}%".format((countFemale / (len(dataset.sex))*100)))
print("Percentage of Male Patients: {:.2f}%".format((countMale / (len(dataset.sex))*100)))
Percentage of Female Patients: 31.68%
Percentage of Male Patients: 68.32%

Просто проверяю процент пациентов мужского и женского пола

pd.crosstab(dataset.age,dataset.target).plot(kind="bar",figsize=(30,15))
plt.title('Heart Disease Frequency for Ages')
plt.xlabel('Age')
plt.ylabel('Frequency')
plt.savefig('heartDiseaseAndAges.png')
plt.show()

Этот график показывает нам частоту сердечных заболеваний с возрастом.

pd.crosstab(dataset.sex,dataset.target).plot(kind="bar",figsize=(15,6),color=['#1CA53B','#AA1111' ])
plt.title('Heart Disease Frequency for Sex')
plt.xlabel('Sex (0 = Female, 1 = Male)')
plt.xticks(rotation=0)
plt.legend(["Haven't Disease", "Have Disease"])
plt.ylabel('Frequency')
plt.show()

Сравнение мужчин и женщин с проблемами сердца и без них.

plt.scatter(x=dataset.age[dataset.target==1], y=dataset.thalach[(dataset.target==1)], c="red")
plt.scatter(x=dataset.age[dataset.target==0], y=dataset.thalach[(dataset.target==0)])
plt.legend(["Disease", "Not Disease"])
plt.xlabel("Age")
plt.ylabel("Maximum Heart Rate")
plt.show()

Точечная диаграмма, показывающая людей разных возрастных групп с заболеванием и без него.

pd.crosstab(dataset.slope,dataset.target).plot(kind="bar",figsize=(15,6),color=['#DAF7A6','#FF5733' ])
plt.title('Heart Disease Frequency for Slope')
plt.xlabel('The Slope of The Peak Exercise ST Segment ')
plt.xticks(rotation = 0)
plt.ylabel('Frequency')
plt.show()

Сравнение с наклоном сегмента ST пиковой нагрузки.

pd.crosstab(dataset.fbs,dataset.target).plot(kind="bar",figsize=(15,6),color=['#FFC300','#581845' ])
plt.title('Heart Disease Frequency According To FBS')
plt.xlabel('FBS - (Fasting Blood Sugar > 120 mg/dl) (1 = true; 0 = false)')
plt.xticks(rotation = 0)
plt.legend(["Haven't Disease", "Have Disease"])
plt.ylabel('Frequency of Disease or Not')
plt.show()

Сравнение с FBS — (уровень сахара в крови натощак > 120 мг/дл) (1 = верно; 0 = неверно)

pd.crosstab(dataset.cp,dataset.target).plot(kind="bar",figsize=(15,6),color=['#11A5AA','#AA1190' ])
plt.title('Heart Disease Frequency According To Chest Pain Type')
plt.xlabel('Chest Pain Type')
plt.xticks(rotation = 0)
plt.ylabel('Frequency of Disease or Not')
plt.show()

Сравнение с типом боли в груди

6. Подготовка данных для выбора модели

На этом этапе мы разделяем наборы данных на два. Первая часть содержит 95% данных, которые используются для обучения и тестирования. Остальные 5% сохраняются и используются для опробования окончательной модели, которую мы развернули (эти данные называются невидимыми данными).

data = dataset.sample(frac=0.95, random_state=786).reset_index(drop=True)
data_unseen = dataset.drop(data.index).reset_index(drop=True)

print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions ' + str(data_unseen.shape))
Data for Modeling: (288, 14)
Unseen Data For Predictions (15, 14)

7. Импорт метода классификации пикаре

Auto Ml, который мы здесь используем, называется pycaret. Его работа очень проста, так как мы хотим предоставить наборы данных в качестве данных, наш целевой столбец в качестве цели. Мы также можем установить некоторые другие функции, как показано ниже.

# Importing pycaret classification method
from pycaret.classification import *

# This is the first step of model selection
# Here the data is our datasets, target is the labeled column(dependent variable), section is is random number for future identification.
exp = setup(data = data, target = 'target', session_id=1,
                  normalize = True, 
                  transformation = True, 
                  ignore_low_variance = True,
                  remove_multicollinearity = True, multicollinearity_threshold = 0.95 )

После этого мы получим список наших столбцов и их тип, просто подтвердите, что они одинаковы. Затем нажмите Enter.

8. Сравнение моделей

После подтверждения типов столбцов теперь мы можем запустить наши наборы данных с парой алгоритмов машинного обучения и сравнить производительность. Как показано ниже.

#This command is used to compare different models with our datasets.
#The accuracy,F1 etc of each model is listed in a table.
#Choose which model you want
compare_models()

В приведенной выше таблице мы видим множество моделей с хорошей точностью.

Далее мы должны решить, какой алгоритм использовать, и скопировать его код.

Коды для разных моделей приведены ниже.

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

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

Наивный байесовский метод ‘nb’

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

SVM (линейный) 'svm'

SVM (RBF) 'rbfsvm'

Гауссовский процесс 'gpc'

Многоуровневый перцептрон ‘mlp’

Классификатор гребня 'гребень'

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

Квадратичный диск. Анализ 'qda'

AdaBoost 'ада'

Классификатор повышения градиента ‘gbc’

Линейный диск. Анализ 'лда'

Классификатор дополнительных деревьев 'et'

Экстремальное повышение градиента xgboost

Усиление светового градиента ‘lightgbm’

Классификатор Cat Boost ‘catboost’

9. Создание модели

Теперь мы можем создать модель.

# With this command we are creating a Linear Disc. Analysis model

# fold is the number of fold you want
lda_model = create_model('lda', fold = 10)

Эта таблица показывает точность и другие показания для всех 10 складок.

Теперь мы настраиваем гиперпараметры.

Настройка гиперпараметров будет очень полезна для повышения точности и других функций.

Для несбалансированных наборов данных мы в основном смотрим на оценку F1, поскольку наши наборы данных сбалансированы, мы можем использовать точность.

10. Настройка гиперпараметров

tuned_lda = tune_model('lda', optimize='F1')

11. Построение кривых ROC

По мере того, как резка перемещается по осям x, y, производительность увеличивается.

plot_model(tuned_lda, plot = 'auc')

12. Матрица путаницы

По мере увеличения числа истинно положительных результатов производительность моделей также увеличивается.

plot_model(tuned_lda, plot = 'confusion_matrix')

13. Прогнозирование точности с использованием тестовых наборов данных

Мы получаем точность 0,8506 и оценку F1 0,8632.

predict_model(tuned_lda);

14. Проверка невидимых данных

Первоначально мы отделили часть наборов данных как невидимый набор данных для проверки окончательной развернутой модели. Ниже мы это проверяем. Результатом является фрейм данных с меткой и оценкой (последние два столбца). Где метка — это предсказанная метка, а оценка — сколько процентов машина считает, что у человека болезнь сердца.

new_prediction = predict_model(tuned_lda, data=data_unseen)

15. Резюме

Как мы видим выше, мы получили высокоточную модель с точностью 86% без переобучения. Auto Ml предпочтительнее, потому что он экономит много времени и дает очень хороший результат. Настройка гиперпараметров непроста для менее опытных людей, но настройка гиперпараметров имеет огромное значение для производительности модели.

Поскольку НИ ОДНА не идеальна, если кто-то обнаружит какие-либо ошибки или предложения, не стесняйтесь комментировать ниже.