用于文本分类的 Scikit Learn-MultinomialNB

Posted

技术标签:

【中文标题】用于文本分类的 Scikit Learn-MultinomialNB【英文标题】:Scikit Learn-MultinomialNB for text classification 【发布时间】:2018-02-11 08:51:22 【问题描述】:

如何计算多类文本分类的FPR、TPR、AUC、roc_curve- 我使用了以下代码 -

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
from sklearn.feature_extraction.text import CountVectorizer
vect=CountVectorizer()
vect.fit(X_train.values.astype('U'))
X_train_dtm=vect.transform(X_train.values.astype('U'))
X_test_dtm=vect.transform(X_test)
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
y_score=nb.fit(X_train_dtm, y_train)
y_pred_class = nb.predict(X_test_dtm)

到目前为止,一切都运行良好- 但是一旦我使用以下代码,就会出现错误-

from sklearn.metrics import roc_curve, auc, roc_auc_score
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(5):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
print ("ROC value is:",roc_auc["micro"])

错误是-

Traceback(最近一次调用最后一次):

文件 "C:/Users/saurabh/PycharmProjects/getting_started/own_code.py", 第 32 行,在 打印(metrics.roc_auc_score(y_test, y_pred_prob))

文件“C:\Anaconda3\lib\site-packages\sklearn\metrics\ranking.py”,行 260,在 roc_auc_score sample_weight=sample_weight) 准确度:0.910536779324

文件“C:\Anaconda3\lib\site-packages\sklearn\metrics\base.py”,行 81,在_average_binary_score raise ValueError("不支持0格式".format(y_type))

ValueError:不支持多类格式

【问题讨论】:

【参考方案1】:

roc_curve 不支持多类格式。你必须计算二进制类。

但是要计算FPR,TPR可以使用confusion_matrix

from sklearn.metrics import confusion_matrix
y_test = np.argmax(y_test, axis=1)
y_score = np.argmax(y_score, axis=1)
c = confusion_matrix(y_test, y_score)
TNR = float(c[0][0])
TPR = float(c[1][1])
FNR = float(c[1][0])
FPR = float(c[0][1])

这是一个简单的二值化示例

for i in range(5):
    yt_bin = [1 if x == i else 0 for x in y_test[:, i]]
    fpr[i], tpr[i], _ = roc_curve(yt_bin, y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

【讨论】:

感谢 Ishant 的回复,但我仍然收到以下错误 - TypeError: Expected sequence or array-like, got estimator MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True) 查看我的编辑。您可能还需要将输入转换为第二部分的 numpy 数组。 嗨!我尝试使用您建议的代码,但仍然没有得到结果。我究竟做错了什么?谢谢!在这一行-y_score = np.argmax(y_score, axis=1) 我得到-ValueError: axis(=1) out of bounds 确保 y_test/y_score 是 numpy 数组。而且您之前的错误与此答案无关 y_score 是整个适合的MultinomialNB 对象,其当前定义的方式。改用y_pred_class(虽然我不确定你是否想要argmax...试试confusion_matrix(y_test, y_pred_class)而不使用argmax转换)。

以上是关于用于文本分类的 Scikit Learn-MultinomialNB的主要内容,如果未能解决你的问题,请参考以下文章

sklearn 除了文本之外的其他输入用于文本分类

文本分类任务的最佳 scikit 分类器

使用 scikit-learn 进行多标签文本分类,使用哪些分类器?

scikit-learn 中为文本分类排列文本数据的标准方法是啥?

应用scikit-learn做文本分类

scikit-learn 中分类算法的文本特征输入格式