2016-11-23 1 views
3

I écrit le code ci-dessous:Sklearn prédire plusieurs sorties

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]])) 

Ce code reçoit la hauteur de l'utilisateur et le poids, puis retourne la robe qui correspond mieux à elle. Y a-t-il un moyen de retourner plusieurs options? Par exemple, retourner deux robes ou plus.

MISE À JOUR

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]])) 

Si l'utilisateur est 1.72m et 68 kg, je veux montrer à la fois les robes vert et pourpre. Cet exemple renvoie juste 100% pour la robe verte.

+0

Quand serait-il revenir plus d'un? Voulez-vous dire les retourner dans le plus proche ordre? – erip

Répondre

5

Oui, vous pouvez. En fait ce que vous pouvez faire est que vous pouvez obtenir la probabilité de chaque classe. Il existe une fonction appelée .predict_proba() qui est implémentée dans certains classificateurs.

Voir here, la documentation de sklearn.

Il renverra la probabilité d'appartenance de votre échantillon pour chaque classe. Ensuite, vous pouvez par exemple renvoyer les étiquettes associées aux deux, les trois plus fortes probabilités.

+0

Cette approche sélectionne simplement les options qui correspondent parfaitement à la condition. Par exemple: si ma taille est de 1,72m et que mon poids est de 68kg, je veux montrer la robe avec 1,73m et 68kg et la robe avec 1,72 et 68kg. – bodruk

2

predict() ne retourneront que dans la classe avec une probabilité plus élevée. Si vous utilisez predict_proba() à la place, il retournera un tableau avec la probabilité pour chaque classe, de sorte que vous pouvez choisir ceux au-dessus d'un certain seuil, par exemple.

Here est la documentation de la méthode.

Vous pouvez quelque chose comme ça avec elle:

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]) 
+1

Votre seuil n'est pas bien choisi. Si 'threshold = 0.5', il ne retournera qu'une seule étiquette. La somme des probabilités étant égale à un, aucune autre étiquette ne peut avoir un proba supérieur à 0.5 ... – MMF

+1

Oui, vous avez raison. Je viens de choisir un nombre aléatoire sans plus y penser. –