如何使用多分类模型对整个数据帧进行预分类



我在训练和测试集中训练了多分类模型,并使用SVC取得了良好的结果。现在,我想使用该模型在我的整个数据帧中进行预测,但当我得到以下错误时:ValueError: X has 36976 features, but SVC is expecting 8989 features as input.

我的数据帧有两列:一列包含类别(我手动标记了大约数据帧的1/5(,另一列包含所有文本(包括未标记的文本(。

data={'categories':['1','NaN','3', 'NaN'], 'documents':['Paragraph 1.nParagraph 2.nParagraph 3.', 'Paragraph 1.nParagraph 2.', 'Paragraph 1.nParagraph 2.nParagraph 3.nParagraph 4.', ''Paragraph 1.nParagraph 2.']}
df=pd.DataFrame(data) 

首先,我删除'categories'列中具有Nan值的行。然后,我创建文档术语矩阵,定义'y',并将其拆分为训练集和测试集。

tf = CountVectorizer(tokenizer=word_tokenize)
X = tf.fit_transform(df['documents'])
y = df['categories']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

其次,我运行SVC模型得到了良好的结果:

from sklearn.svm import SVC
svm = SVC(C=0.1, class_weight='balanced', kernel='linear', probability=True)
model = svm.fit(X_train, y_train)
print('accuracy:', model.score(X_test, y_test))
y_pred = model.predict(X_test) 
print(metrics.classification_report(y_test, y_pred))

最后,我尝试应用SVC模型来预测我的数据帧的整个列'documents'的类别。为此,我创建了整个列'documents'的文档术语矩阵,然后应用模型:

tf_entire_df = CountVectorizer(tokenizer=word_tokenize)
X_entire_df = tf_entire_df.fit_transform(df['documents'])
y_pred_entire_df = model.predict(X_entire_df)

但是,我得到了一个错误,即我的X_entire_dfSVC模型预期的输入具有更多的功能。我想这是因为现在我正试图将模型应用于整个列documents,但我知道如何解决这个问题。

我将感谢你的帮助!

这些问题通常来自于向模型提供未知或看不见的数据(比用于训练的功能更多/更少的功能(。

我强烈建议您使用sklearn.pipeline并创建一个管道,将预处理(CountVectorizer(和机器学习模型(SVC(包含在单个对象中。

根据经验,这有助于避免繁琐复杂的预处理拟合问题。

最新更新