我在训练和测试集中训练了多分类模型,并使用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_df
比SVC
模型预期的输入具有更多的功能。我想这是因为现在我正试图将模型应用于整个列documents
,但我知道如何解决这个问题。
我将感谢你的帮助!
这些问题通常来自于向模型提供未知或看不见的数据(比用于训练的功能更多/更少的功能(。
我强烈建议您使用sklearn.pipeline
并创建一个管道,将预处理(CountVectorizer
(和机器学习模型(SVC
(包含在单个对象中。
根据经验,这有助于避免繁琐复杂的预处理拟合问题。