РАК - этот термин почти всегда вызывает у кого-нибудь страх. По оценкам, в Сингапуре у 1 из каждых 4-5 человек может развиться рак в течение жизни, причем рак груди занимает первое место среди женщин (источник). Хотя приятно знать, что с развитием здравоохранения рак больше не является смертным приговором для каждого пациента, но стоимость лечения непомерно высока. Фактически, стоимость лечения рака на поздней стадии колеблется от 8 до 17 тысяч долларов в месяц (источник). Решение? Нет, не страхование жизни, а… РАННЕЕ ОБНАРУЖЕНИЕ!

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

Обзор

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

Rows     :  569
Columns  :  33

Columns : 
 ['id', 'diagnosis', 'radius_mean', 'texture_mean', 'perimeter_mean', 'area_mean', 'smoothness_mean', 'compactness_mean', 'concavity_mean', 'concave points_mean', 'symmetry_mean', 'fractal_dimension_mean', 'radius_se', 'texture_se', 'perimeter_se', 'area_se', 'smoothness_se', 'compactness_se', 'concavity_se', 'concave points_se', 'symmetry_se', 'fractal_dimension_se', 'radius_worst', 'texture_worst', 'perimeter_worst', 'area_worst', 'smoothness_worst', 'compactness_worst', 'concavity_worst', 'concave points_worst', 'symmetry_worst', 'fractal_dimension_worst', 'Unnamed: 32']

Набор данных несколько несбалансирован.

B    357
M    212

Выбор функций

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

# Plot the top 10 features based on its importance
(pd.Series(model.feature_importances_, index=X.columns)
 .nlargest(10) 

Это 10 самых популярных функций в порядке убывания.

Визуальное представление распределения этих 10 признаков показывает некоторую модель «кривой колокола» для злокачественных заболеваний среди них.

Действительно ли нам нужно 10 функций или их можно еще сократить? Тепловая карта корреляции этих 10 основных функций с нашей целью («диагноз») случайно показывает, что 5 из них сильно коррелируют друг с другом. Это означает, что мы можем выбрать одного в качестве представителя и исключить остальных. Все они связаны с периметром, площадью и радиусом, что имеет смысл. (Объем не включен, поскольку набор данных относится к 2-мерной информации, в противном случае он, скорее всего, был бы среди них.) Если вам интересно, почему каждая важная функция показывает положительную корреляцию, это ожидается, поскольку все 33 столбца относятся к размеров, и мы знаем, что чем больше раковых клеток поддаются количественной оценке, тем они более развиты. Раковые клетки есть в каждом. Если количество обнаруживается, мы отмечаем, что у пациента рак.

Я соглашусь на «radius_worst», чтобы представить эти сильно коррелированные функции, и переопределил X (функции) и Y (цель).

X = df.loc[:,[‘radius_worst’,’concave points_worst’,’concave points_mean’,‘concavity_mean’,’area_se’,’concavity_worst’]]
y = df[‘diagnosis’]

Построение и сравнение моделей

Следующим шагом для построения модели является разделение набора данных для обучения и тестирования. Я принял разделение 80% -20% и использовал метод стратификации, чтобы поддерживать одинаковое соотношение доброкачественных и злокачественных заболеваний как в наборе поездов, так и в наборе тестов, поскольку набор данных несбалансирован.

Следующим шагом является применение kfolds к набору поездов для выполнения проверки поездов по 80% набору данных. Еще раз, я применяю StratifiedKFold, чтобы поддерживать распределение по каждой из моих (n_split = 5) складок. Результаты 10 распространенных алгоритмов машинного обучения обнадеживают. Есть три сильных соперника.

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

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

Логистическая регрессия является лидером при рассмотрении метрики ROC-AUC, которая показывает, насколько хорошо модель может различать два класса.

Заключение

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

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