Использование важности перестановки eli5 в изображениях 32x32 - PullRequest
1 голос
/ 16 января 2020

Я сгенерировал модель keras` (python) из своего набора данных для обучения 32x32 изображения. Теперь я создаю numpy dataX с 100 проверочными изображениями:

print(dataX.shape)
(100, 32, 32, 1) 

Итак, мы можем заметить, что есть 100 изображений размером 32x32 и 1 канал. Когда я запускаю следующий код:

predictions = model.predict(dataX)
y_pred=predictions.argmax(axis=1).astype(int)

В результате получается форма (100,) y_pred: моя модель работает, а dataX имеет правильную форму.

Итак, я хочу использовать python Значение перестановки eli5 в данных dataX. Примерно так:

from eli5.sklearn import PermutationImportance
perm = PermutationImportance(my_model, random_state = 1).fit(dataX, y_true)

(y_true - истинные метки для dataX) Но у меня есть проблема, так как кажется, что PermutationImportance ожидает (100, число функций) данных (а не 100,32, 32,1). Возможно (100,1024) матрица.

Итак, я попытался создать класс, который мог бы преобразовать форму данных до подбора, предсказать. Примерно так (учитывая image_size = 32):

class Model_PI:
    def __init__(self, model):
          self.model=model

    def predict(self,X,y):
        X_=X.reshape(X.shape[0],image_size,image_size,1)
        return self.model.predict(X_,y)

    def fit(self,X,y):
        X_=X.reshape(X.shape[0],image_size,image_size,1)
        return self.model.fit(X_,y)

    def score(self, X, y, sample_weight=None):
        from sklearn.metrics import accuracy_score
        return accuracy_score(y, self.predict(X,y), sample_weight=sample_weight)

my_model=Model_PI(model) 

и я использовал my_model вместо модели. Но когда я пытаюсь

perm = PermutationImportance(my_model, random_state = 1).fit(dX, y_pred)

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

TypeError                                 Traceback (most recent call last)
<ipython-input-73-2095af31af97> in <module>
----> 1 perm = PermutationImportance(my_model, random_state = 1).fit(dX, y_pred)

~/anaconda3/envs/explicabilidade/lib/python3.6/site-packages/eli5/sklearn/permutation_importance.py in fit(self, X, y, groups, **fit_params)
    200             si = self._cv_scores_importances(X, y, groups=groups, **fit_params)
    201         else:
--> 202             si = self._non_cv_scores_importances(X, y)
    203         scores, results = si
    204         self.scores_ = np.array(scores)

~/anaconda3/envs/explicabilidade/lib/python3.6/site-packages/eli5/sklearn/permutation_importance.py in _non_cv_scores_importances(self, X, y)
    224     def _non_cv_scores_importances(self, X, y):
    225         score_func = partial(self.scorer_, self.wrapped_estimator_)
--> 226         base_score, importances = self._get_score_importances(score_func, X, y)
    227         return [base_score] * len(importances), importances
    228 

~/anaconda3/envs/explicabilidade/lib/python3.6/site-packages/eli5/sklearn/permutation_importance.py in _get_score_importances(self, score_func, X, y)
    229     def _get_score_importances(self, score_func, X, y):
    230         return get_score_importances(score_func, X, y, n_iter=self.n_iter,
--> 231                                      random_state=self.rng_)
    232 
    233     @property

~/anaconda3/envs/explicabilidade/lib/python3.6/site-packages/eli5/permutation_importance.py in get_score_importances(score_func, X, y, n_iter, columns_to_shuffle, random_state)
     84     """
     85     rng = check_random_state(random_state)
---> 86     base_score = score_func(X, y)
     87     scores_decreases = []
     88     for i in range(n_iter):

~/anaconda3/envs/explicabilidade/lib/python3.6/site-packages/sklearn/metrics/_scorer.py in _passthrough_scorer(estimator, *args, **kwargs)
    369 def _passthrough_scorer(estimator, *args, **kwargs):
    370     """Function that wraps estimator.score"""
--> 371     return estimator.score(*args, **kwargs)
    372 
    373 

<ipython-input-69-eeb6ee36656d> in score(self, X, y, sample_weight)
     13     def score(self, X, y, sample_weight=None):
     14         from sklearn.metrics import accuracy_score
---> 15         return accuracy_score(y, self.predict(X,y), sample_weight=sample_weight)
     16 
     17 my_model=Model_PI(model)

<ipython-input-69-eeb6ee36656d> in predict(self, X, y)
      5     def predict(self,X,y):
      6         X_=X.reshape(X.shape[0],image_size,image_size,1)
----> 7         return self.model.predict(X_,y)
      8 
      9     def fit(self,X,y):

~/anaconda3/envs/explicabilidade/lib/python3.6/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose, steps)
   1167                                             batch_size=batch_size,
   1168                                             verbose=verbose,
-> 1169                                             steps=steps)
   1170 
   1171     def train_on_batch(self, x, y,

~/anaconda3/envs/explicabilidade/lib/python3.6/site-packages/keras/engine/training_arrays.py in predict_loop(model, f, ins, batch_size, verbose, steps)
    280         # Sample-based predictions.
    281         outs = []
--> 282         batches = make_batches(num_samples, batch_size)
    283         index_array = np.arange(num_samples)
    284         for batch_index, (batch_start, batch_end) in enumerate(batches):

~/anaconda3/envs/explicabilidade/lib/python3.6/site-packages/keras/engine/training_utils.py in make_batches(size, batch_size)
    369     num_batches = (size + batch_size - 1) // batch_size  # round up
    370     return [(i * batch_size, min(size, (i + 1) * batch_size))
--> 371             for i in range(num_batches)]
    372 
    373 

TypeError: only integer scalar arrays can be converted to a scalar index

Кстати, я создал метод оценки, потому что это была ошибка, когда я пытался запустить выше код. Но сейчас я застрял. Есть идеи ? или, есть ли лучший способ выполнить PermitationImportance тренировки с изображениями (размер данных 100,32,32,1 вместо 100,1024)

Заранее спасибо

1 Ответ

1 голос
/ 16 января 2020

После некоторого тестирования, вот код класса, который отлично работает:

class Model_PI:
    def __init__(self, model,X):
        self.model=model

    def predict(self,X):
        X_=X.reshape(X.shape[0],image_size,image_size,1)
        return self.model.predict(X_).argmax(axis=1).astype(int)

    def fit(self,X,y):
        X_=X.reshape(X.shape[0],image_size,image_size,1)
        return self.model.fit(X_,y)

    def score(self, X, y, sample_weight=None):
        result=(y==self.predict(X)).sum()/y.shape[0]
        return result


my_model=Model_PI(model,dataX)

Спасибо всем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...