randomForest: советы по мошенничеству с кредитными картами - PullRequest
0 голосов
/ 10 июня 2019

источник данных: 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"))

1 Ответ

1 голос
/ 10 июня 2019

Для Вопроса 1, how do I identify and remove these 'weak' indicators?, вы должны сосредоточиться на выборе функции: под наблюдением или без надзора. Там, где методы выбора контролируемых признаков состоят из таких методов, как корреляция, обработка пропущенных значений, а методы извлечения неконтролируемых признаков - это анализ основных компонентов, факторный анализ. Идея здесь состоит в том, чтобы уменьшить размерность данных таким образом, чтобы объекты, учитывающие максимальную дисперсию, сохранялись, а объекты с низкой дисперсией отбрасывались.

Для Question 2: How can I improve this model overall? Сосредоточьтесь на схемах перекрестной проверки 5-fold или 10-fold. Чтобы определить оптимальное количество деревьев для повышения точности, см. Эти похожие вопросы: 1 , 2 , 3 , 4 и 5

Ниже приведен минимальный рабочий пример для вопроса 2:

from sklearn import datasets
from sklearn.model_selection import cross_validate
from sklearn.svm import LinearSVC
from sklearn.ensemble import  RandomForestClassifier
import pandas as pd

diabetes = datasets.load_diabetes()
X, y = diabetes.data, diabetes.target

clf=RandomForestClassifier(n_estimators =10, random_state = 42, class_weight="balanced")
output = cross_validate(clf, X, y, cv=2, scoring = 'accuracy', return_estimator =True)
for idx,estimator in enumerate(output['estimator']):
    print("Features sorted by their score for estimator {}:".format(idx))
    feature_importances = pd.DataFrame(estimator.feature_importances_,
                                       index = diabetes.feature_names,
                                        columns=['importance']).sort_values('importance', ascending=False)
    print(feature_importances)

выход

Features sorted by their score for estimator 0:
     importance
s6     0.137735
age    0.130152
s5     0.114561
s2     0.113683
s3     0.112952
bmi    0.111057
bp     0.108682
s1     0.090763
s4     0.056805
sex    0.023609
Features sorted by their score for estimator 1:
     importance
age    0.129671
bmi    0.125706
s2     0.125304
s1     0.113903
bp     0.111979
s6     0.110505
s5     0.106099
s3     0.098392
s4     0.054542
sex    0.023900
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...