我想知道是否有人可以快速查看以下代码片段,并指出我在计算模型中每个类别的样本概率和相关代码错误方面存在的误解。我尝试手动计算sklearn函数lm.predict_proba(X)提供的结果,但结果不同,所以我犯了一个错误。
我认为代码步骤“d”中可能存在错误,可能是在数学上,但我不知道原因。
a) 创建和训练逻辑回归模型(运行良好)。
输出结果如下:
注意:
我认为代码步骤“d”中可能存在错误,可能是在数学上,但我不知道原因。
a) 创建和训练逻辑回归模型(运行良好)。
lm = LogisticRegression(random_state=413, multi_class='multinomial', solver='newton-cg')
lm.fit(X, train_labels)
b) 保存系数和偏差(运行正常)
W = lm.coef_
b = lm.intercept_
c) 使用 lm.predict_proba(X)(功能正常)
def reshape_single_element(x,num):
singleElement = x[num]
nx,ny = singleElement.shape
return singleElement.reshape((1,nx*ny))
select_image_number = 6
X_select_image_data=reshape_single_element(train_dataset,select_image_number)
Y_probabilities = lm.predict_proba(X_select_image_data)
Y_pandas_probabilities = pd.Series(Y_probabilities[0], index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
print"estimate probabilities for each class: \n" ,Y_pandas_probabilities , "\n"
print"all probabilities by lm.predict_proba(..) sum up to ", np.sum(Y_probabilities) , "\n"
输出结果为:
estimate probabilities for each class:
a 0.595426
b 0.019244
c 0.001343
d 0.004033
e 0.017185
f 0.004193
g 0.160380
h 0.158245
i 0.003093
j 0.036860
dtype: float64
all probabilities by lm.predict_proba(..) sum up to 1.0
d) 手动执行lm.predict_proba的计算(没有错误/警告,但结果不同)
manual_calculated_probabilities = []
for select_class_k in range(0,10): #a=0. b=1, c=3 ...
z_for_class_k = (np.sum(W[select_class_k] *X_select_image_data) + b[select_class_k] )
p_for_class_k = 1/ (1 + math.exp(-z_for_class_k))
manual_calculated_probabilities.append(p_for_class_k)
print "formula: ", manual_calculated_probabilities , "\n"
def softmax(x):
"""Compute softmax values for each sets of scores in x."""
e = np.exp(x)
dist = e / np.sum(np.exp(x),axis=0)
return dist
abc = softmax(manual_calculated_probabilities)
print "softmax:" , abc
输出结果如下:
formula: [0.9667598370531315, 0.48453459121301334, 0.06154496922245115, 0.16456194859398865, 0.45634781280053394, 0.16999340794727547, 0.8867996361191054, 0.8854473986336552, 0.13124464656251109, 0.642913996162282]
softmax: [ 0.15329642 0.09464644 0.0620015 0.0687293 0.0920159 0.069103610.14151607 0.14132483 0.06647715 0.11088877]
使用Softmax是因为在Github的logistic.py中有一条评论。
For a multi_class problem, if multi_class is set to be "multinomial" the softmax function is used to find the predicted probability of each class.
注意:
print "shape of X: " , X_select_image_data.shape
print "shape of W: " , W.shape
print "shape of b: " , b.shape
shape of X: (1, 784)
shape of W: (10, 784)
shape of b: (10,)
我在这里找到了一个非常相似的问题(链接),但不幸的是,我无法将其适应我的代码,以便预测结果相同。我尝试了许多不同的组合来计算变量'z_for_class_k'和'p_for_class_k',但很遗憾没有成功地复现从'predict_proba(X)'获得的预测值。