«После рака молочной железы может быть жизнь. Обязательным условием является раннее выявление».
— Энн Джиллиан
Что такое рак молочной железы?
Обычно клетки в организме делятся и воспроизводятся, когда нужны новые клетки. Иногда клетки в какой-либо части тела бесконтрольно растут и делятся, в результате чего образуется масса ткани, называемая опухолью. Если бесконтрольно разрастающиеся клетки являются нормальными клетками, опухоль называется доброкачественной (не раковой). Если бесконтрольно разрастающиеся клетки являются аномальными и не функционируют как нормальные клетки организма клетки, опухоль называется злокачественной (раковой).
Рак молочной железы возникает в ткани молочной железы и может проникать и прорастать в ткани, окружающие грудь. Он также может перемещаться в другие части тела и образовывать новые опухоли.
В США рак молочной железы является второй по значимости причиной смерти от рака у женщин после рака легких и основной причиной смерти от рака среди женщин в возрасте от 35 до 54 лет. определенная генетическая предрасположенность к заболеванию.
Обнаружение рака молочной железы
Одним из лучших способов обнаружения рака молочной железы является хирургическая биопсия молочной железы для сбора и проверки тканей на наличие раковых клеток. Биопсия молочной железы — это процедура, при которой врач берет клетки или небольшой кусочек ткани из части молочной железы и исследует клетки или ткань на наличие признаков рака. Раннее выявление рака молочной железы имеет решающее значение и может значительно улучшить прогноз и шансы на выживание, продвигая клиническое лечение пациентов на ранних стадиях.
Лечение рака молочной железы
После обнаружения рака молочной железы его можно лечить различными способами в зависимости от типа рака молочной железы и степени его распространения. Людей с раком молочной железы часто лечат одним из следующих методов лечения.
- Хирургия. Операция, при которой врачи вырезают раковую ткань.
- Химиотерапия. Использование специальных лекарств для уменьшения или уничтожения раковых клеток. Наркотики могут быть таблетками, которые вы принимаете, или лекарствами, которые вводят вам в вену.
- Гормональная терапия. Блокирует получение раковыми клетками гормонов, необходимых им для роста.
- Биологическая терапия. Воздействует на иммунную систему вашего организма, помогая ей бороться с раковыми клетками или контролировать побочные эффекты других методов лечения рака.
- Лучевая терапия. Использование высокоэнергетических лучей (похожих на рентгеновские лучи) для уничтожения раковых клеток.
Дорожная карта
В оставшейся части этой статьи будет представлена программа, которая попытается точно предсказать, является ли рак молочной железы доброкачественным или злокачественным, путем анализа данных о тканях. Следующие шаги будут выполняться с использованием машинного обучения и Python.
1. Импортируйте необходимые программные библиотеки.
2. Получите доступ к набору данных и импортируйте его в фрейм данных.
3. Анализ данных и исследование.
4. Разделите данные на тестовые и обучающие наборы данных.
5. Обучите модель на обучающих данных.
6. Делайте прогнозы по тестовым данным.
7. Оцените производительность модели.
8. Сделайте выводы из оценок.
Программа
Цели этой программы включают в себя:
1. Использовать различные модели машинного обучения, чтобы найти модель, обеспечивающую наибольшую точность.
2. Определить, какие признаки являются наиболее важными для прогнозирования доброкачественности или злокачественности рака молочной железы.
Импортируйте необходимые программные библиотеки
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC from xgboost import XGBClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, classification_report, accuracy_score
Доступ к набору данных и импорт его
# Load the data into Colab. from google.colab import files # Use to load data on Google Colab uploaded = files.upload() # Use to load data on Google Colab #Store the data into a data frame. bc_data = pd.read_csv('breast_cancer_data.csv')
Анализ и исследование данных
# Print the first 5 rows. bc_data.head(5)
Мы получили набор данных по раку молочной железы в Висконсине (диагностический) от Kaggle. Характеристики рассчитываются по оцифрованному изображению тонкоигольной аспирации (ТАБ) массы молочной железы. Они описывают характеристики ядер клеток, присутствующих на изображении.
Переменные функции включают в себя:
- идентификационный номер
- Диагноз (M = злокачественный, B = доброкачественный)
- 3–32
Для каждого клеточного ядра вычисляются десять вещественных признаков:
- радиус (среднее расстояние от центра до точек на периметре)
- текстура (стандартное отклонение значений шкалы серого)
- периметр
- площадь
- гладкость (локальное изменение длины радиуса)
- компактность (периметр²/площадь — 1,0)
- вогнутость (выраженность вогнутых участков контура)
- вогнутые точки (количество вогнутых частей контура)
- симметрия
- фрактальная размерность («приближение береговой линии» — 1)
Среднее значение, стандартная ошибка и «наихудшее» или наибольшее (среднее значение трех самых больших значений) этих признаков были рассчитаны для каждого изображения, в результате чего было получено 30 признаков.
# Show information about the data columns. bc_data.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 569 entries, 0 to 568 Data columns (total 33 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 569 non-null int64 1 diagnosis 569 non-null object 2 radius_mean 569 non-null float64 3 texture_mean 569 non-null float64 4 perimeter_mean 569 non-null float64 5 area_mean 569 non-null float64 6 smoothness_mean 569 non-null float64 7 compactness_mean 569 non-null float64 8 concavity_mean 569 non-null float64 9 concave points_mean 569 non-null float64 10 symmetry_mean 569 non-null float64 11 fractal_dimension_mean 569 non-null float64 12 radius_se 569 non-null float64 13 texture_se 569 non-null float64 14 perimeter_se 569 non-null float64 15 area_se 569 non-null float64 16 smoothness_se 569 non-null float64 17 compactness_se 569 non-null float64 18 concavity_se 569 non-null float64 19 concave points_se 569 non-null float64 20 symmetry_se 569 non-null float64 21 fractal_dimension_se 569 non-null float64 22 radius_worst 569 non-null float64 23 texture_worst 569 non-null float64 24 perimeter_worst 569 non-null float64 25 area_worst 569 non-null float64 26 smoothness_worst 569 non-null float64 27 compactness_worst 569 non-null float64 28 concavity_worst 569 non-null float64 29 concave points_worst 569 non-null float64 30 symmetry_worst 569 non-null float64 31 fractal_dimension_worst 569 non-null float64 32 Unnamed: 32 0 non-null float64 dtypes: float64(31), int64(1), object(1)
Есть 569 записей пациентов и 33 функции. Набор данных содержит целые числа, объекты и значения с плавающей запятой. Переменная диагноза будет целевой переменной, которая имеет значения M (злокачественный) и B (доброкачественный).
# Check for NA or missing values in features. bc_data.isna().sum() id 0 diagnosis 0 radius_mean 0 texture_mean 0 perimeter_mean 0 area_mean 0 smoothness_mean 0 compactness_mean 0 concavity_mean 0 concave points_mean 0 symmetry_mean 0 fractal_dimension_mean 0 radius_se 0 texture_se 0 perimeter_se 0 area_se 0 smoothness_se 0 compactness_se 0 concavity_se 0 concave points_se 0 symmetry_se 0 fractal_dimension_se 0 radius_worst 0 texture_worst 0 perimeter_worst 0 area_worst 0 smoothness_worst 0 compactness_worst 0 concavity_worst 0 concave points_worst 0 symmetry_worst 0 fractal_dimension_worst 0 Unnamed: 32 569 dtype: int64
Безымянный: 32 — единственный столбец с нулевыми или отсутствующими значениями. Мы удалим этот столбец. Мы также удалим столбец id, потому что он не имеет отношения к целевой переменной.
bc_data = bc_data.dropna(axis=1) bc_data = bc_data.drop('id', axis = 1)
Показать количество злокачественных и доброкачественных клеток.
bc_data['diagnosis'].value_counts() B 357 M 212
357 случаев доброкачественных и 212 случаев злокачественных.
# Visualize the counts for the number of Malignant and Benign cells. sns.countplot(bc_data['diagnosis'],label="Count")
Визуализируйте распределения для каждой функции.
import warnings warnings.filterwarnings("ignore") plt.figure(figsize=(16, 21)) plt.subplot(6, 5, 1) sns.boxplot(bc_data['radius_mean']) plt.subplot(6, 5, 2) sns.boxplot(bc_data['texture_mean']) plt.subplot(6, 5, 3) sns.boxplot(bc_data['perimeter_mean']) plt.subplot(6, 5, 4) sns.boxplot(bc_data['area_mean']) plt.subplot(6, 5, 5) sns.boxplot(bc_data['smoothness_mean']) plt.subplot(6, 5, 6) sns.boxplot(bc_data['compactness_mean']) plt.subplot(6, 5, 7) sns.boxplot(bc_data['concavity_mean']) plt.subplot(6, 5, 8) sns.boxplot(bc_data['concave points_mean']) plt.subplot(6, 5, 9) sns.boxplot(bc_data['symmetry_mean']) plt.subplot(6, 5, 10) sns.boxplot(bc_data['fractal_dimension_mean']) plt.subplot(6, 5, 11) sns.boxplot(bc_data['radius_se']) plt.subplot(6, 5, 12) sns.boxplot(bc_data['texture_se']) plt.subplot(6, 5, 13) sns.boxplot(bc_data['perimeter_se']) plt.subplot(6, 5, 14) sns.boxplot(bc_data['area_se']) plt.subplot(6, 5, 15) sns.boxplot(bc_data['smoothness_se']) plt.subplot(6, 5, 16) sns.boxplot(bc_data['compactness_se']) plt.subplot(6, 5, 17) sns.boxplot(bc_data['concavity_se']) plt.subplot(6, 5, 18) sns.boxplot(bc_data['concave points_se']) plt.subplot(6, 5, 19) sns.boxplot(bc_data['symmetry_se']) plt.subplot(6, 5, 20) sns.boxplot(bc_data['fractal_dimension_se']) plt.subplot(6, 5, 21) sns.boxplot(bc_data['radius_worst']) plt.subplot(6, 5, 22) sns.boxplot(bc_data['texture_worst']) plt.subplot(6, 5, 23) sns.boxplot(bc_data['perimeter_worst']) plt.subplot(6, 5, 24) sns.boxplot(bc_data['area_worst']) plt.subplot(6, 5, 25) sns.boxplot(bc_data['smoothness_worst']) plt.subplot(6, 5, 26) sns.boxplot(bc_data['compactness_worst']) plt.subplot(6, 5, 27) sns.boxplot(bc_data['concavity_worst']) plt.subplot(6, 5, 28) sns.boxplot(bc_data['concave points_worst']) plt.subplot(6, 5, 29) sns.boxplot(bc_data['symmetry_worst']) plt.subplot(6, 5, 30) sns.boxplot(bc_data['fractal_dimension_worst'])
# Change values for diagnosis to numeric. # Benign will have a value of 0 and malignant will have a value of # 1. bc_data['diagnosis'].replace({"B":"0"},inplace = True) bc_data['diagnosis'].replace({"M":"1"},inplace = True) bc_data['diagnosis'] = bc_data['diagnosis'].astype('int64') # View the correlations between the features and target variable. bc_data.corr()
Выбор функций
Удалите функции, которые имеют низкую корреляцию (‹0,5) с целевой переменной, чтобы повысить точность моделей и уменьшить сложность.
cols = ['texture_mean','smoothness_mean', 'symmetry_mean', 'fractal_dimension_mean', 'texture_se', 'smoothness_se', 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se', 'fractal_dimension_se', 'texture_worst', 'smoothness_worst', 'symmetry_worst', 'fractal_dimension_worst'] bc_data = bc_data.drop(columns = cols, axis = 1)
Визуализируйте функции и целевую переменную, используя матрицу корреляции. Мы будем использовать метод корреляции Пирсона.
plt.figure(figsize=(12,10)) cor = bc_data.corr() sns.heatmap(cor, annot=True, cmap='coolwarm')
Разделить данные на тестовые и обучающие наборы данных
Сначала нам нужно разделить наши данные на значения x (данные, которые мы будем использовать для прогнозирования) и значения y (данные, которые мы пытаемся предсказать).
x_data = bc_data.drop('diagnosis', axis = 1) y_data = bc_data['diagnosis']
Используйте функцию train_test_split для создания данных обучения и тестовых данных. Набор тестовых данных составляет 30% от исходного набора данных.
x_training_data, x_test_data, y_training_data, y_test_data = train_test_split(x_data, y_data, test_size = 0.30, random_state=42)
Нормализуйте набор данных признаков.
# StandardScaler will transform the data so that its distribution # will have a mean value 0 and standard deviation of 1. from sklearn.preprocessing import StandardScaler sc = StandardScaler() x_training_data = sc.fit_transform(x_training_data) x_test_data = sc.fit_transform(x_test_data)
Теперь мы будем обучать модели, делать прогнозы и оценивать производительность пяти различных моделей машинного обучения.
Модель логической регрессии
# Create model object. model_lr = LogisticRegression(random_state=0) # Train the model on the training data. model_lr.fit(x_training_data, y_training_data) # Make predictions on the test data. predictions_lr = model_lr.predict(x_test_data) # Calculate the Accuracy Score. lr = accuracy_score(y_test_data, predictions_lr) print(lr)
0.9649122807017544
# Show the classification report. print(classification_report(y_test_data, predictions_lr)) precision recall f1-score support 0 0.96 0.98 0.97 108 1 0.97 0.94 0.95 63 accuracy 0.96 171 macro avg 0.97 0.96 0.96 171 weighted avg 0.96 0.96 0.96 171
Модель логической регрессии правильно предсказала, что 96% случаев рака груди будут доброкачественными или злокачественными.
- 96% правильно предсказали доброкачественный рак молочной железы.
- 97% правильно предсказали, что рак молочной железы будет злокачественным.
Случайная модель Форреста
# Create model object. model_rf = RandomForestClassifier(n_estimators = 200) # Train the model on the training data. model_rf.fit(x_training_data, y_training_data) # Make predictions on the test data. predictions_rf = model_rf.predict(x_test_data) # Calculate the Accuracy Score. rf = accuracy_score(y_test_data, predictions_rf) print(rf)
0.9649122807017544
# Show the classification report. print(classification_report(y_test_data, predictions_rf)) precision recall f1-score support 0 0.96 0.98 0.97 108 1 0.97 0.94 0.95 63 accuracy 0.96 171 macro avg 0.97 0.96 0.96 171 weighted avg 0.96 0.96 0.96 171
Случайная модель Форреста правильно предсказала, что 96% случаев рака молочной железы будут доброкачественными или злокачественными.
- 96% правильно предсказали доброкачественный рак молочной железы.
- 97% правильно предсказали, что рак молочной железы будет злокачественным.
K ближайших соседей
# Create model object. model_kn = KNeighborsClassifier(n_neighbors=9, leaf_size=20) # (n_neighbors = 5, metric = 'minkowski', p = 2) # Train the model on the training data. model_kn.fit(x_training_data, y_training_data) # Make predictions on the test data. predictions_kn = model_kn.predict(x_test_data) # Calculate the Accuracy Score. kn = accuracy_score(y_test_data, predictions_kn) print(kn)
0.9415204678362573
# Show the classification report. print(classification_report(y_test_data, predictions_kn)) precision recall f1-score support 0 0.95 0.96 0.95 108 1 0.93 0.90 0.92 63 accuracy 0.94 171 macro avg 0.94 0.93 0.94 171 weighted avg 0.94 0.94 0.94 171
Модель k ближайших соседей правильно предсказала, что 94% случаев рака груди будут доброкачественными или злокачественными.
- 95% правильно предсказали, что рак молочной железы будет доброкачественным.
- 93% правильно предсказали, что рак молочной железы будет злокачественным.
Машина опорных векторов
# Create model object. model_svc = SVC(C=10, gamma=0.01, kernel='rbf') # Train the model on the training data. model_svc.fit(x_training_data, y_training_data) # Make predictions on the test data. predictions_svc = model_svc.predict(x_test_data) # Calculate the Accuracy Score. svm = accuracy_score(y_test_data, predictions_svc) print(svm)
0.9415204678362573
# Show the classification report. print(classification_report(y_test_data, predictions_svc)) precision recall f1-score support 0 0.94 0.97 0.95 108 1 0.95 0.89 0.92 63 accuracy 0.94 171 macro avg 0.94 0.93 0.94 171 weighted avg 0.94 0.94 0.94 171
Модель машины опорных векторов правильно предсказала, что 94% случаев рака груди будут доброкачественными или злокачественными.
- 94% правильно предсказали рак молочной железы как доброкачественный.
- 95% правильно предсказали, что рак молочной железы будет злокачественным.
Экстремальное усиление градиента
# Create model object. model_xgb = XGBClassifier() # Train the model on the training data. model_xgb.fit(x_training_data, y_training_data) # Make predictions on the test data. predictions_xgb = model_xgb.predict(x_test_data) # Calculate the Accuracy Score. xgb = accuracy_score(y_test_data, predictions_xgb) print(xgb)
0.9532163742690059
# Show the classification report. print(classification_report(y_test_data, predictions_xgb)) precision recall f1-score support 0 0.95 0.98 0.96 108 1 0.97 0.90 0.93 63 accuracy 0.95 171 macro avg 0.96 0.94 0.95 171 weighted avg 0.95 0.95 0.95 171
Модель экстремального повышения градиента правильно предсказала, что 95% случаев рака молочной железы будут доброкачественными или злокачественными.
- 95% правильно предсказали, что рак молочной железы будет доброкачественным.
- 97% правильно предсказали, что рак молочной железы будет злокачественным.
Показать показатель точности по модели
models = pd.DataFrame({ 'Model':['Logistic Regression', 'Random Forest', 'KNeighbours', 'Support Vector Machine', 'Extreme Gradient Boost'], 'Accuracy_score' :[lr, rf, kn, svm, xgb] }) models sns.barplot(x='Accuracy_score', y='Model', data=models) models.sort_values(by='Accuracy_score', ascending=False)
Выводы. Все протестированные модели показали высокие показатели точности в диапазоне от 94,15% до 96,49%. Модели логистической регрессии и случайного леса имели самые высокие оценки точности. Эти модели правильно предсказали, что более 96% случаев рака молочной железы будут доброкачественными или злокачественными.
Показатели точности моделей можно улучшить за счет увеличения набора данных и настройки некоторых гиперпараметров моделей.
Спасибо, что прочитали мою статью! Если у вас есть какие-либо вопросы или комментарии, пожалуйста, дайте мне знать.
Если вам нравится читать такие истории и вы хотите поддержать меня как писателя, подумайте о том, чтобы зарегистрироваться и стать участником Medium. Членство дает вам неограниченный доступ к историям на Medium. Зарегистрироваться можно по этой ссылке https://medium.com/@dniggl/membership