前言
其实准确来讲,自己的秋招在10月中旬已经结束了,签了地方商业性银行,只是自己不满现状又四处折腾了一番,四大行、人行、公务员、选调生,还都试了试,对自身来讲准备的其实并不充分,通过考试的多半参杂运气成分。现如今,考试的流程均已走完,便想借此机会,将秋招的收获和感悟,与大家分享一下,顺便也做个自我总结。
背景
本科普通二本, 硕士985 双一流院校,有暑期华为公司的实习经历。
秋招经历
前期目标很不明确,对自己的定位也不清晰,有被算法工程师的高薪冲昏头脑,看不清自己和前路,志愿报的一塌糊涂,很不理想,跌跌撞撞还是走完了几个知名公司的流程。
一、美团面试 机器学习数据挖掘工程师
面试体验感: 远程视频面试,1个小时15分钟
面试流程:
1.自我介绍
2.项目介绍【面试的小哥哥 竟然根据我的项目背景将 西瓜书 的大部分领域问了个遍,几个通用问题如下()
- (1)分类问题,各样样本数量分布不均衡 的处理方法
https://blog.youkuaiyun.com/heyongluoyao8/article/details/49408131
- 数据集角度:
- 对数据集进行重采样
- 对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数)。
- 对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素)。一些经验法则:
- 考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;
- 考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;
- 考虑尝试随机采样与非随机采样两种采样方法;
- 考虑对各类别尝试不同的采样比例,比一定是1:1,有时候1:1反而不好,因为与现实情况相差甚远;
- 考虑同时使用过采样与欠采样
- 评价指标角度:
准确度评价指标在类别不均衡的分类任务中不能work
应采用 混淆矩阵 精确度 召回率 敏感度 F1得分 MCC
- 尝试产生人工数据样本
一种简单的人工样本数据产生的方法便是,对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。你可以使用基于经验对属性值进行随机采样而构造新的人工样本,或者使用类似朴素贝叶斯方法假设各属性之间互相独立进行采样,这样便可得到更多的数据,但是无法保证属性之前的线性关系(如果本身是存在的)。
SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本,即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。具体可以参见原始论文。
这里有SMOTE算法的多个不同语言的实现版本:
Python: UnbalancedDataset模块提供了SMOTE算法的多种不同实现版本,以及多种重采样算法。
R: DMwR package。
Weka: SMOTE supervised filter。
- 尝试不同的分类算法
强烈建议不要对待每一个分类都使用自己喜欢而熟悉的分类算法。应该使用不同的算法对其进行比较,因为不同的算法使用于不同的任务与数据。
决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。目前流行的决策树算法有:C4.5、C5.0、CART和Random Forest等。
- 尝试对模型进行惩罚
可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,),从而使得分类器将重点集中在小类样本身上。
一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。
如果你锁定一个具体的算法时,并且无法通过使用重采样来解决不均衡性问题而得到较差的分类结果。这样你便可以使用惩罚模型来解决不平衡性问题。但是,设置惩罚矩阵是一个复杂的事,因此你需要根据你的任务尝试不同的惩罚矩阵,并选取一个较好的惩罚矩阵。
- 尝试一个新的角度理解问题
我们可以从不同于分类的角度去解决数据不均衡性问题,我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)与变化趋势检测问题(change detection)。
异常点检测即是对那些罕见事件进行识别。如通过机器的部件的振动识别机器故障,又如通过系统调用序列识别恶意程序。这些事件相对于正常情况是很少见的。
变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。
将小类样本作为异常点这种思维的转变,可以帮助考虑新的方法去分离或分类样本。这两种方法从不同的角度去思考,让你尝试新的方法去解决问题。
【多选】在分类问题中。Eg: 正负样本数据量不等的情况,正样本10w条数据,负样本只有1w条数据,此时处理方法:
A 将负样本重复10次,生成10w样本量,打乱顺序参与分类
B.. 从10w正样本中随机抽取1w参与分类
C.将负样本每个权重设置为10,正样本权重为1,参与分类
- (2)针对100个样本,20000个变量的数据,如果直接进行二分类,应该选择什么样的方法?选择原因?
逻辑斯蒂回归 朴素贝叶斯 xgboost
- (3)变量压缩的方法,PCA主要是朝着什么样的方向压缩,收缩终结点
PCA 原理:https://blog.youkuaiyun.com/program_developer/article/details/80632779
PCA的另一种解释:
若所有样本点的投影尽可能的分开,则应该使投影后样本点的方差最大化。
- (4)案例分析
背景:校门口道路拥堵情况预测每条道路的拥堵情况不仅和当前道路前一个时间点拥堵情况有关系,还和与这条道路临近的其他道路的拥堵情况有关。甚至还和昨天当前时间点当前道路是否拥堵有关联。我们可以根据这个规律,构建训练集,预测一条道路拥堵情况。
假设现在要训练一个模型:使用某条道路最近三分钟拥堵的情况,预测该条道路下一分钟的拥堵情况。如何构建训练集
题目:预测明天某时刻校门口,是否拥堵?
回答:
- 数据收集,
-
时间:3个月的车流量历史信息
特征变量:时间3个月:考虑到季节,天气
是否是开学季:
是否有政府重大活动的举行
是否是节假日
固定时间段的经常行驶的车辆3个月的历史行驶信息
【想通过判断车辆的历史行驶路线,判断这些车辆出行的可能性】
临近道路前3分钟道路拥堵情况
当前道路每分钟经过的车辆数和速度总和
当前道路前3分钟道路的拥堵情况
3个月的每天某时刻的拥堵情况 拥堵/不拥堵
- 问题分析
二分类问题
计算道路每分钟经过的车辆数和速度总和,可以得到道路实时拥堵情况。
预测道路的拥堵情况受当前道路附近道路拥堵的情况,受这几个道路过去几分钟道路拥堵的情况。预测道路拥堵情况可以根据附近每条道路和当前道路前3分钟道路拥堵的情况来预测。用附近每条道路和当前道路前3分钟道路的拥堵情况来当做维度。统计这些道路过去5个小时内每分钟的前3分钟拥堵情况构建数据集。
注意:提高模型的分类数,会提高模型的抗干扰能力。比如道路拥堵情况就分为两类:“畅通”、“拥堵”,如果模型针对一条本来属于“畅通”分类的数据预测错了,那么预测结果只能就是“拥堵”,那么就发生了质的改变。
如果我们将道路拥堵情况分为四类:“畅通”,“比较畅通”,“比较拥堵”,“拥堵”。如果模型针对一条本来数据“畅通”分类的数据预测错了,那么预测结果错的情况下就不是只有“拥堵”这个情况,有可能是其他三类的一种,也有一定的概率预测分类为“比较畅通”,那么就相当于提高了模型的抗干扰能力。
- 方法选择
朴素贝叶斯 逻辑斯蒂回归
- 方法选择原因:【其实是说 本方法的优点】
二分类问题 变量数量不多,数据量不大
3.代码测试【不限制语言】
- 二叉树遍历
- 前序遍历代码 python
二、面试体会:
1.熟悉的项目了解的比较详细,详细到数据集的大小,具体的实验设计方案
2.机器学习知识的考查
重在对机器学习整体框架的把控,如分类问题 /回归问题
3.对xgboost 特别感兴趣
4.以具体案例为背景,开展一系列的问题
5.注重数据集的处理,针对不同场景的处理办法