一.不同的评测指标
通常从算法类型选择指标:
- 分类指标
- 回归指标
- 聚类指标
1.分类常用的指标
准确率(accuracy): 对于给定的测试数据集,分类器正确分类的样本数与总样本数之比。
AUC(Area Under Curve):AUC更大的分类器效果更好。
2.回归常用的指标
均方误差MSE (Mean Squared Error):是反映估计量与被估计量之间差异程度的一种度量:
平均绝对误差MAD(Mean Absolute Deviation):
二.交叉验证
-
为什么要使用交叉验证?
将原始数据分成K个子集(一般是均分),将每个子集数据分别做一次测试集(testing set),其余的K-1组子集数据作为训练集(training set)。这样会得到K个模型,用这K个模型最终的验证集的分类指标的平均数作为K-CV下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取。交叉验证重复K次,每次选择一个子集作为测试集,并将K次的平均交叉验证识别正确率作为结果。
通常交叉验证法称为“K折交叉验证”, 10-folder通常被使用。 -
优点
所有的样本都被作为了训练集和测试集,每个样本都被验证一次。
三.实现分类、回归指标
机器学习库sklearn中,使用metrics方法实现。
- 分类模型的评测指标的调用
# 使用sklearn模块实现准确率计算
import numpy as np
from sklearn.metrics import accuracy_score
y_pred =[0,2,1, 3]
y_true =[0, 1, 2, 3]
print(accuracy_score(y_true, y_pred)) # 结果0.5 正确率2/4 = 0.5
print(accuracy_score(y_true, y_pred , normalize=False)) # 结果2 分正错了2个样本
# 使用sklearn模块计算AUC值
import numpy as np
from sklearn import metrics
y = np.array([1,1,2,2])
pred = np.array([0.1,0.4,0.35,0.8])
print(pred)
fpr,tpr,thresholds = metrics.roc_curve(y,pred,pos_label=2)
print(metrics.auc(fpr,tpr)) # 结果0.75
- 回归模型的评测指标的调用
# 使用sklearn模块计算均方误差
import numpy as np
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import mean_squared_error
y_true =[3, -0.5,2,7] #一维输出
y_pred =[2.5, 0,2,8]
print(mean_squared_error(y_true, y_pred)) # 结果 0.375
y_true =([0.5, 1],[-1, 1],[7, -6]) #二维输出
y_pred = ([0,2],[-1,2],[8, -5])
print(mean_squared_error(y_true, y_pred)) # 结果:0.7083333333333334
四.交叉验证(Cross validation)
机器学习库sklearn中,使用cross_val_score方法实现:
- 拟合模型和计算连续5次的分数(每次不同分割)来估计支持向量机在iris数据集上的精度。
from sklearn.model_selection import cross_val_score
scores = cross_val_score(knn, iris.data, iris.target, cv=5)
print(scores)
- 评分 估计的平均得分和95%置信区间由此给出
print(“Accuracy:%0.2f (+/-%0.2f)”%(scores.mean(),scores.std()*2))#注意不要用全角引号
# 结果: Accuracy:0.98(+/-0.03)
# 或者直接打印均值、方差
print(scores.mean())
print(scores.std()*2)
# 结果:0.9800000000000001
# 结果:0.03265986323710903
- 在默认情况下,每次cross_val_score迭代计算的指标结果是保存在属性score中的,也可以使用scoring参数来选择不同的指标。
#from sklearn import metrics
from sklearn.model_selection import cross_val_score
clf=svm.SVC(kernel='linear',C=1)
scores = cross_val_score(clf, iris.data, iris.target, cv=5,scoring='f1_macro')
print(scores)
- 当cv参数是一个整数k时,cross_val_score使用k-fold策略,同时也可以通过引入一个交叉验证迭代器来使用其他交叉验证策略。
from sklearn.model_selection import ShuffleSplit
n_samples=iris.data.shape[0]
cv=ShuffleSplit(n_splits=3,test_size=0.3,random_state=0)
scores = cross_val_score(clf, iris.data, iris.target, cv=cv)
print(scores)