Какова роль науки о данных в современной медицине?

Роль науки о данных в современной медицине что нужно знать?

Введение

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

Цели обучения

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

Эта статья была опубликована в рамках блогоатона Data Science.

Набор данных

Мы будем загружать и использовать открытый исходный набор данных с 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'))

Вывод:

Наблюдения:

  1. молодым пациентам назначают септрин и цефиксим
  2. пациентам среднего возраста назначается цефтриаксон
  3. пожилым пациентам назначают метронидазол и ко-амоксиклав

Моделирование подхода

Здесь мы попытаемся помочь фармацевту или назначающему врачу. Задача состоит в определении, какой препарат будет назначен пациенту на основе колонки Диагноз, Возраст и Пол.

Несколько соображений и предположений:

  1. Для данного упражнения мы рассмотрим только 5 лучших препаратов и отметим остальные как Остальные.
  2. Таким образом, для каждого значения (Диагноз, Возраст, Пол) целью является определение рекомендуемого препарата. Начальная модель имеет точность 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% на тестовых данных. Это значительное улучшение по сравнению с базовой моделью.

Некоторые идеи для улучшения производительности модели:

  1. Попробуйте TF-IDF или векторизацию для извлечения характеристик.
  2. Попробуйте различные модели и используйте сетку поиска и перекрестную проверку для оптимизации точности.
  3. Попробуйте предсказывать больше лекарств.

Спасибо за чтение моей статьи. Не стесняйтесь связаться со мной на LinkedIn, чтобы обсудить это.

Медиафайлы, показанные в этой статье, не принадлежат Analytics Vidhya и используются по усмотрению автора.