TypeError for predict_proba(np.array(test))


model = LogisticRegression()
model = model.fit(X, y)
test_data = [1,2,3,4,5,6,7,8,9,10,11,12,13]
test_prediction = model.predict_proba(np.array(test_data))
max = -1.0
res = 0
for i in range(test_prediction):
    if test_prediction[i]>max:
        max = test_prediction[i]
        res = i
if res==0:
    print('A')
elif res==1:
    print('B')
else:
    print('C')

使用上面的python代码,我必须预测3种可能结果(A,B,C)的概率。概率保存在test_prediction中,可以打印为:

Output: [[ 0.82882588  0.08641236  0.08476175]]

但其余部分给出了一个错误:

for i in range(test_prediction):
TypeError: only integer scalar arrays can be converted to a scalar index

我想找到最大概率,然后显示可能发生最多的事件 (A/B/C)。怎么办呢?

你也可以使用 numpy.argmax,它会直接给你最大值的索引。

import numpy as np
#test_prediction is most probably np array only
pred = np.array(test_prediction)
classes_val = np.argmax(pred, axis=1)
for res in class_val:
    if res==0:
        print('A')
    elif res==1:
        print('B')
    else:
    print('C')

range中使用数组的问题

在这种情况下,您应该使用数组长度range(len(test_prediction))

你也可以简化你的代码:

import operator
#...
enum_predict = enumerate(test_prediction)
res = max(enum_predict, key=operator.itemgetter(1))[0]

enumerate数组转换为元组列表(索引、项目)

key=operator.itemgetter(1) - max 函数将按秒值比较类型

你可以做这样的事情:

predict_prob_df = pd.DataFrame(model.predict_proba(test_data))
max_prob = predict_prob_df.apply(max,axis = 1)
predicted_output = pd.DataFrame(model.predict(test_data))

然后,您可以连接它们:

final_frame = pd.concat([max_prob,predicted_output],axis = 1)

这样,您就不需要使用 for 循环,这会导致错误。

我想出了另一个解决方案:

for i in range(3):
    if np.take(test_prediction, i) > max:
        max = np.take(test_prediction, i)
        res = i
if res==0:
.....

这是通过使用 np.take 访问 test_prediction 中的索引来工作的

但@Vivek_Kumar指定的解决方案似乎更正确、更有效。

相关内容

  • 没有找到相关文章

最新更新