predict_proba的TypeError(np.array(test))

时间:2017-10-13 14:20:25

标签: python python-3.x numpy scikit-learn typeerror

CATEGORY_LAUNCHER

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

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')

但剩下的部分给出了一个错误:

Output: [[ 0.82882588  0.08641236  0.08476175]]

我想找到最大概率,然后显示可能最多发生的事件(A / B / C)。 如何解决这个问题?

4 个答案:

答案 0 :(得分:1)

您还可以使用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')

答案 1 :(得分:0)

您可以这样做:

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循环了。

答案 2 :(得分:0)

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函数将按第二个值

比较类型

答案 3 :(得分:0)

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

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指定的解决方案似乎更正确和有效。