[TOC]
一般针对过拟合的情况,我们可以在损失函数中增加正则项(L0、L1、L2范数,Dropout)来解决过拟合的问题
机器学习中常常提到的正则化到底是什么意思?
精确率是针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。
召回率是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。
demo1
假设我们手上有60个正样本,40个负样本,我们要找出所有的正样本,系统查找出50个,其中只有40个是真正的正样本,计算上述各指标。
TP: 将正类预测为正类数 40(系统查找出40个是真正的正样本)
FN: 将正类预测为负类数 20(60个正样本 - 系统查找出40个是真正的正样本)
FP: 将负类预测为正类数 10(系统查找出50个 - 系统查找出40个是真正的正样本)
TN: 将负类预测为负类数 30(系统查找出50个正样本,那么就是预测了50个负样本,但是50个认为的负样本中实际上有20个正样本,所以30=50-20)
准确率(accuracy)(ACC) = 预测对的/所有 = (TP+TN)/(TP+FN+FP+TN) = 70%
精确率(precision)(PPV) = TP/(TP+FP) = 80%
召回率(recall) = TP/(TP+FN) = 2/3
灵敏度(Sensitivity)(TPR):就是召回率(Recall)召回率 = 提取出的正确信息条数 / 样本中的信息条数。通俗地说,就是所有准确的条目有多少被检索出来了
真正例率 (TPR) 是召回率的同义词 = TP/(TP+FN)
假正例率 (FPR) = FP/(FP+TN)
特异度(TNR) Specificity = TN/(TN+FP)
以上都是二级指标
三级指标 F1 Score = 2PR/(P+R)
其中,P代表Precision,R代表Recall。
F1-Score指标综合了Precision与Recall的产出的结果。
F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差
1)TP就是【True P】;FP就是【False P】。都是站在预测的角度来描述的。
(2)P代表的是Positive【正类】; N表示的是Negative【负类】
Positive代表原始类别,而Negative代表其他所有的类别
FN:False Negative,被判定为负样本,但事实上是正样本。
FP:False Positive,被判定为正样本,但事实上是负样本。
TN:True Negative,被判定为负样本,事实上也是负样本。
TP:True Positive,被判定为正样本,事实上也是正样本。
demo2
分类阈值(也称为判定阈值)。如果值高于该阈值,则表示“垃圾邮件”;如果值低于该阈值,则表示“非垃圾邮件”。人们往往会认为分类阈值应始终为 0.5,但阈值取决于具体问题,因此您必须对其进行调整。
让我们以一种将电子邮件分为“垃圾邮件”或“非垃圾邮件”这两种类别的分类模型为例。
如果提高分类阈值,
精确率可能会提高:一般来说,提高分类阈值会减少假正例,从而提高精确率。
召回率始终下降或保持不变:提高分类阈值会导致真正例的数量减少或保持不变,而且会导致假负例的数量增加或保持不变。因此,召回率会保持不变或下降。
注意:“调整”逻辑回归的阈值不同于调整学习速率等超参数。在选择阈值时,需要评估您将因犯错而承担多大的后果。例如,将非垃圾邮件误标记为垃圾邮件会非常糟糕。不过,虽然将垃圾邮件误标记为非垃圾邮件会令人不快,但应该不会让您丢掉工作。反之将非垃圾邮件标记为垃圾邮件,那么你可以回家了。
准确率 = (TP+TN)/(TP+FN+FP+TN) = (1+90)/(1+90+1+8) = 0.91
精确率 = TP/(TP+FP) = 1/(1+1) = 0.5 ,也就是说,该模型在预测恶性肿瘤方面的正确率是 50%。
召回率 = TP/(TP+FN) = 1/(1+8) = 0.11,也就是说,该模型能够正确识别出所有恶性肿瘤的百分比是 11%。
以上数据说明:
demo4
在 roulette 游戏中,一只球会落在旋转轮上,并且最终落入 38 个槽的其中一个内。某个机器学习模型可以使用视觉特征(球的旋转方式、球落下时旋转轮所在的位置、球在旋转轮上方的高度)预测球会落入哪个槽中,准确率为 4%。
这个机器学习模型做出的预测比碰运气要好得多;随机猜测的正确率为 1/38,即准确率为 2.6%。尽管该模型的准确率“只有”4%,但成功预测获得的好处远远大于预测失败的损失。
分类 (Classification):检查您的理解情况(ROC 和 AUC)
训练集上的损失值是无法衡量模型的好坏的。我们的办法就是增加交叉验证集,即将所有数据分为三部分:训练集、交叉验证集和测试集。交叉验证集不仅在选择模型时有用,在超参数选择、正则项参数 λ 和评价模型中也很有用。(也就是划分验证集用来模型选择和调参)
validation set method一般步骤如下:
Validation set method的缺点是如果数据集比较小的话我们可能就会没有足够多的数据来训练我们的model,所以model并不能够抓到一些核心的特征,因此validation set对模型的误差的估计也就没有什么意义。我们于是就引入了cross-validation:我们将training data划分为N个set,每个set轮流用来训练model/评估model。
如果数据集够大,直接用validation set method就可以了,完全不需要用到cross-validation method
验证集最终要参与训练得到最终模型,如5折交叉验证,需要的次数是 5m+1,m是超参组合
保持正例和负例的比例不变
GroupKFold是KFold的变化形式
GroupKFold 会保证同一个group的数据不会同时出现在训练集和测试集上。因为如果训练集中包含了每个group的几个样例,可能训练得到的模型能够足够灵活地从这些样例中学习到特征,在测试集上也会表现很好。
只用一个数据作为test集,其他的数据都作为训练集,并将此步骤重复N次(N为数据集的数据数量)。
有N个样本,将每P个样本作为测试样本,其它N-P个样本作为训练样本 排列组合,从N个选P个不同组合;当P=1的时候,就变成了留一法
在分类型模型评判的指标中,常见的方法有如下三种:
ROC曲线有个很好的特性:当测试集中的正负样本的分布变化时,ROC曲线能够保持不变。在实际的数据集中经常会出现不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。下图是ROC曲线和P-R曲线的对比:
metrics.plot_precision_recall_curve
”真正例率“(True Positive Rate,简称TPR)和”假正例率“(False Positive Rate,简称FPR)
from sklearn.metrics import plot_roc_curve
svc_disp = plot_roc_curve(svc, X_test, y_test)
plt.show()
metrics.auc
就是ROC曲线下面积
https://blog.csdn.net/SmartShylyBoy/article/details/91360934
GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数。但是这个方法适合于小数据集,一旦数据的量级上去了,很难得出结果。
一般模型验证时需要用到各种指标:
model_selection.cross_validate 交叉验证
参数:scoring 就是评分指标(str, callable, list, tuple, or dict, default=None)
参数:groups:切分train/test数据集后的样本所在集合标号
验证使用的验证指标可以是方法、字符串、以及字典,如:
scoring = {'accuracy': make_scorer(accuracy_score),
'prec': 'precision'}
所有指标
from sklearn import metrics
metrics.SCORERS.keys()
指标表格
Scoring | Function | Comment |
---|---|---|
Classification | ||
‘accuracy’ | metrics.accuracy_score | |
‘balanced_accuracy’ | metrics.balanced_accuracy_score | |
‘top_k_accuracy’ | metrics.top_k_accuracy_score | |
‘average_precision’ | metrics.average_precision_score | |
‘neg_brier_score’ | metrics.brier_score_loss | |
‘f1’ | metrics.f1_score | for binary targets |
‘f1_micro’ | metrics.f1_score | micro-averaged |
‘f1_macro’ | metrics.f1_score | macro-averaged |
‘f1_weighted’ | metrics.f1_score | weighted average |
‘f1_samples’ | metrics.f1_score | by multilabel sample |
‘neg_log_loss’ | metrics.log_loss | requires predict_proba support |
‘precision’ etc. | metrics.precision_score | suffixes apply as with ‘f1’ |
‘recall’ etc. | metrics.recall_score | suffixes apply as with ‘f1’ |
‘jaccard’ etc. | metrics.jaccard_score | suffixes apply as with ‘f1’ |
‘roc_auc’ | metrics.roc_auc_score | |
‘roc_auc_ovr’ | metrics.roc_auc_score | |
‘roc_auc_ovo’ | metrics.roc_auc_score | |
‘roc_auc_ovr_weighted’ | metrics.roc_auc_score | |
‘roc_auc_ovo_weighted’ | metrics.roc_auc_score | |
Clustering | ||
‘adjusted_mutual_info_score’ | metrics.adjusted_mutual_info_score | |
‘adjusted_rand_score’ | metrics.adjusted_rand_score | |
‘completeness_score’ | metrics.completeness_score | |
‘fowlkes_mallows_score’ | metrics.fowlkes_mallows_score | |
‘homogeneity_score’ | metrics.homogeneity_score | |
‘mutual_info_score’ | metrics.mutual_info_score | |
‘normalized_mutual_info_score’ | metrics.normalized_mutual_info_score | |
‘rand_score’ | metrics.rand_score | |
‘v_measure_score’ | metrics.v_measure_score | |
Regression | ||
‘explained_variance’ | metrics.explained_variance_score | |
‘max_error’ | metrics.max_error | |
‘neg_mean_absolute_error’ | metrics.mean_absolute_error | |
‘neg_mean_squared_error’ | metrics.mean_squared_error | |
‘neg_root_mean_squared_error’ | metrics.mean_squared_error | |
‘neg_mean_squared_log_error’ | metrics.mean_squared_log_error | |
‘neg_median_absolute_error’ | metrics.median_absolute_error | |
‘r2’ | metrics.r2_score | |
‘neg_mean_poisson_deviance’ | metrics.mean_poisson_deviance | |
‘neg_mean_gamma_deviance’ | metrics.mean_gamma_deviance | |
‘neg_mean_absolute_percentage_error’ | metrics.mean_absolute_percentage_error |
分类
metrics.hamming_loss
metrics.brier_score_loss
metrics.hinge_loss
metrics.log_loss
metrics.zero_one_loss
回归
metrics.mean_absolute_error(y_true, y_pred, *)
metrics.mean_squared_error(y_true, y_pred, *) 均方误差
metrics.mean_squared_log_error(y_true, y_pred, *)
metrics.median_absolute_error(y_true, y_pred, *)
metrics.mean_absolute_percentage_error(…)
metrics.mean_poisson_deviance(y_true, y_pred, *)
metrics.mean_gamma_deviance(y_true, y_pred, *)
metrics.mean_tweedie_deviance(y_true, y_pred, *)
jaccard_score 相关系数
matthews_corrcoef 相关系数
就是metrics.precision_recall_curve + metrics.PrecisionRecallDisplay
就是metrics.roc_curve + metrics.RocCurveDisplay
就是metrics.det_curve +metrics.DetCurveDisplay
DET(Detection Error Tradeoff )曲线是对二元分类系统误码率的曲线图,绘制出错误拒绝率FRR(False Reject Rate)与错误接受率(False Accept Rate)之间随着判断阈值的变化而变化的曲线图。现在DET曲线扩展到用于模式识别分类器性能的评价的一个指标之一。
就是metrics.confusion_matrix + metrics.ConfusionMatrixDisplay
模型评估之混淆矩阵(confusion_matrix)
https://zhuanlan.zhihu.com/p/364921771
https://scikit-learn.org/stable/modules/classes.html#module-sklearn.inspection
https://github.com/csinva/imodels
https://github.com/ModelOriented/DALEX
它可以为以下机器学习框架和软件包提供支持:
https://eli5.readthedocs.io/en/latest/
https://github.com/eli5-org/eli5 2.4k(项目本身60star,但是是从一个2.4k的项目迁移过来的)
LIME主要提供三种解释方法,这三种方法都处理不同类型的数据:
https://github.com/marcotcr/lime 9.1k
SHAP(SHapley Additive exPlanations)是一种博弈论方法,用于解释任何机器学习模型的输出。
https://github.com/slundberg/shap 14k
Mlxtend(机器学习扩展)是一个用于数据科学和机器学习任务的非常有用 Python 工具库。
https://github.com/rasbt/mlxtend 3.6k
网络结构的可视化
https://github.com/waleedka/hiddenlayer 1.5k
网络结构的可视化
https://github.com/szagoruyko/pytorchviz 2k
训练过程可视化;tensorboardX来让pytorch的玩家也能享受tensorboard的福利
https://github.com/lanpa/tensorboardX 7.1k
Visdom是Facebook为pytorch开发的一块可视化工具。类似于tensorboard,visdom也是通过在本地启动前端服务器来实现可视化的,而在具体操作上,visdom又类似于matplotlib.pyplot。所以使用起来很灵活。
https://github.com/fossasia/visdom 8.7k
https://zhuanlan.zhihu.com/p/93109455
评比规则:通用基础项(50%)+gihub评分(50%)+加分项(20%)
TPOT ++ 一种自动化的机器学习工具包,可优化一系列scikit-learner操作员以设计机器学习管道,包括数据和功能预处理器以及估计器。可以替代scikit-learn估算器。
auto-sklearn ++ 自动机器学习工具包和scikit-learn估计器的直接替代品
pycaret ++ PyCaret是一个开源的、低代码的Python机器学习库,它允许您在选择的笔记本环境中,在几分钟内从准备数据到部署模型。
autoviml 用单行代码自动构建多个机器学习模型。设计为使用scikit学习模型的更快方法,而无需预处理数据。
Featuretools 执行自动特征工程的框架。它可以用于将时间和关系数据集转换为用于机器学习的特征矩阵。
Neuraxle 一个用于构建整洁管道的库,提供正确的抽象以简化机器学习应用程序的研究,开发和部署。它与深度学习框架和scikit-learn API兼容,可以流式处理迷你批处理,使用数据检查点,构建时髦的管道以及使用自定义逐步保存程序序列化模型。