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