方言文本分类中合并CountVectorizer遇isnan错误及训练预测咨询
方言文本分类:FeatureUnion报错原因及解决方案
错误原因分析
你遇到的这个TypeError,核心问题出在FeatureUnion的使用方式不对。FeatureUnion的作用是把多个特征提取器(比如CountVectorizer这类转换器)组合起来,它需要接收的是未执行fit_transform的转换器实例,但你现在直接传入了MX和XN——这两个是已经通过fit_transform得到的稀疏矩阵,不是转换器对象。当FeatureUnion试图对这些矩阵进行后续处理时,内部调用的isnan函数无法处理稀疏矩阵类型,就抛出了这个错误。
修正后的代码
你需要把FeatureUnion的参数改成两个CountVectorizer的实例,而不是转换后的矩阵。调整后的代码如下:
from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer from sklearn.pipeline import FeatureUnion, Pipeline # 定义两个特征提取器 vectorizerN = CountVectorizer(analyzer='char', ngram_range=(3,4)) vectorizerMX = CountVectorizer(vocabulary=a['vocabs']) # 假设a['vocabs']是你预先定义的词汇表 # 用FeatureUnion组合特征提取器 combined_features = FeatureUnion([ ('ngram_char', vectorizerN), ('custom_vocab', vectorizerMX) ]) # 查看合并后的特征矩阵(可选) X_combined = combined_features.fit_transform(X_train) test_combined = combined_features.transform(test_data)
后续训练与预测流程
接下来有两种常见的方式完成训练和预测:
方式1:先合并特征,再训练分类器
# 合并训练集特征 X_combined = combined_features.fit_transform(X_train) # 初始化分类器并训练 clf = MultinomialNB() clf.fit(X_combined, y_train) # 处理测试集并预测 test_combined = combined_features.transform(test_data) predictions = clf.predict(test_combined)
方式2:用Pipeline把特征组合和分类器串起来(更推荐)
Pipeline可以把特征提取、分类器训练的流程封装起来,避免手动处理中间步骤,也能防止数据泄露:
# 构建完整的流水线 pipeline = Pipeline([ ('feature_union', combined_features), ('classifier', MultinomialNB()) ]) # 直接用流水线训练 pipeline.fit(X_train, y_train) # 直接预测 predictions = pipeline.predict(test_data)
这样就能解决你之前的错误,顺利完成方言文本分类的训练和预测啦。
内容的提问来源于stack exchange,提问作者John Sall
相关产品推荐
相关产品推荐

