模型的选择与评估
参考
机器学习参考
1.sklearn.model_selection
通过交叉验证得分:
model_selection.cross_val_score(clf,data,target,cv=5,scoring=“f1_macro”)
对每个输入数据点产生交叉验证估计:
model_selection.cross_val_predict(clf,data,target,cv=5)
计算并绘制模型的学习率曲线:
model_selection.learning_curve(estimator,X,y)
2.klearn.metrics
指所有分类正确的百分比:准确率:
(accuracy_score(target,y_test,normalize=True,sample_weight=None))
normalize:默认为True,返回正确分类的比例;如果为False:返回正确分类的样本数
recall_score:召回率
找到的数目与总的需要我们找到的数目的比。
klearn.metrics.recall_score(y_true, y_pred, labels=None,
pos_label=1,average='binary', sample_weight=None)
参数average:string, [None, ‘micro’, ‘macro’(default), ‘samples’, ‘weighted’]
macro:计算二分类metrics的均值,为每个类给出相同权重的分值。因此macro-averaging方法会对小类的性能影响很大。
weighted:对于不均衡数量的类来说,计算二分类metrics的平均,通过在每个类的score上进行加权实现。
micro:给出了每个样本类以及它对整个metrics的贡献的pair(sample-weight),而非对整个类的metrics求和,它会每个类的metrics上的权重及因子进行求和,来计算整个份额。Micro-averaging方法在多标签(multilabel)问题中设置,包含多分类,此时,大类将被忽略。
samples:应用在multilabel问题上。它不会计算每个类,相反,它会在评估数据中,通过计算真实类和预测类的差异的metrics,来求平均(sample_weight-weighted)
average:average=None将返回一个数组,它包含了每个类的得分.
roc_curve:ROC曲线指受试者工作特征曲线/接收器操作特性(receiver operating characteristic,ROC)曲线,是反映灵敏性和特效性连续变量的综合指标,是用构图法揭示敏感性和特异性的相互关系,它通过将连续变量设定出多个不同的临界值,从而计算出一系列敏感性和特异性。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真正例率(也就是灵敏度)(True Positive Rate,TPR)为纵坐标,假正例率(1-特效性)(False Positive Rate,FPR)为横坐标绘制的曲线。
sklearn.metrics.roc_curve(y_true,y_score, pos_label=None,
sample_weight=None, drop_intermediate=True)
该函数返回这三个变量:fpr,tpr,和阈值thresholds;
分类器的一个重要功能“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本)。
“Score”表示每个测试样本属于正样本的概率。
接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。其实,我们并不一定要得到每个测试样本是正样本的概率值,只要得到这个分类器对该测试样本的“评分值”即可(评分值并不一定在(0,1)区间)。评分越高,表示分类器越肯定地认为这个测试样本是正样本,而且同时使用各个评分值作为threshold。我认为将评分值转化为概率更易于理解一些。
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
Auc:计算AUC值
计算AUC值,其中x(fpr),y(tpr)分别为数组形式,根据(xi,yi)在坐标上的点,生成的曲线,然后计算AUC值;
sklearn.metrics.auc(x, y, reorder=False)
roc_auc_score
sklearn.metrics.roc_auc_score(y_true, y_score, average=‘macro’, sample_weight=None)
confusion_matrix:混淆矩阵
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
labels:混淆矩阵的索引(如上面猫狗兔的示例),如果没有赋值,则按照y_true, y_pred中出现过的值排序。
均方误差是指参数估计值与参数真值之差平方的期望值;
MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。
(mean_squared_error(target,dicted))
交叉验证:评估估计器性能
学习预测函数的参数并在相同的数据上进行测试是一个方法上的错误:一个只会重复其刚刚看到的样本的标签的模型将具有完美的分数,但是无法预测任何有用的,看不见的数据。这种情况称为过拟合。为了避免这种情况,通常的做法是执行(监督)机器学习实验以将部分可用数据作为测试集。X_test, y_test
**train_test_split**:在scikit中,学习随机分组到训练和测试集中.
```
rom sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
data=load_iris().data
target=load_iris().target
X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=0.4,random_state=0)
clf=SVC(kernel="linear").fit(X_train,y_train)
print(clf.score(X_test,y_test))
```
分析:当评估用于估计器的不同设置(“超参数”),例如C必须为SVM手动设置的设置时,仍然有可能在测试集上过度拟合, 因为可以调整参数直到估计器执行最佳。这样,关于测试集的知识可以“泄漏”到模型中,并且评估指标不再报告泛化性能。为了解决这个问题,数据集的另一部分可以被称为所谓的“验证集”:训练在训练集上进行,之后对验证集进行评估,当实验似乎成功时,可以在测试集上进行最终评估。
然而,通过将可用数据分为三组,我们大大减少了可用于学习模型的样本数,结果可能取决于一对(训练,验证)集合的特定随机选择。
解决:解决这个问题的方法是一个称为 交叉验证 (简称简历)的过程。一个测试集仍然需要进行最终评估,但是在做CV时不再需要验证集。在基本方法中,称为k- fold CV,训练集被分为k个较小的集合(其他方法如下所述,但通常遵循相同的原则)。
然后通过k倍交叉验证报告的绩效指标是循环中计算的值的平均值。这种方法在计算上可能是昂贵的,但是不会浪费太多的数据(如固定任意测试集的情况),这是问题的主要优点,例如反向推理,其中样本数量非常小。
计算交叉验证的度量
使用交叉验证的最简单的方法是cross_val_score在估计器和数据集上调用 帮助函数。
默认情况下,每个CV迭代计算的分数是score 估计量的方法。可以通过使用评分参数来改变它:
计算交叉验证的得分 print(cross_val_score(clf,data,target,cv=5,scoring="f1_macro"))
因此,得分估计的平均分数和95%置信区间由下式给出:
print('Accuracy:%.2f(+/-%.2f)'%(scores.mean(),scores.std()*2))
通过交叉验证获取预测
该函数与输入中的每个元素cross_val_predict具有类似的接口 cross_val_score,但返回,当该元素在测试集中时为该元素获得的预测。只有交叉验证策略才能将所有元素精确地分配给测试集一次(否则引发异常)。
然后可以使用这些预测来评估分类器:
对每个输入数据点产生交叉验证估计
dicted=cross_val_predict(clf,data,target,cv=5)
print(accuracy_score(target,dicted))
print(mean_squared_error(target,dicted))