Sklearn 预测多个输出

Posted

技术标签:

【中文标题】Sklearn 预测多个输出【英文标题】:Sklearn predict multiple outputs 【发布时间】:2017-04-07 19:51:02 【问题描述】:

我写了以下代码:

from sklearn import tree

# Dataset & labels
# Using metric units
# features = [height, weight, style]
styles = ['modern', 'classic']
features = [[1.65, 65, 1], 
            [1.55, 50, 1],
            [1.76, 64, 0],
            [1.68, 77, 0] ]
labels = ['Yellow dress', 'Red dress', 'Blue dress', 'Green dress']

# Decision Tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(features, labels)

# Returns the dress
height = input('Height: ')
weight = input('Weight: ')
style = input('Modern [0] or Classic [1]: ')
print(clf.predict([[height,weight,style]]))

此代码接收用户的身高和体重,然后返回更适合她的衣服。有没有办法返回多个选项?例如,退回两件或更多件衣服。

更新

from sklearn import tree
import numpy as np

# Dataset & labels
# features = [height, weight, style]
# styles = ['modern', 'classic']
features = [[1.65, 65, 1], 
            [1.55, 50, 1],
            [1.76, 64, 1],
            [1.72, 68, 0],
            [1.73, 68, 0],
            [1.68, 77, 0]]
labels =    ['Yellow dress',
            'Red dress',
            'Blue dress',
            'Green dress',
            'Purple dress',
            'Orange dress']

# Decision Tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(features, labels)

# Returns the dress
height = input('Height: ')
weight = input('Weight: ')
style = input('Modern [0] or Classic [1]: ')

print(clf.predict_proba([[height,weight,style]]))

如果用户是 1.72m 和 68kg,我想同时展示绿色和紫色的连衣裙。此示例仅返回 100% 的绿色连衣裙。

【问题讨论】:

什么时候返回多个?您的意思是按最可能的顺序退回它们吗? 【参考方案1】:

是的,你可以。实际上你可以做的是你可以得到每个类的概率。在某些分类器中实现了一个名为.predict_proba() 的函数。

参见here,sklearn 的文档。

它将返回每个类别的样本成员的概率。

然后您可以例如返回与两个、三个最高概率相关联的标签。

【讨论】:

这种方法只是选择完全符合条件的选项。例如:如果我的身高是 1.72m,体重是 68kg,我想展示 1.73m 和 68kg 的连衣裙和 1.72 和 68kg 的连衣裙。【参考方案2】:

您可以使用 predict_proba() 方法来获取给定项目的每个类别的概率。有关更多信息,请查看“predict_proba()”:

http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

希望这会有所帮助..

【讨论】:

【参考方案3】:

predict() 将只返回概率较高的类。如果你使用 predict_proba() 相反,它将返回一个包含每个类别概率的数组,因此您可以选择高于某个阈值的那些,例如。

Here 是该方法的文档。

你可以用它做这样的事情:

probs = clf.predict_proba([[height, weight, style]])
threshold = 0.25 # change this accordingly
for index, prob in enumerate(probs[0]):
    if prob > threshold:
        print(styles[index]) 

【讨论】:

您的阈值选择不当。如果threshold=0.5 它只会返回一个标签。概率之和等于 1,没有其他标签的概率大于 0.5 ... 是的,你是对的。我只是随便选了一个数,没有多想。

以上是关于Sklearn 预测多个输出的主要内容,如果未能解决你的问题,请参考以下文章

SkLearn SVM - 如何获得按概率排序的多个预测?

sklearn logisticregression模型怎么返回预测的概率

Sklearn:为连续特征、多个标签选择朴素贝叶斯模型

sklearn函数怎么看预测值

[sklearn][standardscaler] 我可以反转模型输出的标准缩放器吗?

[机器学习python实践]Sklearn实现集成