randomForest:信用卡欺诈建议

时间:2019-06-10 03:02:10

标签: r classification random-forest

数据源:https://www.kaggle.com/mlg-ulb/creditcardfraud

我有大约280,000行和31列的数据集。该数据集具有信用卡交易记录,并标记了欺诈行为。其中99.8%的数据属于合法交易,而0.2%的数据属于欺诈行为。由于数据是如此不平衡,因此我使用加权randomForest来对NotFraud案件和Fraud案件进行分类。

目前,我认为我的模型非常适合数据,以至于过度拟合。但是,我不确定它是否过拟合,因为在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 个答案:

答案 0 :(得分:1)

对于问题1,how do I identify and remove these 'weak' indicators?,您应该专注于功能选择:有监督还是无监督。有监督的特征选择方法包括相关性,缺失值处理等方法,而无监督的特征提取方法则是主成分分析,因子分析。这里的想法是减少数据维数,以便保留占最大方差的特征,而舍弃具有低方差的特征。

对于Question 2: How can I improve this model overall?,请关注5-fold10-fold交叉验证方案。要确定提高精度的最佳树木数量,请参阅以下类似问题:12345

下面是问题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