В этой статье я продолжу классификацию с контролируемым обучением, используя набор данных Рак молочной железы, Висконсин (Диагностика), но на этот раз использую два других классификатора. Один из них — это классификатор машины опорных векторов (SVC), а другой — классификатор логистической регрессии, помогающий диагностировать пациентов.

Нажмите здесь, чтобы просмотреть классификацию рака молочной железы с использованием классификатора KNN (K ближайших соседей).

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. Создайте фиктивные классификаторы

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

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). Таким образом, вы можете выбрать один из них в качестве окончательного классификатора.

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

Нажмите здесь, чтобы просмотреть классификацию рака молочной железы с использованием классификатора KNN (K ближайших соседей).