Peter’s R — решение проблем с длительным ожиданием с помощью tidymodels P4

Часть 4: аккуратный текст и окончательное решение

В предыдущих постах я установил базовую модель и представил ресемплинг и настройку модели средствами tidymodels. Цель заключалась в сокращении времени ожидания пациентов отделения хирургии кисти при назначении операции. Время ожидания я определил как время от прибытия до начала операции.

Материал

Как и в предыдущих постах, вы найдете данные и файлы уценки в моем github-repo.

Специфика отдела

Когда я оптимизирую время ожидания, я должен помнить, что в процессе не должно быть задержек, потому что задержка влечет за собой дополнительные расходы и делает сотрудников недовольными. Обычно трое пациентов назначаются на 6:30 утра. Они получают плексусную анестезию местным анестетиком длительного действия. Затем пациенты, начиная с четвертого, планируются путем суммирования времени p2p (от пациента к пациенту).

Какая информация существует во время планирования

Предыдущие модели основывались на операциях (ICPM) как на одной переменной. Когда я создаю план на следующий день, операции доступны не во всех операциях. Для некоторых стандартных операций операции уже существуют, но для нестандартных операций операций нет. Поиск всех операций заранее занял бы очень много времени. Доступны следующие переменные:
- возраст пациента
- оперирующий хирург
- день недели
- амбулаторное и стационарное
и помимо этих переменных две текстовые переменные.
Текст планировки под названием «Без». Этот текст содержит информацию о планируемой операции, он не структурирован и фельдшер вводит текст во время планирования операции.
Другая переменная, «op-kenn», является структурированной переменной. Текст специфичен для часто используемых операций, например. Карпалтоннельсиндром, Дюпюитрен. К сожалению, есть несоответствия между экспортом EHR для создания ежедневного планирования операций и экспортом, который я использовал для обучения модели.

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

Предварительно обработайте текстовую информацию

Поскольку обе переменные содержат много беспорядка, например. время, запрошенное пациентом, необходима некоторая предварительная обработка. Обе переменные объединяются в одну переменную. Затем я удалил все цифры и специальные символы в виде ‘:’ или ‘. 'от переменных. В рамках рецепта я токенизирую эту переменную, и стоп-слова удаляются. Максимальное количество слов определяется настройкой с помощью max_words. Остальной код без изменений.

basic_rec <- 
    recipe(p2p ~ ., data = hc_train) %>%
        step_tokenize(bez)  %>%
        step_stopwords(bez, language = "de") %>%
        step_tokenfilter(bez, max_tokens = tune()) %>%
        step_tf(bez) %>% 
        #step_lencode_glm(op_kenn, outcome =vars(p2p)) %>% 
        step_dummy(all_nominal(), -all_outcomes()) %>%
        step_zv()

Обучение

Я подбираю модель XGboost с помощью перекрестной проверки. Для тюнинга использую Anova-racing. Это не так трудоемко, как поиск по полной сетке. На основе промежуточной оценки подмножества повторных выборок не учитываются некоторые показатели производительности для дальнейшей повторной выборки. Подробное объяснение находится здесь. Подгонка данных на моем Mac с 64 руками, использующем 6 ядер, заняла 52 минуты.

registerDoMC(cores = 6)
multi_metric <- metric_set(rmse)
set.seed(1308)
xgb_race <-
  xgb_wf %>%
  tune_race_anova(
    hc_fold,
    grid = 20,
    param_info = xgb_param,
    metrics = multi_metric,
    control = control_race(save_pred = TRUE, verbose_elim = TRUE)
  )
registerDoSEQ()

Окончательная оценка модели

select_best() определяет лучшие параметры модели. С этими параметрами модель будет соответствовать всем данным и оцениваться с помощью тестовых данных last_fit().

best_results_all <- 
        xgb_race %>% 
        show_best(metric = "rmse")
best_results <- 
        xgb_race %>% 
        select_best(metric = "rmse")
boosting_test_results <- 
   xgb_wf %>% 
   finalize_workflow(best_results) %>% 
   last_fit(split = fall_split)
collect_metrics(boosting_test_results)

Метрики сбора показывают среднеквадратичное значение, равное 14, а график прогнозируемого и наблюдаемого показывает большие различия с более высокими значениями p2p.

После окончательной подгонки всех данных vip оценивает важность переменных.

library(vip)
final_wfl <- 
   xgb_wf %>% 
   finalize_workflow(best_results)
fitted_wfl <- final_wfl %>%  
        fit(data = hc_train)
fitted_wfl %>%
  extract_fit_parsnip() %>%
  vip(geom = "point", num_features = 15)

Наибольшее значение имеет характеристика статистики (стационарное или амбулаторное), за которой следует tf_bez_allgemein. Обе функции отмечают операции, которые имеют большую продолжительность. Напротив, две функции arzt_code_ap и arzt_code_nf являются наиболее опытными и быстрыми ручными хирургами.

Используйте модель

Наконец, мы можем сохранить модель,

saveRDS(wz_model, “../models/model1.RDS”)

и использовать его для прогнозирования p2p всех операций следующего дня.

Что дальше?

В настоящее время у меня есть дополнительная программа R, в которой я загружаю модель, предварительно обрабатываю рабочий план на следующий день, вписываюсь в модель и получаю время p2p на следующий день. С ними я планирую расписание на следующий день, как описано выше.

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

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

Через некоторое время я должен оценить, есть ли у нас сокращение t_diff (время от появления до начала операции), что и было основной целью. Через определенные промежутки времени я должен переучивать программу, потому что обстоятельства будут меняться. Будет меняться персонал, мы будем менять операции и т. д. Надеюсь, можно улучшить результаты. На данный момент не пробовал: tfidf, эмбеддинги и прочее.

О первых результатах сообщу через месяц-два и сообщу, удастся ли мне решить основную проблему путем развертывания модели.

Читайте здесь для развертывания модели и первых результатов.

Надеюсь, вам понравилось мое путешествие по проблеме длительного ожидания и моя работа над книгой Опрятное моделирование с помощью R. Путешествие продолжится.
Оставайтесь с нами.