Случай Python с логистической регрессией, перекрестная проверка k-Fold и развертывание матрицы путаницы

Введение

В этом чтении мы рассмотрим пример применения модели логистической регрессии из библиотеки Scikit-learn Python, чтобы предсказать, является ли опухоль злокачественной или доброкачественной к данной информации (так называемые предикторы или функции).

Информация о наборе данных

Наш набор данных был взят из репозитория машинного обучения UCI (https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Original%29) и содержит следующую информацию об атрибутах:

  1. Код образца: идентификационный номер
  2. Толщина комка: 1–10
  3. Однородность размера ячейки: 1–10
  4. Однородность формы клеток: 1–10
  5. Маргинальная адгезия: 1–10
  6. Размер одной эпителиальной клетки: 1–10
  7. Голые ядра: 1–10
  8. Мягкий хроматин: 1–10
  9. Нормальные ядрышки: 1–10
  10. Митозы: 1–10
  11. Класс: (2 для доброкачественных, 4 для злокачественных)

Данные предоставлены исходной базой данных по раку молочной железы штата Висконсин

Без лишних слов, давайте кодировать!

Шаг за шагом

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

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

Импорт набора данных

Мы разделяем набор данных на:

  • x: независимые переменные или предикторы
  • y: зависимая переменная или прогноз
dataset = pd.read_csv('breast_cancer.csv')
x = dataset.iloc[:, 1:-1].values
y = dataset.iloc[:, -1].values

Проверка недостающих данных

np.any(np.isnan(x)) # is there any missing value in x?
False
np.any(np.isnan(y)) # is there any missing value in y?
False

Разделение набора данных на обучающий набор и тестовый набор

Мы разделяем данные на обучающий набор (для подбора нашей модели) и тестовый набор (для проверки прогнозов нашей подобранной модели).

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 0)

Обучение модели логистической регрессии на обучающем наборе

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression(random_state = 0)
classifier.fit(x_train, y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='auto', n_jobs=None, penalty='l2',
                   random_state=0, solver='lbfgs', tol=0.0001, verbose=0,
                   warm_start=False)

Прогнозирование результатов набора тестов

y_pred = classifier.predict(x_test)
y_pred[0:10]
array([2, 2, 4, 4, 2, 2, 2, 4, 2, 2])

Помните, что:

  • 2 = доброкачественный
  • 4 = злокачественный
comparison = np.concatenate((y_test.reshape(-1,1), y_pred.reshape(-1,1)), axis = 1) #comparing the real values vs predictions
comparison[0:10,:]
array([[2, 2],
       [2, 2],
       [4, 4],
       [4, 4],
       [2, 2],
       [2, 2],
       [2, 2],
       [4, 4],
       [2, 2],
       [2, 2]])

Создание матрицы путаницы

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)
[[84  3]
 [ 3 47]]

Ниже мы можем наблюдать в более удобном виде матрицу путаницы наших прогнозов с использованием этой модели:

from sklearn.metrics import plot_confusion_matrix
plot_confusion_matrix(classifier, x_test, y_test)
plt.xlabel("Predicted tumor class")
plt.ylabel("True tumor class")
plt.show()

Из матрицы путаницы на рисунке 1 мы видим, что 84 доброкачественные опухоли и 47 злокачественных опухолей были точно предсказаны, причем обе категории представляют 3 ошибочных предсказания.

Вычисление точности с помощью k-Fold Cross Validation

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

from sklearn.model_selection import cross_val_score
accuracies = cross_val_score(estimator = classifier, X = x_train, y = y_train, cv = 10)
print("Accuracy: {:.2f} %".format(accuracies.mean()*100))
print("Standard Deviation: {:.2f} %".format(accuracies.std()*100))
Accuracy: 96.70 %
Standard Deviation: 1.97 %

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