2016-06-25 11 views
1

Ich habe die gleiche Frage, die in here gefragt wurde:Kreuzvalidierung und Textkategorisierung

Ich habe eine Frage zu in sklearn Kreuzvalidierung in Textklassifikation verwendet wird. Es ist problematisch, alle Daten vor der Kreuzvalidierung zu vektorisieren, da der Klassifikator das in den Testdaten aufgetretene Vokabular "gesehen" hätte. Weka hat gefiltert Klassifikator, um dieses Problem zu lösen. Was ist das sklearn Äquivalent für diese Funktion? Ich meine, für jede Falte wäre der Feature-Set anders, weil die Trainingsdaten unterschiedlich sind.

Da ich jedoch viel Daten für die Daten zwischen dem Kategorisierungsschritt und dem Klassifizierungsschritt verarbeite, kann ich keine Pipelines verwenden ... und habe versucht, die Kreuzvalidierung von mir selbst als äußere Schleife für das Ganze zu implementieren Prozess ... jede Anleitung dazu, wie ich ziemlich neu sowohl für Python und sickitlearn

Antwort

1

Ich denke, die Kreuzvalidierung Iterator als äußere Schleife ist eine gute Idee und ein Ausgangspunkt, die Ihre Schritte klar und lesbar machen würde:

from sklearn.cross_validation import KFold 
X = np.array(["Science today", "Data science", "Titanic", "Batman"]) #raw text 
y = np.array([1, 1, 2, 2]) #categories e.g., Science, Movies 
kf = KFold(y.shape[0], n_folds=2) 
for train_index, test_index in kf: 
    x_train, y_train = X[train_index], y[train_index] 
    x_test, y_test = X[test_index], y[test_index] 
    #Now continue with your pre-processing steps.. 
+0

Danke .. Dies ist genau das, was ich gesucht habe. – Ophilia

+0

Nur aktualisierten Code hinzufügen! 'von sklearn.model_selection Import KFold' ' Import numpy als np' 'X = np.array ([ "Wissenschaft heute", "Data Science", "Titanic", "Batman"]) #raw Text '' y = np.array ([1, 1, 2, 2]) #categories zB Wissenschaft, Movies' 'kf = KFold (n_splits = 2)' ' für train_index, test_index in kf.split (X): ' ' x_zug, y_zug = X [train_index], y [train_index] ' ' x_test, y_test = X [test_index], y [test_index] ' –

0

Ich vermisse die Bedeutung Ihrer Frage und bin nicht vertraut mit Weka, aber Sie können das Vokabular als Wörterbuch in den Vectorizer Sie übergeben Verwenden Sie in Sklearn. Hier ist ein Beispiel, das das Wort "Sekunde" im Test-Set überspringt und nur Merkmale aus dem Zugsatz verwendet.

from sklearn.feature_extraction.text import CountVectorizer 

train_vectorizer = CountVectorizer() 
train = [ 
    'this is the first', 
    'set of documents' 
    ] 

train_matrix = train_vectorizer.fit_transform(train) 
train_vocab = train_vectorizer.vocabulary_ 

test = [ 
    'this is the second', 
    'set of documents' 
    ] 

test_vectorizer = CountVectorizer(vocabulary=train_vocab) 
test_matrix = test_vectorizer.fit_transform(test) 

print(train_vocab) 
print(train_matrix.toarray()) 
print('\n') 
print(test_vectorizer.vocabulary_) 
print(test_matrix.toarray()) 

Beachten Sie auch, dass Sie Ihre eigene Verarbeitung und/oder tokenization Prozesse im vectorizer wie verwenden:

def preprocessor(string): 
    #do logic here 

def tokenizer(string): 
    # do logic here 

from sklearn.cross_validation import cross_val_score 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.pipeline import Pipeline 
from sklearn.svm import LinearSVC 
clf = Pipeline([('vect', TfidfVectorizer(processor=preprocessor, tokenizer=tokenizer)), ('svm', LinearSVC())]) 
+0

ich zwischen der Vektorisierung und der Klassierungsschritt und wegen, dass ich nicht in der Lage war, um es in einer Pipeline mache eine Probenahme .. Zur gleichen Zeit möchte ich eine Kreuzvalidierung durchführen, die eine Pipeline haben muss, oder als Lösung dachte ich daran, eine äußere Schleife zu machen, die die Daten für die Kreuzvalidierung partitioniert, dann gehe ich zur Verarbeitung/Klassifizierung jeder Daten auf der cv iterations – Ophilia

Verwandte Themen