4

私はPythonとsklearnを使ってテキスト分類をしています。私はベクタライザに加えて私が使用するいくつかのカスタム機能を持っています。私はsklearn Pipelineでそれらを使用することが可能かどうか、どのように機能が積み重ねられるかを知りたいと思います。sklearnパイプラインのカスタム機能の使い方は?

パイプラインのない分類のための私の現在のコードの短い例です。あなたが何かが間違っているのを見たら教えてください、あなたが助けてくれて非常に感謝します。 Sklearn Pipelineで何らかの方法で使用することは可能ですか? 私は独自の関数get_features()を作成しました。この関数は、カスタムフィーチャを抽出し、ベクタライザを変換し、フィーチャをスケールし、最後にすべてをスタックします。

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 

私はFeatureUnionがある知っているが、私はそれが私の目的のために、それが機能を拡張し、hstackするかどうかを使用することができるかどうかわかりません。

EDIT:これは良いスタートであるように見える:https://michelleful.github.io/code-blog/2015/06/20/pipelines/

はまだそれを試していませんが、私が行うとき、掲載します。問題は今、私がパイプラインを使ってフィーチャー選択を行う方法です。

答えて

2

関心のある人は、カスタムフィーチャクラスにフィッティング関数とトランスフォーム関数が必要で、FeatureUnionで使用できる必要があります。詳しい例については、私の他の質問をここで確認してください>How to fit different inputs into an sklearn Pipeline?

関連する問題