首页 > 解决方案 > 无论实际内容如何,​​sklearn 文本分类模型都返回单个类

问题描述

我正在建立文本分类模型。并且由于某种原因,无论实际文本或行数如何,它都会返回我一个类。这就是我正在做的事情:

X = df['text']
y = df['type']
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 13)

pipe_mnnb = Pipeline(steps = [('tf', TfidfVectorizer()), ('mnnb', MultinomialNB())])

pgrid_mnnb = {
 'tf__max_features' : [100, 250, 500],
 'tf__stop_words' : ['english', None],
 'tf__ngram_range' : [(1,1),(1,2)],
 'tf__use_idf' : [True, False],
 'mnnb__alpha' : [0.1, 0.5, 1]
}
gs_mnnb = GridSearchCV(pipe_mnnb,pgrid_mnnb,cv=5,n_jobs=-1)
gs_mnnb.fit(X_train, y_train)

然后我使用以下代码行仔细检查结果:

preds_mnnb = gs_mnnb.predict(X)
df['preds'] = preds_mnnb

一切看起来都很好。现在,我创建了一个我想应用分类模型的新数据框(我在这里使用虚拟数据):

test_data = pd.DataFrame({'text':['abc text',
                           'xyz text',
                           'mnopr text',
                           'ijk text',
                           'rrr text',
                           'xxx text']}
                        )
文本
美国广播公司文本
xyz 文本
mnopr 文本
ijk 文本
rrr 文本
xxx 文本

如果我使用这种方法,那么我会得到不同类别的正确分类结果:

test_data2 = test_data.iloc[:,0]
gs_mnnb.predict(test_data2)

数组(['A 类','B 类','C 类','C 类','D 类','B 类'],dtype='<U30')

但是当我不应用 iloc 数据选择时:

gs_mnnb.predict(test_data)

然后我只会得到这种响应,无论有多少行或它们包含什么:

数组(['class A'],dtype='<U30')

标签: pythonpredictsklearn-pandas

解决方案


如果模型需要与. DataFrames_ 像这样更改前两行代码(注意额外的方括号):XyDataFramesSeries

X = df[['text']]
y = df[['type']]

推荐阅读