我有一个文本分类问题,想添加两个功能。我拥有的数据是电影评论(imbd 数据集)。我想使用两个特征作为输入变量来将评论分类为正面或负面情绪。这两个特征是:评论长度(所以使用的词)和评论的词袋表示。
所以另一件事是我想使用FeatureUnion
sklearn 中的对象来完成这个。所以我想出了如何做到这一点,通过使用hstack
来连接两个稀疏矩阵。但作为学习目的,我很好奇如何去做,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)
和另一个自定义变压器:
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
课堂上工作。