2013-07-21 3 views
0

Я пытаюсь использовать AdaBoostClassifier с пеной дерева решений в качестве базового классификатора. Я заметил, что корректировка веса, производимая AdaBoostClassifier, давала мне ошибки как для параметров SAMME.R, так и для SAMME.проблемы с весом в adiboost scikit-learn

Вот краткий обзор того, что я делаю

def train_adaboost(features, labels): 
    uniqLabels = np.unique(labels) 
    allLearners = [] 
    for targetLab in uniqLabels: 
     runs=[] 
     for rrr in xrange(10): 
      feats,labs = get_binary_sets(features, labels, targetLab) 
      baseClf = DecisionTreeClassifier(max_depth=1, min_samples_leaf=1) 
      baseClf.fit(feats, labs) 

      ada_real = AdaBoostClassifier(base_estimator=baseClf, 
              learning_rate=1, 
              n_estimators=20, 
              algorithm="SAMME") 
      runs.append(ada_real.fit(feats, labs)) 
     allLearners.append(runs) 

    return allLearners 

Я смотрел на подгонке для каждого отдельного дерева решений классификатора, и они могут предсказать некоторые ярлыки. Однако, когда я смотрю на AdaBoostClassifier, используя этот базовый классификатор, я получаю ошибки в алгоритме повышения веса.

def compute_confidence(allLearners, dada, labbo): 
    for ii,thisLab in enumerate(allLearners): 
     for jj, thisLearner in enumerate(thisLab): 
      #accessing thisLearner's methods here 

методы дают ошибки, подобные этим:

ipdb> thisLearner.predict_proba(myData)

PATHTOPACKAGE/lib/python2.7/site-packages/sklearn/ensemble/weight_boosting.py:727: RuntimeWarning: invalid value encountered in double_scalars proba /= self.estimator_weights_.sum() *** ValueError: 'axis' entry is out of bounds

ipdb> thisLearner.predict(myData)

PATHTOPACKAGE/lib/python2.7/site-packages/sklearn/ensemble/weight_boosting.py:639: RuntimeWarning: invalid value encountered in double_scalars pred /= self.estimator_weights_.sum() *** IndexError: 0-d arrays can only use a single() or a list of newaxes (and a single ...) as an index

Я попытался SAMME.R аль gorithm для AdaBoost, но я не могу поместиться даже AdaBoost в этом случае из-за этой ошибки [...]

File "PATH/sklearn/ensemble/weight_boosting.py", line 388, in fit return super(AdaBoostClassifier, self).fit(X, y, sample_weight)

File "PATH/sklearn/ensemble/weight_boosting.py", line 124, in fit X_argsorted=X_argsorted)

File "PATH/sklearn/ensemble/weight_boosting.py", line 435, in _boost X_argsorted=X_argsorted)

File "PATH/sklearn/ensemble/weight_boosting.py", line 498, in _boost_real (estimator_weight < 0)))

ValueError: non-broadcastable output operand with shape (1000) doesn't match the broadcast shape (1000,1000)

размеры данных фактически совместимы с форматом, который ожидает классификатор, как до использования adaboost, так и при попытке проверить обученные классификаторы. Что означают эти ошибки?

+0

Не могли бы вы описать, что 'myData' в терминах типа (массив или список?), dtype, shape. – ogrisel

+0

Конечно. В случае, когда я получал эти ошибки, типы, dtype и shape были такими же, как для myData (использовались как подвиги ниже) и лабораторий. Для умений: dtype ('float64'), , (1000, 20) Для лабораторий: dtype ('int8'), , (1000, 1). Решение было тривиально для проблемы (я написал ответ ниже), я просто не был знаком с формами массива python. – aarslan

ответ

1

Ну, это было немного противоречиво, исходя из кодирования в Matlab.

По-видимому, размеры лабораторий были проблемой, которая равна (1000,1). Она должна быть (1000,)

Добавив эту строку решить ее:

лабораторий = лабораторий [:, 0]

Смежные вопросы