【问题标题】:randomForest: Credit card fraud advicerandomForest:信用卡欺诈建议
【发布时间】:2019-10-24 11:27:49
【问题描述】:

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

我有一个包含大约 280,000 行和 31 列的数据集。该数据集包含信用卡交易记录,并标记了欺诈交易。 99.8% 的数据是合法交易,0.2% 的数据是欺诈性的。由于数据如此不平衡,我使用加权随机森林对 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"))

【问题讨论】:

    标签: r classification random-forest


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 2019-02-25
      • 2011-06-08
      • 1970-01-01
      • 2010-11-10
      • 2012-02-12
      • 2013-01-14
      • 2015-02-21
      • 2019-10-27
      相关资源
      最近更新 更多