【发布时间】:2017-05-28 18:42:11
【问题描述】:
这是我第一次尝试使用 ML 和 Python 进行文档分类。
- 我首先查询我的数据库以提取 5000 篇与洗钱相关的文章并将它们转换为 pandas df
- 然后我提取了 500 篇与洗钱无关的文章,并将它们转换为 pandas df
- 我连接两个 dfs 并将它们标记为“洗钱”或“其他”
- 我进行预处理(删除标点符号和停用词、小写等)
-
然后根据词袋原理喂模型如下:
vectorizer = CountVectorizer(analyzer = "word", tokenizer = None, preprocessor = None, stop_words = None, max_features = 5000) text_features = vectorizer.fit_transform(full_df["processed full text"]) text_features = text_features.toarray() labels = np.array(full_df['category']) X_train, X_test, y_train, y_test = train_test_split(text_features, labels, test_size=0.33) forest = RandomForestClassifier(n_estimators = 100) forest = forest.fit(X_train, y_train) y_pred = forest.predict(X_test) accuracy_score(y_pred=y_pred, y_true=y_test)
直到现在它都可以正常工作(尽管给我的准确率太高了 99%)。但我现在想在一个全新的文本文档上测试它。如果我对它进行矢量化并执行forest.predict(test),它显然会说:
ValueError: Number of features of the model must match the input. Model n_features is 5000 and input n_features is 45
我不知道如何克服这个问题才能对全新的文章进行分类。
【问题讨论】:
-
vectorize 函数将文本语料库映射到(多维)空间中。您应该检查一下,但是从我的角度来看,由于映射函数是依赖于语料库的,因此可以预期,如果您添加一个不是来自初始文本语料库的新文本,则先前的映射对这个新文本没有微不足道的意义文本。这就是为什么在您的情况下,使用真正的新文本,代码不会运行。有 ML / 统计方法可以解决您的问题,但我认为这更像是一个统计挑战而不是编程问题。
-
听起来您正在重新安装矢量化器。请记住,您在训练阶段适合矢量化器和分类器。在预测阶段,您只需在矢量化器上调用变换并在分类器上进行预测。
-
@probaPerception 你是对的,新文章应该适合模型。否则没有意义。
标签: python python-3.x scikit-learn nlp