источник данных: https://www.kaggle.com/mlg-ulb/creditcardfraud
У меня есть набор данных с приблизительно 280 000 строк и 31 столбцом.Этот набор данных содержит записи о транзакциях по кредитным картам и помечен как мошеннические.99,8% данных являются законными транзакциями, а 0,2% данных являются мошенническими.Поскольку данные настолько несбалансированны, я использовал взвешенный randomForest для классификации случаев NotFraud и случаев мошенничества.
В настоящее время я думаю, что моя модель очень хорошо подходит для данных до такой степени, что их можно перегрузить.Тем не менее, я не уверен, является ли это переобучением, потому что данные естественно несбалансированы на 99,8% реальных транзакций.Вот как выглядит мой результат:
#training
> actual <- as.factor(c(0,0,1,1))
> predicted <- as.factor(c(0,1,0,1))
> count <- c(191204,40,98,228)
> df1 <- data.frame(actual,predicted,count)
#testing
> actual <- as.factor(c(0,0,1,1))
> predicted <- as.factor(c(0,1,0,1))
> count <- c(56852,9,26,75)
> df2 <- data.frame(actual,predicted,count)
Вопрос 1: Что я могу сделать, чтобы сделать модель более общей и уменьшить переоснащение?Удалить ли переменные из модели?Если да, то как мне определить и устранить эти «слабые» показатели?
Вопрос 2: Как я могу улучшить эту модель в целом?Я хочу увеличить количество истинных позитивов и уменьшить количество ложных срабатываний и ложных негативов.
Я попытался установить ntree в 100, 200 и 500. Из того, что я понимаю, это не сильно повлияло на мои результаты.
> set.seed(123)
> data_set_size <- floor(nrow(df)*0.80)
> index <- sample(1:nrow(df), size = data_set_size)
> training <- df[index,]
> testing <- df[-index,]
> rf <- randomForest(Class ~ ., data = training, ntree = 4, importance = TRUE, classwt = c(0.3,0.7))
> results <- data.frame(testing$Class, predict(rf, testing[,1:30], type = "class"))