Я сгенерировал модель 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)
Заранее спасибо