В 2020 году у 2,3 миллиона женщин был диагностирован рак молочной железы.

В 2020 г. во всем мире было зарегистрировано 685 000 смертей от рака молочной железы.

К концу 2020 года насчитывалось 7,8 миллионаженщин, у которых за последние 5 лет был диагностирован рак молочной железы.

Он стал самым распространенным раком в мире.

Это безумие.

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

Доктор Анита Борхес из Индийского онкологического общества и доктор Лакшми Кришнан из Niramai Health Analytix говорят: «Обследование населения с помощью методов раннего выявления и повышение осведомленности о раке молочной железы могут помочь справиться с болезнью и улучшить показатели выживаемости, сократив количество лечения. расходы."

Итак… С чего начать?

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

Вот шаги:

1. Сбор + импорт данных:

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

Для этого проекта у меня были данные, которые уже были собраны. Я использовал рак молочной железы набор данных из машинного обучения UCI, который был доступен на Kaggle.

2. Очистка + исследовательский анализ данных:

Приступая к написанию кода, я импортировал библиотеки/пакеты, которые мне нужны, чтобы мне было проще писать код:

#import library
импортировать numpy как np
импортировать pandas как pd
импортировать matplotlib.pyplot как plt
импортировать seaborn как sns

ПОЧЕМУ ЭТИ БИБЛИОТЕКИ?

Numpy важен, потому что в этом проекте я использую Python. Библиотека представляет собой библиотеку Python и имеет множество массивов и математических функций. Это то, что я буду использовать в проекте.

Pandas важен, потому что он помогает мне манипулировать данными и анализировать их.

Matplotlin.pyplot важен, потому что это библиотека построения графиков для языка программирования Python.

Seaborn важен, потому что это библиотека визуализации данных, построенная поверх matplotlib и тесно интегрированная со структурами данных pandas в Python.

ИМПОРТ ДАННЫХ В ПРОГРАММУ

из файлов импорта google.colab

загружено = files.upload()

df=pd.read_csv('datafinal.csv')

df.head(7)

Эта программа позволяет загрузить файл с именем «datafinal.csv». Я скачал это на свой рабочий стол.

df.head — это фрейм данных. Печатает первые 7 строк данных.

ИЗУЧЕНИЕ ДАННЫХ

Изучение данных помогает сформировать общую картину данных, с которыми ведется работа.

СЧЕТ СТРОК + СТОЛБЦЫ ДАННЫХ

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

df.shape

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

ОЧИСТКА ДАННЫХ

Подсчет количества пустых значений в каждом столбце

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

df.isna().sum()

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

Столбец с именем «Безымянный: 32» — это столбец, в котором нет данных. Он имеет 569 пустых значений. Это ненужные данные, которые могут сделать программу более подверженной ошибкам. Это также может привести к ошибкам в выводах. В приведенном ниже коде показано, как я удалил столбец со всеми отсутствующими значениями.

df = df.dropna(axis=1)

Функция Dropna() возвращает новый индекс без значений NA/NaN. Axis=1 говорит о том, что это пустые значения для столбцов.

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

df.shape

Затем, чтобы подсчитать количество злокачественных (M) или доброкачественных (B) клеток, я сделал:

df[‘диагноз’].value_counts().

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

3. Визуализация данных:

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

Я визуализирую количество злокачественных и доброкачественных случаев с различными факторами с помощью этого кода:

sns.countplot(df[‘диагноз’], label=’count’)

sns.countplot взят из библиотеки Seaborn. Он подсчитывает количество наблюдений в категории для категориальной переменной и отображает результаты в виде гистограммы. Вместо численного отображения того, что имеется 212 злокачественных значений и 357 начальных значений, он отображает это на графике.

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

df.dtypes

Фрагмент того, что было возвращено. Единственными данными, которые не были числовыми, был диагноз.

Диагноз не является числовым (поскольку это M и B), поэтому чтобы сделать числовое значение…

из sklearn.preprocessing импортировать LabelEncoder

labelencoder_Y = LabelEncoder ()

df.iloc[:,1]= labelencoder_Y.fit_transform(df.iloc[:,1].values)

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

Я изменил значения в столбце диагностика с M и B на 1 и 0 соответственно, а затем распечатал результаты.

ПАРА УЧАСТОК

Затем я создал парный сюжет.

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

sns.pairplot(df.iloc[:,1:5], hue=’diagnosis’)

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

Это был вывод:

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

Поскольку это сравнивалось для 5 столбцов данных, есть новый набор данных. И чтобы распечатать этот новый набор данных, я сделал:

df.head(5)

Чтобы увидеть корреляцию между столбцами, я сделал:

df.iloc[:,1:12].corr()

Корреляция 1 означает, что существует почти идеальная корреляция. Примером этого является диагностика. Корреляция 0 означает, что корреляции нет. Если значение ниже 0, это означает, что существует обратная корреляция. Например, мы можем видеть, что radius_mean больше влияет на диагноз пациента, чем smoothness_mean. Другой пример — отрицательная корреляция fractal_dimension_mean с диагнозом. Radius_mean имеет положительную корреляцию.

Это все цифры, а если выразить словами:

sns.heatmap(df.iloc[:,1:12].corr(), annot=True, fmt=’.0%’)

Здесь sns.heatmap создает визуал. annot=true, аннотирует каждую ячейку числовым значением, используя целочисленное форматирование. fmt = ‘0%’ преобразует числовые значения корреляции в проценты корреляции.

Намного легче понять, не так ли?

Параметр figsize регулирует размер тепловой карты.

plt.figure(figsize=(10,10))

10,10 делает его больше.

4. Подготовка данных перед обучением модели

РАЗДЕЛЕНИЕ ДАННЫХ

Сначала я разделил наборы данных на независимые (x) и зависимые (y) наборы данных.

x=df.iloc [:, 2:31].values

y=df.iloc[:,1].values

тип(df)

Здесь x — это переменная, которая хранит значения из индекса столбца 2 в столбец с индексом 31. Она независима, потому что x — это разные функции, которые определяют, есть ли у кого-то рак. Y - это столбец в первом индексе, который является злокачественным или доброкачественным (1 или 0).

СЕЙЧАС, я отказался от обучения и тестирования. Обучающий набор — это набор, на котором учится моя модель. Эти данные вводятся в модель, чтобы она могла изучить отношения между входными и выходными данными. Тестовый набор используется для проверки точности вашей модели после обучения. Модель никогда не увидит данные тестирования во время обучения.

Я разделил 75% на тестирование и 25% на обучение.

из sklearn.model_selection импорта train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0,25, random_state=0)

train_test_split — это функция выбора модели Sklearn для разделения массивов данных на два подмножества: для данных обучения и для данных тестирования. С этой функцией мне не нужно делить набор данных вручную. По умолчанию Sklearn train_test_split создаст случайные разделы для двух подмножеств.

ФУНКЦИОНАЛЬНОЕ МАСШТАБИРОВАНИЕ

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

Но зачем нам нормировать диапазон?

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

из sklearn.preprocessing import StandardScaler

sc=StandardScaler()

x_train=sc.fit_transform (x_train)

x_test=sc.fit_transform (x_test)

5. Обучение и оценка модели:

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

Я выбираю 3 разных алгоритма:

  • случайный лесной классификатор

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

  • классификатор дерева решений

Он идет от наблюдений за элементом (представленных в узлах/ветвях) к выводам о целевом значении элемента (представленным в листьях).

  • логистическая регрессия

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

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

Я создал функцию «def models (x_train, y_train):», чтобы включить ее для всех моделей.

#логистическая регрессия

из sklearn.linear_model импортировать логистическую регрессию

log=LogisticRegression(random_state=0)

log.fit(x_train, y_train)

#дерево решений

из sklearn.tree импортировать DecisionTreeClassifier

tree= DecisionTreeClassifier(criterion=’entropy’, random_state=0)

tree.fit(x_train, y_train)

#классификатор случайного леса

из sklearn.ensemble импортировать RandomForestClassifier

forest=RandomForestClassifier (n_estimators=10, критерий = ‘энтропия’, random_state=0)

forest.fit(x_train, y_train)

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

Последняя строка помогает обучить модель. В ML есть функция подгонки, которая используется для обучения модели на примерах данных. Функция Fit регулирует веса в соответствии со значениями данных, чтобы можно было достичь большей точности.

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

print(‘[0]Точность обучения логистической регрессии:’ , log.score(x_train, y_train))

print(‘[1]Точность обучения классификатора случайного леса:’ , forest.score(x_train, y_train))

print(‘[2]Точность обучения классификатора дерева решений:’ , tree.score(x_train, y_train))

возврат журнала, дерева, леса

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

model=models(x_train, y_train)

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

МАТРИЦА СМЕШАНИЙ

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

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

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

из sklearn.metrics импортировать путаницу_матрицу
для i в диапазоне (длина (модель)):
cm = путаница_матрица (Y_test, модель [i].predict (X_test))

TN = см[0][0]
TP = см[1][1]
FN = см[1][0]
FP = см[0][1]

print(cm)
print('Model[{}] Testing Accuracy = "{}!"'.format(i, (TP + TN) / (TP + TN + FN + FP)))
print()# Напечатать новую строку

Модель 0, классификатор логистической регрессии, достигла точности около 95 % на данных тестирования.

Модель 1, классификатор дерева решений, достигла точности около 94 % на данных тестирования.

Модель 2, наш классификатор случайного леса, достигла точности около 96,5 % на наших тестовых данных.

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

Это делается через:

# показать другой способ отображения показателей моделей

от sklearn.metrics импортаclassification_report

из sklearn.metrics импорта precision_score

для i в диапазоне ( len(model)):

print («Модель», i)

print(classification_report(y_test, model[i].predict(x_test)))

print(accuracy_score(y_test, model[i].predict(x_test)))

печать()

Судя по точности и метрикам, приведенным выше, модель, которая показала наилучшие результаты на тестовых данных, — это классификатор случайного леса. Его показатель точности составил около 96,5%.

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

Кредиты для этого проекта достались: Computer Science и их видео на YouTubeи статья!

Если эта статья помогла вам понять, аплодируйте ей, делитесь ею и связывайтесь со мной в Linkedin и следите за мной в Twitter!!

Если у вас есть интересные статьи/вещи, связанные с ИИ, напишите в комментариях или свяжитесь со мной, и давайте поболтаем!!!

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