排序

时间:2016-03-19 07:55:40

标签: python

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%)?

2 个答案:

答案 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)

瞧,那里有你的课程