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

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

В наборе данных есть несколько категориальных и непрерывных независимых переменных, которые можно использовать для прогнозирования сердечных заболеваний у пациента. Пройдя процесс определения отсутствующих значений (если таковые имеются), мы перейдем к EDA для выявления любых закономерностей в данных.

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

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

Из приведенных выше диаграмм видно, что холестрол сам по себе не оказывает большого влияния на сердечные заболевания. EDA является важной частью науки о данных, и его важность часто недооценивается. В этой статье мы собираемся перейти к построению реальной модели, но перед тем как двигаться дальше, мы можем также использовать корреляционную матрицу, чтобы лучше понять общие данные.

Функциональная инженерия

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

df=pd.get_dummies(df,columns=['cp','restecg','slope','ca','thal'],drop_first=True)
y=df.target
X=df.drop("target",axis=1)

Кроме того, для непрерывных переменных важно стандартизировать их, чтобы улучшить производительность модели. В этом преобразовании следует отметить одну важную вещь - разделить обучение и набор тестов до стандартизации. Для обучающего набора мы собираемся использовать StandardScaler из библиотеки scikit, а затем преобразовать его в тестовый набор,

from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
num_columns=['age','trestbps','chol','thalach','oldpeak']
X_train['age']=scaler.fit_transform(X_train['age'].values.reshape(-1,1))
X_train['trestbps']=scaler.fit_transform(X_train['trestbps'].values.reshape(-1,1))
X_train['chol']=scaler.fit_transform(X_train['chol'].values.reshape(-1,1))  
X_train['thalach']=scaler.fit_transform(X_train['thalach'].values.reshape(-1,1))   
X_train['oldpeak']=scaler.fit_transform(X_train['oldpeak'].values.reshape(-1,1))
X_test['age']=scaler.transform(X_test['age'].values.reshape(-1,1))
X_test['trestbps']=scaler.transform(X_test['trestbps'].values.reshape(-1,1))
X_test['chol']=scaler.transform(X_test['chol'].values.reshape(-1,1))  
X_test['thalach']=scaler.transform(X_test['thalach'].values.reshape(-1,1))   
X_test['oldpeak']=scaler.transform(X_test['oldpeak'].values.reshape(-1,1))

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

Алгоритмы

Мы начнем с алгоритма логистической регрессии, чтобы увидеть, как он работает с набором данных.

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report
lr=LogisticRegression(C=1.0,penalty='l2')
lr.fit(X_train,y_train)
print("The cross validation score mean is ",cross_val_score(lr,X_train,y_train,cv=3).mean())
pred=lr.predict(X_test)
print(classification_report(y_test,pred))
sns.heatmap(confusion_matrix(y_test,pred),annot=True)

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

from sklearn.tree import DecisionTreeClassifier
dc=DecisionTreeClassifier()
dc.fit(X_train,y_train)
print("The cross validation score is ",cross_val_score(dc,X_train,y_train).mean())
pred=dc.predict(X_test)
print(classification_report(y_test,pred))
sns.heatmap(confusion_matrix(y_test,pred),annot=True

Дерево решений работает немного лучше с точностью 57%. Дерево решений лишь немного улучшило производительность модели, но, возможно, использование классификатора случайного леса может повысить точность.

from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier()
rf.fit(X_train,y_train)
print("The cross validation score is ",cross_val_score(rf,X_train,y_train).mean())
pred=rf.predict(X_test)
print(classification_report(y_test,pred))
sns.heatmap(confusion_matrix(y_test,pred),annot=True)

Классификатор случайного леса улучшил производительность модели, поскольку теперь точность составляет 71%. Тепловая карта - это матрица неадекватности набора данных, которая показывает, что существует 19 ложноотрицательных и 3 ложных срабатывания. В случае болезни сердца цена ложного отрицательного результата очень высока. Давайте посмотрим, может ли это улучшить алгоритм повышения. Мы собираемся использовать очень популярный алгоритм повышения под названием XG Boost, который на самом деле использовался для победы в соревнованиях Kaggle. Код алгоритма написан ниже.

Повышение

import xgboost as xgb
data_dmatrix = xgb.DMatrix(data=X,label=y)
xg_reg = xgb.XGBClassifier(objective ='reg:logistic', colsample_bytree = 0.3, learning_rate = 0.1,
                max_depth = 5, alpha = 10, n_estimators = 10
xg_reg.fit(X_train,y_train)
pred = xg_reg.predict(X_test)
sns.heatmap(confusion_matrix(y_test,pred),annot=True)

На приведенной выше диаграмме показана матрица неточностей. Как видно, производительность модели значительно улучшилась с меньшим количеством ложноотрицательных результатов. Модель XGBoost имеет точность более 80%.

В этом примере мы увидели, как машинное обучение можно применить к набору данных для прогнозирования сердечных заболеваний. Мы начали с исследовательского анализа данных, затем перешли к проектированию функций и построили алгоритмы машинного обучения. Мы закончили с моделью XGBoost, чтобы показать, как повышение может улучшить производительность модели.