赞
踩
from sklearn.cross_validation import train_test_split
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
为了演示,我们生成数据,数据一共1000条记录,每条记录100个特征,内容随机生成。
## 数据集生成
x, y = make_classification(n_samples=1000, n_features=100, n_redundant=0, random_state=1)
train_X, test_X, train_y, test_y = train_test_split(x, y, test_size=0.2, random_state=555)
## KNN训练与预测
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(train_X, train_y)
pred_y = knn.predict(test_X)
混淆矩阵(Confusion Matrix):将分类问题按照真实情况与判别情况两个维度进行归类的一个矩阵,在二分类问题中,可以用一个 2 × 2 2\times 2 2×2 的矩阵表示。
TP
表示实际为真预测为真,TN
表示实际为假预测为假,FN
表示实际为真预测为假,通俗讲就是漏报了,FP
表示实际为假预测为真,通俗讲就是误报了。from sklearn.metrics import confusion_matrix
conf_m = confusion_matrix(test_y, pred_y)
print('confusion matrix: \n', conf_m)
输出结果
confusion matrix:
[[59 49]
[17 75]]
机器学习中最基本指标是 召回率(Recall Rate,也称 查全率) 和 准确率(Precision Rate,也称查准率)。其计算公式如下:
p
r
e
c
i
s
i
o
n
=
T
P
T
P
+
F
P
precision=\frac{TP}{TP+FP}
precision=TP+FPTP
r
e
c
a
l
l
=
T
P
T
P
+
F
N
recall=\frac{TP}{TP+FN}
recall=TP+FNTP
通俗示例:某池塘有1400条鲤鱼,300只虾,300只鳖。现在以捕鲤鱼为目的。撒一大网,逮着了700条鲤鱼,200只虾,100只鳖。那么,这些指标分别如下:
p
r
e
c
i
s
i
o
n
=
700
700
+
200
+
100
=
70
%
precision=\frac{700}{700+200+100}=70\%
precision=700+200+100700=70%
r
e
c
a
l
l
=
700
1400
=
50
%
recall=\frac{700}{1400}=50\%
recall=1400700=50%
from sklearn.metrics import precision_score, recall_score
precision = precision_score(test_y, pred_y)
print("precision score: ", precision)
recall = recall_score(test_y, pred_y)
print("recall score: ", recall)
输出结果
precision score: 0.6048387096774194
recall score: 0.8152173913043478
准确度(Accuracy) :对检测结果一个均衡的评价,对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。也就是损失函数是 0-1损失
时测试数据集上的准确率。它的定义如下:
A
c
c
u
r
a
c
y
=
T
P
+
T
N
P
+
N
=
T
P
+
T
N
T
P
+
T
N
+
F
P
+
F
N
Accuracy=\frac{TP+TN}{P+N}=\frac{TP+TN}{TP+TN+FP+FN}
Accuracy=P+NTP+TN=TP+TN+FP+FNTP+TN
F1-Score:对准确率和召回率的一个均衡评价,F1值就是精确值和召回率的调和均值, 也就是
2
F
1
=
1
P
r
e
c
i
s
i
o
n
+
1
R
e
c
a
l
l
\frac{2}{F_1} = \frac{1}{Precision} + \frac{1}{Recall}
F12=Precision1+Recall1
也就是
F
1
=
2
P
r
e
c
i
s
i
o
n
×
R
e
c
a
l
l
P
r
e
c
i
s
i
o
n
+
R
e
c
a
l
l
=
2
T
P
2
T
P
+
F
P
+
F
N
F_1 = \frac{2Precision\times{Recall}}{Precision+{Recall}} = \frac{2TP}{2TP + FP + FN}
F1=Precision+Recall2Precision×Recall=2TP+FP+FN2TP
国内外不少数据挖掘比赛都是重点关注F1-Score的值。
from sklearn.metrics import accuracy_score, f1_score
acc = accuracy_score(test_y, pred_y)
print("accuracy score: ", acc)
f1 = f1_score(test_y, pred_y)
print("F1 score: ", f1)
输出结果
accuracy score: 0.67
F1 score: 0.6944444444444445
ROC(Receiver Operating Characteristic Curve,受试者工作特征曲线):以TPR(True Position Rate,真阳性率)为纵坐标,FPR(False Position Rate,假阳性率)为横坐标绘制的曲线,是反映灵敏性和特效性连续变量的综合指标。一般认为ROC越光滑说明分类算法过拟合的概率越低,越接近左上角说明分类性能越好。
AUC(Area Under the Receiver Operating Characteristic Curve) 就是量化衡量ROC分类性能的指标,如下图所示,物理含义是ROC曲线的面积,AUC越大越好。
from sklearn.metrics import auc, roc_curve, roc_auc_score
import matplotlib.pyplot as plt
f_pos, t_pos, thresh = roc_curve(test_y, pred_y)
auc_area = auc(f_pos, t_pos)
plt.plot(f_pos, t_pos, 'darkorange', lw=2, label='AUC = %.2f' % auc_area)
plt.legend(loc='lower right')
plt.plot([0, 1], [0, 1], color='navy', linestyle='--')
plt.title('ROC')
plt.ylabel('True Pos Rate')
plt.xlabel('False Pos Rate')
plt.show()
print("AUC: ", roc_auc_score(test_y, pred_y))
输出结果
AUC: 0.680756843800322
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。