Керрас классификатор предсказать проба() не соответствует предсказать()


Я работаю с Keras NN с бэкэндом Aanos, я работаю над проблемой классификации с 14 выходными классами. Мне нужен предсказанный класс плюс связанные с ним вероятности. Проблема в том, что вероятности из predict_proba () не совпадают с предсказанным классом из predict (), вот код плюс результирующий вывод 1 образца.

PPRANK = ['pp1', 'pp2', 'pp3', 'pp4', 'pp5', 'pp6', 'pp7', 'pp8', 'pp9', 'pp10', 'pp11', 'pp12', 'pp13', 'pp14', 'pp15']

FEATURES = (PPRANK)

# fix random seed for reproducibility
seed = 7
np.random.seed(seed)

data_df = pd.DataFrame.from_csv("data.csv")
X = np.array(data_df[FEATURES].values)
Y = (data_df["bres"].replace(14,13).values)


# define baseline model
def baseline_model():
    # create model
    model = Sequential()
    model.add(Dense(8, input_dim=(len(FEATURES)), init='normal', activation='relu'))
    model.add(Dense(14, init='normal', activation='softmax'))
    # Compile model
    model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model
#build model
estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=200, batch_size=5, verbose=0)

#split train and test
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.1, random_state=seed)
estimator.fit(X_train, Y_train)

#get probabilities
predictions = estimator.predict_proba(X_test)

#convert expon to floats
probs = [[] for x in range(21)]
tick2 = 0
for i in range( len( predictions ) ):
    tick = 0
    for x in xrange(14):
        (predictions[i][(tick)]) = '%.4f' % (predictions[i][(tick)])
        probs[(tick2)].append((predictions[i][(tick)]))
        tick += 1
    tick2 += 1

# pprint probabilities
pp = pprint.PrettyPrinter(indent=0)
pp.pprint(probs)

#print class predictions
print estimator.predict(X_test)
print Y_test

Вероятности

[0.00000, 0.00030, 0.02360, 0.04329, 0.00019, 0.00069, 0.00120, 0.00030, 0.00559, 0.00410, 0.00510, 0.91549, 0.0, 0.0]

Предсказанный класс

11

Фактический класс

13

Он показывает, что 12 имеют наибольшую вероятность от predict_proba (), а не 11 от predict (). Спасибо за любую помощь.

1 2

1 ответ:

Индекс массивов python (и здесь классы) отсчитывается от 0, а не от 1. Взгляните еще раз, 0.91-это 12-е значение, поскольку люди считают вещи, но это при индексе = 11, поэтому predict и predict_proba непротиворечивы

Что касается того, почему не 13, предсказание может быть неверным (но убедитесь, что у вас нет такой же ошибки)