4

Ich mache Textklassifizierung mit Python und Sklearn. Ich habe einige benutzerdefinierte Funktionen, die ich zusätzlich zu Vektorisierer verwenden. Ich würde gerne wissen, ob es möglich ist, sie mit sklearn Pipeline zu verwenden und wie die Features darin gestapelt werden.Wie verwende ich sklearn Pipeline mit benutzerdefinierten Funktionen?

Ein kurzes Beispiel meines aktuellen Codes für die Klassifizierung ohne die Pipeline. Bitte sagen Sie mir, wenn Sie sehen, dass irgendetwas darin falsch ist, werde ich Ihnen sehr dankbar sein. Ist es möglich, es mit der sklearn-Pipeline zu verwenden? Ich habe meine eigene Funktion get_features() erstellt, die die benutzerdefinierten Funktionen extrahiert, den Vektorisierer transformiert, die Features skaliert und sie schließlich stapelt.

import sklearn.svm 
import re 
from sklearn import metrics 
import numpy 
import scipy.sparse 
import datetime 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.svm import SVC 
from sklearn.svm import LinearSVC 
from nltk.tokenize import word_tokenize, sent_tokenize 
from sklearn.preprocessing import StandardScaler 

# custom feature example 
def words_capitalized(sentence): 
    tokens = [] 
    # tokenize the sentence 
    tokens = word_tokenize(sentence) 

    counter = 0 
    for word in tokens: 

     if word[0].isupper(): 
      counter += 1 

    return counter 

# custom feature example 
def words_length(sentence): 
    tokens = [] 
    # tokenize the sentence 
    tokens = word_tokenize(sentence) 

    list_of_length = list() 
    for word in tokens: 
     list_of_length.append(length(word)) 

    return list_of_length 

def get_features(untagged_text, value, scaler): 

    # this function extracts the custom features 
    # transforms the vectorizer 
    # scales the features 
    # and finally stacks all of them 

    list_of_length = list() 
    list_of_capitals = list() 

    # transform vectorizer 
    X_bow = countVecWord.transform(untagged_text) 

    # I also see some people use X_bow = countVecWord.transform(untagged_text).todense(), what does the .todense() option do here? 

    for sentence in untagged_text: 
     list_of_urls.append([words_length(sentence)]) 
     list_of_capitals.append([words_capitalized(sentence)]) 

    # turn the feature output into a numpy vector 
    X_length = numpy.array(list_of_urls) 
    X_capitals = numpy.array(list_of_capitals) 

    if value == 1: 
     # fit transform for training set 
     X_length = = scaler.fit_transform(X_length) 
     X_capitals = scaler.fit_transform(X_capitals) 
    # if test set 
    else: 
     # transform only for test set 
     X_length = = scaler.transform(X_length) 
     X_capitals = scaler.transform(X_capitals) 

    # stack all features as a sparse matrix 
    X_two_bows = scipy.sparse.hstack((X_bow, X_length)) 
    X_two_bows = scipy.sparse.hstack((X_two_bows , X_length)) 
    X_two_bows = scipy.sparse.hstack((X_two_bows , X_capitals)) 

    return X_two_bows 

def fit_and_predict(train_labels, train_features, test_features, classifier): 

    # fit the training set 
    classifier.fit(train_features, train_labels) 

    # return the classification result 
    return classifier.predict(test_features) 

if __name__ == '__main__': 

    input_sets = read_data() 

    X = input_sets[0] 
    Y = input_sets[1] 
    X_dev = input_sets[2] 
    Y_dev = input_sets[3] 

    # initialize the count vectorizer 
    countVecWord = sklearn.feature_extraction.text.CountVectorizer(ngram_range=(1, 3)) 

    scaler= StandardScaler() 

    # extract features 

    # for training 
    X_total = get_features(X, 1, scaler) 

    # for dev set 
    X_total_dev = get_features(X_dev, 2, scaler) 

    # store labels as numpy array 
    y_train = numpy.asarray(Y) 
    y_dev = numpy.asarray(Y_dev) 

    # train the classifier 
    SVC1 = LinearSVC(C = 1.0) 

    y_predicted = list() 
    y_predicted = fit_and_predict(y_train, X_total, X_total_dev, SVC1) 

    print "Result for dev set" 
    precision, recall, f1, _ = metrics.precision_recall_fscore_support(y_dev, y_predicted) 
    print "Precision: ", precision, " Recall: ", recall, " F1-Score: ", f1 

Ich weiß, es FeatureUnion ist, aber ich weiß nicht, ob es für meine Zwecke verwendet werden kann, und ob es skaliert und die Eigenschaften hstack.

EDIT: Dies scheint ein guter Anfang zu sein: https://michelleful.github.io/code-blog/2015/06/20/pipelines/

es noch nicht versucht haben, posten, wenn ich es tue. Die Frage ist nun, wie kann ich Feature-Auswahl mit Pipelines tun.

Antwort

2

Für alle Interessierten muss die benutzerdefinierte Feature-Class über Anpassungsfunktionen verfügen und anschließend in FeatureUnion verwendet werden. Für ein ausführliches Beispiel überprüfen Sie meine andere Frage hier>How to fit different inputs into an sklearn Pipeline?

Verwandte Themen