Рак груди - одно из самых опасных заболеваний в мире для женщин, а иногда и для мужчин. Если пациенту / врачу не удалось обнаружить болезнь на начальной стадии, результатом будет смерть пациента. Врач может не определить болезнь для каждого человека. Итак, на место приходят инженеры по машинному обучению / специалисты по данным.
СОДЕРЖАНИЕ:
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.
Спасибо….. -:)