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

СОДЕРЖАНИЕ:

1. Цель проекта ML

2. Импорт основных библиотек

3. Загрузите набор данных о раке груди и исследуйте

3.1 Создание DataFrame

4. Визуализация данных

4.1. Парный график данных о раке груди

4.2. Контрзаговор

5. Тепловая карта

5.1. Тепловая карта рака груди DataFrame

5.2. Тепловая карта корреляционной матрицы

6. Гистограмма корреляции

7. Предварительная обработка данных

7.1. Разделение DataFrame на обучение и тестирование

7.2. Масштабирование функций

8. Построение модели

8.1. Классификатор опорных векторов

8.2. Логистическая регрессия

8.3. K - Классификатор ближайшего соседа

8.4. Наивный байесовский классификатор

8.5. Классификатор дерева решений

8.6. Классификатор случайного леса

8.7. Классификатор Adaboost

8.8. Классификатор XGBoost

8.8.1. Настройка параметров XGBoost Рандомизированный поиск

8.9. Матрица путаницы

8.10. Отчет о классификации модели

8.11. Перекрестная проверка модели машинного обучения

8.12. Сохраните модель машинного обучения

8.13. Заключение

Цель проекта ML

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

Импорт основных библиотек

# import libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Загрузить набор данных по раку груди

Загрузка данных о раке груди с помощью класса scikit-learn load_brast_cancer.

#Load breast cancer dataset 
from sklearn.datasets import load_breast_cancer 
cancer_dataset = load_breast_cancer()
type(cancer_dataset)

Вывод ››› sklearn.utils.Bunch

Scikit-learn хранит данные в группе объектов, например в словаре.

# keys in dataset 
cancer_dataset.keys()

Вывод ››› dict_keys ([‘data’, ‘target’, ‘target_names’, ‘DESCR’, ‘feature_names’, ‘filename’])

# featurs of each cells in numeric format 
cancer_dataset['data']

Вывод ›››

array([[1.799e+01, 1.038e+01, 1.228e+02, ..., 2.654e-01, 4.601e-01, 1.189e-01], [2.057e+01, 1.777e+01, 1.329e+02, ..., 1.860e-01, 2.750e-01, 8.902e-02], [1.969e+01, 2.125e+01, 1.300e+02, ..., 2.430e-01, 3.613e-01, 8.758e-02], ..., [1.660e+01, 2.808e+01, 1.083e+02, ..., 1.418e-01, 2.218e-01, 7.820e-02], [2.060e+01, 2.933e+01, 1.401e+02, ..., 2.650e-01, 4.087e-01, 1.240e-01], [7.760e+00, 2.454e+01, 4.792e+01, ..., 0.000e+00, 2.871e-01, 7.039e-02]])

Эти числовые значения являются извлеченными характеристиками каждой ячейки.

# malignant or benign value 
cancer_dataset['target']

Цель хранит значения злокачественных или доброкачественных опухолей.

# target value name malignant or benign tumor cancer_dataset['target_names']

Вывод ››› массив ([«злокачественный», «доброкачественный»], dtype = ’‹ U9 ′)

0 означает злокачественную опухоль;
1 означает доброкачественную опухоль.

Создать DataFrame

Теперь создадим DataFrame, объединив «данные» и «цель» вместе и присвоив имя столбцам.

# create dataframe
cancer_df=pd.DataFrame(np.c_[cancer_dataset['data'],cancer_dataset['target']], columns = np.append(cancer_dataset['feature_names'], ['target']))

Получение информации о раке DataFrame с помощью метода «.info ()».

# Information of cancer Dataframe 
cancer_df.info()

Вывод ›››

<class 'pandas.core.frame.DataFrame'> RangeIndex: 569 entries, 0 to 568 Data columns (total 31 columns): mean radius 569 non-null float64 mean texture 569 non-null float64 mean perimeter 569 non-null float64 mean area 569 non-null float64 mean smoothness 569 non-null float64 mean compactness 569 non-null float64 mean concavity 569 non-null float64 mean concave points 569 non-null float64 mean symmetry 569 non-null float64 mean fractal dimension 569 non-null float64 radius error 569 non-null float64 texture error 569 non-null float64 perimeter error 569 non-null float64 area error 569 non-null float64 smoothness error 569 non-null float64 compactness error 569 non-null float64 concavity error 569 non-null float64 concave points error 569 non-null float64 symmetry error 569 non-null float64 fractal dimension error 569 non-null float64 worst radius 569 non-null float64 worst texture 569 non-null float64 worst perimeter 569 non-null float64 worst area 569 non-null float64 worst smoothness 569 non-null float64 worst compactness 569 non-null float64 worst concavity 569 non-null float64 worst concave points 569 non-null float64 worst symmetry 569 non-null float64 worst fractal dimension 569 non-null float64 target 569 non-null float64 dtypes: float64(31) memory usage: 137.9 KB

Всего 569 ненулевой информации о пациентах с 31 функцией. Все типы данных функций в float. Размер 137,9 КБ.

Визуализация данных

Парный график данных о раке груди

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

Парный график примера функции фрейма данных

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

Контрзаговор

Показано общее количество пациентов со злокачественными и доброкачественными опухолями на контрзаговоре.

Тепловая карта

Тепловая карта рака груди DataFrame

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

Тепловая карта корреляционной матрицы

Чтобы найти корреляцию между каждой функцией и целью, визуализируйте тепловую карту с помощью корреляционной матрицы.

Гистограмма корреляции

Взятие корреляции каждой функции с целью и гистограммой визуализации.

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

Предварительная обработка данных

Разделение DataFrame на обучение и тестирование

# input variable 
X = cancer_df.drop(['target'], axis = 1) 
X.head(6)
# split dataset into train and test 
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= 5)

Масштабирование функций

Преобразование различных единиц и данных величины в одну единицу.

# Feature scaling 
from sklearn.preprocessing import StandardScaler 
sc = StandardScaler() 
X_train_sc = sc.fit_transform(X_train) 
X_test_sc = sc.transform(X_test)

Построение модели

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

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

Во-первых, нам нужно импортировать необходимые пакеты.

from sklearn.metrics import confusion_matrix, classification_report, accuracy_score

Классификатор опорных векторов

# Support vector classifier 
from sklearn.svm import SVC 
svc_classifier = SVC() 
svc_classifier.fit(X_train, y_train) 
y_pred_scv = svc_classifier.predict(X_test) 
accuracy_score(y_test, y_pred_scv)

Вывод ››› 0,5789473684210527

# Train with Standard scaled Data 
svc_classifier2 = SVC() 
svc_classifier2.fit(X_train_sc, y_train) 
y_pred_svc_sc = svc_classifier2.predict(X_test_sc) accuracy_score(y_test, y_pred_svc_sc)

Вывод ››› 0.9649122807017544

Логистическая регрессия

# Logistic Regression 
from sklearn.linear_model import LogisticRegression 
lr_classifier = LogisticRegression(random_state = 51, penalty = 'l1') 
lr_classifier.fit(X_train, y_train) 
y_pred_lr = lr_classifier.predict(X_test) 
accuracy_score(y_test, y_pred_lr)

Выход ››› 0,9736842105263158

# Train with Standard scaled Data 
lr_classifier2 = LogisticRegression(random_state = 51, penalty = 'l1') 
lr_classifier2.fit(X_train_sc, y_train) 
y_pred_lr_sc = lr_classifier.predict(X_test_sc) accuracy_score(y_test, y_pred_lr_sc)

Вывод ››› 0,5526315789473685

K - Классификатор ближайшего соседа

# K - Nearest Neighbor Classifier from sklearn.neighbors import KNeighborsClassifier 
knn_classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2) 
knn_classifier.fit(X_train, y_train) 
y_pred_knn = knn_classifier.predict(X_test) 
accuracy_score(y_test, y_pred_knn)

Вывод ››› 0.9385964912280702

# Train with Standard scaled Data 
knn_classifier2 = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2) 
knn_classifier2.fit(X_train_sc, y_train) 
y_pred_knn_sc = knn_classifier.predict(X_test_sc) accuracy_score(y_test, y_pred_knn_sc)

Вывод ››› 0,5789473684210527

Наивный байесовский классификатор

# Naive Bayes Classifier 
from sklearn.naive_bayes import GaussianNB 
nb_classifier = GaussianNB() 
nb_classifier.fit(X_train, y_train) 
y_pred_nb = nb_classifier.predict(X_test) 
accuracy_score(y_test, y_pred_nb)

Выход ››› 0.9473684210526315

# Train with Standard scaled Data 
nb_classifier2 = GaussianNB() 
nb_classifier2.fit(X_train_sc, y_train) 
y_pred_nb_sc = nb_classifier2.predict(X_test_sc) accuracy_score(y_test, y_pred_nb_sc)

Вывод ››› 0.9385964912280702

Классификатор дерева решений

# Decision Tree Classifier 
from sklearn.tree import DecisionTreeClassifier 
dt_classifier = DecisionTreeClassifier(criterion = 'entropy', random_state = 51) 
dt_classifier.fit(X_train, y_train) 
y_pred_dt = dt_classifier.predict(X_test) 
accuracy_score(y_test, y_pred_dt)

Выход ››› 0.9473684210526315

# Train with Standard scaled Data 
dt_classifier2 = DecisionTreeClassifier(criterion = 'entropy', random_state = 51) 
dt_classifier2.fit(X_train_sc, y_train) 
y_pred_dt_sc = dt_classifier.predict(X_test_sc) accuracy_score(y_test, y_pred_dt_sc)

Выход ››› 0,7543859649122807

Классификатор случайного леса

# Random Forest Classifier 
from sklearn.ensemble import RandomForestClassifier 
rf_classifier = RandomForestClassifier(n_estimators = 20, criterion = 'entropy', random_state = 51) 
rf_classifier.fit(X_train, y_train) 
y_pred_rf = rf_classifier.predict(X_test) 
accuracy_score(y_test, y_pred_rf)

Выход ››› 0,9736842105263158

# Train with Standard scaled Data 
rf_classifier2 = RandomForestClassifier(n_estimators = 20, criterion = 'entropy', random_state = 51) 
rf_classifier2.fit(X_train_sc, y_train) 
y_pred_rf_sc = rf_classifier.predict(X_test_sc) accuracy_score(y_test, y_pred_rf_sc)

Выход ››› 0,7543859649122807

Классификатор Adaboost

# Adaboost Classifier 
from sklearn.ensemble import AdaBoostClassifier 
adb_classifier = AdaBoostClassifier(DecisionTreeClassifier(criterion = 'entropy', random_state = 200), n_estimators=2000, learning_rate=0.1, algorithm='SAMME.R', random_state=1,) adb_classifier.fit(X_train, y_train) 
y_pred_adb = adb_classifier.predict(X_test) 
accuracy_score(y_test, y_pred_adb)

Выход ››› 0.9473684210526315

# Train with Standard scaled Data 
adb_classifier2=AdaBoostClassifier(DecisionTreeClassifier(criterion = 'entropy', random_state = 200), n_estimators=2000, learning_rate=0.1, algorithm='SAMME.R', random_state=1,) adb_classifier2.fit(X_train_sc, y_train) 
y_pred_adb_sc = adb_classifier2.predict(X_test_sc) accuracy_score(y_test, y_pred_adb_sc)

Выход ››› 0.9473684210526315

Классификатор XGBoost

# XGBoost Classifier 
from xgboost import XGBClassifier 
xgb_classifier = XGBClassifier() 
xgb_classifier.fit(X_train, y_train) 
y_pred_xgb = xgb_classifier.predict(X_test) 
accuracy_score(y_test, y_pred_xgb)

Выход ››› 0.9824561403508771

# Train with Standard scaled Data 
xgb_classifier2 = XGBClassifier() 
xgb_classifier2.fit(X_train_sc, y_train) 
y_pred_xgb_sc = xgb_classifier2.predict(X_test_sc) accuracy_score(y_test, y_pred_xgb_sc)

Выход ››› 0.9824561403508771

Настройка параметров XGBoost Рандомизированный поиск

# XGBoost classifier most required parameters 
params={ "learning_rate" : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] , "max_depth" : [ 3, 4, 5, 6, 8, 10, 12, 15], "min_child_weight" : [ 1, 3, 5, 7 ], "gamma" : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ], "colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7 ] }
# Randomized Search 
from sklearn.model_selection import RandomizedSearchCV 
random_search = RandomizedSearchCV(xgb_classifier, param_distributions=params, scoring= 'roc_auc', n_jobs= -1, verbose= 3) 
random_search.fit(X_train, y_train)

Вывод ›››

RandomizedSearchCV(cv='warn', error_score='raise-deprecating', estimator=XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1, colsample_bynode=1, colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0, max_depth=3, min_child_weight=1, missing=None, n_estimators=100, n_jobs=1, nthread=None, objective='binary:logistic', random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, silent=None, subsample=1, verbosity=1), fit_params=None, iid='warn', n_iter=10, n_jobs=-1, param_distributions={'learning_rate': [0.05, 0.1, 0.15, 0.2, 0.25, 0.3], 'max_depth': [3, 4, 5, 6, 8, 10, 12, 15], 'min_child_weight': [1, 3, 5, 7], 'gamma': [0.0, 0.1, 0.2, 0.3, 0.4], 'colsample_bytree': [0.3, 0.4, 0.5, 0.7]}, pre_dispatch='2*n_jobs', random_state=None, refit=True, return_train_score='warn', scoring='roc_auc', verbose=3)
random_search.best_params_

Вывод ›››

{'min_child_weight': 1, 'max_depth': 3, 'learning_rate': 0.3, 'gamma': 0.4, 'colsample_bytree': 0.3}
random_search.best_estimator_

Вывод ›››

XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1, colsample_bynode=1, colsample_bytree=0.3, gamma=0.4, learning_rate=0.3, max_delta_step=0, max_depth=3, min_child_weight=1, missing=None, n_estimators=100, n_jobs=1, nthread=None, objective='binary:logistic', random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, silent=None, subsample=1, verbosity=1)
# training XGBoost classifier with best parameters

Выход ››› 0.9824561403508771

Матрица неточностей:

Модель дает ошибку типа 2 0%, и это лучше всего.

Отчет о классификации модели

print(classification_report(y_test, y_pred_xgb_pt))

Вывод ›››

precision recall f1-score support 0.0 1.00 0.96 0.98 48 1.0 0.97 1.00 0.99 66 micro avg 0.98 0.98 0.98 114 macro avg 0.99 0.98 0.98 114 weighted avg 0.98 0.98 0.98 114

Перекрестная проверка модели машинного обучения

Чтобы найти, что модель ML переоборудована, недостаточно подогнана или обобщить, выполните перекрестную проверку.

# Cross validation
from sklearn.model_selection import cross_val_score 
cross_validation = cross_val_score(estimator = xgb_classifier_pt, 
X = X_train_sc,y = y_train, cv = 10) 
print("Cross validation accuracy of XGBoost model = ",cross_validation) 
print("\nCross validation mean accuracy of XGBoost model = ", cross_validation.mean())

Вывод ›››

Cross validation accuracy of XGBoost model = [0.9787234 0.97826087 0.97826087 0.97826087 0.93333333 0.91111111 1. 1. 0.97777778 0.88888889] 
Cross validation mean accuracy of XGBoost model = 0.9624617124062083

Среднее значение точности перекрестной проверки составляет 96,24%, а точность модели XGBoost составляет 98,24%. Он показывает, что XGBoost немного переоборудован, но когда обучающих данных будет больше, это будет обобщенная модель.

Сохраните модель машинного обучения

После завершения проекта машинного обучения или построения модели машинного обучения необходимо развернуть ее в приложении. Чтобы развернуть модель машинного обучения, сначала необходимо ее сохранить. Чтобы сохранить проект машинного обучения, мы можем использовать pickle.

## Pickle import pickle 
# save model 
pickle.dump(xgb_classifier_pt, open('breast_cancer_detector.pickle', 'wb')) # load model 
breast_cancer_detector_model=pickle.load(open('breast_cancer_detector.pickle', 'rb')) # predict the output 
y_pred = breast_cancer_detector_model.predict(X_test) # confusion matrix 
print('Confusion matrix of XGBoost model: \n',confusion_matrix(y_test, y_pred),'\n') # show the accuracy print('Accuracy of XGBoost model = ',accuracy_score(y_test, y_pred))

Вывод ›››

Confusion matrix of XGBoost model: [[46 2] [ 0 66]] 
Accuracy of XGBoost model = 0.9824561403508771

Мы успешно завершили проект машинного обучения с точностью 98,24%, что отлично подходит для проекта «Обнаружение рака груди с помощью машинного обучения». Теперь мы готовы развернуть нашу модель машинного обучения в проекте здравоохранения.

Заключение

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

Спасибо….. -:)