1

이것은 내 첫 번째 StackOverflow 질문이며 도움이 필요합니다. 나는 철저히 자신과 실험을 통해 답변을 찾았지만 지역 사회의 누군가가 도울 수 있기를 바라고 있습니다.대용량 데이터를 사용하는 RandomForestClassifier에서 GridSearchCV를 사용하여 문제가 발생하여 항상 회수 점수 = 1이므로 가장 좋은 매개 변수가 중복됩니다.

이것은 Uni에서 내 논문을위한 작품이므로 어떤 도움을 주시면 매우 감사하겠습니다.

나는 최선을 가능한 한 요약하려고합니다 : 나는 Keras/Tensorflow와 향후 작업에 대한베이스 라인을 형성, GridSearchCV 그들을 Scikit 배우기 분류 작업 및 조정/CV를 시도하고

  • .
  • 내 문제는 현재 RandomForestClassifier/GridSearchCV에 있습니다.
  • 많은 양의 데이터를 사용하고 있습니다. Kaggle의 신용 카드 사기 데이터 here.
  • 데이터가 불균형이어서 오버 샘플링을 위해 SMOTE를 사용하므로 트레이닝 스플릿이 0 클래스와 1 클래스 (사기) 모두에서 동일합니다. 이것은 각각 약 20 만개입니다. 내가 RandomForestClassifer에이 데이터를이 GridSearchCV을 실행할 때 더 특정 매개 변수는 '최고로 선택 없음을 의미, 리콜 점수는 항상 = 1입니다

    • : 이제

    문제를 설명하기 '. 또한 이것이 왜 항상 1인지 이해할 수 없습니다. 이것은 실행하는 데 약 6-8 시간이 걸리므로 모든 반복에 회수 = 1이면 무의미 해집니다.

  • 그러나 단순히 데이터 (GridsearchCV 없음)를 실행하고 예측 테스트를 수행하면됩니다. 나는 약 80-84 %의 점수 결과를 얻는다 (다시 리콜에 관심이있다). 확실히 더 현실적입니다.

내 생각/실험 :

  • 나는 GSCV 반복 당 약 90 %를 제공, 각 클래스의 492에 데이터를 샘플링에서 시도했다. 여전히 평균 이상으로 나아졌지만 여전히 보입니다.
  • 또한 다양한 교육 세트 크기 (50,000, 100,000, ...)를 시도했으며 각 반복마다 리콜 = 1을 제공합니다.

내 추측으로는 왜 이런 일이 발생했는지에 대한 너무 많은 데이터/overfitting/something이 있습니다. 또는 Gridsearch가 이러한 경우에 1에 가까운 전체/비 사기 분류 측정 기준을 사용하고 있다고 생각했습니다. {: 200,000, 1 : 200,000 0} 트레이닝 세트 : 여기

가에 GSCV를 실행의 출력의 그림입니다 테스트를 할 때 배 아직 각 당신이 볼 수 있듯이,이 GSCV each iteration recall=1 점수 = 1/모델을 통해 예측하면 분류 보고서에서 겉으로보기에는 유효한 80 % 틱 메트릭을 얻습니다.

나는 테스트 세트가 사기 경우가 아주 적다는 것을 안다.그러나 이것은 새로운 (보이지 않는) 테스트 데이터를 유지하기 위해 교육 데이터를 오버 샘플링했기 때문에 발생했습니다.

그래서 분류 보고서를 보면 GridSearchCV가 잘못된 값을 사용할 수 있다고 생각했습니다. 즉, 클래스 = 1 측정 항목에 관심이 있습니다. 그러나 docs를 보면서, Pos_label = 1은 skikit-learn의 scorers에서 기본값입니다. 그래서 이것이 문제가되어서는 안됩니다.

내가 시도 지정 득점/기본 득점 등 여기

내 코드 (조금 지저분하지만 무슨 일이 일어나고 있는지 명확해야 주석 단일 RF 분류를 참고 GridSearch없이!)입니다 :

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np 
import itertools 

data = pd.read_csv("creditcard.csv") 

# Normalise and reshape the Amount column, so it's values lie between -1 and 1 
from sklearn.preprocessing import StandardScaler 
data['norm_Amount'] = StandardScaler().fit_transform(data['Amount'].reshape(-1,1)) 

# Drop the old Amount column and also the Time column as we don't want to include this at this stage 
data = data.drop(['Time', 'Amount'], axis=1) 

from sklearn.linear_model import LogisticRegression 
from sklearn.model_selection import train_test_split, KFold, cross_val_score, GridSearchCV 
from sklearn.metrics import confusion_matrix,precision_recall_curve,auc,roc_auc_score,roc_curve,recall_score,classification_report 

######################################################## 
# MODEL SETUP 

# Assign variables x and y corresponding to row data and it's class value 
X = data.ix[:, data.columns != 'Class'] 
y = data.ix[:, data.columns == 'Class'] 

# Whole dataset, training-test data splitting 
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 0) 

from collections import Counter 
from imblearn.over_sampling import SMOTE 
sm = SMOTE(random_state=1) 
X_res, y_res = sm.fit_sample(X_train, y_train) 
print('Original dataset shape {}'.format(Counter(data['Class']))) 
print('Training dataset shape {}'.format(Counter(y_train['Class']))) 
print('Resampled training dataset shape {}'.format(Counter(y_res))) 



print 'Random Forest: ' 
from sklearn.ensemble import RandomForestClassifier 

# rf = RandomForestClassifier(n_estimators=250, criterion="gini", max_features=3, max_depth=10) 

rf = RandomForestClassifier() 
param_grid = { "n_estimators"  : [250, 500, 750], 
      "criterion"   : ["gini", "entropy"], 
      "max_features"  : [3, 5]} 

from sklearn.metrics import recall_score, make_scorer 
scorer = make_scorer(recall_score, pos_label=1) 


grid_search = GridSearchCV(rf, param_grid, n_jobs=1, cv=3, scoring=scorer, verbose=50) 
grid_search.fit(X_res, y_res) 
print grid_search.best_params_, grid_search.best_estimator_ 

# rf.fit(X_res, y_res) 
# y_pred = rf.predict(X_test) 
y_pred = grid_search.predict(X_test) 
from sklearn.metrics import classification_report 
print classification_report(y_test, y_pred) 
print 'Test recall score: ', recall_score(y_test, y_pred) 

감사합니다,

해리

+0

일부 코드가 주석 처리 된 것으로 보입니다. 검토하고 질문과 관련이없는 경우 제거하십시오. –

+0

안녕하세요, 감사합니다. 관련없는 코드를 삭제했습니다. 나머지 코드는 모두 관련이 있으며 잘하면 분명합니다. –

답변

0

이것은 overfitting의 문제이다. 오버 샘플링과 교차 유효성 검사를 사용할 때는 오버 샘플링을 학습 데이터에만 적용해야하지만 유효성 검사 데이터에는 적용하지 말아야합니다. 즉, 10 배 교차 유효성 검사의 경우 9 배 오버 샘플 데이터가 교육 세트로 사용되고, 오버 샘플링없이 유효성 검사 세트로 배