Escolar Documentos
Profissional Documentos
Cultura Documentos
Objetivo
Criar um modelo de classificação que consiga identificar fraudes de cartões de créditos.
Analise Exploratória
Visualização parcial do dataset
Hide
# Visualizando as 5 primeiras e ultimas linhas dos dados
bind_rows(head(df),
tail(df))
Time V1 V2 V3 V4 V5 V6 V7
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
0 -1.3598071 -0.07278117 2.5363467 1.3781552 -0.33832077 0.46238778 0.23959855
0 1.1918571 0.26615071 0.1664801 0.4481541 0.06001765 -0.08236081 -0.07880298
1 -1.3583541 -1.34016307 1.7732093 0.3797796 -0.50319813 1.80049938 0.79146096
1 -0.9662717 -0.18522601 1.7929933 -0.8632913 -0.01030888 1.24720317 0.23760894
2 -1.1582331 0.87773675 1.5487178 0.4030339 -0.40719338 0.09592146 0.59294075
2 -0.4259659 0.96052304 1.1411093 -0.1682521 0.42098688 -0.02972755 0.47620095
172785 0.1203164 0.93100513 -0.5460121 -0.7450968 1.13031398 -0.23597317 0.81272207
172786 -11.8811179 10.07178497 -9.8347835 -2.0666557 -5.36447278 -2.60683733 -4.91821543
172787 -0.7327887 -0.05508049 2.0350297 -0.7385886 0.86822940 1.05841527 0.02432970
172788 1.9195650 -0.30125385 -3.2496398 -0.5578281 2.63051512 3.03126010 -0.29682653
A Função SMOTE gera novos valores com base no atributo Class = 1, desta forma a base
de dados passa de 28 mil linhas para 39 mil.
Conforme o novo gráfico, os atributos estão bem mais equilibrados.
Hide
# Novo dataset com os dados balanceados
df_smote <- SMOTE(Class ~., as.data.frame(df), perc.over = 40000,
perc.under = 100) %>% as_tibble()
Como forma de ilustração, a função “rpart” ira criar uma arvore de decisão com os
atributos escolhidos ao acaso, V1, V2 e V3.
Hide
# Criando um modelo bom base em uma arvore de decisão
model_dt <- rpart(Class ~ V1 + V2 + V3,
data = train,
method = "class")
# Plotando a arvore
prp(model_dt, type = 0, extra = 1, under = TRUE, compress = TRUE)
O modelo Random Forest foi criado utilizando todos os atributos dos dados de treino e 50
arvores.
Aparentemente o modelo está com overfitting, pois a taxa de erro esta próxima de 0%
mediante aos dados de treino.
Hide
# Criando um modelo com random forest para 50 arvores
model_rf <- randomForest(Class ~., data = train, ntree = 50)
# resumo do modelo
model_rf
Call:
randomForest(formula = Class ~ ., data = train, ntree = 50)
Type of random forest: classification
Number of trees: 50
No. of variables tried at each split: 5
Avaliando o modelo
Apos a criação do novo modelo, ele será testado com dados que não participaram da
criação do modelo, de forma a validar sua capacidade de generalização.
A acurácia final foi de 99%.
Hide
# Prevendo os dados de teste
pred_rf <- predict(model_rf, test)
# Matriz de confusão
confusionMatrix(test$Class, pred_rf)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 58858 182
1 219 58968
Accuracy : 0.9966
95% CI : (0.9963, 0.9969)
No Information Rate : 0.5003
P-Value [Acc > NIR] : < 2e-16
Kappa : 0.9932
Sensitivity : 0.9963
Specificity : 0.9969
Pos Pred Value : 0.9969
Neg Pred Value : 0.9963
Prevalence : 0.4997
Detection Rate : 0.4978
Detection Prevalence : 0.4994
Balanced Accuracy : 0.9966
'Positive' Class : 0
---
```{r modulos}
# carregando os modulos
library(tidyverse)
library(randomForest)
library(DMwR)
library(caret)
library(rpart)
library(rpart.plot)
# Lendo o conjunto de dados para treinamento
df <- read_csv("creditcard.csv", col_types = cols(.default = col_double(),
Class = col_factor()))
```
## Analise Exploratoria ##
Sera necessario balancear os dados para que o modelo consiga aprender o que
seria fraude (1).
```{r frequencia}
# grafico de barras com o total por classe
df %>% group_by(Class) %>%
summarise(total = n()) %>%
ggplot(aes(x = Class, y = total, fill = as.factor(total))) +
geom_bar(stat = "identity", show.legend = F) +
theme_classic() +
ggtitle("Total de classes")
```
A Funcao SMOTE ira gerar novos valores com base no atributo Class = 1,
desta forma a base de dados passa de 28 mil linhas para 39 mil.
Conforme o novo grafico, os atributos estao bem mais equilibrados.
```{r smote}
# Novo dataset com os dados balanceados
df_smote <- SMOTE(Class ~., as.data.frame(df), perc.over = 40000,
perc.under = 100) %>% as_tibble()
# grafico de barras com o total por classe
df_smote %>% group_by(Class) %>%
summarise(total = n()) %>%
ggplot(aes(x = Class, y = total, fill = total)) +
geom_bar(stat = "identity", show.legend = F) +
theme_classic() +
ggtitle("Total de classes")
```
## Criando o modelo ##
Criando dois datasets, um com 70% dos dados para criar o modelo e o outro
com 30% dos dados para usar como teste.
```{r split}
# Dividindo os dados em treino e teste (70/30)
set.seed(124)
index <- createDataPartition(df_smote$Class, p = 0.7, list = FALSE)
train <- df_smote[index,-1]
test <- df_smote[-index,-1]
```
Como forma de ilustracao, a funcao "rpart" ira criar uma arvore de decisao
com os atributos escolhidos ao acaso, V1, V2 e V3.
```{r arvore}
# Criando um modelo bom base em uma arvore de decisao
model_dt <- rpart(Class ~ V1 + V2 + V3,
data = train,
method = "class")
# Plotando a arvore
prp(model_dt, type = 0, extra = 1, under = TRUE, compress = TRUE)
```
O modelo Random Forest foi criado utilizando todos os atributos dos dados
de treino e 50 arvores.
## Avaliando o modelo ##
Apos a criacao do novo modelo, ele sera testado com dados que nao
participaram da criacao do modelo, de forma a validar sua capacidade de
generalizacao.
PROGRAMA REESCRITO
#carregando bibliotecas
install.packages("rpart")
install.packages("rpart.plot")
install.packages("tidyverse")
install.packages("randomForest")
install.packages("DMwR")
install.packages("caret")
# carregando os modulos
library(tidyverse)
library(randomForest)
library(DMwR)
library(caret)
library(rpart)
library(rpart.plot)
df = read.csv(file="C:\\Users\\salvo\\OneDrive\\Desktop\\creditcard.csv",sep = ",")
df
head(df,5)
tail(df,5)
bind_rows(head(df),tail(df))
glimpse(df)
summary(df)
set.seed(124)
# Plotando a arvore
# resumo do modelo
model_rf
# Selecao de atributos
varImpPlot(model_rf)
model_rf <- randomForest(Class ~ V14 + V10 + V12 + V4 + V17, data = train, ntree = 50)
# Matriz de confusão
confusionMatrix(test$Class, pred_rf)
# carregando os modulos
library(tidyverse)
library(randomForest)
library(DMwR)
library(caret)
library(rpart)
library(rpart.plot)
## Analise Exploratoria ##
df
bind_rows(head(df),tail(df))
glimpse(df)
summary(df)
theme_classic() +
ggtitle("Total de classes")
## Criando o modelo ##
set.seed(124)
index <- createDataPartition(df_smote$Class, p = 0.7, list = FALSE)
data = train,
method = "class")
# Plotando a arvore
# resumo do modelo
model_rf
Call:
randomForest(formula = Class ~ ., data = train, ntree =
50)
Type of random forest: classification
Number of trees: 50
No. of variables tried at each split: 5
>