Keras 分类器 predict_proba() 与 predict() 不匹配
Keras classifier predict_proba() doesn't match predict()
我正在使用 Keras Theano 后端处理 14 classes 的 classification 问题。我想要预测的 class 加上相关的概率。问题是 predict_proba()
的概率似乎与 predict()
的预测 class 不匹配,这里是代码加上 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
结果:
#probabilities
[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]
#predicted class
11
#actual class
13
它显示 predict_proba()
中概率最高的是 12,而不是 predict()
中的 11。
python 数组的索引(这里是 类)从 0 开始计数,而不是从 1 开始计数。再看看,0.91 是人们计数的第 12 个值,但它在索引处= 11 所以 predict
和 predict_proba
是一致的。
至于为什么不是 13,预测很可能是错误的(但请检查您是否有相同类型的错误)。
我正在使用 Keras Theano 后端处理 14 classes 的 classification 问题。我想要预测的 class 加上相关的概率。问题是 predict_proba()
的概率似乎与 predict()
的预测 class 不匹配,这里是代码加上 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
结果:
#probabilities
[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]
#predicted class
11
#actual class
13
它显示 predict_proba()
中概率最高的是 12,而不是 predict()
中的 11。
python 数组的索引(这里是 类)从 0 开始计数,而不是从 1 开始计数。再看看,0.91 是人们计数的第 12 个值,但它在索引处= 11 所以 predict
和 predict_proba
是一致的。
至于为什么不是 13,预测很可能是错误的(但请检查您是否有相同类型的错误)。