Я помню, как сидел в моем 8-м классе английского языка, когда мы все ходили в один прекрасный день, называя члена семьи, за которого мы были благодарны. Я помню мальчика, который робко поднял руку и поделился, что он благодарен своей маме, которая боролась с раком груди.
После того, как он поделился историей своей матери, многие другие люди назвали имена своих матерей, тетушек, бабушек и близких членов семьи, больных раком груди.
Это был потрясающий опыт. До этого я не знала, насколько распространен рак груди.
Примерно у 1 из 8 женщин в течение жизни разовьется инвазивный рак груди. И каждый год более 40 000 женщин в одних только Соединенных Штатах умирают от рака груди.
Но что еще более шокирует, так это то, что наиболее значительными факторами риска рака груди являются пол (принадлежность к женщине) и возраст (старение). Чаще всего рак груди встречается у женщин, у которых нет симптомов.
Женщины не могут предотвратить или контролировать свой риск рака груди, и часто его не диагностируют быстро из-за отсутствия симптомов и отклонений, с которыми они сталкиваются.
Используя машинное обучение, мы можем уменьшить количество женщин, у которых диагностирован рак груди, и которые умирают от него. Машинное обучение позволяет нам быстрее определять наличие опухолей, что увеличивает шансы пациента на выживание.
В этом проекте я построил модель машинного обучения, которая может классифицировать опухоль как доброкачественную, что означает, что опухоль не является вредной, или как злокачественную, тип деструктивной опухоли, которая может быстро расти и представляет серьезную угрозу для пациента.
В этом проекте я использовал три разных алгоритма классификации и сравнил их результаты. Я протестировал результаты модели логистической регрессии, классификатора дерева решений и классификатора случайного леса по классификации опухолей как доброкачественных или злокачественных.
1. Импорт библиотек и наборов данных
Первым шагом к созданию нашей модели является импорт наших библиотек и наборов данных в нашу записную книжку Google Colab.
Мы можем начать с импорта библиотек Python, которые нам понадобятся для этого проекта:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
pandas: самая популярная библиотека Python, которая используется для обработки и анализа данных. В этом проекте это в первую очередь полезно для работы с фреймами данных.
NumPy: библиотека Python, которая обеспечивает поддержку больших, многомерных массивов и матриц и имеет математические функции высокого уровня, помогающие работать с этими массивами и управлять ими.
matplotlib.pyplot и seaborn: используются для визуализации данных.
После того, как мы установили наши библиотеки, мы можем продолжить и импортировать наш набор данных с помощью pandas. Набор данных, использованный в этом проекте, можно скачать здесь! Его следует сохранить как файл CSV. При загрузке набора данных я назвал его data.csv и смог импортировать его, как показано ниже.
В последней строке этого блока будут напечатаны первые 7 строк данных, что позволит нам увидеть входные данные или функции данных в фрейме данных, сокращенные до df.
from google.colab import files uploaded = files.upload() df = pd.read_csv('data.csv') df.head(7)
Как мы видим, первая колонка называется «id», что соответствует идентификатору пациента. Во втором столбце показан диагноз пациента; «M» означает злокачественную опухоль, а буква «B», не указанная в первых 7 строках, означает доброкачественную опухоль.
Мы также можем видеть другие особенности, включая текстуру, периметр и площадь опухоли. Если мы продолжим прокрутку вправо, мы сможем увидеть все 33 функции во фрейме данных.
Обратите внимание, что первая строка в наборе данных всегда равна «0». Поэтому, когда мы печатаем первые 7 строк, будут напечатаны только строки с 0 по 6, а не строка 7.
2. Исследовательский анализ данных
После того, как мы импортировали необходимые библиотеки и наш набор данных, мы можем начать исследовательский анализ данных, который важен для избавления от несоответствий в наборе данных. Это включает в себя удаление дубликатов, исправление ошибок и работу с отсутствующими значениями.
В этой части проекта мы будем визуализировать наши данные и удалять нулевые или пустые значения.
Первым шагом в нашем исследовательском анализе данных является понимание того, что наши данные включают, а что не включают. Сначала нам нужно узнать, сколько строк и столбцов у нас есть в наборе данных, запустив df.shape. Это возвращает результат «(569, 33)». Это означает, что у нас есть 569 строк или данных от 569 пациентов и 33 столбца или 33 входных объекта для каждого пациента. Однако не все 33 из этих функций могут быть полезными.
Затем мы хотим увидеть наличие нулевых значений или пустых значений в нашем фрейме данных, что мы можем сделать, запустив df.isna () .sum () в следующем блоке кода.
Когда мы запускаем этот блок, мы должны увидеть список всех функций с количеством нулевых значений в каждом столбце справа. Как видите, единственная функция с нулевыми значениями - это последний столбец «Безымянный: 32», который полностью пуст. Поэтому мы можем продолжить и отбросить этот столбец, запустив df = df.dropna (axis = 1).
Если мы запустим df.shape в следующем блоке кода, мы должны увидеть, что есть только 32 столбца или 32 функции после того, как мы удалили одну из функций. Однако осталось 569 строк, поскольку количество пациентов, у которых мы собрали данные, не изменилось.
После того, как мы отказались от этой функции, мы сможем диагностировать злокачественные (M) или доброкачественные (B) опухоли, запустив df [‘Diagnosis’]. Value_counts (). Это показывает нам, что набор данных включает 357 диагнозов доброкачественных опухолей и 212 диагнозов злокачественных опухолей.
Мы также можем визуализировать эти подсчеты, создав график подсчета с помощью seaborn:
sns.countplot(df[‘diagnosis’], label=’count’)
Следующий шаг в нашем исследовательском анализе данных включает преобразование или кодирование всех данных в числовые значения. После запуска df.dtypes мы видим, что все функции являются числовыми (int или float), за исключением диагнозов, которые являются типами данных объекта. Очень важно, чтобы все данные были числовыми, чтобы алгоритмы правильно использовали данные.
Мы можем сделать это с помощью sklearn или sci-kit learn, который представляет собой библиотеку Python, которая имеет различные алгоритмы классификации, регрессии и кластеризации.
Мы можем закодировать числовые типы данных в этой функции, запустив:
from sklearn.preprocessing import LabelEncoder labelencoder_Y = LabelEncoder() df.iloc[:,1] = labelencoder_Y.fit_transform(df.iloc[:,1].values) df.iloc[:,1]
В этом случае мы используем df.iloc, потому что метки индекса нашего фрейма данных не являются числовыми. Используя df.iloc, мы можем ссылаться на числовые значения. Например, мы кодируем значения функции диагностики в числовые значения, которые являются первым столбцом в нашем фрейме данных. Следовательно, мы можем назвать его столбцом 1.
Как только мы это сделаем, мы сможем увидеть диагнозы пациентов, представленные как единицы и нули. Единицы представляют диагноз злокачественной опухоли, а нули - диагнозы доброкачественных опухолей.
После того, как мы закодировали диагнозы в числовые значения, мы можем визуализировать это с помощью парного графика, используя морской анализ.
Парный график включает информацию из первых 6 строк фрейма данных и разделяет данные на различные цвета, чтобы показать два возможных результата; оранжевый - злокачественные опухоли, синий - доброкачественные.
3. Визуализация данных
Закончив изучение набора данных и визуализацию фрейма данных, мы можем посмотреть на корреляции в наших данных.
Во-первых, мы можем найти корреляции между столбцами или функциями. Следующий код покажет нам корреляцию между первыми 12 строками данных:
df.iloc[:,1:12].corr()
В этой таблице мы можем увидеть корреляцию между одними функциями и другими. Корреляция 1 означает, что существует почти идеальная корреляция, а корреляция 0 означает, что корреляции нет. Если значение меньше 0, это означает, что имеется обратная корреляция. Например, мы можем видеть, что radius_mean больше влияет на диагноз пациента, чем smoothness_mean.
Мы также можем визуализировать эту корреляцию, создав тепловую карту:
plt.figure(figsize = (10, 10)) sns.heatmap(df.iloc[:,1:12].corr(), annot = True, fmt = '.0%')
figsize устанавливает размер тепловой карты, а вторая строка кода устанавливает, что тепловая карта будет отображать корреляции между первыми 12 строками фрейма данных. Использование annot = True показывает нам числовые значения внутри тепловой карты, а fmt = ‘.0%’ преобразует числовые значения корреляции в проценты корреляции.
4. Подготовка данных перед обучением модели
После того, как мы очистили данные и визуализировали корреляции внутри фрейма данных, нам нужно подготовить данные перед обучением модели.
Во-первых, нам нужно разделить данные на независимые наборы данных X и Y. Первый столбец - это выходные данные модели, диагноз пациента, а остальные 31 столбец - это характеристики или входные данные модели.
X = df.iloc[:,2:31].values Y = df.iloc[:,1].values
После того, как мы установили наборы данных X и Y, мы можем разделить 75% данных на данные обучения и 25% на данные тестирования.
обучающие данные просто используются для обучения модели. Мы просто передаем данные модели, чтобы она могла узнать отношения между входами и выходами.
Данные тестирования используются после обучения модели. После того, как мы закончили обучение и итерации, мы передаем тестовые данные в модель. Модель никогда не увидит данные тестирования во время обучения.
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.
Чтобы масштабировать наши данные, мы можем импортировать StandardScaler из sklearn и передать наши данные обучения и тестирования:
from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.fit_transform(X_test)
Теперь, если мы просто запустим X_train, мы увидим следующие значения:
5. Обучение и оценка модели.
В этом проекте я проверил точность трех различных алгоритмов классификации - модели логистической регрессии, классификатора дерева решений и классификатора случайного леса - и сравнил их показатели точности при классификации опухоли как доброкачественной или злокачественной.
Логистическая регрессия. Алгоритм, который используется, когда значение целевой переменной является категориальным по своей природе. Он используется, когда данные относятся к тому или иному классу, в этом случае он классифицирует опухоль как доброкачественную или злокачественную.
Классификация дерева решений: алгоритм в виде древовидной структуры, который разбивает набор данных на все меньшие и меньшие подмножества. Он состоит из узлов решений, которые имеют ветви, и конечных узлов, которые представляют классификацию или решение.
Классификация случайного леса: алгоритм, который работает путем построения множества деревьев решений во время обучения. Каждое из деревьев решений строится путем случайного сбора выборки данных.
Теперь, когда мы знаем больше о трех различных моделях, которые тестируются и сравниваются, мы можем передавать наши обучающие данные по каждой из трех моделей:
Каждая из моделей имеет аналогичную структуру. Мы можем импортировать каждый из трех алгоритмов из sklearn и установить случайное состояние равным нулю. Как в классификаторе дерева решений, так и в классификаторе случайного леса нам необходимо установить критерий = энтропия, который используется для расчета прироста информации в узлах деревьев решений.
Кроме того, random_state = 0 должен быть установлен во всех трех алгоритмах. Установка фиксированного значения random_state гарантирует, что при каждом запуске кода будет генерироваться одна и та же последовательность случайных чисел. Это помогает проверить вывод.
Затем мы можем запустить model = models (X_train, Y_train), чтобы увидеть точность всех трех моделей на данных обучения.
Как мы видим, классификатор дерева решений работал со 100% точностью, классификатор случайного леса работал с точностью около 99,5%, а модель логистической регрессии - с точностью около 99%. Хотя сейчас эти проценты могут показаться чрезвычайно высокими, они упадут при выполнении с данными тестирования, чего модели не видели раньше.
Чтобы запустить модели на основе данных тестирования, мы можем импортировать матрицу неточностей. Матрица неточностей будет запускать модели на данных тестирования и сообщать нам количество истинных положительных результатов, истинных отрицательных и ложных результатов. положительные и ложноотрицательные, которые классифицировала модель.
Как мы видим, модель 0, наш классификатор логистической регрессии, достигла точности около 95% по данным тестирования. Модель 1, наш классификатор дерева решений, достигла точности около 94% по данным тестирования, а Модель 2, наш классификатор случайного леса, достигла точности около 96,5% strong. > по нашим данным тестирования.
Мы можем сделать вывод, что Классификатор случайного леса - лучший алгоритм для этого проекта, поскольку он показал лучшие результаты на тестовых данных, хотя и уступил классификатору дерева решений на обучающих данных.
Помимо матрицы неточностей, мы также можем закодировать отчет о классификации для каждой из наших моделей, который измеряет качество прогнозов, сделанных моделями.
Хотя ни одна из моделей не работает идеально, они работают достаточно хорошо с учетом ограничений данных. Продолжая обучать модель и настраивать параметры, мы можем продолжать повышать точность прогнозов!
Если вы хотите получить более подробное руководство о том, как проводился проект, ознакомьтесь с учебником, который я использовал, и видео, которое я сделал по своему проекту!
Большое спасибо за то, что прочитали это! Если вы узнали что-то из этой статьи, поделитесь, пожалуйста! Не забудьте связаться со мной и оставить эту статью аплодисментами 👏, если она вам понравилась!