如何计算Cohen的kappa系数来衡量评估者之间的协议? (电影评论)

时间:2017-04-28 09:35:48

标签: python machine-learning statistics scikit-learn

我正在使用scikit学习和解决预测电影评论评级的练习。我读过Cohen的kappa(我坦白地说完全不理解它),它作为观察和预期准确度之间的比较度量的有用性。我像往常一样在我的语料库中应用机器学习算法,使用一袋单词模型。我读过Cohen的Kappa是衡量分类器性能的好方法。 我如何使用sklearn将这个概念适应我的预测问题?
Sklearn的文档并没有明确说明如何使用文档术语矩阵继续处理此事(如果它甚至是正确的方法) sklearn.metrics.cohen_kappa_score(y1, y2, labels=None, weights=None)
这是sklearn网站上的示例:

from sklearn.metrics import cohen_kappa_score
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
cohen_kappa_score(y_true, y_pred)

Kappa评分计算是否适用于此?在我的语料库中注释评论的人中间?怎么写呢? 由于所有电影评论都来自不同的注释器,它们在评估科恩的Kappa时仍然需要考虑两个注释器吗? 我该怎么办 ? 这是我正在尝试的例子:

import pandas as pd
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import StratifiedShuffleSplit

xlsx1 = pd.ExcelFile('App-Music/reviews.xlsx') 
'''
review are stored in two columns, one for the review, one for the rating
'''


X = pd.read_excel(xlsx1,'Sheet1').Review
Y = pd.read_excel(xlsx1,'Sheet1').Rating

X_train, X_test, Y_train, Y_test = train_test_split(X_documents, Y, stratify=Y)
new_vect= TfidfVectorizer(ngram_range=(1, 2), stop_words='english')
X_train_dtm = new_vect.fit_transform(X_train.values.astype('U'))
X_test_dtm = new_vect.fit_transform(X_test.values.astype('U'))

new_model.fit(X_train_dtm,Y_train)
new_model.score(X_test_dtm,Y_test)

'''
this is the part where I want to calculate cohen kappa score for comparison  
'''

我对这个想法可能完全错了,但我读了 page 有关情绪分析的内容 “最终,工具的准确性仅仅是人类判断与工具判断一致的次数的百分比。人类之间的这种程度的一致性也被称为人类的一致性。各种人和公司进行了各种研究,他们得出结论:人类一致率在70%到79%之间。“ 我希望这是足够的信息。 :)

1 个答案:

答案 0 :(得分:4)

documentation of cohen_kappa_score中所述:

  

kappa统计量是对称的,因此交换y1和y2不会改变   价值。

此指标中没有y_predy_true。您在帖子中提到的签名是

sklearn.metrics.cohen_kappa_score(y1, y2, labels=None, weights=None)

在这种情况下,没有像正确和预测值那样的东西。它只是两个不同人的标签。因此,由于他们对该主题的看法和理解,它可能会有所不同。

您只需要提供两个列表(或数组),其中的标签由不同的注释器注释。排序无关紧要。

编辑1

你说你有文字评论。在这种情况下,您需要应用一些特征提取过程来识别标签。

This metric用于查找标记数据的两个人之间的协议。就像为某些数据样本分配类一样。这不能直接用于原始文本。

编辑2 : 假设你的y只包含整数(可能是从1到10的评论),这就成了一个多类分类问题。它受到cohen_kappa_score

的scikit实现的支持

如果我正确理解您发布的情绪分析链接,那么您应该这样做:

Y_pred = new_model.predict(X_test_dtm)
cohen_score = cohen_kappa_score(Y_test, Y_pred)