Это начало.

Здоровье - это одна из многих вещей, которые мы принимаем как должное в повседневной жизни. Когда мы заболеваем или начинаем заболеть, боль, процесс диагностики, лечение - это все, что мы ожидаем. Мы часто не задумываемся о том, что является основой всего этого - системой здравоохранения. Врачи, инфраструктура, сама больница, а также все оборудование, обеспечивающее диагностику и лечение. Так делали многие десятилетия и добились огромных успехов.

Вот как в настоящее время диагностируют и лечат рак груди

Текущие правила проверки:

Обычно при раке груди врачи и практикующие врачи используют маммографию (разновидность рентгеновского снимка), ультразвук, МРТ и / или биопсию, чтобы помочь диагностировать пациентов.

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

Для раннего выявления рака Американское онкологическое общество рекомендует следующее:

  • «Женщины в возрасте от 45 до 54 лет должны проходить маммографию каждый год» и что…
  • «Женщины 55 лет и старше должны переходить на маммографию каждые 2 года или могут продолжать ежегодное обследование».

Если у пациента диагностирован рак груди, врачи затем исследуют способы избавления от рака, который зависит от типа рака груди, его стадии и степени, размера, а также от того, чувствительны ли раковые клетки к гормонам сообщает Клиника Мэйо.

Затем врачи приступили к удалению рака груди (лампэктомия), удалению всей груди (мастэктомия) или удалению ограниченного количества лимфатических узлов (биопсия сторожевого узла ), удаление нескольких лимфатических узлов (диссекция подмышечных лимфатических узлов) или удаление обеих молочных желез. Кроме того, в зависимости от ситуации и множества факторов существуют и другие методы лечения, такие как лучевая терапия, химиотерапия, гормональная терапия, иммунотерапия и другие. (Клиника Майо).

Бесконечные достижения в медицине привели к тому моменту, когда мы находимся сегодня, обладая бесконечными инструментами и талантами, чтобы помочь диагностировать и лечить один из наиболее распространенных типов рака среди женщин, от которого только в 2018 году во всем мире пострадало более 2 миллионов человек (WCRF ).

Подожди ... Я думал о душе, хотя ...

Я отчетливо помню, что это было в 8 утра во время каникул. Я принимал душ и думал о медицине и о том, как я был благодарен за всю систему здравоохранения и за то, как она заботится о многих моих близких и обо мне.

Каким-то образом мой разум волшебным образом блуждал, а затем связал мое увлечение ИИ с его использованием для лечения или диагностики болезней. Закончив мыть посуду, я схватил свой телефон со стойки и начал записывать записи, исследуя проекты и наборы данных на Kaggle, пытаясь понять, что я могу сделать в рамках своего следующего проекта в области искусственного интеллекта. А потом… БАМ. Я нашел это.

Набор данных по раку молочной железы, штат Висконсин (диагностический).

Подсказка проекта? «Предскажите, доброкачественный рак или злокачественный»

Затем я сразу включил идею проекта в свой список дел на Notion и начал искать, как мне это сделать. Через несколько часов я начал. Вот процесс и пошаговое руководство.

Проэкт.

У меня было впереди несколько шагов, но я шел один за другим, полон решимости завершить его. Вот процесс и пошаговое руководство.

Шаг 0: Подготовка данных.

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

Он был составлен Департаментом машинного обучения Калифорнийского университета в Ирвине. Внутри он включает в себя список особенностей из оцифрованных изображений тонкой иглы аспирата (FNA) новообразования груди. , которую собрали д-р Уильям Х. Вольберг, У. Ник Стрит и Ольви Л. Мангасарян из Университета Висконсина.

Доктор Уильям Х. Вольберг создал набор данных, используя образцы жидкости, взятые у пациентов с твердыми образованиями груди, и программное обеспечение под названием Xcyt, которое могло анализировать цитологические особенности на основе его цифровых сканирований. «Затем программа использует алгоритм аппроксимации кривой, вычисляя 10 признаков из каждой ячейки в выборке, вычисляя среднее значение, экстремальное значение и стандартную ошибку каждого признака для изображения, возвращая 30 векторов с действительным знаком» (V Гоэль).

Вот некоторые данные, взятые прямо с сайта:

Информация об атрибутах:

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

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

a) радиус (среднее расстояние от центра до точек по периметру)
b) текстура (стандартное отклонение значений шкалы серого)
c) периметр
d) площадь
e ) гладкость (локальное изменение длины радиуса)
f) компактность (периметр² / площадь - 1,0)
g) вогнутость (выраженность вогнутых участков контура)
h) точки вогнутости (количество вогнутые части контура)
i) симметрия
j) фрактальная размерность («приближение береговой линии» - 1)

Огромный привет всем компьютерным специалистам, докторам и исследователям из обоих университетов, которые собрали это вместе! Еще одна благодарность каналу Youtube Computer Science за ценную помощь в этом проекте, когда я застрял!

Шаг 1. Исследование данных

Первым шагом в рамках любого проекта является открытие IDE или среды, которую вы будете использовать. Я открыл блокнот Jupyter в Google Colab и начал работать. Первым шагом было изучение данных, чтобы увидеть, с чем я работал, и вот разбивка того, что я сделал:

Сначала я импортировал ключевые библиотеки и пакеты, необходимые для проекта.

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

Затем я загрузил набор данных и загрузил его в программу. Я также распечатал первые 8 строк данных, чтобы понять, с чем я работал.

*#Load the dataset into the program*
from google.colab import files
uploaded = files.upload()
df = pd.read_csv('data.csv')
df.head(8)

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

Затем я решил взглянуть на данные и выяснить количество строк и столбцов в моем наборе данных. Я понял, что действительно было 569 строк данных, что означает, что в этом наборе данных было представлено 569 пациентов и что было 33 столбца данных, окружающих каждого пациента, 31 если вы исключите идентификатор пациента и подтвержденный диагноз.

#Count the number of rows and columns in the data set
df.shape

Я хотел очистить все бесполезные части своих данных и попытаться найти все столбцы, которые были пустыми или не содержали ничего (NaN, NAN, na) значений.

#Count the number of empty (NaN, NAN, na) values in each column
df.isna().sum()

В результате я удалил последний столбец, так как он не имел смысла.

#Drop the column with empty values (Na, NAN, NaN)
df = df.dropna(axis=1)

Затем я получил новое количество строк и столбцов, чтобы подтвердить, что последний был исключен.

#Get the new count of the number of rows and columns
df.shape

Затем я хотел узнать, у скольких из пациентов были злокачественные раковые клетки (M) и доброкачественные (B) незлокачественные клетки. Кроме того, я хотел визуализировать это и создать график подсчета.

#Get a count of the number of the Malignant (M) and Benign (B) cells
df['diagnosis'].value_counts()
#Visualize the count
sns.countplot(df['diagnosis'], label='count')

Чтобы убедиться, что все типы данных верны, я запустил некоторый код, чтобы увидеть, есть ли какие-либо нечисловые данные, которые показали, что столбец «диагностика» был категориальными данными, объектом в Python.

Шаг 2 - Категориальные данные

Набор данных включал категориальные данные, которые представляют собой переменные, которые представляют собой значения меток, а не числовые значения. Примеры вариантов использования категориальных данных могут включать ссылку на страну, пол, возрастную группу и т. Д. В результате я хотел преобразовать значения «диагноза» в 1 и 0 из M и B соответственно, а затем распечатать результаты. Другими словами, используя кодировщик меток, я преобразовал доброкачественные в 0, а злокачественные - в 1.

#Encoding categorical data values (
from sklearn.preprocessing import LabelEncoder
labelencoder_Y = LabelEncoder()
df.iloc[:,1]= labelencoder_Y.fit_transform(df.iloc[:,1].values)
print(labelencoder_Y.fit_transform(df.iloc[:,1].values))

Затем я решил визуализировать данные, чтобы лучше понять их, и создать точечные диаграммы, на которых переменные в одной строке данных сопоставляются друг с другом. Помните, что доброкачественный = 0 и злокачественный = 1.

#Create a pair plot, remember that 0 means benign and 1 means malignant
sns.pairplot(df.iloc[:,1:5], hue = 'diagnosis')

Теперь, когда я мог визуализировать и видеть корреляции, я также хотел позволить компьютеру отображать числовые корреляции.

#Get the correlatioins of the columns
df.iloc[:,1:12].corr()

Я также хотел визуализировать корреляцию, создав тепловую карту. Я также хотел изменить значения, чтобы отображалась степень вероятности корреляции переменных в процентах вместо шкалы от 0 до 1.

#Visualize the correlation
plt.figure(figsize=(10,10))
sns.heatmap(df.iloc[:,1:12].corr(), annot=True , fmt='.0%')

Шаг 3 - Масштабирование функций и разделение данных

После изучения и очистки данных я настроил данные, разделив набор данных на набор данных функции (независимый набор данных с переменной X) и целевой набор данных (зависимый набор данных с переменной Y).

X = df.iloc[:, 2:31].values 
Y = df.iloc[:, 1].values

Затем я снова разделил его, чтобы 75% было выделено на обучение, а 25% использовалось для тестирования, когда я завершил программу.

#Splitting Data
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.25, random_state = 0)

Теперь цель состоит в том, чтобы масштабировать данные с помощью масштабирования функций, чтобы гарантировать, что все функции имеют одинаковый уровень величины. Это означает, что функция или независимые данные будут находиться в определенном диапазоне от 0–1 до 0–100.

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

Шаг 4 - Выбор модели

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

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

Обучение с учителем
Это метод, с помощью которого мы обучаем или обучаем машину, используя данные с хорошей маркировкой. Кроме того, этот помеченный набор данных помогает обучить модель понимать закономерности в данных. В дальнейшем это можно разделить на два типа проблем: Регрессия (где выводом является непрерывное значение, т. Е. Заработная плата, цены на жилье, вес, возраст) и Классификация (где выход является категорией, то есть аналогичен работе в двоичном формате, вывод либо 0, либо 1, либо вывод «правильно» или «неправильно» и т. д.)

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

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

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

#Create a function for the models
def models(X_train, Y_train):
#Logistic Regression
  from sklearn.linear_model import LogisticRegression
  log = LogisticRegression(random_state=0)
  log.fit(X_train, Y_train)
#Decision Tree
  from sklearn.tree import DecisionTreeClassifier
  tree = DecisionTreeClassifier(criterion = 'entropy', random_state=0)
  tree.fit(X_train, Y_train)
#Random Forest Classifier
  from sklearn.ensemble import RandomForestClassifier
  forest = RandomForestClassifier(n_estimators = 10, criterion = 'entropy', random_state=0)
  forest.fit(X_train, Y_train)
#Print the model's accuracy on the training data
  print('[0] Logistic Regression Training Accuracy', log.score(X_train, Y_train))
  print('[1] Decision Tree Classifier Training Accuracy', tree.score(X_train, Y_train))
  print('[2] Random Forest Classifier Training Accuracy', forest.score(X_train, Y_train))
return log, tree, forest
# Getting all of the models
model = models(X_train, Y_train)

Вот результаты и показатели точности. Кажется, что уровни точности составляют 99,0%, 100,0% и 99,5% для моделей логистической регрессии, дерева решений и случайного леса соответственно.

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

#Test Model Accuracy on Test Data on Confusion Matrix
from sklearn.metrics import confusion_matrix
for i in range( len(model) ): 
  print('Model', i)
  cm = confusion_matrix(Y_test, model[i].predict(X_test))
TN = cm[0][0]
  TP = cm[1][1]
  FN = cm[1][0]
  FP = cm[0][1]
print(cm)
  print('Testing Accuracy = ', (TP + TN) / (TP + TN + FN + FP))
  print()

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

# Alternative Method to Get Metrics of The Models
from sklearn.metrics import classification_report
from sklearn.metrics import accuracy_score
for i in range(len(model)): 
  print('Model', i)
  print()
  print(classification_report(Y_test, model[i].predict(X_test)))
  print(accuracy_score(Y_test, model[i].predict(X_test)))

Основываясь на приведенных выше цифрах, мы можем видеть, что модель, которая работает лучше всего, действительно является классификатором случайного леса с точностью 96,5%! Не так уж плохо в контексте машинного обучения, но если бы это было использовано на реальных пациентах, уровень точности должен был бы быть намного выше, так как это означало бы, что для каждых 100 пациентов эта модель выполняет прогнозы, она получит это неправильно на 3,5 пациента. Если бы они использовались в реальных медицинских учреждениях, потребовалось бы немного больше настройки этих моделей. Надеюсь, с дальнейшими улучшениями мы дойдем до точки, когда точность в основном достигнет 100%.

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

#Print the prediction of Random Forest Classifier Model
pred = model[2].predict(X_test)
print(pred) #predictions
print()
print(Y_test) #real diagnosis according to the original dataset

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

Ресурсы

  1. Https://towardsdatascience.com/building-a-simple-machine-learning-model-on-breast-cancer-data-eca4b3b99fa3
  2. Https://randerson112358.medium.com/breast-cancer-detection-using-machine-learning-38820fe98982
  3. Https://en.wikipedia.org/wiki/Confusion_matrix
  4. Https://www.cancer.org/healthy/find-cancer-early/cancer-screening-guidelines/american-cancer-society-guidelines-for-the-early-detection-of-cancer.html#:~: text = Женщины% 20лет% 2040% 20to% 2044, или% 20can% 20продолжить% 20лет% 20 скрининг .
  5. Https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+%28Diagnostic%29

Не стесняйтесь оставлять любые комментарии ниже, если у вас есть какие-либо вопросы или вы хотите оставить отзыв или предложение.

Кроме того, вот несколько ссылок ниже, где вы можете найти меня, если это ваша чашка чая:

📰 Подпишитесь на мою ежемесячную рассылку новостей!
👨‍💻 Персональный сайт
🎬 Youtube
🔗 Linkedin
📝 Ссылка на код