7

Tôi đã cố gắng sử dụng GradientBoostingClassifier trong scikit-learn và nó hoạt động tốt với các tham số mặc định của nó. Tuy nhiên, khi tôi cố thay thế BaseEstimator bằng một trình phân loại khác, nó không hoạt động và đưa cho tôi lỗi sau,GradientBoostingClassifier với BaseEstimator trong scikit-learn?

return y - np.nan_to_num(np.exp(pred[:, k] - 
IndexError: too many indices 

Bạn có giải pháp nào cho vấn đề.

Lỗi này có thể được tái tạo bằng cách sử dụng các đoạn sau:

import numpy as np 
from sklearn import datasets 
from sklearn.ensemble import GradientBoostingClassifier 
from sklearn.linear_model import LogisticRegression 
from sklearn.utils import shuffle 

mnist = datasets.fetch_mldata('MNIST original') 
X, y = shuffle(mnist.data, mnist.target, random_state=13) 
X = X.astype(np.float32) 
offset = int(X.shape[0] * 0.01) 
X_train, y_train = X[:offset], y[:offset] 
X_test, y_test = X[offset:], y[offset:] 

### works fine when init is None 
clf_init = None 
print 'Train with clf_init = None' 
clf = GradientBoostingClassifier((loss='deviance', learning_rate=0.1, 
          n_estimators=5, subsample=0.3, 
          min_samples_split=2, 
          min_samples_leaf=1, 
          max_depth=3, 
          init=clf_init, 
          random_state=None, 
          max_features=None, 
          verbose=2, 
          learn_rate=None) 
clf.fit(X_train, y_train) 
print 'Train with clf_init = None is done :-)' 

print 'Train LogisticRegression()' 
clf_init = LogisticRegression(); 
clf_init.fit(X_train, y_train); 
print 'Train LogisticRegression() is done' 

print 'Train with clf_init = LogisticRegression()' 
clf = GradientBoostingClassifier(loss='deviance', learning_rate=0.1, 
          n_estimators=5, subsample=0.3, 
          min_samples_split=2, 
          min_samples_leaf=1, 
          max_depth=3, 
          init=clf_init, 
          random_state=None, 
          max_features=None, 
          verbose=2, 
          learn_rate=None) 
clf.fit(X_train, y_train) # <------ ERROR!!!! 
print 'Train with clf_init = LogisticRegression() is done' 

Đây là HTE hoàn traceback của lỗi:

Traceback (most recent call last): 
File "/home/mohsena/Dropbox/programing/gbm/gb_with_init.py", line 56, in <module> 
    clf.fit(X_train, y_train) 
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/gradient_boosting.py", line 862, in fit 
    return super(GradientBoostingClassifier, self).fit(X, y) 
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/gradient_boosting.py", line 614, in fit random_state) 
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/gradient_boosting.py", line 475, in _fit_stage 
    residual = loss.negative_gradient(y, y_pred, k=k) 
File "/usr/local/lib/python2.7/dist-packages/sklearn/ensemble/gradient_boosting.py", line 404, in negative_gradient 
    return y - np.nan_to_num(np.exp(pred[:, k] - 
    IndexError: too many indices 

Trả lời

4

Theo đề nghị của scikit-học phát triển, vấn đề có thể được giải quyết bằng cách sử dụng một bộ chuyển đổi như thế này:

def __init__(self, est): 
    self.est = est 
def predict(self, X): 
    return self.est.predict_proba(X)[:, 1] 
def fit(self, X, y): 
    self.est.fit(X, y) 
+0

Xin chào, tôi đang gặp phải lỗi rất giống với GBC và LR: y_pred [:, k] + = learning_rate * tree.predict (X) .ravel() IndexError: quá nhiều chỉ mục - đã cố gắng sử dụng ý tưởng bộ điều hợp của bạn nhưng không có, lỗi vẫn còn. Bạn có ý tưởng nào để giải quyết vấn đề này không? – abalogh

3

Gradient Đẩy mạnh thường đòi hỏi người học cơ sở là một thuật toán mà thực hiện dự đoán số, không phân loại. Tôi cho rằng đó là vấn đề của bạn.

+0

Cảm ơn nhận xét của bạn. Nếu bạn xem sklearn/ensemble/gradient_boosting.py, bạn có thể thấy rằng nó có hỗ trợ cho các vấn đề phân loại (tìm esidual = loss.negative_gradient (y, y_pred, k = k)) – iampat

+0

Tăng cường Gradient vốn đã là hồi quy thuật toán. Nó có thể được điều chỉnh để phân loại với một chức năng mất mát thích hợp. Tôi không có thời gian để đọc tất cả mã của họ, nhưng điều đó không có nghĩa là nó không sử dụng bộ hồi quy để thực hiện phân loại. Hàm mất ít nhất của Squares sử dụng cùng một phương thức. Tôi sẽ thử một bộ hồi quy phi tuyến tính khác trước để xem liệu vấn đề có thực sự là bạn nên sử dụng thuật toán hồi quy hay không. Tôi chưa bao giờ thấy bất kỳ ai sử dụng Gradient Boosting với thuật toán không hồi quy. –

8

Một phiên bản cải tiến của câu trả lời của và hiệu chỉnh nhỏ scikit-developers 'iampat câu trả lời s nên làm lừa.

class init: 
    def __init__(self, est): 
     self.est = est 
    def predict(self, X): 
     return self.est.predict_proba(X)[:,1][:,numpy.newaxis] 
    def fit(self, X, y): 
     self.est.fit(X, y) 
4

Đây là một phiên bản đơn giản và hoàn chỉnh của đoạn mã của iampat.

class RandomForestClassifier_compability(RandomForestClassifier): 
     def predict(self, X): 
      return self.predict_proba(X)[:, 1][:,numpy.newaxis] 
    base_estimator = RandomForestClassifier_compability() 
    classifier = GradientBoostingClassifier(init=base_estimator) 
Các vấn đề liên quan