В этой статье я продолжу классификацию с контролируемым обучением, используя набор данных Рак молочной железы, Висконсин (Диагностика), но на этот раз использую два других классификатора. Один из них — это классификатор машины опорных векторов (SVC), а другой — классификатор логистической регрессии, помогающий диагностировать пациентов.
0. Импортируйте полезные библиотеки
Во-первых, давайте импортируем все полезные библиотеки и установим случайное значение состояния.
# Suppress all warnings import warnings warnings.filterwarnings('ignore') # Import some necessary libararies import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline RANDOM_STATE = 42
1. Подготовка данных
Теперь мы загружаем набор данных Winsconsin из scikit-learn и преобразуем необработанные данные из объекта Bunch во фрейм данных для лучшей обработки данных.
from sklearn.datasets import load_breast_cancer # Load the dataset from scikit-learn. cancer = load_breast_cancer() # cancer.keys() # to see all the attributes cancer_df = pd.DataFrame(cancer.data, columns = cancer.feature_names) cancer_df['target'] = cancer.target cancer_df.head()
давайте проведем простое исследование данных, чтобы увидеть, есть ли пропущенные значения, неправильные типы данных, несбалансированные классы и т. д.
Поскольку набор данных чист, а распределение классов относительно сбалансировано, мы можем использовать чистые данные, чтобы выполнить разделение обучения и тестирования и подготовиться к обучению модели с использованием разных классификаторов.
from sklearn.model_selection import train_test_split X = cancer_df.drop('target', axis=1) y = cancer_df.target X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = RANDOM_STATE)
2. Создайте фиктивные классификаторы
Во-первых, давайте создадим два фиктивных классификатора для проверки работоспособности. Фиктивный классификатор — это классификатор, который не дает никакой информации из данных, но может обеспечить базовую точность метки класса. В нашем случае мы будем использовать два фиктивных классификатора:
- Dummy A (Uniform): фиктивный классификатор, который генерирует предсказания равномерно случайным образом из уникальных классов, наблюдаемых в целевом наборе данных. (Scikit-Learn Documentation).
- Фиктив B (самый частый): фиктивный классификатор, который всегда возвращает наиболее часто встречающуюся метку класса в наблюдаемом наборе данных y. (Scikit-Learn Documentation).
from sklearn.dummy import DummyClassifier from sklearn.metrics import precision_score from sklearn.metrics import recall_score def make_dummy_classidiers(X_train, y_train, X_test, y_test): # make two dummy classifiers and fit the training data dummy_A = DummyClassifier(strategy = 'uniform', random_state = RANDOM_STATE) dummy_A.fit(X_train, y_train) dummy_B = DummyClassifier(strategy = 'most_frequent', random_state = RANDOM_STATE) dummy_B.fit(X_train, y_train) # get the predicted classes dummy_A_pred = dummy_A.predict(X_test) dummy_B_pred = dummy_B.predict(X_test) # get precision, recall, and accuracy scores for each dummy classifier preA, recA, accA = precision_score(y_test, dummy_A_pred), recall_score(y_test, dummy_A_pred), dummy_A.score(X_test, y_test) preB, recB, accB = precision_score(y_test, dummy_B_pred), recall_score(y_test, dummy_B_pred), dummy_B.score(X_test, y_test) return (preA, recA, accA),( preB, recB, accB)
Затем давайте оценим два фиктивных классификатора, увидев точность, полноту и точность двух фиктивных классификаторов.
dummy_A_scores, dummy_B_scores = make_dummy_classidiers(X_train, y_train, X_test, y_test) print('Dummy classifier A (Stratified) scores:') print('Precision: {}, Recall: {}, Accuracy: {}'.format(dummy_A_scores[0],dummy_A_scores[1],dummy_A_scores[2])) print('-----------------------') print('Dummy classifier B (Most frequent) scores:') print('Precision: {}, Recall: {}, Accuracy: {}'.format(dummy_B_scores[0],dummy_B_scores[1],dummy_B_scores[2])) # the result Dummy classifier A (uniform) scores: Precision: 0.6708860759493671, Recall: 0.5955056179775281, Accuracy: 0.5664335664335665 ----------------------- Dummy classifier B (most_frequent) scores: Precision: 0.6223776223776224, Recall: 1.0, Accuracy: 0.6223776223776224
Эти баллы фиктивных классификаторов являются базовыми баллами наших настоящих классификаторов. Если показатели точности, полноты или точности нашего реального классификатора близки к показателям манекенов, это означает, что производительность наших классификаторов не лучше, чем случайное предположение.
3. Применить классификатор SVC
Во-первых, давайте построим классификатор SVC и сопоставим его с обучающими данными.
from sklearn.svm import SVC # make a func using defult para values def make_SVC_classifier(X_train, X_test, y_train, y_test, kernel = 'rbf', C = 1, gamma = 'scale', random_state = RANDOM_STATE): svc = SVC(kernel = kernel, C = C, random_state = random_state) svc.fit(X_train, y_train) svc_preds = svc.predict(X_test) preSVC, recSVC, accSVC = precision_score(y_test, svc_preds), recall_score(y_test, svc_preds), svc.score(X_test, y_test) return (preSVC, recSVC, accSVC), svc, svc_preds
Затем давайте оценим классификатор SVC, просмотрев оценки точности, полноты и точности.
# get the precision, recall, and accuracy scores svc_scores, svc, svc_preds = make_SVC_classifier(X_train, X_test, y_train, y_test) print('SVC classifier scores:') print('Precision: {}, Recall: {}, Accuracy: {}'.format(svc_scores[0],svc_scores[1],svc_scores[2])) # the result SVC classifier scores: Precision: 0.9361702127659575, Recall: 0.9887640449438202, Accuracy: 0.951048951048951
и построитькривую точности и полноты.
# plot the precision recall curve chart from sklearn.metrics import plot_precision_recall_curve plot_precision_recall_curve(svc, X_test, y_test);
4. Примените классификатор логистической регрессии
Далее давайте построим классификатор логистической регрессии.
from sklearn.linear_model import LogisticRegression def make_logreg_classifier(X_train, X_test, y_train, y_test, penalty = 'l2', C=1, # defult para values random_state = RANDOM_STATE): lr = LogisticRegression(random_state = random_state) lr.fit(X_train, y_train) lr_preds = lr.predict(X_test) prelr, reclr, acclr = precision_score(y_test, lr_preds), recall_score(y_test, lr_preds), lr.score(X_test, y_test) return (prelr, reclr, acclr), lr, lr_preds
и оцените классификатор логистической регрессии, просмотрев оценки точности, полноты и точности.
lr_scores, lr, lr_preds = make_logreg_classifier(X_train, X_test, y_train, y_test) print('Logistic Regression classifier scores:') print('Precision: {}, Recall: {}, Accuracy: {}'.format(lr_scores[0],lr_scores[1],lr_scores[2])) # result # Logistic Regression classifier scores: Precision: 0.9666666666666667, Recall: 0.9775280898876404, Accuracy: 0.965034965034965
и построитькривуюточность-отзывслишком.
В целом, оба классификатора довольно хорошо работают с набором данных Winsconsin. Скорость отзыва классификатора SVC немного выше, чем у классификатора логистической регрессии (отзыв: 0,99 против 0,98), но как уровень точности, так и его точность ниже, чем у классификатора логистической регрессии (точность: 0,94 против 0,97). , точность: 0,95 против 0,97). Таким образом, вы можете выбрать один из них в качестве окончательного классификатора.
Одно замечание в этой настройке заключается в том, что мы предпочитаем более высокую скорость отзыва, чем скорость точности. Это классический компромисс между точностью и полнотой. Очевидно, что в сценарии обнаружения рака ложноотрицательные результаты очень нежелательны, потому что это может привести к тому, что пациенты, у которых действительно есть злокачественные клетки, будут ложно обнаружены как таковые, что может привести к тому, что они не получат лечения. Вы можете найти больше об определениях точности и полноты в Википедии.