2016-07-06 5 views
1

Ich versuche, eine einfache Frage Klassifizierer mit Scikit-lernen zu erstellen. Derzeit bin ich in der Lage, die Frage in entsprechende Klassen zu klassifizieren, indem ich die "bag of word" -Ansatze benutze, die die countvectorizer-Funktion von Scikit verwenden. Jetzt möchte ich benutzerdefinierte Funktionen mit vorhandenen Funktionen, die mit countvectorizer erstellt wurden, erstellen und hinzufügen.So erstellen Sie unsere benutzerdefinierte Feature-Extraktor-Funktion und verwenden Sie sie mit countvectorizer in der Pipeline in Scikit-lernen

Angenommen, ich möchte eine Funktion erstellen, die prüft, ob eine Telefonnummer vorhanden ist oder nicht und eine weitere Funktion, die die Länge der Frage extrahiert.

Also, was ist der Weg, um alle Funktionen zusammen zu generieren und zusammenzuführen.

Von diesem link habe ich versucht, diese Vorlage für kundenspezifische Merkmalsextraktion

`von sklearn.base Import BaseEstimator, TransformerMixin

Klasse SampleExtractor (BaseEstimator, TransformerMixin):

def __init__(self, vars): 
    self.vars = vars # e.g. pass in a column name to extract 

def transform(self, X, y=None): 
    return do_something_to(X, self.vars) # where the actual feature extraction happens 

def fit(self, X, y=None): 
    return self # generally does nothing` 

aber wenn, wenn Ich setze seine Ausgabe in die Pipeline mit countvectorizer wie

ppl = Pipeline([ 
('feats', FeatureUnion([ 
    ('ngram', CountVectorizer()), # can pass in either a pipeline 
    ('ave', SampleExtractor()) # or a transformer 
])), 
('clf', LinearSVC()) # classifier 

])

i erhalten Fehler

ValueError: blocks[0,:] has incompatible row dimensions

Ich denke, diese Fehler aufgrund Matrix sowohl Feature sind nicht gleicher Dimension sein kann, aber ich verstehe nicht, wie es zu lösen.

+0

Reduziert die 'SampleExtractor()' Transformationsmethode die Anzahl der Zeilen? Wenn dies der Fall ist, ist dies keine akzeptable Transformation, die in eine Pipeline eingefügt werden soll, da nur X transformiert wird, nicht y (und sowohl X als auch y müssen die gleiche Anzahl von Zeilen haben). – David

+0

Dhiraj, hast du das funktionieren lassen? – Senthil

Antwort

0

Die Methode transform von CountVectorizer gibt eine Dokument-Term-Matrix zurück, deren Zeilen den Dokumenten und die Spalten den Termen entsprechen. Das (i, j) -te Element der Matrix zeigt, wie oft der j-te Ausdruck im i-ten Dokument vorkommt. Sie müssen nur noch einige Spalten in dieser Matrix hinzufügen, die den neuen Funktionen entsprechen.

Beispiel: Angenommen Liste doc_len enthält die Länge Ihrer Dokumente in Wort und Dokument-Begriff-Matrix ist M. Dann wird der Code:

M_arr = M.toarray() 
assert len(doc_len) == M_arr.shape[0] 
np.append(M_arr,np.array(doc_len),axis=1) 

wird eine neue Spalte am Ende der Matrix mit der neuen Funktion hinzufügen. Sie können diesen Vorgang für zusätzliche neue Funktionen wiederholen. Die erweiterte Matrix kann zu jedem Klassifikator geführt werden, den Sie auf die übliche Weise verwenden.

+0

Danke für Ihre Antwort, aber ich bin immer noch nicht in der Lage, die beiden Funktionen zusammenzuführen. –

Verwandte Themen