算法面试必备-----贝壳算法面试准备

算法面试必备-----贝壳算法面试准备

机器学习基础

1、过拟合和欠拟合的学习曲线怎么画,横纵坐标轴分别代表什么?实际应用当中,如何区分你是过拟合还是前拟合?

学习曲线是什么?

学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,以及增大训练集是否可以减小过拟合。

学习曲线与交叉验证的关系

由于一次学习的数据不够准确,因此,使用交叉验证,设置多次(组)数据,获得多组train_scores, test_scores, 返回给learning_curve API。

怎么画?

在画学习曲线时,横轴为训练样本的数量,纵轴为准确率。

sklearn中sklearn.model_selection.learning_curve函数说明

通过cv设置交叉验证,取几次(组)数据,通过train_sizes设置每一次取值,在不同训练集大小上计算得分。

train_sizes,train_scores,test_score = learning_curve ( estimator, X, y, groups=None, train_sizes=array([0.1, 0.33, 0.55, 0.78, 1. ]), cv=’warn’, scoring=None)

estimator:估计器,用什么模型进行学习;

cv:交叉验证生成器,确定交叉验证拆分策略;

画训练集的曲线时,横轴为train_sizes, 纵轴为train_scores_mean; train_scores为二维数组,行代表train_sizes不同时的得分,列表示取cv组数据。

画测试集的曲线时:横轴为train_sizes, 纵轴为test_scores_mean; test_scores为二维数组

learning_curve为什么运行时间那么长:模型要进行train_sizes * cv次运行

如何判断?

在这里插入图片描述
欠拟合情况:随着训练样本数增大,训练集得分和验证集得分收敛,并且两者的收敛值很接近。

过拟合情况:随着训练样本数增大,训练集得分和验证集得分相差还是很大。

欠拟合
当训练集和测试集的误差收敛但却很高时,为高偏差

左上角的偏差很高,训练集和验证集的准确率都很低,很可能是欠拟合。
我们可以增加模型参数,比如,构建更多的特征,减小正则项。
此时通过增加数据量是不起作用的。

过拟合
当训练集和测试集的误差之间有大的差距时,为高方差

当训练集的准确率比其他独立数据集上的测试结果的准确率要高时,一般都是过拟合。
右上角方差很高,训练集和验证集的准确率相差太多,应该是过拟合。
我们可以增大训练集,降低模型复杂度,增大正则项,或者通过特征选择减少特征数。

理想情况
理想情况是是找到偏差和方差都很小的情况,即收敛且误差较小。

2、对于不平衡数据集,有什么应对方案?

即数据集中,每个类别下的样本数目相差很大。例如,在一个二分类问题中,共有 100 个样本(100 行数据,每一行数据为一个样本的表征),其中 80 个样本属于 class 1,其余的 20 个样本属于 class 2,class 1:class2=80:20=4:1,这便属于类别不均衡。当然,类别不均衡问题同样会发生在多分类任务中。

解决不平衡分类问题的策略可以分为两大类:一类是从训练集入手 , 通过改变训练集样本分布,降低不平衡程度;另一类是从学习算法入手 , 根据算法在解决不平衡问题时的缺陷 , 适当地修改算法使之适应不平衡分类问题。

平衡训练集的方法主要有训练集重采样 (re-sampling)方法和训练集划分方法。

学习算法层面的策略包括分类器集成 、代价敏感学习和特征选择方法等。
在这里插入图片描述

3、数据集不平衡时采用评价指标呢?

评估指标1:recall,Precision,F-score

其中F-score是两者的中和,一般认为F-measure越高,分类器的性能越好;
Precision就是提交给用户的结果里边,究竟有多少是对的;
Recall是一共有这么多的有用结果(包括真正的正样本和负样本),系统究竟能判定出来多少是有用的(能够检出多少?),或者反过来说,我们究竟丢了多少有用的。

这两个数是成对出现,单独出现没有意义。为什么这么说?一个例子是我可以轻轻松松将recall提高到100%,那就是不管用户查询啥,我都把系统内所有的文档都给他,这样肯定没丢东西,但是用户也没法得到的好的结果。

但是我们还是希望有一个数能够衡量系统的性能,否则系统A的precision比系统B高,但是recall却比系统B低,那么我们就不太好选了。所以综合Precision和Recall,我们得到一个F Score

在这里插入图片描述

在这里插入图片描述

评估指标2:ROC(接受者操作特征曲线)与AUC

以假正率为x轴,以真正率为y轴做出的曲线。
AUC即ROC特征曲线下面的面积,AUC越大分类器性能越好。最后说说AUC的优势,AUC的计算方法同时考虑了分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价。例如在反欺诈场景,设非欺诈类样本为正例,负例占比很少(假设0.1%),如果使用准确率评估,把所有的样本预测为正例便可以获得99.9%的准确率。但是如果使用AUC,把所有样本预测为正例,TPRate和FPRate同时为1,AUC仅为0.5,成功规避了样本不均匀带来的问题。

简述 ROC 曲线统计量的含义?

ROC 曲线 X 轴为 false positive rate(FPR),Y 轴为 true positive rate(TPR):

在这里插入图片描述
考虑 ROC 曲线图中的四个点和一条线。第一个点(0,1),即 FPR=0, TPR=1,这意味着 FN(false negative)=0,并且 FP(false positive)=0。Wow,这是一个完美的分类器,它将所有的样本都正确分类。第二个点,(1,0),即 FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。第三个点,(0,0),即 FPR=TPR=0,即 FP(false positive)=TP( true positive ) =0 ,可以发现该分类器预测所有的样本都为负样本(negative)。类似的,第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC 曲线越接近左上角,该分类器的性能越好。

考虑 ROC 曲线图中的虚线 y=x 上的点。这条对角线上的点其实表示的是一个采用随机猜测策略的分类器的结果,例如(0.5,0.5),表示该分类器随机对于一半的样本猜测其为正样本,另外一半的样本为负样本。

当测试集中的正负样本的分布变化的时候,ROC 曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。下图是 ROC 曲线和 Precision-Recall 曲线的对比:
在这里插入图片描述
(a)和©为 ROC 曲线,(b)和(d)为 Precision-Recall 曲线。(a)和(b)展示的是分类其在原始测试集(正负样本分布平衡)的结果,©和(d)是将测试集中负样本的数量增加到原来的 10 倍后,分类器的结果。可以明显的看出,ROC 曲线基本保持原貌,而 Precision-Recall 曲线则变化较大。

如何画出一个 ROC 曲线?

在这里插入图片描述
在这里插入图片描述
当我们将 threshold 设置为 1 和 0 时,分别可以得到 ROC 曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了 ROC 曲线。当 threshold 取值越多, ROC 曲线越平滑。

其实,我们并不一定要得到每个测试样本是正样本的概率值,只要得到这个分类器对该测试样本的“评分值”即可(评分值并不一定在(0,1)区间)。评分越高,表示分类器越肯定地认为这个测试样本是正样本,而且同时使用各个评分值作为threshold。

简述 AUC 曲线统计量的含义?

AUC(Area Under Curve)被定义为 ROC 曲线下的面积,显然这个面积的数值不会大于 1。又由于 ROC 曲线一般都处于 y=x 这条直线的上方,所以 AUC 的取值范围在 0.5 和 1 之间。使用 AUC 值作为评价标准是因为很多时候 ROC 曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应 AUC 更大的分类器效果更好。

首先 AUC 值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分 类算法根据计算得到的 Score 值将这个正样本排在负样本前面的概率就是 AUC 值。当然,AUC 值越大,当前的分类算法越有可能将正样本排在负样本前面,即 能够更好的分类。

显然 A 点为最优点,ROC 曲线越靠近 A 点代表模型表现越好,曲线下面积(Area Under Curve, AUC)越大,AUC 是衡量模型表现好坏的一个重要指标。
在这里插入图片描述

AUC为什么对不平衡的情况不敏感?

AUC就是所有正样本中随机选取一个样本A,所有负样本中随机选取一个样本B,然后根据分类器对两个随机样本进行预测,把样本A预测为正类的概率=p1,把样本B预测为正类的概率=p0,p1>p0的概率即为AUC。

(因为它不依赖决定分类时候的阈值,是直接排序计算的)

4、面对不平衡数据,还有哪些深度学习上的方法?

权值均衡

权值均衡是在训练样本的时候,在计算loss的时候,通过权值来均衡数据的分布。正常情况下,每个类别在损失函数中的权值是1.0。但是有时候,当某些类别特别重要的时候,我们需要给该类别的训练样本更大权值。参考我们的买房的例子,由于“买”的类别的准确率非常的重要,训练样本中的这个类别应该对损失函数有更大的影响。

**可以直接给对应的类别的样本的loss乘上一个因子来设定权值。**在Keras中,我们可以这样:

我们创建了一个字典,其中,“买”类别为75%,表示了占据了75%的loss,因为比“不买”的类别更加的重要,“不买”的类别设置成了25%。当然,这两个数字可以修改,直到找到最佳的设置为止。我们可以使用这种方法来均衡不同的类别,当类别之间的样本数量差别很大的时候。我们可以使用权值均衡的方式来使我们的所有的类别对loss的贡献是相同的,而不用取费力的收集少数类别的样本了。

另一个可以用来做训练样本的权值均衡的是Focal loss。如下所示,主要思想是这样:在数据集中,很自然的有些样本是很容易分类的,而有些是比较难分类的。在训练过程中,这些容易分类的样本的准确率可以达到99%,而那些难分类的样本的准确率则很差。问题就在于,那些容易分类的样本仍然在贡献着loss,那我们为什么要给所有的样本同样的权值?

在这里插入图片描述

这正是Focal loss要解决的问题。focal loss减小了正确分类的样本的权值,而不是给所有的样本同样的权值。这和给与训练样本更多的难分类样本时一样的效果。在实际中,当我们有数据不均衡的情况时,我们的多数的类别很快的会训练的很好,分类准确率很高,因为我们有更多的数据。但是,为了确保我们在少数类别上也能有很好的准确率,我们使用focal loss,给与少数类别的样本更高的权值。focal loss使用Keras是很容易实现的:

过采样和欠采样

选择合适的类别的权重有时候比较复杂。做一个简单的频率倒数可能有时候效果也不好。Focal loss有点用,但是仍然会对所有的正确分类的样本都做权值的下降。另外一个数据均衡的方法就是直接的采样。下面的图给出了一个大概的说明.
在这里插入图片描述

在图像的两边,蓝色的类别比橘黄色的类别的样本多得多。这种情况下,我们在预处理时,有两种选择。

欠采样意思是从多数的类别中只采样其中的一部分的样本,选择和少数类别同样多的样本。这种采样保持了该类别原来的数据分布。这很容易,我们只需要少用点样本就可以让数据变得均衡。

过采样的意思是我们复制少数类别中的样本,使得数量和多数样本一样多。复制操作需要保持少数样本的原有的数据分布。我们不需要获取更多的数据就可以让数据集变得均衡。

采样的方法是一个很好的类别均衡的方法,如果你发现类别权值很难做而且效果不好的时候,可以试试!

5、bagging和boosting的区别

1)样本选择上:

Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

2)样例权重:

Bagging:使用均匀取样,每个样例的权重相等

Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

3)预测函数:

Bagging:所有预测函数的权重相等。

Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

4)并行计算:

Bagging:各个预测函数可以并行生成

Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值