テキスト分類の問題があり、2 つの機能を追加したいと考えています。私が持っているデータは、映画のレビューです (imbd データセット)。2 つの特徴を入力変数として使用して、レビューを肯定的または否定的な感情に分類したいと考えています。2 つの機能は、レビューの長さ (つまり、使用される単語) と、レビューの Bag-of-words 表現です。
FeatureUnion
もう 1 つは、sklearnのオブジェクトを使用してこれを完成させたいということです。hstack
そこで、 2 つのスパース行列を連結するために使用することで、それなしでそれを行う方法を考え出しました。FeatureUnion
しかし、学習目的としては、私は自分の道を歩むことができないので、それをどのように行うのか興味があります.
今まで使用したリソース:
- Michelle Fullwood - scikit-learn でパイプラインと FeatureUnions を使用する
- Zac Stewart - scikit-learn パイプラインと FeatureUnions の使用
- Julie Michelman - パンダ、パイプライン、およびカスタム トランスフォーマー
今まで私は次のコードを持っています:
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.feature_extraction.text import CountVectorizer
# Instantiate pipeline: pl
pl = Pipeline([
('union', FeatureUnion(
transformer_list = [
('numeric_features', Pipeline([
('extract', ColumnExtractor(cols)),
('length', AverageWordLengthExtractor())
])),
('text_features', Pipeline([
('vectorizer', CountVectorizer())
]))
]
)),
('clf', LinearSVC())
])
カスタム トランスフォーマー:
class AverageWordLengthExtractor(TransformerMixin):
"""Takes in dataframe, extracts road name column, outputs average word length"""
def review_length(self, review):
"""Helper code to compute length of a review"""
return len(review.split())
def fit(self, X, y=None):
"""Returns `self` unless something different happens in train and test"""
return self
def transform(self, X, y=None):
"""The workhorse of this feature extractor"""
return X.apply(self.review_length)
および別のカスタム Transformer:
class ColumnExtractor(TransformerMixin):
"""Takes in dataframe, extracts road name column, outputs average word length"""
def __init__(self, cols):
self.cols = cols
def fit(self, X, y=None):
"""Returns `self` unless something different happens in train and test"""
return self
def transform(self, X, y=None):
"""The workhorse of this feature extractor"""
return X[self.cols]
X_train、y_train、X_test、および y_test データセットは pandas DataFrame に変換されるため、パイプラインの入力はデータフレームになることに注意してください。
CountVectorizer
これはスパース行列を出力するため、私が間違っていると思うのはです。のタイプで独自のカスタム トランスフォーマーを作成する必要がCountVectorizer
あるので、代わりにデータフレームを返しますか? もしそうなら、これは大規模なコーパスで作業するのは非常に計算コストが高くないですか? クラスで作業CountVectorizer
する全体像を把握できないという考えがあるので、本当に助けを借りることができます。FeatureUnion