Как бы вы оценили мой код для проблемы двоичной классификации? - PullRequest
0 голосов
/ 10 апреля 2020

Мне нужно ваше мнение о моем коде. Я хочу тренировать несбалансированный набор данных с двоичной целевой переменной, применить некоторые методы, используемые для обработки дисбаланса, и оценить эти эффекты впоследствии. Я использую CART в качестве модели и использую такие методы, как SMOTE / ROSE / Undersampling / Oversampling. Для оценки я использую ConfusionMatrix. Ребята, у вас есть идеи, что я могу улучшить в своем коде? Возможно другие методы или другие метрики. Я хочу сделать это относительно простым. Я хочу использовать базовые c техники, ничего особенного.

Это мой код:

enter code h# Datensatz aufrufen und speichern
setwd("C:\\Users\\loren\\Dropbox\\Uni\\Präsentation\\Datensätze")
data <- read.csv("creditcard.csv")
prop.table(table(data$Class))
table(data$Class)
summary(data)
barplot(table(data$Class), col = rainbow(2))


# Oder zufälliges Aufteilen
set.seed(1234) # Es handelt sich um ein zufälliges Aufteilen der Daten --> Somit bleibt der Anfang 
immer gleich
index <- sample(2, nrow(data), replace = TRUE, prob = c(0.8, 0.2))
train_data <- data[index==1,]
prop.table(table(train_data$Class))
test_data <- data[index==2,]
prop.table(table(test_data$Class))


# Faktorisiern der Train/Test-Daten
test_data$Class <- factor(test_data$Class)
train_data$Class <- factor(train_data$Class)


# Verteilung der Daten
table(train_data$Class)
summary(train_data)
prop.table(table(train_data$Class))
barplot(table(train_data$Class))
table(test_data$Class)
prop.table(table(test_data$Class))
barplot(table(test_data$Class))


# Klassifikationsgüte der Ausgangsdaten
library(rpart)
library(caret)
library(e1071)
fit_train <- rpart(Class ~ ., data = train_data, method = "class", control = rpart.control(cp = 0)) # 
rpart = rekurisves Partitioniern
rpart.plot(fit_train, extra=4)
#printcp(fit_train)
#plotcp(fit_train)
pred_fit_train <- predict(fit_train, newdata = test_data, type = "class")
table(test_data$Class, pred_fit_train)
confusionMatrix(data = pred_fit_train ,
            reference = factor(test_data$Class),
            positive = "1")
mccr(pred_fit_train, test_data$Class)


# Down-Sample
library(ROSE)
down_train <- ovun.sample(Class ~ ., data = train_data, method = "under", N=786)$data
table(down_train$Class)
prop.table(table(down_train$Class))
barplot(table(down_train$Class), col = rainbow(2))
fit_down <- rpart(Class~., data = down_train, method = "class")
pred_down <- predict(fit_down, newdata = test_data, type = "class")
summary(pred_down)
confusionMatrix(data = pred_down ,
            reference = factor(test_data$Class),
            positive = "1")
mccr(pred_down, test_data$Class)



# Up-Sample
library(caret)
up_train <- ovun.sample(Class ~ ., data = train_data, method = "over", N=455276)$data
table(up_train$Class)
prop.table(table(up_train$Class))
barplot(table(up_train$Class))
fit_up <- rpart(Class~., data = up_train, method = "class")
pred_up <- predict(fit_up, newdata = test_data, type = "class")
summary(pred_up)
confusionMatrix(data = pred_up ,
            reference = factor(test_data$Class),
            positive = "1")
mccr(pred_up, test_data$Class)


# Both
both_train <- ovun.sample(Class ~ ., data = train_data, method = "both", p=0.5, N=4000, seed = 
123)$data
table(both_train$Class)
prop.table(table(both_train$Class))
fit_both <- rpart(Class~., data = both_train, method = "class")
pred_both <- predict(fit_both, newdata = test_data, type = "class")
performance(pred_both)
confusionMatrix(data = pred_both ,
            reference = factor(test_data$Class),
            positive = "1")
mccr(pred_both, test_data$Class)


# SMOTE
library(smotefamily)
library(DMwR)
smote_train <- SMOTE(Class~., data = train_data) #punkt oder nicht?
table(smote_train$Class)
prop.table(table(smote_train$Class))
barplot(table(smote_train$Class), col = rainbow(2))
fit_smote <- rpart(Class~., data = smote_train, method = "class")
pred_smote <- predict(fit_smote, newdata = test_data, type = "class")
summary(pred_smote)
confusionMatrix(data = pred_smote ,
            reference = factor(test_data$Class),
            positive = "1")
mccr(pred_smote, test_data$Class)


# ROSE
library(ROSE)
rose_train <- ROSE(Class~., data = train_data)$data
table(rose_train$Class)
prop.table(table(rose_train$Class))
fit_rose <- rpart(Class~., data = rose_train, method = "class")
rpart.plot(fit_rose)
pred_rose <- predict(fit_rose, newdata = test_data, type = "class")
summary(pred_rose)
accuracy.meas(test_data$Class, pred_rose)
confusionMatrix(data = pred_rose ,
            reference = factor(test_data$Class),
            positive = "1")
mccr(pred_rose, test_data$Class)

#Tomek
library(UBL)
tomek_train <- TomekClassif(Class~.,train_data, dist = "Euclidean", p = 2, Cl = "all", rem = "both")

Любая критика c или идея приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...