Использование MLPClassifier scikit-learn в AdaBoostClassifier - PullRequest
2 голосов
/ 11 апреля 2019

Для проблемы двоичной классификации я хочу использовать MLPClassifier в качестве базовой оценки в AdaBoostClassifier. Однако это не работает, поскольку MLPClassifier не реализует sample_weight, что требуется для AdaBoostClassifier (см. здесь ). До этого я пытался использовать модель Keras и KerasClassifier в AdaBoostClassifier, но это также не работало, как упоминалось здесь .

A way , предложенный пользователем V1nc3nt, заключается в создании собственного MLPclassifier в TensorFlow и учете sample_weight.

Пользователь V1nc3nt поделился значительными частями своего кода, но, поскольку у меня ограниченный опыт работы с Tensorflow, я не могу восполнить недостающие части. Поэтому мне было интересно, нашел ли кто-нибудь работающее решение для создания ансамблей Adaboost из MLP или может помочь мне в завершении решения, предложенного V1nc3nt.

Заранее большое спасибо!

1 Ответ

1 голос
/ 11 апреля 2019

На основании предоставленных вами ссылок я изменил MLPClassifier для размещения sample_weights.

Попробуйте это!

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier

class customMLPClassifer(MLPClassifier):
    def resample_with_replacement(self, X_train, y_train, sample_weight):

        # normalize sample_weights if not already
        sample_weight = sample_weight / sample_weight.sum(dtype=np.float64)

        X_train_resampled = np.zeros((len(X_train), len(X_train[0])), dtype=np.float32)
        y_train_resampled = np.zeros((len(y_train)), dtype=np.int)
        for i in range(len(X_train)):
            # draw a number from 0 to len(X_train)-1
            draw = np.random.choice(np.arange(len(X_train)), p=sample_weight)

            # place the X and y at the drawn number into the resampled X and y
            X_train_resampled[i] = X_train[draw]
            y_train_resampled[i] = y_train[draw]

        return X_train_resampled, y_train_resampled


    def fit(self, X, y, sample_weight=None):
        if sample_weight is not None:
            X, y = self.resample_with_replacement(X, y, sample_weight)

        return self._fit(X, y, incremental=(self.warm_start and
                                            hasattr(self, "classes_")))


X,y = load_iris(return_X_y=True)
adabooster = AdaBoostClassifier(base_estimator=customMLPClassifer())

adabooster.fit(X,y)
...