Какова роль науки о данных в современной медицине?
Роль науки о данных в современной медицине что нужно знать?
Введение
С появлением искусственного интеллекта мы все больше полагаемся на принятие решений на основе данных, чтобы упростить жизнь профессионалов. Независимо от того, это логистика поставок или одобрение займа для клиента, данные играют ключевую роль. Использование возможностей науки о данных в медицине может дать прорывные результаты. Анализируя огромные объемы современной медицинской информации, ученые по данным могут выявить закономерности, которые могут привести к открытиям и лечению. Интеграция науки о данных в медицинскую сферу имеет потенциал революционизации сферы здравоохранения, и это не просто хорошая идея; это необходимость.
Цели обучения
В этой статье мы рассмотрим, как анализировать медицинский набор данных для создания модели, которая предсказывает, какие препараты должен принимать пациент при конкретном диагнозе. Звучит интересно, так что давайте приступим!
Эта статья была опубликована в рамках блогоатона Data Science.
- Новое исследование AI представляет SWIM-IR масштабный синтетический многоязычный набор данных для поиска с 28 миллионами обучающих пар на 33 языках.
- Исследователи из Университета Торонто раскрывают удивительное избыточность в больших наборах данных о материалах и силу информативных данных для повышения эффективности машинного обучения
- ExLlamaV2 Самая быстрая библиотека для запуска LLM
Набор данных
Мы будем загружать и использовать открытый исходный набор данных с Kaggle:
Ссылка здесь
Набор данных содержит
- Возраст и пол пациента
- Диагноз пациента
- Антибиотики, используемые для лечения пациента
- Доза антибиотиков в граммах
- Маршрут применения антибиотиков
- Частота использования антибиотиков
- Продолжительность лечения антибиотиками в днях
- Показания для применения антибиотиков
Загрузка библиотек и набора данных
Здесь мы импортируем необходимые библиотеки. Затем мы загружаем набор данных во фрейм данных и просматриваем несколько строк.
import numpy as np # линейная алгебра
import pandas as pd # обработка данных, работа с CSV-файлами (например, pd.read_csv)
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import matplotlib.pyplot as plt
import collections
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix, classification_report
df = pd.read_csv("/kaggle/input/hospital-antibiotics-usage/Hopsital Dataset.csv")
print(df.shape)
df.head()
Вывод:
Названия столбцов довольно интуитивно понятны и имеют смысл. Давайте рассмотрим несколько статистических показателей.
Основные статистические показатели
# "Давайте посмотрим на несколько статистических показателей"df.info()
Вывод:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 833 entries, 0 to 832
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Age 833 non-null object
1 Date of Data Entry 833 non-null object
2 Gender 833 non-null object
3 Diagnosis 833 non-null object
4 Name of Drug 833 non-null object
5 Dosage (gram) 833 non-null object
6 Route 833 non-null object
7 Frequency 833 non-null object
8 Duration (days) 833 non-null object
9 Indication 832 non-null object
dtypes: object(10)
memory usage: 65.2+ KB
Наблюдения:
- Каждый столбец является строковым столбцом
- Давайте преобразуем столбцы Age, Dosage(gram), Duration(days) в числовой формат.
- Давайте также преобразуем столбец Date of Data Entry в формат даты и времени.
- В столбце Indication одно значение null, во всех остальных столбцах нет нулевых значений.
Предобработка данных
Давайте очистим некоторые столбцы. На предыдущем шаге мы видели, что все столбцы являются целыми числами. Поэтому для начала мы преобразуем возраст, дозировку и продолжительность в числовые значения. Аналогично, мы преобразуем дату ввода данных в тип datetime. Вместо прямого преобразования, мы создадим новые столбцы, то есть создадим столбец Age2, который будет числовой версией столбца Age и так далее.
df['Age2'] = pd.to_numeric(df['Age'],errors='coerce')df['Dosage (gram)2'] = pd.to_numeric(df['Dosage (gram)'],errors='coerce')df['Duration (days)2'] = pd.to_numeric(df['Duration (days)'],errors='coerce')df['Date of Data Entry2'] = pd.to_datetime(df['Date of Data Entry'],errors='coerce')df.info()
Вывод:
<class 'pandas.core.frame.DataFrame'>RangeIndex: 833 entries, 0 to 832Data columns (total 14 columns): # Столбец Количество непустых значений Тип --- ------ -------------- ----- 0 Возраст 833 non-null object 1 Дата ввода данных 833 non-null object 2 Пол 833 non-null object 3 Диагноз 833 non-null object 4 Название препарата 833 non-null object 5 Дозировка (грамм) 833 non-null object 6 Маршрут 833 non-null object 7 Частота 833 non-null object 8 Продолжительность (дней) 833 non-null object 9 Показание 832 non-null object 10 Возраст2 832 non-null float64 11 Дозировка (грамм)2 831 non-null float64 12 Продолжительность (дней)2 831 non-null float64 13 Дата ввода данных2 831 non-null datetime64[ns]dtypes: datetime64[ns](1), float64(3), object(10)memory usage: 91.2+ KB
После преобразования мы видим некоторые пустые значения. Давайте посмотрим на эти данные.
df[(df['Дозировка (грамм)2'].isnull()) | (df['Продолжительность (дней)2'].isnull()) | (df['Возраст2'].isnull()) | (df['Дата ввода данных2'].isnull()) ]#import csv
Вывод:
Похоже, в наборе данных есть некоторые некорректные значения. Давайте удалим их.
Теперь мы также заменим значения нового столбца на значения в старых столбцах и удалим созданные ранее столбцы
df = df[~((df['Дозировка (грамм)2'].isnull()) | (df['Продолжительность (дней)2'].isnull()) | (df['Возраст2'].isnull()) | (df['Дата ввода данных2'].isnull())) ]df['Возраст'] = df['Возраст2'].astype('int')df['Дозировка (грамм)'] = df['Дозировка (грамм)2']df['Дата ввода данных'] = df['Дата ввода данных2']df['Продолжительность (дней)'] = df['Продолжительность (дней)2'].astype('int')df = df.drop(['Возраст2','Дозировка (грамм)2','Дата ввода данных2','Продолжительность (дней)2'],axis=1)print(df.shape)df.head()
Вывод:
Анализ некоторых статистических данных
Теперь мы посмотрим на некоторые статистические данные по всем столбцам. Мы используем функцию describe и передадим аргумент include, чтобы получить статистику по всем столбцам. Давайте рассмотрим это
df.describe(include='all')
Вывод:
Наблюдения:
- Мы видим, что возраст равен 1, а максимальное значение равно 90.
- Аналогично, рассматривая столбец Data Entry – мы знаем, что он содержит данные для 19 декабря 2019 года с 13:00 до 19:00.
- В столбце Gender имеется 2 уникальных значения.
- Дозировка имеет минимальное значение 0,02 грамма и максимальное значение 960 грамм (кажется крайне высоким).
- Продолжительность имеет значение 1 и максимальное значение 28 дней.
- Столбцы Diagnosis, Name of Drug, Route, Frequency и Indication имеют различные значения. Мы их рассмотрим.
Анализ маршрутов и частоты одной переменной
Здесь мы попробуем исследовать столбцы “Route” и “Frequency”. Мы воспользуемся функцией value_counts().
display(df['Route'].value_counts())print()df['Frequency'].value_counts()
Вывод:
RouteIV 534Oral 293IM 4Имя: count, dtype: int64FrequencyBD 430TDS 283OD 110QID 8Имя: count, dtype: int64
Наблюдения:
- Существует 3 различных маршрута лечения. Самый часто используемый маршрут лечения – IV, а наименее используемый – IM.
- Существует 4 различных частоты лечения. Наиболее часто используемая частота лечения – BD, а наименее используемая – QID.
Анализ диагноза в одной переменной
Здесь мы рассмотрим столбец “Diagnosis”. Мы воспользуемся функцией value_counts().
df['Diagnosis'].value_counts()
Вывод:
Запустив вышеуказанный код, мы видим, что имеется 263 различных значения. Также мы видим, что у каждого пациента может быть несколько диагнозов (разделенных запятыми). Итак, давайте попробуем построить облако тегов, чтобы лучше понять этот столбец. Мы попытаемся удалить стоп-слова из облака тегов, чтобы отфильтровать ненужный шум.
text = " ".join(diagnosis for diagnosis in adf.Diagnosis)print ("В комбинации всех диагнозов {} слов.".format(len(text)))stopwords = set(STOPWORDS)# Создание изображения облака теговwordcloud = WordCloud(stopwords=stopwords, background_color="white").generate(text)# Отображение сгенерированного изображения:# способ с помощью matplotlib:plt.imshow(wordcloud, interpolation='bilinear')plt.axis("off")plt.show()
Вывод:
В комбинации всех диагнозов 35359 слов.
Наблюдения:
- В комбинации всех диагнозов насчитывается 35359 слов. Большинство из них будут повторяющимися.
- Просмотрев облако тегов, мы видим, что наиболее частыми диагнозами являются инфекция легких и легочная форма туберкулеза.
- Мы также видим другие состояния, такие как диабет, миелома и т. д.
Давайте посмотрим на топ-10 и наименее распространенные 10 слов/фраз. Мы воспользуемся функцией Counter в библиотеке collections.
A = collections.Counter([i.strip().lower() for i in text.split(',') if (i.strip().lower()) not in stopwords ])print('Топ-10 слов/фраз')display(A.most_common(10))print('\nНаименее распространенные 10 слов/фраз')display(A.most_common()[-11:-1])
Вывод:
Топ 10 слов/фраз[('col', 77), ('chest infection', 68), ('ihd', 55), ('copd', 40), ('hypertension', 38), ('ccf', 36), ('type 2 dm', 32), ("koch's lung", 28), ('ckd', 28), ('uraemic gastritis', 18)]Нижние 10 слов/фраз[('poorly controlled dm complicated uti', 1), ('poorly controlled dm septic shock', 1), ('hypertension hepatitis', 1), ('uti hepatitis', 1), ('uti uti', 1), ('cff ppt by chest infection early col', 1), ('operated spinal cord', 1), ('hematoma and paraplegia he', 1), ('rvi with col glandular fever', 1), ('fever with confusion ccf', 1)]
Наблюдения:
- Среди топ 10 слов/фраз, col и chest infection встречаются чаще всего. У 77 пациентов диагностирован col, а у 68 chest infection.
- Среди нижних 10 слов/фраз мы видим, что каждое из них встречается только один раз.
Одномерный анализ столбца Indication
Здесь мы рассмотрим столбец Indication. Мы воспользуемся функцией value_counts().
display(df['Indication'].value_counts())print()df['Indication'].value_counts(1)
Вывод:
Indicationchest infection 92col 32uti 30type 2 dm 25prevention of infection 22 ..pad(lt u.l) 1old stroke 1fainting attack 1cheat infection 1centepede bite 1Name: count, Length: 220, dtype: int64Indicationchest infection 0.110843col 0.038554uti 0.036145type 2 dm 0.030120prevention of infection 0.026506 ... pad(lt u.l) 0.001205old stroke 0.001205fainting attack 0.001205cheat infection 0.001205centepede bite 0.001205Name: proportion, Length: 220, dtype: float64
Мы видим, что в столбце Indication есть 220 значений. Кажется, также присутствуют опечатки – chest против cheat. Мы можем исправить это. Для текущего упражнения рассмотрим верхние 25% индикаций.
top_indications = df['Indication'].value_counts(1).reset_index()top_indications['cum_proportion'] = top_indications['proportion'].cumsum()top_indications = top_indications[top_indications['cum_proportion']<0.25]top_indications
Вывод:
Мы будем использовать этот фрейм данных в последующем двумерном анализе и моделировании.
Одномерный анализ столбца Name of Drug
Здесь мы рассмотрим этот столбец. Мы воспользуемся функцией value_counts().
display(df['Name of Drug'].nunique())display(df['Name of Drug'].value_counts())
Вывод:
55Name of Drugceftriaxone 221co-amoxiclav 162metronidazole 59cefixime 58septrin 37clarithromycin 32levofloxacin 31amoxicillin+flucloxacillin 29ceftazidime 24cefepime 14cefipime 13clindamycin 12rifaximin 10amikacin 9cefoperazone 9coamoxiclav 9meropenem 8ciprofloxacin 7gentamicin 5pen v 5rifampicin 5azithromycin 5cifran 4mirox 4amoxicillin 4streptomycin 4ceftazidine 4clarthromycin 4amoxicillin+flucoxacillin 3cefoparazone+sulbactam 3linezolid 3ofloxacin 3norfloxacin 3imipenem 2flucloxacillin 2ceftiaxone 2cefaziclime 2ceftriaxone+sulbactam 2cefexime 2pipercillin+tazobactam 1amoxicillin+flucloxiacillin 1pentoxifylline 1menopem 1levefloxacin 1pentoxyfylline 1doxycyclin 1amoxicillin+flucoxiacillin 1vancomycin 1cefteiaxone 1dazolic 1amoxicillin+flucloaxcin 1amoxiclav 1doxycycline 1cefoperazone+sulbactam 1nitrofurantoin 1
Наблюдения:
- Есть 55 уникальных препаратов.
- Опять же, мы видим ошибки в написании – ceftriaxone vs ceftiaxone. Уникальный счет препаратов может быть ниже.
Рассмотрим здесь топ-5 препаратов. Мы создадим столбец cum_proportion для хранения накопительной доли, которую каждый препарат вносит.
top_drugs = (df['Name of Drug'].value_counts(1).reset_index())top_drugs['cum_proportion'] = top_drugs['proportion'].cumsum()top_drugs = top_drugs.head()top_drugs
Вывод:
Топ-5 препаратов назначаются 64,6% пациентов.
Прим.: Если мы исправим ошибки в написании, это может быть более 64,6%.
Мы будем использовать этот фрейм данных в дальнейшем анализе и моделировании двумерного фрейма данных.
Двумерный анализ показания vs название препарата
Здесь мы рассмотрим созданные фреймы данных top_indications и top_drugs и попытаемся увидеть распределение между ними, т.е. мы сравним топ-5 названий препаратов с топ-25% показаниями. Мы будем использовать функцию pivot_table().
(df[(df['Indication'].isin(top_indications['Indication'])) &(df['Name of Drug'].isin(top_drugs['Name of Drug']))].pivot_table(index='Indication',columns='Name of Drug',values='Age',aggfunc='count'))
Вывод:
Наблюдения:
- для инфекции грудной клетки наиболее рекомендуемым препаратом является ко-амоксиклав, за ним следует цефтриаксон.
- Аналогичные наблюдения можно сделать и для других показаний.
Примечание: Эти препараты назначаются с учетом ряда других факторов, таких как возраст, пол, диагноз и медицинская история пациента.
Двумерный анализ показания vs возраст
Здесь мы попытаемся понять, появляются ли некоторые состояния у пожилых пациентов. Мы рассмотрим top_indications и рассмотрим средние и медианные значения возраста.
(df[df['Indication'].isin(top_indications['Indication'])].groupby('Indication')['Age'].agg(['mean','median','count']))
Вывод:
Наблюдения:
- Показания – col и профилактика инфекций наблюдаются чаще у молодых пациентов.
- инфекция мочевыводящих путей наблюдается у пациентов среднего возраста.
- Показания: инфекция грудной клетки и сахарный диабет 2 типа более часто наблюдаются у пожилых пациентов.
Двумерный анализ название препарата vs возраст
Здесь мы попытаемся понять, используются ли определенные препараты для пожилых пациентов. Мы рассмотрим top_drugs и рассмотрим средние и медианные значения возраста.
(df[df['Name of Drug'].isin(top_drugs['Name of Drug'])].groupby('Name of Drug')['Age'].agg(['mean','median','count']).sort_values(by='median'))
Вывод:
Наблюдения:
- молодым пациентам назначают септрин и цефиксим
- пациентам среднего возраста назначается цефтриаксон
- пожилым пациентам назначают метронидазол и ко-амоксиклав
Моделирование подхода
Здесь мы попытаемся помочь фармацевту или назначающему врачу. Задача состоит в определении, какой препарат будет назначен пациенту на основе колонки Диагноз, Возраст и Пол.
Несколько соображений и предположений:
- Для данного упражнения мы рассмотрим только 5 лучших препаратов и отметим остальные как Остальные.
- Таким образом, для каждого значения (Диагноз, Возраст, Пол) целью является определение рекомендуемого препарата. Начальная модель имеет точность 16,67% (1/6).
Посмотрим, сможем ли мы превзойти этот результат. Создадим копию датафрейма для тренировочного упражнения.
adf = df.copy()adf['Output'] = np.where(df['Name of Drug'].isin(top_drugs['Name of Drug']), df['Name of Drug'],'Other')adf['Output'].value_counts()
Результат:
OutputOther 294ceftriaxone 221co-amoxiclav 162metronidazole 59cefixime 58septrin 37Name: count, dtype: int64
Мы уже видели данный распределение ранее. Это означает, что классы не равномерно распределены. Мы должны учесть это при инициализации модели.
Feature Engineering
Мы попытаемся выделить более часто встречающиеся слова/н-граммы в столбце диагноза. Для этого мы будем использовать модуль Count Vectorizer.
vectorizer = CountVectorizer(max_features=150,stop_words='english', ngram_range=(1,3))X = vectorizer.fit_transform(adf['Diagnosis'].str.lower())vectorizer.get_feature_names_out()
Результат:
array(['abscess', 'acute', 'acute ge', 'af', 'aki', 'aki ckd', 'aki ckd retro', 'alcoholic', 'anaemia', 'art', 'bite', 'bleeding', 'bone', 'ca', 'cap', 'ccf', 'ccf chest', 'ccf chest infection', 'ccf increased', 'ccf increased lft', 'ccf koch', 'ccf koch lung', 'cerebral', 'cerebral infarct', 'chest', 'chest infection', 'chest infection pre', 'chronic', 'ckd', 'ckd chest infection', 'ckd retro', 'col', 'col portal', 'col portal hypertension', 'copd', 'copd chest', 'copd chest infection', 'debility', 'debility excessive', 'debility excessive vomitting', 'diabetes', 'disease', 'disease renal', 'disease renal impairment', 'dm', 'dm ihd', 'edema', 'effusion', 'encephalopathy', 'excessive', 'excessive vomitting', 'excessive vomitting uraemic', 'failure', 'fever', 'gastritis', 'gastritis hcv', 'gastritis hcv aki', 'ge', 'general', 'general debility', 'general debility excessive', 'gi bleeding', 'hcv', 'hcv aki', 'hcv aki ckd', 'hcv col', 'heart', 'hepatic', 'hepatic encephalopathy', 'hepatitis', 'ht', 'ht disease', 'ht disease renal', 'hypertension', 'ihd', 'impairment', 'impairment koch', 'impairment koch lungs', 'increased', 'increased lft', 'infarct', 'infection', 'infection pre', 'infection pre diabetes', 'koch', 'koch lung', 'koch lung copd', 'koch lungs', 'koch lungs ccf', 'left', 'left sided', 'leg', 'lft', 'lung', 'lung copd', 'lung copd chest', 'lungs', 'lungs ccf', 'lungs ccf increased', 'marrow', 'multiple', 'multiple myeloma', 'multiple myeloma ckd', 'myeloma', 'myeloma ckd', 'newly', 'old', 'pleural', 'pleural effusion', 'pneumonia', 'portal', 'portal hypertension', 'pre', 'pre diabetes', 'pulmonary', 'pulmonary edema', 'renal', 'renal impairment', 'renal impairment koch', 'retro', 'right', 'rvi', 'rvi stage', 'rvi stage ht', 'septic', 'septic shock', 'severe', 'severe anaemia', 'severe anaemia multiple', 'shock', 'sided', 'snake', 'snake bite', 'stage', 'stage ht', 'stage ht disease', 'stroke', 'tb', 'type', 'type dm', 'type dm ihd', 'uraemic', 'uraemic gastritis', 'uraemic gastritis hcv', 'uti', 'uti type', 'uti type dm', 'vomitting', 'vomitting uraemic', 'vomitting uraemic gastritis'], dtype=object)
Выше представлен список из топ-150 нграмм, обнаруженных в столбце диагноза после удаления стоп-слов.
Создание набора данных
Здесь мы создадим единую таблицу, содержащую только что созданные функции, а также столбцы возраста и пола в качестве входных данных. Мы используем Label Encoder для преобразования названий лекарств в числовые значения.
feature_df = pd.DataFrame(X.toarray(),columns=vectorizer.get_feature_names_out())feature_df['Age'] = adf['Age'].fillna(0).astype('int')feature_df['Gender_Male'] = np.where(adf['Gender']=='Male',1,0)le = LabelEncoder()feature_df['Output'] = le.fit_transform(adf['Output'])
Теперь мы выполним разделение на обучающую и тестовую выборки. Мы оставим 20% данных в качестве тестовой выборки. Мы используем аргумент random_state для обеспечения воспроизводимости.
X_train, X_test, y_train, y_test = train_test_split( feature_df.drop('Output',axis=1).fillna(-1), feature_df['Output'], test_size=0.2, random_state=42)
Моделирование
Здесь я попробовал использовать модель Случайный лес. Вы также можете попробовать другие модели. Мы используем аргумент random_state для обеспечения воспроизводимости. Мы используем параметр class_weight, так как ранее видели, что классы не равномерно распределены.
clf = RandomForestClassifier(max_depth=6, random_state=0, class_weight='balanced')clf.fit(X_train, y_train)
Давайте посмотрим точность и другие метрики для обучающего набора данных,
# точность на данных X_trainfinal_accuracy = clf.score(X_train, y_train)print("final_accuracy is : ",final_accuracy)# создание матрицы ошибок для определения и визуализации точностиclf_predict = clf.predict(X_train)print(classification_report(y_train, clf_predict, target_names=list(mapping_df['Actual_Name'])))
Результат:
final_accuracy is : 0.411144578313253 precision recall f1-score support Other 0.84 0.30 0.44 236 cefixime 0.16 0.86 0.27 49 ceftriaxone 0.74 0.26 0.39 176 co-amoxiclav 0.48 0.47 0.48 127metronidazole 0.39 0.59 0.47 49 septrin 0.45 0.93 0.61 27 accuracy 0.41 664 macro avg 0.51 0.57 0.44 664 weighted avg 0.64 0.41 0.43 664
Аналогично, давайте посмотрим точность и другие метрики для тестового набора данных.
# точность на данных X_testfinal_accuracy = clf.score(X_test, y_test)print("final_accuracy is : ",final_accuracy)# создание матрицы ошибок для определения и визуализации точностиclf_predict = clf.predict(X_test)print(classification_report(y_test, clf_predict, target_names=list(mapping_df['Actual_Name'])))
Результат:
final_accuracy is : 0.38323353293413176 precision recall f1-score support Other 0.71 0.38 0.49 58 cefixime 0.08 0.56 0.14 9 ceftriaxone 0.36 0.09 0.14 45 co-amoxiclav 0.64 0.71 0.68 35metronidazole 0.31 0.40 0.35 10 septrin 0.44 0.40 0.42 10 accuracy 0.38 167 macro avg 0.42 0.42 0.37 167 weighted avg 0.53 0.38 0.41 167
Основные наблюдения:
- Модель является 41,11% точной на обучающих данных и 38,32% на тестовых данных.
- Если мы посмотрим на f1-оценку, мы увидим, что для других названий препаратов – обучающий набор данных имел значение 0,44, а тестовый набор данных имел значение 0,49.
- Мы также видим, что тестовая f1-оценка ниже для препаратов цефиксим и цефтриаксона. В то время как у цефиксима всего 9 образцов, у цефтриаксона их 45. Поэтому нам необходимо проанализировать эти данные, чтобы понять возможность улучшения наших наборов характеристик.
Вывод
В этой статье мы проанализировали медицинский набор данных от начала до конца. Затем мы очистили набор данных. Мы увидели основные статистические данные, распределение и даже облако тегов, чтобы понять столбцы. Затем мы создали проблему, чтобы помочь фармацевту или прописывающему врачу с современными лекарствами. Это было определение препарата, который будет предложен пациенту на основе столбцов Диагноза, Возраста и Пола.
Основные выводы
- Мы рассмотрели топ-150 слов/биграмм/триграмм из столбца Диагноза для моделирования. Давайте скажем, мы разделили столбец диагноза и создали 150 характеристик.
- У нас также была функция Возраста и Пола. Таким образом, у нас было 152 характеристики.
- Используя эти 152 характеристики, мы пытались определить, какое лекарство следует назначить.
- Базовая/случайная модель была точной на 16,67%. Наша модель была точной на 41,11% на обучающих данных и 38,32% на тестовых данных. Это значительное улучшение по сравнению с базовой моделью.
Некоторые идеи для улучшения производительности модели:
- Попробуйте TF-IDF или векторизацию для извлечения характеристик.
- Попробуйте различные модели и используйте сетку поиска и перекрестную проверку для оптимизации точности.
- Попробуйте предсказывать больше лекарств.
Спасибо за чтение моей статьи. Не стесняйтесь связаться со мной на LinkedIn, чтобы обсудить это.
Медиафайлы, показанные в этой статье, не принадлежат Analytics Vidhya и используются по усмотрению автора.