2017-02-09 3 views
2

Theanos 백엔드가있는 Keras NN과 협력 중이며 14 가지 출력 클래스로 분류 문제를 해결하고 있습니다. 예상 클래스와 관련 확률을 원합니다. 문제는 predict_proba()의 확률이 predict()의 예측 클래스와 일치하지 않는 것입니다. 여기에 코드와 1 샘플의 결과 출력이 더해집니다.Keras 분류 자 ​​predict_proba()가 predict()와 일치하지 않습니다.

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

predict()에서 11이 아닌 predict_proba()에서 가장 높은 확률을 보이는 12를 보여줍니다. 어떤 도움을 주셔서 감사합니다.

답변

3

파이썬 배열의 색인 (및 여기에 클래스)은 0이 아닌 1부터 계산됩니다. 다시 한 번 살펴 보겠습니다. 0.91은 사람들이 계산하는 12 번째 값이지만 index = 11에 있으므로 predict와 predict_proba는 일관됩니다

왜 13이 아니겠습니까? 예측이 잘못되었을 수 있습니다 (단, 같은 종류의 오류가 없는지 확인하십시오)