2017-04-14 4 views
0

Sklearn에서 GradientBoostingClassifier를 실행 중이며 자세한 출력에서 ​​일부 이상한 출력이 표시됩니다. 나는 전체 데이터 세트에서 무작위로 10 % 샘플을 가져오고 있으며, 대부분은 괜찮은 것 같지만 때로는 이상한 출력과 좋지 않은 결과를 얻습니다. 누군가가 무슨 일이 일어나는지 설명해 주시겠습니까?Scikit에서 버그 - GradientBoostingClassifier 알아보기?

"좋은"결과 :

n features = 168 
GradientBoostingClassifier(criterion='friedman_mse', init=None, 
       learning_rate=0.01, loss='deviance', max_depth=4, 
       max_features=None, max_leaf_nodes=None, 
       min_impurity_split=1e-07, min_samples_leaf=1, 
       min_samples_split=2, min_weight_fraction_leaf=0.0, 
       n_estimators=2000, presort='auto', random_state=None, 
       subsample=1.0, verbose=1, warm_start=False) 
     Iter  Train Loss Remaining Time 
     1   0.6427   40.74m 
     2   0.6373   40.51m 
     3   0.6322   40.34m 
     4   0.6275   40.33m 
     5   0.6230   40.31m 
     6   0.6187   40.18m 
     7   0.6146   40.34m 
     8   0.6108   40.42m 
     9   0.6071   40.43m 
     10   0.6035   40.28m 
     20   0.5743   40.12m 
     30   0.5531   39.74m 
     40   0.5367   39.49m 
     50   0.5237   39.13m 
     60   0.5130   38.78m 
     70   0.5041   38.47m 
     80   0.4963   38.34m 
     90   0.4898   38.22m 
     100   0.4839   38.14m 
     200   0.4510   37.07m 
     300   0.4357   35.49m 
     400   0.4270   33.87m 
     500   0.4212   31.77m 
     600   0.4158   29.82m 
     700   0.4108   27.74m 
     800   0.4065   25.69m 
     900   0.4025   23.55m 
     1000   0.3987   21.39m 
     2000   0.3697   0.00s 
predicting 
this_file_MCC = 0.5777 

"나쁜"결과 :

Training the classifier 
n features = 168 
GradientBoostingClassifier(criterion='friedman_mse', init=None, 
       learning_rate=1.0, loss='deviance', max_depth=5, 
       max_features='sqrt', max_leaf_nodes=None, 
       min_impurity_split=1e-07, min_samples_leaf=1, 
       min_samples_split=2, min_weight_fraction_leaf=0.0, 
       n_estimators=500, presort='auto', random_state=None, 
       subsample=1.0, verbose=1, warm_start=False) 
     Iter  Train Loss Remaining Time 
     1   0.5542   1.07m 
     2   0.5299   1.18m 
     3   0.5016   1.14m 
     4   0.4934   1.16m 
     5   0.4864   1.19m 
     6   0.4756   1.21m 
     7   0.4699   1.24m 
     8   0.4656   1.26m 
     9   0.4619   1.24m 
     10   0.4572   1.26m 
     20   0.4244   1.27m 
     30   0.4063   1.24m 
     40   0.3856   1.20m 
     50   0.3711   1.18m 
     60   0.3578   1.13m 
     70   0.3407   1.10m 
     80   0.3264   1.09m 
     90   0.3155   1.06m 
     100   0.3436   1.04m 
     200   0.3516   46.55s 
     300  1605.5140   29.64s 
     400 52215150662014.0469   13.70s 
     500 585408988869401440279216573629431147797247696359586211550088082222979417986203510562624281874357206861232303015821113689812886779519405981626661580487933040706291550387961400555272759265345847455837036753780625546140668331728366820653710052494883825953955918423887242778169872049367771382892462080.0000   0.00s 
predicting 
this_file_MCC = 0.0398 
+0

이 문제의 원인이되는 데이터 샘플을 찾을 수 있습니까? –

+0

약 1 백만 행이있는 데이터 집합의 "물음표 샘플"에 대한 교육입니다. 각 샘플에는 약 100,000 개의 행이 있습니다. 오류없이 동일한 샘플 파일에서 sklearn.ensemble.ExtraTreesClassifier를 실행 한 이후 입력 데이터에 문제가없는 것 같습니다. – denson

+0

확인. 저는 sklearn에 버그를 넣을 재현 가능한 예제를 가질 수 있도록 요청했습니다. –

답변

1

"나쁜"예를 들어, 귀하의 학습 속도가 너무 높고 로컬 또는 글로벌 최소값 이상 뛰어 오르고있다 Gradient Boosting 알고리즘의 그래디언트 디센트 단계에서. 이로 인해 발산 상황이 발생하고보고있는 오류가 폭발적으로 발생합니다. this lecture from Andrew Ng's Machine Learning Course을보십시오. 학습 비율에 관련된 부분은 약 4:30에옵니다.

골짜기/언덕의 바닥이나 꼭대기에 이상적으로 또는 이상적으로 가장 낮거나 가장 높은 지점으로가는 길을 찾기 위해 Gradient Descent/Ascent를 생각해보십시오. 언덕/계곡이 매우 크고 작은 계단을 취하면 궁극적으로 최소 최소/최대 점까지 길을 찾을 수 있어야합니다. 그러나 언덕/계곡이 계단의 크기에 비례하여 작 으면 맥시마/미니 마를 뛰어 넘어 어디 까지나 끔찍한 짓을하게됩니다. 학습 속도는 학습 속도 (알파)가 0.01 인 "좋은"사례에서 단계의 크기를 나타냅니다. 따라서 극한에 도달 할 때까지 올바른 방향 (대부분)으로 작은 단계를 수행 할 수 있었지만 "나쁜"경우 알파는 1.0 이었으므로 큰 단계를 밟았고 로컬 미니 마 위로 바로 뛰어 올라 오름차순으로 오름차순으로 올라갔습니다. 그 학습 속도가 알고리즘 내에서 무엇을하는지에 대한 정말 기본적인 사고 방식입니다.

tuning the learning rate on DatumBox에서이 기사를 읽으면 누가이 이미지를 누가 훔쳐 갔는지 확실치 않은 재활용 시각화가 보입니다.하지만 어디에서나 볼 수 있습니다. 학습 속도를 적절하게 변경하는 방법에 대해 약간 논의하십시오. 이것이 sklearn의 기본값인지 확실하지 않지만 그것을 믿을 수는 없습니다.

+0

나는 무작위로 매개 변수를 선택했기 때문에 어떤 조합은 "나쁘다"는 것을 알았습니다. 그러나 GradientBoostingClassifier는 문제가 발생했을 때 쓰레기를 출력하는 것 같습니다. 일부 입력 샘플의 경우 동일한 매개 변수가 실제로 올바르게 작동하고 상당히 높은 성능을 생성합니다. – denson

+0

이것은 임의의 시드의 결과 일 가능성이 큽니다. 고정 된 씨앗을 사용하고 있습니까? 하강을 시작하는 곳을 기준으로하지 않으면 일부 매개 변수가 때때로 작동하지만 다른 매개 변수는 작동하지 않을 수 있습니다. – Grr

+0

최적의 모델을 찾는 경우 매개 변수를 무작위로 지정하는 것보다 grid_serch를 사용하는 것이 좋습니다. – Grr