Логистическая регрессия в машинном обучении является частью класса алгоритмов обучения с учителем, используемых для прогнозирования вероятности возникновения события. Для задачи бинарной классификации, такой как наличие или отсутствие диабета, алгоритм выводит вероятность (от 0 до 1) каждой точки данных с использованием независимых переменных. Хотя пороговое значение можно изменить, вероятность, равная или превышающая 0,5, указывает на то, что событие произойдет (наличие диабета), а вероятность менее 0,5 указывает на то, что событие не произойдет (наличие диабета).
Используемый набор данных первоначально был получен из Национального института диабета, болезней органов пищеварения и почек. Набор данных можно найти здесь. Он использовался для прогнозирования наличия у человека диабета на основе некоторых переменных. Независимые переменные включали беременность, глюкозу, кровяное давление, толщину кожи, инсулин, ИМТ, диабетическую родословную, возраст, а зависимая переменная была результатом.
Первоначально мы хотели выяснить, существует ли значительная средняя разница между диабетиками и не-диабетиками для всех независимых переменных, используя t-критерий независимой выборки.
Используя критерий Шапиро-Уилка, мы определили, что ни одна из независимых переменных не имеет нормального распределения, поэтому для проверки достоверности средней разницы мы использовали U-критерий Манна-Уитни. Результаты показали, что существует значительная средняя разница между диабетиками и не-диабетиками для всех независимых переменных.
Впоследствии мы проверили предположения с помощью логистической регрессии. Предположения включают:
1. Для модели бинарной регрессии зависимая переменная (Результат) должна быть бинарной.
2. Данные должны быть независимыми. Что каждая строка должна представлять одну точку данных
3. Данные должны практически не демонстрировать мультиколлинеарность. То есть независимые переменные должны быть независимы друг от друга. Проверено с помощью коэффициента инфляции дисперсии
4. Непрерывные независимые переменные должны иметь линейную зависимость от логарифмических шансов зависимых переменных.
5. Набор данных должен быть относительно большим >500
6. В данных не должно быть сильно влияющих выбросов.
Проверка предположений
Бинарные зависимые переменные
Используя уникальную функцию панд, мы определили два возможных результата: 0 и 1, где 0 представляет участников без диабета, а 1 представляет участников с диабетом.
Независимость от точки данных
Это предположение выполняется, потому что каждая точка данных представляет одну индейскую женщину пима.
Проверка мультиколлинеарности между непрерывными независимыми переменными
Затем мы рассчитали коэффициент инфляции дисперсии для каждой из независимых переменных, чтобы проверить наличие мультиколлинеарности между непрерывными независимыми переменными.
Формула для расчета коэффициента инфляции дисперсии: 1/(1-R²). Где R² – коэффициент детерминации. R² представляет собой степень изменения зависимой переменной, которую можно объяснить с помощью независимой переменной.
Как это работает.
Предположим, мы хотим рассчитать VIF для количества беременностей (одна из независимых переменных в наборе данных Diabetes). Мы делаем число беременностей зависимой переменной, а затем сохраняем остальные независимые переменные. Мы рассчитываем значение R² для количества беременностей. Это значение укажет, в какой степени изменение числа беременностей можно объяснить с помощью остальных независимых переменных. Используя формулу VIF, мы можем рассчитать значение VIF для каждой из независимых переменных. Более высокие значения R² приведут к более высоким значениям VIF, что означает, что они могут быть коллинеарными. Значение VIF больше 5 будет указывать на коллинеарность между этой переменной и некоторыми независимыми переменными.
independent_vars= diabeats[['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age','const']] def calc_vif(df): '''Calculates the Variance inflation factor for the particular column. Returns a dataframe with the VIF for each of the columns ''' vif_df= pd.DataFrame() vif_df['Independent Variable']= df.columns vif_df['VIF index']= [vif(df.values,i )for i in range(df.shape[1])] return (vif_df) calc_vif(independent_vars)
Индексы VIF для всех независимых переменных ниже 5 и близки к 1, что означает почти полное отсутствие мультиколлинеарности между независимыми переменными.
Непрерывные независимые переменные имеют линейную связь с логарифмическими шансами зависимых переменных.
Проверено с помощью точечных диаграмм.
Относительно большой набор данных
Для модели логистической регрессии нам обычно требуются относительно большие данные. Более 500.
В наборе данных 768 строк. Это предположение удовлетворяется количеством точек данных, которые у нас есть в этом наборе данных.
Сильные влиятельные выбросы
Мы определили наличие сильно влияющих выбросов в наборе данных, используя расстояние Кука. Влиятельные выбросы — это точки данных, которые могут повлиять на оценки параметров модели. То есть, если эти точки удалить из набора данных, у нас будут другие параметры модели, такие как значение p, весовые коэффициенты и значение R².
Как это работает
Мы рассчитываем расстояние повара для каждой точки данных в наборе данных, а затем определяем порог повара. Точки, как правило, выше этого порога, считаются влиятельными. Порог рассчитывается как 4/n, где n — длина кадра данных. Однако точки данных с расстоянием Кука более 0,5 считаются очень важными и могут потребовать дальнейшего изучения.
np.set_printoptions(suppress=True)#Prevent printing scientific notation of numbers influence=log_results.get_influence() cooks_distance= influence.cooks_distance cooks_df= pd.DataFrame(cooks_distance).T\ .rename({0:'Cooks Distance',1:'p_value'},axis=1) #Calculating the Cook's Threshold cook_threshold= 4/len(cooks_df) plt.figure() plt.scatter(cooks_df.index, cooks_df['Cooks Distance']) for i in range(len(cooks_df)): if cooks_df.iloc[i]['Cooks Distance']> cook_threshold: plt.annotate(cooks_df.index[i], (cooks_df.index[i], cooks_df.iloc[i]['Cooks Distance'])) plt.axhline(y=cook_threshold, ls='--',c ='red') plt.ylabel('Cooks Distance') plt.title('Cooks Distance each Datapoint')
Хотя есть некоторые точки выше порога, ни одна из точек данных не имеет расстояния повара больше 0,5.
Обучение модели
Мы нормализовали данные с помощью функции StandardScaler.
Мы обучили и подогнали базовую модель, используя параметры логистической регрессии по умолчанию.
Мы вычислили матрицу путаницы и показатель AUC для базовой модели. Базовая модель имела показатель AUC 0,74.
Оптимизация параметров логистической регрессии
Затем мы использовали gridsearchCV для настройки параметров модели для алгоритма логистической регрессии, чтобы найти лучшие параметры и лучший показатель AUC для набора данных.
logreg= LogisticRegression(max_iter=250) params= {'C':np.logspace(-4,4,10), 'penalty':['l2']} gridsearch= GridSearchCV(logreg, param_grid=params, scoring='roc_auc') gridsearch.fit(X_train_transform, y_train) print('The best parameters for fitting the model are {}'. format(gridsearch.best_params_)) print('The highest AUC score that was obtained with the hypertuned parameters is ', gridsearch.best_score_)
Затем, используя лучшие параметры модели, мы обучили и подогнали новую модель для набора данных.
Затем мы оценили недавно обученную модель, используя кривую ROC и показатель AUC.
Модель имеет показатель AUC 0,84, что показывает, что она отлично подходит.
Код Python, используемый для этого анализа и обучения модели, можно найти здесь