Функция потери градиентного повышающего классификатора со склеарном - операнды нельзя передавать вместе

У меня проблема с методом estimator.loss_ для классификатора повышения градиента sklearn. Я пытаюсь составить график ошибки теста по сравнению с ошибкой тренировки во времени. Вот некоторые из моих подготовительных данных:

# convert data to numpy array
train = np.array(shuffled_ds)

#label encode neighborhoods
for i in range(train.shape[1]):
if i in [1,2]:
    print(i,list(train[1:5,i]))
    lbl = preprocessing.LabelEncoder()
    lbl.fit(list(train[:,i]))
    train[:,i] = lbl.transform(train[:,i])
print('neighborhoods & crimes encoded')

#create target vector
y_crimes = train[::,1]
train=np.delete(train,1,1)
print(y_crimes)

#arrays to float
train = train.astype(float)
y_crimes = y_crimes.astype(float)

#data holdout for testing
X_train, X_test, y_train, y_test = cross_validation.train_test_split(
    train, y_crimes, test_size=0.4, random_state=0)
print('test data created')

#train model and check train vs test error
print('begin training...')
est=GBC(n_estimators = 3000,learning_rate=.1,max_depth=4,max_features=1,min_samples_leaf=3)
est.fit(X_train,y_train)
print('done training')

В этот момент, когда я распечатываю свои формы массива с

print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)

Я получил:

(18000, 9)
(12000, 9)
(18000,)
(12000,)

соответственно.

Таким образом, мои формы совместимы в соответствии с документацией sklearn. Но затем я пытаюсь заполнить вектор результатов теста, чтобы я мог отобразить его для сравнения наряду с моей ошибкой обучения как таковой:

test_score=np.empty(len(est.estimators_))
for i, pred in enumerate(est.staged_predict(X_test)):
    test_score[i] = est.loss_(y_test,pred)

и я получаю следующую ошибку:

: operands could not be broadcast together with shapes (12000,47) (12000,) 
         return np.sum(-1 * (Y * pred).sum(axis=1) +
543    544else:ValueError

Я не уверен, откуда идет этот 47. Я использовал эту же процедуру ранее для другого набора данных и не было никаких проблем. Любая помощь приветствуется.

1 ответ

Решение

Вы выпустили эту ошибку, потому что вы должны передать результат метода staged_decision_function (вместо staged_predict) в loss_

Посмотри здесь Градиентная регуляризация

clf = ensemble.GradientBoostingClassifier(**params)
clf.fit(X_train, y_train)

# compute test set deviance
test_deviance = np.zeros((params['n_estimators'],), dtype=np.float64)

for i, y_pred in enumerate(clf.staged_decision_function(X_test)):
    # clf.loss_ assumes that y_test[i] in {0, 1}
    test_deviance[i] = clf.loss_(y_test, y_pred)
Другие вопросы по тегам