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

1. Набор данных Kaggle

Эти данные помогут определить, есть ли у кого-либо заболевание коронавирусом или нет, на основе некоторых заранее определенных стандартных симптомов. Эти симптомы основаны на рекомендациях Всемирной организации здравоохранения (ВОЗ) who.int и Министерства здравоохранения и благосостояния семьи Индии.



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

  1. Симптомы: по данным ВОЗ, 5 основных симптомов COVID-19: лихорадка, усталость, затрудненное дыхание, сухой кашель и боль в горле.
  2. Испытывайте любые другие симптомы: боли, заложенность носа, насморк, диарею и другие.
  3. Пол: есть 3 пола (мужской, женский, трансгендер)
  4. Классификация возрастной группы для каждого человека на основе стандарта ВОЗ для возрастных групп
  5. Контактировал ли человек с другим пациентом с COVID-19?
  6. Уровень серьезности, Нет, Легкая, Умеренная, Тяжелая
  7. Страна: Список стран, которые посетил человек (включая Китай, Францию, Германию, Иран, Италию, Другое, Другое-EUR, Республику Корея, Испанию и ОАЭ.

2. предварительная обработка данных

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

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

# df is the data frame read the csv file.
country_id = {"Country":     {"China": 0, "UAE": 1, 'Italy':2,'Spain':3,'Iran':4,'Republic of Korean':5,
                              'France':6,'Germany':7,'Other-EUR':8,'Other':9}}
df = df.replace(country_id)

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

df['Age'] = df['Age_0-9']*0+df['Age_10-19']*1+df['Age_20-24']*2+df['Age_25-59']*3+df['Age_60+']*4

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

3. Наивный Байес

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

где X=X1, X2, .., Xn — вектор признаков, а Y — класс.

Согласно теореме Байеса, где A и B — события, а P(B) не равно нулю, условную вероятность можно рассчитать по следующей формуле.

Эта формула используется для байесовского вывода, где можно определитьвероятность гипотезы. С точки зрения антецедентов и последствий, если А является следствием, то В является потенциальной переменной, которая приводит к А. В задаче классификации Y представляет класс, а X — признак. Мы можем узнать, что предсказание Y основано на наблюдении за X.

Если задано X с n измерениями и Y принадлежит {c1,c2,...,ck}, множеству всех возможных классов,

поскольку каждая функция в векторе X независима, при этом

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

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

4. Наивный байесовский классификатор с Numpy и Pandas

Во-первых, мы должны разделить данные на обучающие и тестовые наборы. Как и большинство людей, мы делим 80% данных на обучающий набор, а остальные — на тестовый.

np.random.seed(1)
train=df.sample(frac=0.8,random_state=1) 
test=df.drop(train.index)

Затем мы начали с вычисления априорной вероятности P(Y=ck).

prior = (train.groupby('Severity').size()).div(len(train)) 
print(prior)

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

likelihood = {}
for x in train.columns[:-1]:
  likelihood[x] = (train.groupby(['Severity',x]).size()).div(len(train)).div(prior)

В словарном правдоподобии мы сохранили апостериорные вероятности необходимого наивного байесовского классификатора для нашей задачи — проверки covid-19.

Чтобы предсказать, есть ли у кого-то covid-19 или нет, нам нужно всего лишь ввести вектор признаков всех видов симптомов, опыта и личной информации. Затем модель может сказать нам, заразился ли он covid-19 и насколько серьезна его инфекция. Весь код написан на Colab.

Однако результат тестирования модели не так хорош, как мы думали:

Кстати, нам не нужно каждый раз реализовывать байесовский классификатор только с Pandas или Numpy. Мы можем напрямую импортировать правильный классификатор из Sklearn следующим образом:

from sklearn.naive_bayes import GaussianNB,CategoricalNB
gnb = CategoricalNB()
y_pred = gnb.fit(x_train, y_train).predict(x_test)

В этой статье мы кодировали с помощью Numpy и Pandas, чтобы сделать процесс немного более прозрачным и интуитивно понятным. Если вы не знакомы с моделью классификации Байеса, настоятельно рекомендуется Sklearn, который более эффективен.

5. Оценка

До сих пор мы обучили наивный байесовский классификатор для проверки инфекции covid-19 на основе данного набора данных из Kaggle. К сожалению, его предсказание тестового набора не лучше, чем выстрел в темноте, который также может достигать около 1/4 Acc для 4 целей в пространстве Y.

Итак, что случилось?

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

Вектор признаков для нашей проверки covid-19 состоит из основных симптомов и других переживаний, которые не полностью независимы друг от друга. Мы можем представить, что если у кого-то лихорадка, этот человек также легко устает. Если у кого-то сейчас заложен нос, в следующую минуту у него может появиться насморк. Основные симптомы часто сопровождаются друг другом, независимо от того, какая у вас инфекция.

С другой стороны, не все перечисленные признаки являются значимыми для классификации. Возможно, они сыграли свою роль, чтобы показать ситуацию пациента, но не были достаточно научными или подробными. Мы знаем, что и 37,9 °C, и 39,9 °C — несомненный признак лихорадки. Кто-то с 37,9°C может тусоваться, а другой с 39,9°C должен сильно страдать от лихорадки, что в приведенных данных не совсем понятно. Количественное измерение признаков может очень помочь. Вместо сообщения о том, есть ли лихорадка, мы могли бы использовать температуру, которая будет более точным описанием симптомов. То же самое для других симптомов, например. кашель постоянно или время от времени. нам нужен правильный масштаб, чтобы определить функции.

Если бы мы могли внести соответствующие коррективы в эти два аспекта, наивный байесовский классификатор показал бы свою многообещающую эффективность при проверке инфекции Covid-19.

Наконец, советы не имеют отношения к нашей теме, если вы плохо себя чувствуете и какие-то симптомы появились в течение нескольких дней, тесты на антитела могут сказать вам, заражены ли вы вирусом. Даже самый известный врач не может сказать, есть ли инфекция covid-19, только по вашему устному описанию. Собственно, это третья причина, по которой обученная модель не работает😅.

6. Ссылки

Риш, Ирина. «Эмпирическое исследование наивного байесовского классификатора. Семинар IJCAI 2001 по эмпирическим методам искусственного интеллекта. Том. 3. №22. 2001.»