Scikit-learn的decision_function
让我回想起不同班级的概率。
model= LinearSVC()
print("Probabilities are:")
predicted = model.decision_function(mat_tmp_test)
print(predicted) #value of predicted are the probabilities of different classes
这给了我一个numpy数组:
[[ 0.24235777 0.3219151 0.43572713 0.13572713]
[ 0.24235777 0.3219151 0.43572713 0.53572713]
[ 0.18263773 0.5854693 0.23189297 0.73572713]
[ 0.3219151 0.24235777 0.43572713 0.63572713]]
现在我正在排序概率
order=np.sort(predicted,axis=1)
print("Sorted!")
我现在正试图挑选前2个概率。
print(order[:,-2:])
我明白了:
[[ 0.43572713 0.3219151 ]
[ 0.53572713 0.43572713]
[ 0.73572713 0.5854693 ]
[ 0.63572713 0.43572713]]
如何访问前3个概率的类?这个命令给我一个错误,说明用作索引的indice数组必须是整数(或布尔)类型。
print(model1.classes_[order[:,-2:]])
这应该给我[1,3] 其中1,3是班级名称。
此外,是否可以从上面的代码中打印出每个类的概率以及类名。类似A类(0.90%),B类(0.43%)?
答案 0 :(得分:3)
numpy.sort
对矩阵中的概率进行排序。但是对于访问类标签,您不需要概率(它们的实际值不是感兴趣的,而只是它们的相对排序)。相反,您需要具有最高概率的指数。
numpy.argsort
返回索引数组而不是值。所以你应该使用:
order = np.argsort(predicted, axis=1)
print(order)
这将打印对应于排序顺序的每一行的索引的排列:
[[3 0 1 2]
[0 1 2 3]
[0 2 1 3]
[1 0 2 3]]
现在您应该能够使用索引来访问类标签:
print(model1.classes_[order[:,-2:]])
但是,您还没有显示model1.classes_
的外观,因此您可能需要另一种索引语法。
要检索实际概率,您也可以使用索引数组:
predicted_sorted = predicted[np.arange(predicted.shape[0]),order.T].T
print(predicted_sorted[:,-2:])
打印:
[[ 0.3219151 0.43572713]
[ 0.43572713 0.53572713]
[ 0.5854693 0.73572713]
[ 0.43572713 0.63572713]]
答案 1 :(得分:1)
好的,我的解决方案有点复杂。
首先,创建一个pandas数据框,以便在那里拥有类名:
my_df = pd.DataFrame(predicted, columns = ['a','b','c','d']
一旦你有了,我们将迭代行,根据概率排序,但记住类名。为此,您可以使用以下内容:
import operator
def sort_and_return_names(x):
d = x.to_dict() #convert to dictionary
d_sorted = sorted(d.items(), key=operator.itemgetter(1)) #sort by value
keys = [i[0] for i in d_sorted] #key only the class name
return keys
现在你只需按顺序应用函数:
classes = my_df.apply(lambda x: sort_and_return_names(x), axis=1)
瞧,那里有你的课程