python - 如何从python中sklearn中的cross_val_predict获取排序的概率和名称

Posted

技术标签:

【中文标题】python - 如何从python中sklearn中的cross_val_predict获取排序的概率和名称【英文标题】:How to get the sorted probability and name from cross_val_predict in sklearn in python 【发布时间】:2019-12-31 03:29:21 【问题描述】:

我正在使用下面的代码来获取第 1 类的概率。

from sklearn import datasets

iris = datasets.load_iris()
X = iris.data
y = iris.target

clf=RandomForestClassifier(n_estimators=10, random_state = 42, class_weight="balanced")

k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
proba = cross_val_predict(clf, X, y, cv=k_fold, method='predict_proba')

#print probability of class 1
print(proba[:,1])

我的结果如下所示。

[0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.1 0.  0.  0.
 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.  0.
 0.2 0.  0.  0.  0.  0.1 0.  0.  0.  0.  0.  0.  0.  0.  0.9 1.  0.7 1.
 1.  1.  1.  0.7 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  0.9 0.9 0.1 1.
 0.6 1.  1.  1.  0.9 0.  1.  1.  1.  1.  1.  0.4 0.9 0.9 1.  1.  1.  0.9
 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  0.  0.  0.  0.  0.  0.  0.9 0.
 0.1 0.  0.  0.  0.  0.  0.  0.  0.1 0.  0.  0.8 0.  0.1 0.  0.1 0.  0.1
 0.3 0.2 0.  0.6 0.  0.  0.  0.6 0.4 0.  0.  0.  0.8 0.  0.  0.  0.  0.
 0.  0.  0.  0.  0.  0. ]

但是,这只是一个概率列表,很难解释结果。

假设,我还有每个data point in theiris 数据集的名称列表,如下所示(Iris 数据集有 150 个数据点)。

iris_names = ['iris_0', 'iris_1', 'iris_2', 'iris_3', 'iris_4', 'iris_5', 'iris_6', 'iris_7', 'iris_8', 'iris_9', 'iris_10', 'iris_11', 'iris_12', 'iris_13', 'iris_14', 'iris_15', 'iris_16', 'iris_17', 'iris_18', 'iris_19', 'iris_20', 'iris_21', 'iris_22', 'iris_23', 'iris_24', 'iris_25', 'iris_26', 'iris_27', 'iris_28', 'iris_29', 'iris_30', 'iris_31', 'iris_32', 'iris_33', 'iris_34', 'iris_35', 'iris_36', 'iris_37', 'iris_38', 'iris_39', 'iris_40', 'iris_41', 'iris_42', 'iris_43', 'iris_44', 'iris_45', 'iris_46', 'iris_47', 'iris_48', 'iris_49', 'iris_50', 'iris_51', 'iris_52', 'iris_53', 'iris_54', 'iris_55', 'iris_56', 'iris_57', 'iris_58', 'iris_59', 'iris_60', 'iris_61', 'iris_62', 'iris_63', 'iris_64', 'iris_65', 'iris_66', 'iris_67', 'iris_68', 'iris_69', 'iris_70', 'iris_71', 'iris_72', 'iris_73', 'iris_74', 'iris_75', 'iris_76', 'iris_77', 'iris_78', 'iris_79', 'iris_80', 'iris_81', 'iris_82', 'iris_83', 'iris_84', 'iris_85', 'iris_86', 'iris_87', 'iris_88', 'iris_89', 'iris_90', 'iris_91', 'iris_92', 'iris_93', 'iris_94', 'iris_95', 'iris_96', 'iris_97', 'iris_98', 'iris_99', 'iris_100', 'iris_101', 'iris_102', 'iris_103', 'iris_104', 'iris_105', 'iris_106', 'iris_107', 'iris_108', 'iris_109', 'iris_110', 'iris_111', 'iris_112', 'iris_113', 'iris_114', 'iris_115', 'iris_116', 'iris_117', 'iris_118', 'iris_119', 'iris_120', 'iris_121', 'iris_122', 'iris_123', 'iris_124', 'iris_125', 'iris_126', 'iris_127', 'iris_128', 'iris_129', 'iris_130', 'iris_131', 'iris_132', 'iris_133', 'iris_134', 'iris_135', 'iris_136', 'iris_137', 'iris_138', 'iris_139', 'iris_140', 'iris_141', 'iris_142', 'iris_143', 'iris_144', 'iris_145', 'iris_146', 'iris_147', 'iris_148', 'iris_149']

现在,我想对类 1 的 cross_val_predict 结果进行排序,并将其添加到 iris names

所以,我的预期输出如下。

sorted_probability_of_class_1 = [[iris_xxx, 1], [iris_xxx, 1], ........, [iris_xxx, 0.9], [iris_xxx, 0.8], ........, [iris_xxx, 0], [iris_xxx, 0]]

我该怎么做? cross_val_predict 中的概率是否按照我们原始数据点的顺序?

如果需要,我很乐意提供更多详细信息。

【问题讨论】:

【参考方案1】:

使用zip() 将两个列表合并为一个:

sorted_probability_of_class_1 = zip(proba[:, 1], iris_names)

您可能需要先使用list(proba)proba 转换为列表。这是zip 方法的一个更易读的示例:

>>> probabilities = [1, 2, 3, 0]
>>> labels = ['a', 'b', 'c', 'd']
>>> list(zip(labels, probabilities))
[('a', 1), ('b', 2), ('c', 3), ('d', 0)]

可以使用sorted(iterable, key)itemgetter对压缩列表进行排序:

>>> from operator import itemgetter
>>> merged_list = list(zip(labels, probabilities))
>>> merged_list
[('a', 1), ('b', 2), ('c', 3), ('d', 0)]
>>> sorted(merged_list, key=itemgetter(1))
[('d', 0), ('a', 1), ('b', 2), ('c', 3)]

itemgetter(1) 访问元组列表中元组的第二个元素。这可能需要根据您的工作代码进行调整。

【讨论】:

感谢您的回答,但我的预期输出是一个包含iris_names 和概率的排序列表。这是可能的。期待您的来信:) 我在问题中提到了预期的输出:) 我用一个例子编辑了我的答案 - 希望现在它会更有意义。 zip 函数将关联iris_names 和概率。 非常感谢,是的,我现在更清楚了。但是,我希望按问题中提到的降序排列概率。有可能吗?期待您的来信:) 当然,我编辑了我的答案以包括排序:)

以上是关于python - 如何从python中sklearn中的cross_val_predict获取排序的概率和名称的主要内容,如果未能解决你的问题,请参考以下文章

boost::python - 如何从 C++ 在自己的线程中调用 python 函数?

如何从变量中调用函数? (Python)

如何从 Windows 机器中完全删除 Python?

python 如何从字符串中提取指定的内容?

如何使用 pyspark 从 python 列表中选择随机文本值?

python - 如何在python中使用MTCNN从文件夹中的图像中提取人脸?