数据挖掘实习
原文:http://aleeee.com/category/it/interview
百度数据挖掘实习工程师一、二现场面试(深圳)
一面
项目
详细介绍项目。
现场手写代码
- 字符串反转
- 快排
Python
- 如何提高Python的运行效率
- 写一个简单的正则匹配表达式(将文本中的123.4匹配出来)
机器学习
- KNN(分类与回归)
- CART(回归树用平方误差最小化准则,分类树用基尼指数最小化准则)
- Logistics(推导)
- GBDT(利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树)
- 随机森林(Bagging+CART)
- SVM与随机森林比较
- 改变随机森林的训练样本数据量,是否会影响到随机森林学习到的模型的复杂度
- Logistics与随机森林比较
- GBDT与随机森林比较
- 自己实现过什么机器学习算法
- 推荐算法(基于用户的协同过滤,基于内容的协同过滤)
- 如何做一个新闻推荐
其他
- Map-reduce,Hadoop
- 一个袋子里有很多种颜色的球,其中抽红球的概率为1/4,现在有放回地抽10个球,其中7个球为红球的概率是多少?(伯努利试验)
二面
项目
- 详细介绍项目
- 从项目中在哪一方面体会最深
- 自己项目中有哪些可以迁移到其他领域的东西
- 除了老师的科研课题,是否有做过其他项目
数据结构
- 介绍大顶堆和小顶堆
- 二叉树的前中后遍历
- 手写二叉树前序递归遍历算法(千万不要忘记异常处理!)
- 介绍二叉树前序遍历非递归遍历算法
编程语言
Python
- list有哪几种添加元素的方法,能否从表头插入元素?(append, extend和insert, insert能从表头插入元素, 但是时间复杂度为O(n).)
- 如何获取list中最后一个元素
-
a = [1, 2, 3, 4], b = a, b[0] = 100
, 请问print(a)结果是什么 - list是怎样实现的
C++
-
char a[4] = {1, 2, 3, 4}; char *b = a; b[0] = 100;
请问输出a的结果是什么? - STL中vector是怎样实现的
- 是否有用C++写过实际的工程项目
总结
一,二面从下午3点一直到5点半,所以题目就记下一部分。感觉百度的要求挺高的,既要理论知识到位,还要写代码熟练,对底层、效率等方面也需要有一定的了解,编程方面比较看重C++。
百度NLP电面总结(数据挖掘)
编程基础
C++
Python
- 常用的数据结构及应用场景(list,dict,tuple)
统计知识
给定一个分类器p,它有0.5的概率输出1,0.5的概率输出0。
-
Q1:如何生成一个分类器使该分类器输出1的概率为0.25,输出0的概率为0.75? Ans:连续进行两次分类,两次结果均为1则输出1,其余情况(10,01,00)均输出0。
-
Q2:如何生成一个分类器使该分类器输出1的概率为0.3,输出0的概率为0.7? Tip:小明正在做一道选择题,问题只有A、B和C三个选项,通过抛一个硬币来使选择3个选项的概率相同。小明只需抛连续抛两次硬币,结果正正为A,正负为B,负正为C,负负则重新抛硬币。 Ans:连续进行4次分类(2^4=16 > 10),结果前3种情况则输出1,结果接下来7种情况则输出0,其余情况重新进行分类。
工程应用问题
-
Q1:给定一个1T的单词文件,文件中每一行为一个单词,单词无序且有重复,当前有5台计算机。请问如何高效地利用5台计算机完成文件词频统计工作? Ans(有问题的):将1T文件切分为5份,分配给5台计算机。每台计算机进行词频统计工作,输出一个结果为{单词:频数}的字典结果文件。将5台计算机生成的5个结果文件合并。
-
Q2:每台计算机需要计算200G左右的文件,内存无法存放200G内容,那么如何统计这些文件的词频? Ans(不是最优):首先将文件排序,然后遍历利用list存储结果即可。(不能用字典,因为200G统计出来的结果会很大,没有那么大的内存存放字典。由于经过排序操作,遍历存储并不会使结果丢失,所以用list存储结果即可,每当一个list即将占满内存,则将其写入文件,然后清空list继续存储结果。)
-
Q3:如何将1T的文件均匀地分配给5台机器,且每台机器统计完词频生成的文件只需要拼接起来即可(即每台机器统计的单词不出现在其他机器中) Ans1(不是很好):对1T文件中的单词进行抽样,获得其概率分布,遍历文件,然后根据首字母的概率均匀分配至5台计算机,如a到e的概率均为0.04, 0.04*5=0.2,则将所有以a-e的单词放入第1台计算机,若z的概率为0.2,则把所有以z开头的单词放入第5台计算机。缺点:不具有可扩展性,如果有100台计算机,那么可能就需要2个字母计算了,则程序就要改变。还有可能出现2台机器中有相同的单词。Ans2(不是最优):遍历文件,对于每一个单词,获得单词中各字母的ASCII码值,然后将ASCII值之和取余。则每台机器中的单词必定是不一样。
总结
百度NLP部门电面考的基础很多,但是关于机器学习、数据挖掘方面的知识一个都没有问,坑爹啊!!!亏我准备了好久关于机器学习方面(特别是SVM,随机森林和AdaBoost)的东西!!!所以即使是投递机器学习、数据挖掘和自然语言处理相关的岗位,关于编程基础(C/C++)和算法还是得准备。
阿里巴巴电话面试2面总结_数据挖掘工程师(天猫事业部)
项目相关
- 介绍项目
- 项目相比别人有什么优劣
- 项目的数据从哪里来
- 项目的特征向量的归一化与异常处理
- 项目的下载量
- 目前在研究什么
- 参加天猫大数据推荐算法成绩
机器学习
- 线性分类器与非线性分类器的区别及优劣;
- 特征比数据量还大时,选择什么样的分类器?
- 对于维度很高的特征,你是选择线性还是非线性分类器?
- 对于维度极低的特征,你是选择线性还是非线性分类器?
- 如何解决过拟合问题?
- L1和L2正则的区别,如何选择L1和L2正则?
- 随机森林的学习过程;
- 随机森林中的每一棵树是如何学习的;
- 随机森林学习算法中CART树的基尼指数是什么?
算法
- 如何找到第k大的数?
总结
机器学习知识中问的很细,不仅需要考虑算法本身,还需要考虑应用。
LibSVM简易入门要点备忘
SVM
数据预处理
类别特征
使用m个数字来代表一个m类属性,且m个数字中只有1个为1,其余均为0。例如,一个三类别属性红、绿、蓝,可以用(0,0,1),(0,1,0)和(1,0,0)表示。只要数值不是太大,这种编码方式比单个数字更健壮。
Scaling
Scaling的主要优势是避免大数值属性主导小数值属性,另外一个优势是避免计算中的数值困难。因为Kernel值通常依赖于特征向量的内积,例如对于linear kernel和polynomial kernel,大的属性值将会造成数值问题。推荐将每个属性值范围放缩到[-1, +1]或者[0, 1]。 另外特别注意,训练集和测试集要用相同的放缩方法。
模型选择
RBF Kernel
- 一般来说,RBF kernel是可靠的首选。RBF Kernel将输入空间非线性地转换到一个更高维的特征空间,从而解决了非线性问题。
- RBF kernel只有1个参数,而参数越多,模型选择的复杂度越高。如polynomial kernel有三个参数,选择最优的模型非常复杂。
- RBF kernel很少有数值困难的问题。一个关键点就是RBF kernel计算出来的Kij范围是(0, 1],而当polynomial kernel的degree很大时,计算的Kij值可能趋向于无穷或者0。另外,sigmoid kernel在某些参数下是非法的(例如不是两个向量的内积)。
- 在某些情况下RBF kernel是不合适的。实际情况中,当特征数非常大时,我们大多会考虑用linear kernel。
交叉验证和Grid-Search
RBF kernel有2个参数:C和gamma。The parameter C, common to all SVM kernels, trades off misclassification of training examples against simplicity of the decision surface. A low C makes the decision surface smooth, while a high C aims at classifying all training examples correctly. the gamma parameter defines how far the influence of a single training example reaches, with low values meaning ‘far’ and high values meaning ‘close’. A low C makes the decision surface smooth, while a high C aims at classifying all training examples correctly. (摘自scikit-learn Parameters of the RBF Kernel,RBF SVM parameters。个人粗暴理解:C则是分类器判错的惩罚权重,C越大,判错惩罚越大,越拟合,但容易过拟合;C越小,判错惩罚越小,分界超平面越平滑,但容易欠拟合。gamma影响一个单个的训练实例径向的范围,gamma越小,范围越大,gamma越大,范围越小。所以越小的C,决策面越平滑,gamma越大,旨在能够正确分类所有的训练实例。) 而Grid-Search则为C和gamma参数寻优的一种方法,推荐使用交叉验证对C和gamma进行Grid-Search。由于Grid-Search非常耗时,推荐先进行粗略地Grid-Search,然后对于某个区域进行详细的Grid-Search,从而节省时间。另外对于非常多的数据,可以先随机抽取出整个数据集的子集,然后子集进行Grid-Search,找到好的范围,在这个好的范围内对整个数据集进行Grid-Search。
如何选择Linear和RBF kernel
前提:只有在找到最优的C和gamma参数条件下,RBF kernel的效果才可能和Linear kernel效果相当或者更好。
实例数量远小于特征数量
如果特征数量很多,我们可能不需要将输入空间转换到一个更高维的空间就能拟合训练数据。也就是说,非线性转换并不能明显提升效果。那么使用Linear kernel就足够了,而且只需要寻一个最优参数C。
实例数量和特征数量都很大
当然选Linear Kernel啦,因为特征数量足够多保证Linear kernel效果并不差,而对于实例数量很多,Linear kernel比RBF效率高很多。
实例数量远大于特征数量
当特征数量很少时,将原来的输入空间转换到一个更高维的特征空间就显得非常必要了(如使用非线性kernel),这样能更好地拟合训练数据。所以可以考虑使用RBF kernel,因为它拟合的效果很强大,而使用Linear kernel可能会造成欠拟合情况。
另外,如果要用Linear kernel,LibLinear软件要比LibSVM软件效率高很多。
参考文献:
1. A Practical Guide to Support Vector Classification
2. Scikit-Learn RBF parameter