数据源: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"))
答案 0 :(得分:1)
对于问题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