如何用sci-kit learn识别误分类文本文件的ID/名称/标题

Posted

技术标签:

【中文标题】如何用sci-kit learn识别误分类文本文件的ID/名称/标题【英文标题】:How to identify the ID / name / title of the misclassified text file with sci-kit learn 【发布时间】:2015-06-10 21:56:18 【问题描述】:

我正在为文本分类构建自己的分类器,但目前我正在使用 sci-kit learn 来弄清楚一些事情。我使用 NB 分类器对我的几个文本文件进行了分类。我正在使用 26 个文本文件手动分类为 2 个类别,每个文件的编号在 01 - 26 之间(即“01.txt”等)。

我的代码和结果:

import sklearn
from sklearn.datasets import load_files
import numpy as np
bunch = load_files('corpus')

split_pcnt = 0.75 
split_size = int(len(bunch.data) * split_pcnt)
X_train = bunch.data[:split_size]
X_test = bunch.data[split_size:]
y_train = bunch.target[:split_size]
y_test = bunch.target[split_size:]

from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer, HashingVectorizer, CountVectorizer

clf_1 = Pipeline([('vect', CountVectorizer()),
                      ('clf', MultinomialNB()),
    ])

from sklearn.cross_validation import cross_val_score, KFold
from scipy.stats import sem

def evaluate_cross_validation(clf, X, y, K):
    # create a k-fold croos validation iterator of k=5 folds
    cv = KFold(len(y), K, shuffle=True, random_state=0)
    # by default the score used is the one returned by score >>> method of the estimator (accuracy)
    scores = cross_val_score(clf, X, y, cv=cv)
    print scores
    print ("Mean score: 0:.3f (+/-1:.3f)").format(np.mean(scores), sem(scores))

clfs = [clf_1]

for clf in clfs:
    evaluate_cross_validation(clf, bunch.data, bunch.target, 5)

[ 0.5  0.4  0.4  0.4  0.6]
Mean score: 0.460 (+/-0.040)

from sklearn import metrics

def train_and_evaluate(clf, X_train, X_test, y_train, y_test):

    clf.fit(X_train, y_train)

    print "Accuracy on training set:"
    print clf.score(X_train, y_train)
    print "Accuracy on testing set:"
    print clf.score(X_test, y_test)
    y_pred = clf.predict(X_test)

    print "Classification Report:"
    print metrics.classification_report(y_test, y_pred)
    print "Confusion Matrix:"
    print metrics.confusion_matrix(y_test, y_pred)


train_and_evaluate(clf_1, X_train, X_test, y_train, y_test)

Accuracy on training set:
1.0

Accuracy on testing set:
0.714285714286

    Classification Report:
                 precision    recall  f1-score   support

              0       0.67      0.67      0.67         3
              1       0.75      0.75      0.75         4

    avg / total       0.71      0.71      0.71         7

    Confusion Matrix:
    [[2 1]
     [1 3]]

我不知道如何识别错误分类文件的 ID,以查看哪些确切文件被错误分类(例如“05.txt”和“23.txt”)。这完全可以通过 sci-kit learn 实现吗?

最好的,

古兹德

【问题讨论】:

旁注:您可能应该将数据随机划分为训练集和测试集,而不是基于位置,除非您确定它们是随机编号的。幸运的是,scikit-learn 对此有一个 easy function。 【参考方案1】:

是的,您必须使用load_files 结果的属性filenames

但是,您的示例代码中有两个模型训练和评估周期:一个使用 CV,另一个使用简单的训练-测试拆分。

在训练测试拆分中:

test_filenames = bunch.filenames[split_size:]
misclassified = (y_pred != y_test)
print test_filenames[misscalssified]

此答案不假定文本文件按字母顺序或所有数字都存在。

【讨论】:

嘿 dukeboy,感谢您的帮助并指出这两个模型。我现在将它们分成两种不同的方法。再次感谢。 :)【参考方案2】:

假设load_files 按字母顺序加载文本文件,您所需要的只是被错误分类的示例的索引。这可以通过以下方式获得:

misclassified = np.where(y_pred != y_test)
print(misclassified)

train_and_evaluate 函数的末尾。所以如果打印出来,比如[1, 3, 7],文件“01.txt”、“03.txt”和“07.txt”被错误分类。

【讨论】:

嘿,戴夫。谢谢你的帮助。 Load_files 有一个选项可以让您非随机加载文件,但默认参数设置设置为 shuffle。但是,当我测试随机选项会发生什么时,结果发现文件被打乱了,但总是以相同的方式。去搞清楚。再次感谢。 :)

以上是关于如何用sci-kit learn识别误分类文本文件的ID/名称/标题的主要内容,如果未能解决你的问题,请参考以下文章

如何将个人 PNG 数据集放入 Sci-Kit Learn 进行图像识别?

Sci-kit 分类阈值

Sci-kit分类阈值

使用 Sci-Kit 学习对具有大型语料库的文本进行分类

使用 Sci-kit Learn SVM 时预测始终相同

如何用python和scikit learn实现神经网络