我正在为我的情绪分析模型评估不同的分类器 . 我正在查看所有可用的指标,虽然大多数达到类似的精确度,召回率,F1分数和ROC-AUC分数,但线性SVM似乎得到了 perfect ROC-AUC分数 . 请看下面的图表:
缩写:MNB =多项式朴素贝叶斯,SGD =随机梯度下降,LR = Logistic回归,LSVC =线性支持向量分类
以下是LSVC的其余性能指标,它们与其他分类器非常相似:
precision recall f1-score support
neg 0.83 0.90 0.87 24979
pos 0.90 0.82 0.86 25021
avg / total 0.87 0.86 0.86 50000
正如您所看到的,数据集是针对pos和neg注释进行 balancer 的 .
这是相关代码:
def evaluate(classifier):
predicted = classifier.predict(testing_text)
if isinstance(classifier.steps[2][1], LinearSVC):
probabilities = np.array(classifier.decision_function(testing_text))
scores = probabilities
else:
probabilities = np.array(classifier.predict_proba(testing_text))
scores = np.max(probabilities, axis=1)
pos_idx = np.where(predicted == 'pos')
predicted_true_binary = np.zeros(predicted.shape)
predicted_true_binary[pos_idx] = 1
fpr, tpr, thresholds = metrics.roc_curve(predicted_true_binary, scores)
auc = metrics.roc_auc_score(predicted_true_binary, scores)
mean_acc = np.mean(predicted == testing_category)
report = metrics.classification_report(testing_category, predicted)
confusion_matrix = metrics.confusion_matrix(testing_category, predicted)
return fpr, tpr, auc, mean_acc, report, confusion_matrix
我使用 predict_proba
除了 LSVC
之外的所有分类器使用 decision_function
代替(因为它没有 predict_proba
方法`)
What's going on?
编辑:根据@Vivek Kumar的评论改变:
def evaluate(classifier):
predicted = classifier.predict(testing_text)
if isinstance(classifier.steps[2][1], LinearSVC):
probabilities = np.array(classifier.decision_function(testing_text))
scores = probabilities
else:
probabilities = np.array(classifier.predict_proba(testing_text))
scores = probabilities[:, 1] # NEW
testing_category_array = np.array(testing_category) # NEW
pos_idx = np.where(testing_category_array == 'pos')
predicted_true_binary = np.zeros(testing_category_array.shape)
predicted_true_binary[pos_idx] = 1
fpr, tpr, thresholds = metrics.roc_curve(predicted_true_binary, scores)
auc = metrics.roc_auc_score(predicted_true_binary, scores)
mean_acc = np.mean(predicted == testing_category)
report = metrics.classification_report(testing_category, predicted)
confusion_matrix = metrics.confusion_matrix(testing_category, predicted)
return fpr, tpr, auc, mean_acc, report, confusion_matrix
现在生成此图:
1 回答
我不认为比较的方法是predict_proba和decision_function之类的 . docs中LSVC决策函数"Predict confidence scores for samples."的第一句不能读作"predicting probabilties" . 第二句话澄清了它,它类似于一般的决策功能SVC.
您可以将predict_proba用于带sklearn的线性SVC;那么你需要在一般的SVC下将内核特定为'线性' . 但是,您正在改变引擎下的实现(远离“LIBLINEAR”) .