Каковы настоящие симптомы рака легких? Давайте ответим на него в этой статье
Фон
Рак легких — это тип рака, который начинается в легких. Ваши легкие — это два губчатых органа в груди, которые поглощают кислород при вдохе и выделяют углекислый газ при выдохе.
Рак легких является ведущей причиной смертности от рака во всем мире.
Рак легких обычно не вызывает признаков и симптомов на самых ранних стадиях. Признаки и симптомы рака легких обычно проявляются на поздних стадиях заболевания.
Признаки и симптомы рака легких могут включать:
- Новый кашель, который не проходит
- Кашель кровью, даже небольшим количеством
- Одышка
- Боль в груди
- аллергия
- хрипы
- Похудение без усилий
- Боль в костях
- Головная боль
Сопутствующие работы
Я прочитал несколько статей, которые действительно помогли мне понять, что на самом деле вызвало рак легких, и попытаться сопоставить это с моими наборами данных.
Имея обширные знания о симптомах рака легких, я могу увидеть корреляцию и наиболее полезные функции данных.
https://www.mayoclinic.org/diseases-conditions/lung-cancer/symptoms-causes/syc-20374620
Наборы данных и функции
- Пол: M (мужской), F (женский)
- Возраст: Возраст пациента
- Курение: ДА=2 , НЕТ=1.
- Желтые пальцы: ДА=2, НЕТ=1.
- Тревога: ДА=2, НЕТ=1.
- Peer_pressure: YES=2 , NO=1.
- Хроническое заболевание: ДА=2, НЕТ=1.
- Усталость: ДА=2, НЕТ=1.
- Аллергия: ДА=2 , НЕТ=1.
- Свистящее дыхание: ДА=2, НЕТ=1.
- Алкоголь: ДА=2, НЕТ=1.
- Кашель: ДА=2, НЕТ=1.
- Одышка: ДА=2, НЕТ=1.
- Затрудненное глотание: ДА=2, НЕТ=1.
- Боль в груди: ДА=2, НЕТ=1.
- Рак легких: ДА, НЕТ.
Так много функций, и, скорее всего, они тесно связаны друг с другом, собираемся ли мы использовать все функции? неа. давайте сначала сделаем предварительную обработку данных.
Предварительная обработка данных
Нам действительно не нужно много менять, потому что данные уже не нулевые или не-NaN данные.
Что нам нужно сделать, так это изменить формат всех категориальных данных на 0 и 1, например
dataset["GENDER"] = dataset["GENDER"].apply(lambda x: '1' if x == "M" else '0') dataset["GENDER"] = dataset["GENDER"].astype(int) dataset["LUNG_CANCER"] = dataset["LUNG_CANCER"].apply(lambda x: '1' if x == "YES" else '0') dataset["LUNG_CANCER"] = dataset["LUNG_CANCER"].astype(int)
и результат будет таким
ЭДА
Нам нужно понимать данные, чтобы иметь возможность делать выбор функций.
На этом этапе давайте узнаем информацию об этой паре.
- Корреляция
- Распределение данных
Корреляция
Мы знаем, что из приведенного выше графика корреляции
- Курение имеет низкую корреляцию со всеми переменными, влияющими на рак легких, а также не коррелирует с раком легких.
- Желтые пальцы и беспокойство имеют высокую корреляцию, которая составляет 57%, и оба имеют достойную корреляцию с раком легких.
- Затрудненное глотание и беспокойство имеют высокую корреляцию с 49% и каким-то образом хорошо коррелируют с раком легких.
- Одышка и усталость имеют высокую корреляцию с 44% и имеют достойную корреляцию с раком легких.
- Аллергия и употребление алкоголя имеют высокую корреляцию с 34% и самую высокую корреляцию с раком легких, что указывает на то, что это важный фактор рака легких.
- Употребление алкоголя и свистящее дыхание также имеют высокую корреляцию с 37% и высокую корреляцию с раком легких, что также указывает на фактор рака легких.
- Боль в груди и употребление алкоголя также имеют высокую корреляцию с 33%, а также сильно коррелируют с раком легких, что также может указывать на фактор рака легких.
Из приведенных выше пунктов мы это знаем.
- Употребление алкоголя и свистящее дыхание могут быть Х-фактором
- Употребление алкоголя и аллергия могут быть Х-фактором
- Боль в груди и употребление алкоголя также могут быть Х-фактором.
- Затрудненное глотание и тревога также могут быть Х-фактором.
Особенности, которые я возьму после рассмотрения корреляции, вероятно,
- Употребление алкоголя
- хрипы
- аллергия
- Боль в груди
Распределение данных
Распределение данных по возрасту довольно нормальное, диапазон находится между возрастными точками 52–72 лет.
Это означает, что люди в возрасте от 52 до 72 лет, скорее всего, больны раком легких.
Результат ЭДА
Мы будем использовать эти функции как независимые переменные, чтобы понять и предсказать, кто заболевает раком легких.
- Употребление алкоголя
- хрипы
- аллергия
- Боль в груди
- Возраст
- Рак легких (как ярлык)
Методы
Дисбалансный подход к данным
Мы видим, что LUNG_CANCER
people составляет 270 человек по сравнению с не-LUNG_CANCER
people около 39 человек.
Из-за дисбаланса данных нам нужно сделать передискретизацию.
Почему?
Потому что, если данные о дисбалансе произошли, модель будет иметь смещение, потому что данные, как правило, показывают больше данных «LUNG_CANCER», которые нужно обучить.
Это означает, что он с большей вероятностью будет предсказывать будущие данные в метке большинства.
Мы будем использовать SMOTE для обработки этих данных дисбаланса.
from imblearn.over_sampling import SMOTE sm = SMOTE(random_state = 120) x_sm, y_sm = sm.fit_resample(dataset.drop("LUNG_CANCER", axis=1), dataset["LUNG_CANCER"]) dataset_sm = pd.concat([x_sm, y_sm], axis=1) dataset_sm
Теперь наши данные сбалансированы.
Продолжим моделирование.
Подход к моделированию
Исходя из этих данных, приведенных выше, я буду использовать алгоритм классификации «Дерево решений».
Почему ?
- Данные представляют собой нелинейные наборы данных
- Данные в основном представляют собой логическое значение, что означает двоичные данные.
Выбор атрибутов
Поскольку мы проводим обучение модели с использованием классификатора «дерева решений», нам нужно знать, какие функции мы начнем использовать для разделения.
Из приведенной выше модели мы используем «ИНДЕКС Джини» в качестве критерия.
classifier = DecisionTreeClassifier(criterion="gini", max_depth=3)
Подход к масштабированию функций
Функции AGE
имеют широкий диапазон данных, которые на самом деле не имеют такого же масштаба, как другие функции.
Нам нужно будет стандартизировать шкалу, используя подход StandardScaler
. Это изменит значение на основе среднего значения и стандартного отклонения.
Полученные результаты
Результат несколько положительный, потому что модель способна прогнозировать с более чем приличной производительностью.
Я отслеживаю пару показателей, которые могли бы поддержать решение.
- Отзывать
- Оценка F1
- Матрица путаницы
classifier = DecisionTreeClassifier(criterion="gini", max_depth=3) classifier.fit(X_train, y_train) y_pred = classifier.predict(X_test) recall = metrics.recall_score(y_test, y_pred) f1_score = metrics.f1_score(y_test, y_pred) confusion_matrix = metrics.confusion_matrix(y_test, y_pred) /** Output Recall: 0.6521739130434783 F1 Score: 0.75 Confusion Metrics: [[58 4] [16 30]] */
Отзывать
Мы получаем оценку отзыва 0.65
, что вполне нормально, но может увеличить истинное положительное значение.
Оценка F1
Оценка f1 находится на 0.75
, что больше, чем «ОК», она может прогнозировать с несколько высоким баллом.
Матрица путаницы
Это означает, что у нас есть 16 ложноотрицательных результатов, которые не смогли предсказать, что у 16 человек есть рак легких, хотя у человека он есть.
А также мы ошибочно предсказываем, что у 4 человек будет РАК ЛЕГКИХ.
Заключение
Мы также знаем, что курение не связано с раком легких, оно чаще встречается у алкоголиков и других симптомов, таких как боль в груди и хрипы.
Скорее всего, это заболевание возникло в пожилом возрасте от 52 до 72 лет.
Мы должны быть уверены, что предсказываем и выдвигаем первую гипотезу о болезни пациентов, проверяя сначала симптомы, а не привычки пациентов.
И мы уже знаем некоторую существующую закономерность, и было бы проще, если бы критерии пациентов соответствовали нашему анализу.
Кредиты
Pacmann.ai научил меня многому, благодаря чему я смог создать этот отчет и поделиться им со всеми вами.
Проекты
Исходный код можно посмотреть здесь