«После рака молочной железы может быть жизнь. Обязательным условием является раннее выявление».

Энн Джиллиан

Что такое рак молочной железы?

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

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

В США рак молочной железы является второй по значимости причиной смерти от рака у женщин после рака легких и основной причиной смерти от рака среди женщин в возрасте от 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. Характеристики рассчитываются по оцифрованному изображению тонкоигольной аспирации (ТАБ) массы молочной железы. Они описывают характеристики ядер клеток, присутствующих на изображении.

Переменные функции включают в себя:

  1. идентификационный номер
  2. Диагноз (M = злокачественный, B = доброкачественный)
  3. 3–32

Для каждого клеточного ядра вычисляются десять вещественных признаков:

  1. радиус (среднее расстояние от центра до точек на периметре)
  2. текстура (стандартное отклонение значений шкалы серого)
  3. периметр
  4. площадь
  5. гладкость (локальное изменение длины радиуса)
  6. компактность (периметр²/площадь — 1,0)
  7. вогнутость (выраженность вогнутых участков контура)
  8. вогнутые точки (количество вогнутых частей контура)
  9. симметрия
  10. фрактальная размерность («приближение береговой линии» — 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