2017-04-10 21 views
0

私はバイナリクラシファイアを以下のように定義しました: 'gbc'メソッド(Gradient Boosting Classifier)を使用して呼び出すと、エラーmin_samples_split must be at least 2 or in (0, 1], got 1が最後の行featuresClassesがデータフレームであり、featureLabelsは機能のリストであるmin_samples_splitは少なくとも2または(0、1)である必要があります。1

Binary_classifier(method, featureLabels, featuresClasses): 

    membershipIds = list(set(featuresClasses['membershipId'])) 
    n_membershipIds = len(membershipIds) 

    index_rand = np.random.permutation(n_membershipIds) 
    test_size = int(0.3 * n_membershipIds) 

    membershipIds_test = list(itemgetter(*index_rand[:test_size])(membershipIds)) 
    membershipIds_train = list(itemgetter(*index_rand[test_size+1:])(membershipIds)) 

    data_test = featuresClasses[featuresClasses['membershipId'].isin(membershipIds_test)] 
    data_train = featuresClasses[featuresClasses['membershipId'].isin(membershipIds_train)] 

    data_test = data_test[data_test['standing'].isin([0, 1])] 
    data_train = data_train[data_train['standing'].isin([0, 1])] 

    X_test = data_test[featureLabels].as_matrix() 
    y_test = data_test['standing'].values.astype(int) 

    X_train = data_train[featureLabels].as_matrix() 
    y_train = data_train['standing'].values.astype(int) 

    # -------------------------- Run classifier 
    print 'Binary classification by', method 

    if method == 'svm': 
     classifier = svm.SVC(kernel='linear', probability=True) 
     y_score = classifier.fit(X_train, y_train).decision_function(X_test) 

    elif method == 'gbc': 
     params = {'n_estimators': 200, 'max_depth': 3, 'min_samples_split': 1, 'learning_rate': 0.1, 'loss': 'deviance'} 

     classifier = GradientBoostingClassifier(**params) 
     y_score = classifier.fit(X_train, y_train).predict(X_test) 

答えて

2

GradientBoostingClassifier documentationによれば:

min_samples_split:整数、フロート、オプション(デフォルト= 2)

The minimum number of samples required to split an internal node: 

    If int, then consider min_samples_split as the minimum number. 
    If float, then min_samples_split is a percentage and ceil(min_samples_split * n_samples) 
       are the minimum number of samples for each split. 

あなたのコードは'min_samples_split': 1です。これは有効なケースではありません。その整数の最小値は2です。 1を浮動小数点数として入力したい場合(すなわち、1 *の機能数を意味する)(つまり、すべての機能をmin_samples_splitにしたい場合)、'min_samples_split': 1.0と指定します。 1と指定するとintとみなされ、エラーが発生します。

これは、(0.0、1.0)の代わりに(0,1)として表示されるエラーの相違で、混乱の原因となっています。これはscikit-learnのgithubの問題についても尋ねられています。次のリリース:

+0

@Vivekクマールありがとう – YNr

関連する問題