2016-07-16 7 views
1

Dies ist eine Erweiterung von meiner vorherigen Frage How to convert a groupby().mean() into a callable object?Wie behandelt man die Score-Methode in Sklearn?

ich für die Hilfe dankbar bin, dass ich aus diesem Forum und Alberto Garcia-Raboso insbesondere erhalten, die meine Frage zu diesem Modell beantwortet.

Während ich fortfahre, treten mehr Fehler auf. Dieser scheint mir schwer zu korrigieren. Es geht um die Leistungsbewertung des Modells. Ich versuchte .score (pred_values, real_values) zu verwenden, aber der Fehler schlägt vor, die Eingangswerte sind nicht in dem [index]:

KeyError: 'None of [[87.333333333333329, 76.0, 81.5, 87.333333333333329, 87.333333333333329, 76.0, 81.5]] are in the [index]' 

Ich bin nicht sicher, wie dies zu erklären. Wo ist der Index und wie kann man darauf zugreifen und das Problem beheben?

Ich habe schon lange darüber nachgedacht. Wenn ich es erneut versuche, kann ich das Problem nicht lösen. Ich wäre jeder Hilfe dankbar. Vielen Dank.

Modell

from sklearn.base import BaseEstimator, ClassifierMixin 
import pandas as pd 
import numpy as np 

class MeanClassifier(BaseEstimator, ClassifierMixin): 
    def __init__(self): 
     pass 

    def fit(self, X, y): 
     self.name = X 
     self.scores = y 
     self.data = pd.DataFrame({"name": self.name, "score": self.scores}) 
     #print(self.data) 
     self.means = self.data.groupby(["name"]).mean() 
     #print(self.means) 
     return self 

    def predict(self, X): 
     return list(self.means.loc[X, 'score']) 

Dateneingaben und Modellversuche

names = ["John", "Mary", "Suzie", "John", "John", "Mary", "Suzie"] 
scores = [80, 70, 75, 90, 92, 82, 88] 
dd = pd.DataFrame({"name": names, "score": scores}) 

ddnames = list(dd['name']) 
ddscores = list(dd['score']) 

B = MeanClassifier() 
Bfit = B.fit(ddnames, ddscores) 

Bpred = B.predict(dd['name']) 
#print(Bpred) 

print(B.score(Bpred, ddscores)) #The error appears here 

Antwort

1

Es gibt zwei Probleme im Code ... das erste ist mit dem score Verfahren.

Die Funktionsdefinition der Partitur ist wie -

Score (X, y [, sample_weight])

Und nur score Anrufe predict selbst im Backend zu erwähnen.

wo X ist Ihr Feature-Set und y ist Ihre wahre Daten. Was Sie geliefert haben, ist die vorhergesagte Liste und die wahre Liste. Also diese Zeile ändern, um einfach -

print(B.score(ddnames, ddscores)) 

Aber wenn Sie dies ausführen werden Sie eine andere Fehlermeldung erhalten -

Kann nicht Mischung aus Klassenkombinationen verarbeiten und die kontinuierliche

Und warum Sie Erhalten Sie diesen Fehler, wenn Sie ClassifierMixin erben und eine Regressionsaufgabe ausführen. In einfacheren Worten geben Sie also eine kontinuierliche Ausgabe, aber classifiermixin denkt darüber nach wie ein Klassifikationsproblem.

Erben Sie einfach RegressorMixin und Sie sind gut zu gehen.

#left code# 
from sklearn.base import BaseEstimator, RegressorMixin 
class MeanClassifier(BaseEstimator, RegressorMixin): 
def __init__(self): 
    pass 
#left code# 

print(B.score(ddnames, ddscores)) 

Ausgang -

0.395607701564 
+0

Danke. Das ist in der Tat, was ich brauche. :) – achimneyswallow