Как обработать несбалансированный набор данных для предсказания поступления в университет с использованием предсказательной модели в R?

Вопрос или проблема

“Как обработать несбалансированный набор данных для предсказания поступления в университет с использованием предсказательной модели в R?”

Описание:

Привет всем,

Я работаю над проектом, в котором нужно предсказать поступление в университет (двоичная переменная: 0 = не принято, 1 = принято) на основе набора признаков кандидатов (например, академические оценки, возраст, пол и т. д.). Главная проблема в том, что моя целевая переменная, поступление, является сильно несбалансированной: только около 1% кандидатов принимаются.

Я попробовал несколько техник, но у меня возникают трудности с предсказанием положительных случаев (принятых кандидатов). Вот что я сделал:

Случайный лес: Работает довольно хорошо с точки зрения общей точности, но требует много времени на обучение из-за большого объема данных и практически не улавливает истинно положительные результаты (TP).

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

Методы повторной выборки:

Увеличение выборки: Дублирование положительных случаев.
Уменьшение выборки: Сокращение отрицательных случаев.
Взвешенные классы: Присваивание большего веса меньшинству (принятым кандидатам).
Эти подходы немного улучшили общую эффективность, повысив точность до около 0.7, но модель все еще испытывает трудности с предсказанием истинных поступлений.

Градиентный бустинг: В настоящее время я экспериментирую с xgboost, но все еще сталкиваюсь с теми же проблемами с несбалансированными классами, с низким уровнем истинных положительных результатов.

Я осведомлен о эффективных алгоритмах на Python, таких как чувствительный к стоимости бустинг, но я работаю на компьютере с административными данными, где Python не может быть установлен, поэтому я вынужден оставаться на R.

Мой вопрос:

Какие другие техники я могу попробовать, чтобы справиться с таким несбалансированным набором данных и улучшить предсказание положительных классов? Я особенно стремлюсь повысить точность и полноту для истинных положительных без значительной потери общей точности.
Буду признателен за любые советы по альтернативным подходам или настройкам модели, которые лучше работают с сильно несбалансированными наборами данных в R.

Заранее спасибо!

Я уже попробовал несколько моделей, таких как Случайный лес, Логит Lasso и т. д.

Ответ или решение

Как справиться с несбалансированным набором данных для предсказания поступления в университет с использованием предсказательной модели в R

Здравствуйте!

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

1. Применение методов обработки несбалансированных данных

  • Избыточная выборка (Oversampling): Попробуйте использовать метод SMOTE (Synthetic Minority Over-sampling Technique). Этот метод создает синтетические примеры для положительного класса, что может помочь модели лучше понять его особенности. В R доступен пакет DMwR, который предоставляет реализацию SMOTE.

    library(DMwR)
    dataset_balanced <- SMOTE(admission ~ ., data = original_dataset, perc.over = 300, perc.under = 200)
  • Недостаточная выборка (Undersampling): Вместо случайного удаления экземпляров из отрицательного класса можно использовать методы, такие как Tomek links или Neighborhood cleaning, которые удаляют экземпляры, находящиеся ближе к границе принятия решения.

2. Использование методов ансамблирования

  • Рандомизированный Лес с весами (Weighted Random Forest): Вы можете использовать метод случайного леса, но с учетом весов классов. Установите вес для положительного класса выше, чтобы сделать его более заметным для модели.

    library(randomForest)
    rf_model <- randomForest(admission ~ ., data = training_data, 
                           sampsize = c(1, 3000), 
                           ntree = 1000,
                           importance = TRUE,
                           replace = FALSE)
  • Градиентный бустинг с учетом ошибок (Cost-sensitive Gradient Boosting): В xgboost можно задать параметр scale_pos_weight, который поможет сбалансировать веса при обучении. Это особенно полезно, если классы несбалансированы.

    library(xgboost)
    scale_pos_weight <- table(training_data$admission)[2] / table(training_data$admission)[1]
    xgb_model <- xgboost(data = as.matrix(training_data[, -1]), 
                       label = training_data$admission, 
                       scale_pos_weight = scale_pos_weight, 
                       nrounds = 100, 
                       objective = "binary:logistic")

3. Оптимизация порога предсказания

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

predictions <- predict(model, new_data, type = "prob")[,2]
predicted_classes <- ifelse(predictions > 0.3, 1, 0)  # Порог устанавливается на 0.3

4. Использование метрик для оценки

При оценке вашей модели используйте метрики, такие как F1-меры и ROC-AUC, которые более информативны в условия несбалансированности классов.

5. Модели глубокого обучения

Если ваш набора данных позволяет, попробуйте использовать нейронные сети. В R можно использовать пакеты, такие как keras или tensorflow. Нейронные сети могут часто обрабатывать сложные зависимости в данных и улучшить предсказания для не структурированных наборов данных, если правильно настроены.

library(keras)
model <- keras_model_sequential() %>%
  layer_dense(units = 64, activation = 'relu', input_shape = ncol(training_data) - 1) %>%
  layer_dropout(rate = 0.5) %>%
  layer_dense(units = 1, activation = 'sigmoid')

model %>% compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = 'accuracy')
model %>% fit(as.matrix(training_data[, -1]), training_data$admission, epochs = 50, batch_size = 32)

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...