【发布时间】:2020-10-02 04:35:15
【问题描述】:
我正在尝试使用 sklearn 构建文本分类器。这个想法是:
- 使用向量化训练语料库 TfidfVectorizer
- 使用SelectKBest 选择产生的前 20,000 个特征(或者如果结果数量低于 20k,则使用所有特征)
- 将这些功能输入Logistic Regression Classifier
我设置成功如下:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
vectorizer = TfidfVectorizer()
x_train = vectorizer.fit_transform(df_train["input"])
selector = SelectKBest(f_classif, k=min(20000, x_train.shape[1]))
selector.fit(x_train, df_train["label"].values)
x_train = selector.transform(x_train)
classifier = LogisticRegression()
classifier.fit(x_train, df_train["label"])
我现在想将所有这些打包到一个管道中,并共享该管道,以便其他人可以将其用于他们自己的文本数据。然而,我不知道如何让 SelectKBest 实现与上面相同的行为,即接受 min(20000, n_features from vectorizer output) 作为 k。如果我将其简单地保留为 k=20000,如下所示,当拟合具有少于 20k 向量化特征的新语料库时,管道将不起作用(引发错误)。
pipe = Pipeline([
("vect",TfidfVectorizer()),
("selector",SelectKBest(f_classif, k=20000)),
("clf",LogisticRegression())])
【问题讨论】:
-
错误是由于this function check here。您需要继承 SelectKBest 并实施您自己的检查以查看
k是否小于X的形状。如果没有,则分配新的k
标签: python scikit-learn