2017-02-03 14 views
0

私はすでに特徴が抽出され、テキストファイルで与えられているいくつかの文書に対してバイナリ分類を行っています。私の問題は、テキストの機能と年数などの数値機能があることです。 1つの試料をこの形式で与えられます。scikit-learnで異種の特徴を組み合わせる

label |title text |otherText text |numFeature1 number |numFeature2 number 

私はfeature unionsについてのマニュアルを参照して、以下のよが、そのユースケースは少し異なっています。私はこれらの数値的特徴が既に与えられているので、別の特徴から特徴を抽出しない。

現在、私は次のようにセットアップを使用しています:

pipeline = Pipeline([ 
('features', Features()), 

('union', FeatureUnion(
    transformer_list=[ 
     ('title', Pipeline([ 
      ('selector', ItemSelector(key='title')), 
      ('tfidf', TfidfVectorizer()), 
     ])), 
     ('otherText', Pipeline([ 
      ('selector', ItemSelector(key='otherText')), 
      ('tfidf', TfidfVectorizer()), 
     ])), 
     ('numFeature1', Pipeline([ 
      ('selector', ItemSelector(key='numFeature1')), 
     ])), 
     ('numFeature2', Pipeline([ 
      ('selector', ItemSelector(key='numFeature2')), 
     ])), 
    ], 
)), 
('classifier', MultinomialNB()), 
]) 

機能のクラスはまた、ドキュメントから採用されている:

class Features(BaseEstimator, TransformerMixin): 
    def fit(self, x, y=None): 
    return self 

    def transform(self, posts): 
    features = np.recarray(shape=(len(posts),), 
          dtype=[('title', object),('otherText', object), 
            ('numFeature1', object),('numFeature2', object)]) 

    for i, text in enumerate(posts): 
     l = re.split("\|\w+", text) 
     features['title'][i] = l[1] 
     features['otherText'][i] = l[2] 
     features['numFeature1'][i] = l[3] 
     features['numFeature2'][i] = l[4] 

    return features 

私の問題は今:どのように私は追加しませんFeatureUnionの数値機能CountVectorizerを使用するとき、私は "ValueError:空の語彙を得ます;ドキュメントにはストップワードしか含まれていないでしょう"とDictVectorizerを使って1つのエントリだけを使用しても、

+0

Key = 'numFeature1'と 'numFeature2'のItemSelector()クラスを使用してください –

+0

これはValueErrorを返します:ブロック[0 ,:]には行の寸法が一致しません ' – lup3x

+0

パイプライン全体のコードを表示します。 –

答えて

0

TfidfVectorizer()オブジェクトにまだデータが設定されていません。

パイプラインを構築する前に、これを行う -

vec = TfidfVectorizer() 
vec.fit(data['free text column']) 
pipeline = Pipeline([ 
('features', Features()), 

('union', FeatureUnion(
    transformer_list=[ 
     ('title', Pipeline([ 
      ('selector', ItemSelector(key='title')), 
      ('tfidf', vec), 
     ])), 

     ... other features 

を使用すると、テストの目的のためにもう一度あなたのデータに合うようにしたい場合、これが役立ちます...ので、テストデータのためのパイプラインを自動的用)(変換関数を使用しますあなたが明示的にパイプラインItemSelector()があるん何

+0

ドキュメントのようにパイプラインを構築した後、私のデータに合うように 'pipeline.fit(train.data、train.target)'を使います。私の質問は、残りの非テキスト機能をパイプラインに統合するために必要なステップでした。 – lup3x

0

を構築する前に行う必要がある代わりに、フィット()関数のTfidfVectorizerは、コンストラクタに供給keyに応じて与えられたdict(X)からデータをピックアップし、一次元返します配列[n,]

このタイプの[n,]アレイは、FeatureUnionによって正しく処理されません。 FeatureUnionは、内部のtransformersのそれぞれから2次元の配列を必要とし、第1次元(サンプル数)は一貫していなければならず、最後に水平に積み重ねて特徴を結合することができる。

最初の二つのトランス(TfidfVectorizer())における第2の操作がItemSelectorからこの[n,]配列を受け取り、m = number of features extracted from raw textアレイの有効[n,m]種類を出力します。

しかし、あなたの3番目と4番目の変圧器は、のみItemSelector()が含まれているので、[n,]配列を出力します。それがエラーの原因です。

これを修正するには、ItemSelectorの出力を[n,1]に変更する必要があります。

オリジナル

data_dict[self.key] 

data_dict[self.key].reshape((-1,1)) 

:(私はあなたがを指定しますが、リンクからItemSelectorコードを使用していると仮定していItemSelector.transform()に次のコードを変更します は[n,]を012にフォーマットしますこれはFeatureUnionがデータを正しく追加するために使用できます。

+0

私の関連する質問[こちら](https://stackoverflow.com/questions/44221558/featureunion-with-heterogenous-features-valueerror-blocks0-has-incompatib)をご覧ください。 –

関連する問題