Вопрос или проблема
Я пытаюсь предсказать на основе нескольких параметров, таких как тип поездки, тип автомобиля, источник бронирования, время начала, время до бронирования (начало – бронирование) и несколько других параметров, отменит ли клиент бронь или нет. По коду ниже точность default.ct в первом классификационном дереве составляет 75%. deeper.ct, более глубокое дерево, которое я генерирую, дает точность 70%. Постепенно точность обрезанного дерева также остается неизменной. Бустинг с помощью пакета adabag занимает слишком много времени, так как у меня почти 500 000 наблюдений по 19 переменным. xgboost дает мне лучшее значение mlogloss на уровне около 0,43.
Что я могу сделать, чтобы улучшить точность модели?
# Генерация классификационного дерева
default.ct <- rpart(tag ~ ., data = train.df, method = "class",
control=rpart.control(minsplit=2, minbucket=1, cp=0.001))
summary(default.ct)$used
printcp(default.ct)
# генерация матрицы ошибок для обучающих данных
prp(default.ct, type = 1, extra = 1, under = TRUE, split.font = 1, varlen =
-10)
default.ct.point.pred.train <- predict(default.ct,train.df,type = "class")
confusionMatrix(default.ct.point.pred.train, train.df$tag)
deeper.ct <- rpart(tag ~ ., data = train.df, method = "class", cp = 0,
minsplit = 1)
# подсчет количества листьев
length(deeper.ct$frame$var[deeper.ct$frame$var == "<leaf>"])
## Используйте кросс-валидацию для обрезки дерева
cv.ct <- rpart(tag ~ ., data = train.df, method = "class", cp = 0, minsplit =
5, xval = 5)
# используйте printcp(), чтобы напечатать таблицу.
printcp(cv.ct)
# Используйте переменную c для хранения данных о точности для разных cp и выведите их
c <- list()
for (i in 1:nrow(cv.ct$cptable)){
pruned.ct <- prune(cv.ct,
cp = cv.ct$cptable[i])
pruned.ct.point.pred.train <- predict(pruned.ct,valid.df,type = "class")
c[i] <- confusionMatrix(pruned.ct.point.pred.train, valid.df$tag)$overall[1]
}
# обрезать дерево с помощью второго большого cp и использовать его для предсказания данных проверки
pruned.ct <- prune(cv.ct, cp = cv.ct$cptable[2])
length(pruned.ct$frame$var[pruned.ct$frame$var == "<leaf>"])
- Создайте дополнительную переменную: например, время бронирования = время до начала.
- Сократите количество переменных с большим количеством классов, если они присутствуют (часть EDA)
- Стандартизируйте числовые переменные – (значение – среднее) / стандартное отклонение
- Дерево – это очень слабый классификатор, вам придется делать бэггинг или бустинг (например, ada boost или gbm или случайный лес)
- Попробуйте настройку параметров – я не вставляю ссылки, так как не знаю политику рекламы здесь, но просто поищите настройку параметров GBM в Гугле – вы найдете множество ссылок
Вы упомянули о проблемах со временем, когда пытались использовать ансамблевые методы. Чтобы решить это:
- возьмите подмножество данных и попробуйте сделать ансамбль на этом (после того как окончательно определитесь с моделью, запустите ее на всем наборе данных)
- если вы используете XGBoost, у вас есть возможность принимать другую модель в качестве входных данных (вы можете запускать это партиями)
Ответ или решение
Чтобы улучшить точность вашей модели для предсказания отмены поездки на такси, необходимо рассмотреть несколько стратегий, основанных на терминологии FOREST (Favorable, Obvious, Relevant, Easy, Specific, Timely). Давайте подробнее рассмотрим, как вы можете оптимизировать свой подход.
1. Улучшение качества данных (Favorable)
Создание новых признаков: Расширьте вашу датасет добавлением производных переменных. Например, разница между временем начала поездки и временем бронирования может дать дополнительный признак "время для бронирования". Это поможет выявить закономерности отмен на основе времени.
2. Предотвращение переобучения (Obvious)
Сокращение числа переменных: Проведите визуализацию данных и анализ значимости признаков, чтобы выявить и исключить менее значимые переменные. Это снизит сложность модели и уменьшит риск переобучения.
Стандартизация числовых переменных: Обработка числовых данных путем стандартизации (например, использование z-преобразования) способствует повышению стабильности моделей, которые зависят от масштаба входных данных, таких как деревья решений и модели регрессии.
3. Применение более сложных методов (Relevant)
Использование ансамблевых методов: Как указано в вашем комментарии, деревья решений могут быть слабым классификатором. Попробуйте использовать методы бэггинга (такие как Random Forest) или бустинга (например, XGBoost или LightGBM). Эти методы могут значительно повысить точность модели, поскольку они комбинируют множество моделей для улучшения прогноза.
4. Оптимизация гиперпараметров (Easy)
Тонкая настройка параметров: Тщательная настройка гиперпараметров вашего алгоритма может выявить наиболее оптимальные настройки. Рассмотрите возможность использования сеточного или случайного поиска (Grid Search или Random Search) для оптимизации таких гиперпараметров, как количество деревьев, максимальная глубина дерева и минимальное количество образцов в листе. Это особенно важно для XGBoost и других градиентных бустинговых моделей.
5. Улучшение вычислительной эффективности (Specific)
Сокращение объема данных: Если вы сталкиваетесь с проблемами времени выполнения при использовании ансамблевых методов с полным набором данных, рассмотрите возможность работы с подмножеством данных для настройки модели. После завершения валидации можете развернуть модель на всем наборе данных.
Параллельная обработка: Используйте возможности многопоточности, доступные в XGBoost для ускорения обучения модели. Настройка параметров, таких как n_jobs
, позволяет эффективно использовать вычислительные ресурсы.
6. Мониторинг и анализ (Timely)
Кросс-валидация: Использование кросс-валидации для оценки модели позволяет избежать переобучения и дает лучшее представление о реальной производительности на новом наборе данных. Применение метода k-fold к вашим моделям может помочь в более устойчивой оценке точности.
Заключение
Следующие шаги помогут вам повысить точность вашей модели предсказания отмены поездок на такси. Улучшающийся процесс обработки данных, использование более мощных методов анализа и оптимизация гиперпараметров, наряду с тщательным мониторингом результатов, помогут вам добиться более высоких показателей точности. Удачи в реализации этих стратегий!