Scikit learn 使用GridSearchCV和使用大数据的RandomForestClassifier时出现的问题,总是显示召回分数=1,因此最佳参数变得多余

Scikit learn 使用GridSearchCV和使用大数据的RandomForestClassifier时出现的问题,总是显示召回分数=1,因此最佳参数变得多余,scikit-learn,random-forest,large-data,grid-search,precision-recall,Scikit Learn,Random Forest,Large Data,Grid Search,Precision Recall,这是我的第一个问题,我需要帮助!我自己也在通过实验来寻找答案,但我希望社区里的人能帮上忙 这是我在大学的论文,所以任何帮助都将不胜感激 我将尽可能地总结: 我正在使用Scikit学习分类器,并尝试使用GridSearchCV对其进行调整/CV,以形成未来使用Keras/Tensorflow的基线。 我目前的问题在于RandomForestClassifier/GridSearchCV。 我正在使用大量数据。来自Kaggle的信用卡欺诈数据 数据不平衡,因此我使用SMOTE进行过采样,使0类和1

这是我的第一个问题,我需要帮助!我自己也在通过实验来寻找答案,但我希望社区里的人能帮上忙

这是我在大学的论文,所以任何帮助都将不胜感激

我将尽可能地总结:

  • 我正在使用Scikit学习分类器,并尝试使用GridSearchCV对其进行调整/CV,以形成未来使用Keras/Tensorflow的基线。
  • 我目前的问题在于RandomForestClassifier/GridSearchCV。
  • 我正在使用大量数据。来自Kaggle的信用卡欺诈数据
  • 数据不平衡,因此我使用SMOTE进行过采样,使0类和1类(欺诈)的训练分割相等。每人大约20万英镑。
现在来解释问题:

  • 当我在RandomForestClassifier上为该数据运行此GridSearchCV时,召回分数始终为=1。这意味着没有特定参数被选为“最佳”。我也不明白为什么这总是1。这大约需要6-8个小时才能运行,因此,如果每次迭代都有recall=1,这将变得毫无意义。
  • 但是,当我对数据进行单一拟合(无GridsearchCV)并进行预测测试时。我得到大约80-84%的分数结果(再次对回忆感兴趣)。这当然更现实。
我的想法/实验:

  • 我尝试对数据进行采样,每个类采样492次,每次GSCV迭代的采样率约为90%。似乎更好,但仍明显高于平均水平。
  • 还尝试了不同的训练集大小(50000、100000,…),并且每次迭代的召回率都为1。
我的猜测是,有太多的数据/过度拟合/关于为什么会发生这种情况。或者,我认为Gridsearch采用的是总体/非欺诈分类指标,在这些情况下接近1

下面是在{0:200000,1:200000}训练集上运行GSCV的输出图片: 正如你所看到的,在对模型进行测试/预测后,我们在分类报告中得到了一个似乎有效的80%ish指标,每个折叠的分数为1

我知道测试集中有相当少的欺诈案例(只有几百个)。但这是因为我只对训练数据进行了过度采样,以保持新的(看不见的)测试数据

因此,通过查看分类报告,我认为GridSearchCV可能采用了错误的值(即,我们对class=1指标感兴趣)。然而,在查看文档时,在skikit learn的记分器中,Pos_label=1是默认值。所以这不应该是问题所在

我尝试过自定义记分器/默认记分器等

这是我的代码(有点凌乱,但应该清楚发生了什么!注意注释掉的单个RF分类器,没有GridSearch):

将熊猫作为pd导入
将matplotlib.pyplot作为plt导入
将numpy作为np导入
进口itertools
数据=pd.read\u csv(“creditcard.csv”)
#对“金额”列进行规格化和重塑,使其值介于-1和1之间
从sklearn.preprocessing导入StandardScaler
数据['norm_Amount']=StandardScaler().fit_transform(数据['Amount'].重塑(-1,1))
#删除“旧金额”列和“时间”列,因为我们不希望在此阶段包含此内容
data=data.drop(['Time','Amount'],axis=1)
从sklearn.linear_模型导入逻辑回归
从sklearn.model_selection导入训练测试_split、KFold、cross_val_score、GridSearchCV
从sklearn.metrics导入混淆矩阵、精度回忆曲线、auc、roc回忆分数、roc回忆分数、分类报告
########################################################
#模型设置
#分配与行数据及其类值对应的变量x和y
X=data.ix[:,data.columns!=“类”]
y=data.ix[:,data.columns=='Class']
#整个数据集,训练测试数据拆分
X_序列,X_测试,y_序列,y_测试=序列测试分割(X,y,测试大小=0.3,随机状态=0)
从收款进口柜台
从IMBRearn.over_采样导入SMOTE
sm=SMOTE(随机状态=1)
X_res,y_res=sm.拟合样本(X_序列,y_序列)
打印('原始数据集形状{}'。格式(计数器(数据['Class']))
打印('Training dataset shape{}'。格式(计数器(y_train['Class']))
打印('Resampled training dataset shape{}'。格式(计数器(y_res)))
打印“随机林:”
从sklearn.employ导入随机林分类器
#rf=随机森林分类器(n_估计器=250,准则=“基尼”,最大特征=3,最大深度=10)
rf=随机森林分类器()
参数网格={“n_估计”:[250500750],
“标准”:[“基尼”、“熵”],
“最大功能”:[3,5]}
从sklearn.metrics导入召回评分,生成评分器
记分员=记分员(回忆记分,位置标签=1)
网格搜索=网格搜索cv(rf,参数网格,n_作业=1,cv=3,评分=记分员,详细信息=50)
网格搜索.fit(X\u res,y\u res)
打印grid\u search.best\u参数,grid\u search.best\u估计器_
#射频配合(X_分辨率,y_分辨率)
#y_pred=射频预测(X_测试)
y_pred=网格搜索。预测(X_测试)
从sklearn.metrics导入分类报告
打印分类报告(y_测试,y_预测)
打印“测试回忆分数:”,回忆分数(y_测试,y_pred)
谢谢


哈利

这是一个过度装修的问题。
当使用交叉验证和过采样时,过采样应仅应用于训练数据,而不应用于验证数据,这一点很重要,即对于10倍交叉验证,9倍过采样数据将用作训练集,一倍过采样数据将用作验证集,而无需过采样

看起来您的一些代码被注释掉了。请检查它,如果它与问题无关,请删除它。嗨,tha