Рак молочной железы является одной из основных причин смерти канадских женщин: 1 из 8 заболевает им в течение жизни и 1 из 34 умирает из-за него. Существующие методы выявления рака молочной железы дороги и неэффективны, например, такие процедуры, как маммография, МРТ или биопсия.

Оглавление:

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

Проблема

Что такое модель классификации ML

Как это работает

Заключение

Что такое рак молочной железы + как это работает

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

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

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

Проблема

Около 5%-28% случаев рака молочной железы ставят неверный диагноз, в результате чего тысячи женщин ходят, не подозревая, что у них есть заболевание. Как упоминалось ранее, методы диагностики рака груди также невероятно дороги: маммография стоит около 210 долларов, МРТ груди стоит 1900 долларов, а биопсия груди стоит от 1000 до 5000 долларов, и все это без медицинской страховки.

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

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

Модели машинного обучения и классификации

Машинное обучение — это распространенное подмножество ИИ, в котором используются сложные алгоритмы для решения проблем и самостоятельного обучения на основе прошлого опыта без какого-либо сложного программирования. Машинное обучение присутствует в нашей повседневной жизни, от экранов рекомендаций Netflix и Instagram до поисковых систем, таких как Google или Firefox. ML подразделяется на три аспекта: обучение с учителем, обучение без учителя и обучение с подкреплением. Чтобы узнать больше о машинном обучении и искусственном интеллекте, ознакомьтесь с моей статьей здесь.

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

Использование машинного обучения для обнаружения рака молочной железы

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

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

1. Импорт библиотек и загрузка набора данных

Numpy: используется для выполнения математических операций.

Pandas: используется для обработки и анализа набора данных.

Matplotlib.pyplot. Используется для визуализации данных и сохранения состояний при вызовах функций.

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

После импорта библиотек я загрузил этот набор данных (с использованием набора данных о раке молочной железы штата Висконсин) в программу и использовал файл df. head(10) для отображения первых 10 строк данных. Число в скобках можно изменить в зависимости от того, сколько строк данных вы хотите отобразить.

2. Анализ + визуализация данных

df.shape
sns.pairplot(df,hue = 'diagnosis' , palette= 'coolwarm' , vars= ['radius_mean' , 'texture_mean' , 'perimeter_mean' , 'area_mean' , 'smoothness_mean'])

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

Теперь приступим к дальнейшему анализу данных.

df.isna().sum()
df= df.dropna(axis = 1)
df.shape
df['diagnosis'].value_counts()

Первым шагом, который я предпринял, было использование функции df.isna() для определения количества пропущенных значений в столбцах. После этого я удалил эти столбцы с отсутствующими значениями (df.dropna) и установил их как новые df. Я сохранил этот новый фрейм данных в файле df. shape, а затем получил количество данных о доброкачественных и злокачественных клетках с помощью функции df.value_counts, которая используется для получения серии уникальных значений.

sns.countplot (df['diagnosis'], label = 'count')
#visualizing the count (B= 357, M= 212)

Используя метод sns.counterplot() или морской контрплот, я мог визуализировать количество данных каждой категории наблюдений в виде гистограммы, показанной ниже.

df.dtypes

Следуя схеме анализа данных с помощью функции df, я использовал функцию df.dtypes для возврата ряда типов данных в наборе данных.

df= df.rename(columns = {'diagnosis' : 'label'})
print(df.dtypes)

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

Чтобы предоставить краткий обзор используемых типов данных Python:

int64 = также называется 64-битным целым числом. Этот тип данных хранит как положительные, так и отрицательные целые числа (никогда не будет храниться с десятичным разрядом). 64 просто показывает, сколько памяти выделено для хранения значения/символа.

float64 = Также называемый форматом с плавающей запятой двойной точности, этот тип данных похож на последний, где 64 показывает, сколько памяти хранится в символе. Тип данных float, с другой стороны, не соответствует типу данных int, потому что вместо хранения целых чисел он всегда будет хранить числа только в десятичной форме. Он используется для дробных значений или когда необходим диапазон значений.

object = обычно это str или строковые типы данных, используемые для хранения текста, числовых или нечисловых значений.

y= df['label'].values
print(np.unique(y))  

С помощью функции df().values ​​я определил переменную, которую необходимо предсказать (y), а затем напечатал уникальные элементы массива (список)

3. Преобразование текстовых значений в целые

from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
Y = labelencoder.fit_transform(y) 
print(np.unique(Y))

В первой строке кода я импортировал labelencoder, инструмент для кодирования меток со значением 0 или 1, из пакета sklearn.preprocessing (часть библиотеки sklearn).

Sklearn = – это библиотека машинного обучения, предназначенная для классификации, регрессии, кластеризации и уменьшения размеров (используется для фактического построения модели, а не для анализа данных).

Во второй строке кода я просто назвал сам labelencoder.

В третьей строке кода происходит все действие. Если вспомнить, в предыдущих блоках кода переменная y эквивалентна элементам, которые необходимо предсказать (B и M). В этой строке кода я назвал новую переменную Y (верхний регистр), чтобы сохранить свойства переменной y, но переименовал ее, указав двоичные значения 1 и 0, а не M и B.

Наконец, как и ранее, я использовал функцию np.unique() для вывода уникальных элементов массива, за исключением того, что мы печатаем переменную Y, а не y. Результатом этого было просто [0 1].

4. Определение X

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X)
X = scaler.transform(X)
print(X)   

Переменная X в этой модели будет содержать все столбцы данных, кроме идентификатора и меток. Для начала я импортировал MinMaxScaler из того же пакета, что и раньше. Это нормализует значения и приведет значения признаков в диапазон от 0 до 1.

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

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

5. Разделение данных

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 = 42)
print('The shape of training data is:', x_train.shape)
print('The shape of training data is:', x_test.shape)

Для начала я импортировал функцию train_test_split из выбора модели библиотеки sklearn. Это поможет разделить данные на два массива данных тестирования и обучения.

Следующая строка кода устанавливает параметры sklearn train_test_split. Я устанавливаю переменные поезда и теста X и Y в параметры библиотеки. Чтобы пройти часть кода train_test_split(), первая часть X и Y является параметром используемого набора данных, размер теста установлен на значение по умолчанию 0,25 тестовых данных, а random_state = 42 — это выбор случайных комбинаций. данных обучения и тестирования.

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

6. Создание фактической модели

import tensorflow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout
model = Sequential ()
model.add(Dense(128, input_dim=30,activation= 'relu'))
model.add(Dropout(0.5))
model.add(Dense(64,activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(1))model.add(Activation('sigmoid'))

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

Сначала я импортировал библиотеку tensorflow, а затем импортировал Sequential с тремя подслоями (плотный, активация и отсев). Последовательные модели используются, когда у нас есть только один вход и выход для каждого набора слоев.

После импорта библиотек мы начнем создавать слои. Как видно из 5-й, 7-й и 9-й строк кода, существует три плотных слоя. Следуя строке кода model.add(Dense()), все, что я сделал, это создал и определил эти плотные слои. Первый набор чисел, следующий за «плотным», относится к количеству скрытых слоев (например, 126, 64, 1), а функция input_dim в основном дает количество измерений в объекте (например, 30). Чтобы быстро дать определение функциям активации (например, активация = relu, Activation(‘sigmoid’):

Функции активации = определяет вывод ввода/набора вводов

Функция активации Relu = Непосредственно выводит все положительные входные данные, но выводит все отрицательные входные данные как 0 или значение, близкое к 0.

Функция активации сигмоида = определяет, какие значения (входные) будут переданы в качестве выходных, а какие нет.

В созданной модели мы использовали две наиболее распространенные функции активации: relu и sigmoid. В строках 6 и 8 кода у нас есть то, что называется выпадающим слоем. Этот слой случайным образом дает входным данным свойство 0, чтобы предотвратить переоснащение модели. Dropout(0.5), по сути, означает, что 50% входных данных будут установлены на ноль.

7. Компиляция и обобщение модели

model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.summary()
Model: Sequential 
history= model.fit(x_train,y_train,verbose = 1,epochs = 100, batch_size = 64, validation_data = (x_train,y_train))

В этом разделе кода я выполнил и обобщил всю модель. Функция model.compile по существу определяет функции потерь, оптимизаторы и метрики, которые мы видим в скобках. Утверждение loss=binary_crossentropy в основном переводится как сравнение вычисленных результатов истинных меток с предсказанными метками. Optimizer = adam — это метод оптимизации для градиентного спуска при работе с большими наборами данных или несколькими параметрами. Последняя часть, говорящая «метрики = точность», вычисляет, как часто сделанный прогноз модели будет совпадать с меткой.

Переходя ко второй строке кода, model.summary() возвращает сводную информацию о модели с отчетом о слоях и их порядке. Модель: последовательная просто указывает, какая модель использовалась для классификации рака молочной железы.

В последнем разделе кода, history = model.fit(), мы смотрим на историю модели, обращаясь к данным, на которых она обучалась, эпохам и тестовым данным. Все, что видно в этой строке кода, включая данные обучения и тестирования переменных x и y, подробный (показывает индикатор выполнения данных), эпохи (сколько количество прогонов данных через модель), размер пакета(количество обучающих примеров, используемых в одну эпоху) и проверочные данные используются для прогнозирования точности модели.

8. Визуализация обучения и точности проверки

loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1,len(loss)+1)
plt.plot(epochs,loss,'y', label= 'Training loss')
plt.plot(epochs,val_loss, 'r', label= 'Validation loss')
plt.title('Training and Validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
acc = history.history['accuracy']

val_acc = history.history['val_accuracy']
plt.plot(epochs,acc,'y',label = 'Training acc')
plt.plot(epochs,val_acc,'r', label = 'Validation acc')
plt.title('Training and Validation loss')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show(

В этой части кода я создал графики для визуализации результатов данных. Первые две строки кода аналогичны последнему разделу, в котором они вызывают функцию истории для записей показателей обучения для каждой эпохи. После этого, с каждой строкой, начинающейся с plt, я изобразил все потери в каждую эпоху и создал метки на графике. Это было сделано в обоих разделах кода для создания двух разных графиков: один с потерями (ось Y) и эпохами (ось X), а другой с точностью (ось Y) и эпохами (ось X).

9. Прогнозирование и анализ точности тестов

y_pred = model.predict(x_test)
y_pred = (y_pred > 0.5)
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_pred)
sns.heatmap(cm, annot = True)

В последнем разделе кода мы можем увидеть результаты модели классификации.

В первой и второй строках будут происходить все действия, потому что они предсказывают выходные данные в каждой точке данных. y_pred > 0,5 просто означает, что пороговое значение вероятности 1 больше, чем вероятность нуля.

Threshold = определяет, включен или выключен вывод входа (0 или 1)

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

Матрица путаницы – таблица, которая используется для демонстрации эффективности модели классификации.

Четвертая строка кода просто устанавливает переменную cm в матрицу путаницы с y_pred (содержащей предсказанные метки) и y_true (правильные целевые значения).

Наконец, в пятой строке кода данные преобразуются в матрицу с цветовой кодировкой. Annot = true просто означает, что если данные верны, добавьте их в каждую ячейку, а cm — для переменной из четвертой строки кода (матрица путаницы).

Заключение

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

Ресурсы