1. 给你一个无序数组,怎么才能合理采样?
无序数组是相对有序数组而言的,无序数组并不等于随机,我们要做的是将无序数组洗牌,得到随机排列。
对于无序数组,n个元素能产生n!种排序。如果洗牌算法能产生n!种不同的结果,并且这些结果产生的概率相等,那么这个洗牌算法是正确的。
方法:for i in range(len(n)): swap(arr[i], arr[random(i,n)])
这段代码是对随机确定数组第一位的值,然后递归对剩余的数组进行相同的过程,可以产生n!中等可能的排序情况。
https://blog.csdn.net/rtian001/article/details/50348999
2. 常用的Python库有哪些?
numpy:矩阵运算
sklearn:常用机器学习和数据挖掘工具库
scipy:基于numpy做高效的数学计算,如积分、线性代数、稀疏矩阵等
pandas:将数据用表的形式进行操作
matplotlib:数据可视化工具
seaborn:数据可视化工具
keras/tensorflow/theano:深度学习工具包
NLTK:自然语言处理工具包
beautifulsoap:网页文档解析工具
3. 行存储和列存储的区别。(列式数据库,更符合人类阅读习惯)
(1)行存储:传统的关系型数据库,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存储法(Row-based),在基于行式存储的数据库中, 数据是按照行数据为基础逻辑存储单元进行存储的, 一行中的数据在存储介质中以连续存储形式存在。传统数据库的存储方式,同一张表内的数据放在一起,插入更新很快。缺点是每次查询即使只涉及几列,也要把所有数据读取. 对此,行式数据库给出的优化方案是加“索引”,在OLTP( 联机事务处理)类型的应用中,通过索引机制或给表分区等手段,可以简化查询操作步骤,并提升查询效率。
(2)列存储:列式存储(Column-based)是相对于行式存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列为基础逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。OLAP(联机分析处理)等情况下,将数据按照列存储会更高效,每一列都可以成为索引,投影很高效。缺点是查询是选择完成时,需要对选择的列进行重新组装。
4. K-Means算法原理及改进,遇到异常值怎么办?评估算法的指标有哪些?
5. 数据预处理过程有哪些?
缺失值处理:删、插
异常值处理
特征转换:时间特征sin化表示
标准化:最大最小标准化、z标准化等
归一化:对于文本或评分特征,不同样本之间可能有整体上的差异,如a文本共20个词,b文本30000个词,b文本中各个维度上的频次都很可能远远高于a文本
离散化:onehot、分箱等
6. 随机森林原理?有哪些随机方法?
随机森林原理:通过构造多个决策树,做bagging以提高泛化能力
subsample(有放回抽样)、subfeature、低维空间投影(特征做组合,参考林轩田的《机器学习基石》)
7. PCA(主成分分析)
主成分分析是一种降维的方法
思想是将样本从原来的特征空间转化到新的特征空间,并且样本在新特征空间坐标轴上的投影方差尽可能大,这样就能涵盖样本最主要的信息
方法:
a. 特征归一化
b. 求样本特征的协方差矩阵A
c. 求A的特征值和特征向量,即AX=λX
d. 将特征值从大到小排列,选择topK,对应的特征向量就是新的坐标轴(采用最大方差理论解释,参考:https://blog.csdn.net/huang1024rui/article/details/46662195)
PCA也可以看成激活函数为线性函数的自动编码机(参考林轩田的《机器学习基石》第13课,深度学习)
8. hive?spark?sql? nlp?
Hive允许使用类SQL语句在hadoop集群上进行读、写、管理等操作
Spark是一种与hadoop相似的开源集群计算环境,将数据集缓存在分布式内存中的计算平台,每轮迭代不需要读取磁盘的IO操作,从而答复降低了单轮迭代时间
9. Linux基本命令
目录操作:ls、cd、mkdir、find、locate、whereis等
文件操作:mv、cp、rm、touch、cat、more、less
权限操作:chmod+rwx421
账号操作:su、whoami、last、who、w、id、groups等
查看系统:history、top
关机重启:shutdown、reboot
vim操作:i、w、w!、q、q!、wq等
10. NVL函数
是oracle的一个函数
NVL( string1, replace_with),如果string1为NULL,则NVL函数返回replace_with的值,否则返回原来的值
11. 逻辑回归
用于分类问题的线性回归
采用sigmoid对输出值进行01转换
采用似然法求解
手推
优缺点局限性
改进空间
12. sql中null与‘ ’的区别。
null表示空,用is null判断
'‘表示空字符串,用=’'判断
13. 数据库与数据仓库的区别。
14. SQL的数据类型。
字符串:char、varchar、text
二进制串:binary、varbinary
布尔类型:boolean
数值类型:integer、smallint、bigint、decimal、numeric、float、real、double
时间类型:date、time、timestamp、interval
15. 分类算法性能的主要评价指标。
查准率、查全率、F1
AUC
LOSS
Gain和Lift
WOE和IV
16. 数据缺失怎么办
删除样本或删除字段
用中位数、平均值、众数等填充
插补:同类均值插补、多重插补、极大似然估计
用其它字段构建模型,预测该字段的值,从而填充缺失值(注意:如果该字段也是用于预测模型中作为特征,那么用其它字段建模填充缺失值的方式,并没有给最终的预测模型引入新信息)
onehot,将缺失值也认为一种取值
压缩感知及矩阵补全
17. GBDT(梯度提升树)
首先介绍Adaboost Tree,是一种boosting的树集成方法。基本思路是依次训练多棵树,每棵树训练时对分错的样本进行加权。树模型中对样本的加权实际是对样本采样几率的加权,在进行有放回抽样时,分错的样本更有可能被抽到
GBDT是Adaboost Tree的改进,每棵树都是CART(分类回归树),树在叶节点输出的是一个数值,分类误差就是真实值减去叶节点的输出值,得到残差。GBDT要做的就是使用梯度下降的方法减少分类误差值。
在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失损失L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。
GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
得到多棵树后,根据每颗树的分类误差进行加权投票
18. 如何避免决策树过拟合?
限制树深
剪枝
限制叶节点数量
正则化项
增加数据
bagging(subsample、subfeature、低维空间投影)
数据增强(加入有杂质的数据)
早停
19. SVM的优缺点
优点:
a. 能应用于非线性可分的情况
b. 最后分类时由支持向量决定,复杂度取决于支持向量的数目而不是样本空间的维度,避免了维度灾难
c. 具有鲁棒性:因为只使用少量支持向量,抓住关键样本,剔除冗余样本
d. 高维低样本下性能好,如文本分类
缺点:
a. 模型训练复杂度高
b. 难以适应多分类问题
c. 核函数选择没有较好的方法论
20. 统计教授多门课老师数量并输出每位老师教授课程数统计表。
解:设表class中字段为id,teacher,course
统计教授多门课老师数量
select count( * )
from class
group by teacher
having count( * ) > 1
输出每位老师教授课程数统计
select teacher, count(course) as count_course
from class
group by teacher
21. 有uid,app名称,app类别,数据百亿级别,设计算法算出每个app类别只安装了一个app的uid总数。
小数据量的话直接查询:
select b.apptype,count(b.uid) from (select uid, apptype, count(appname) as num from app_info group by uid,apptype having count(appname) = 1 )b group by b.apptype
大数据量下(没用过hadoop不太清楚,望大家指正)
a. 原始文件可以拼接为uid-app-categroy
b. map阶段形成的
c. reduce阶段统计key为“uid-category”的count数量
d. 只保留count为1的数据
e. 剩下的数据量直接统计uid出现次数=category类别数的数据
22. 请说明随机森林较一般决策树稳定的几点原因.
bagging的方法,多个树投票提高泛化能力
bagging中引入随机(参数、样本、特征、空间映射),避免单棵树的过拟合,提高整体泛化能力
23. 什么是聚类分析?聚类算法有哪几种?请选择一种详细描述其计算原理和步骤。
聚类分析是一种无监督的学习方法,根据一定条件将相对同质的样本归到一个类总。
聚类方法主要有:
a. 层次聚类
b. 划分聚类:kmeans
c. 密度聚类
d. 网格聚类
e. 模型聚类:高斯混合模型
k-means比较好介绍,选k个点开始作为聚类中心,然后剩下的点根据距离划分到类中;找到新的类中心;重新分配点;迭代直到达到收敛条件或者迭代次数。 优点是快;缺点是要先指定k,同时对异常值很敏感。
24. 余弦距离与欧式距离求相似度的差别。
25. 数据清理中,处理缺失值的方法是?
由于调查、编码和录入误差,数据中可能存在一些无效值和缺失值,需要给予适当的处理。常用的处理方法有:估算,整例删除,变量删除和成对删除。
26. Bagging&Boosting的区别,分别适用于什么样的数据集
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
5)vairance&bias
bagging是减少variance,而boosting是减少bias。
Bagging 通过对样本重采样得到子样本集,然后多个模型取平均。由于子样本集的相似性以及使用的是同种模型,因此模型上有相似的vias和variance。 E ( ∑ X i n ) = E ( X i ) E( \frac{\sum{X_i}}{n} )=E(X_i) E(n∑Xi)=E(Xi)
所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。另一方面,若各子模型独立,则有 V a r ( ∑ X i n ) = V a r ( X i ) n Var( \frac{\sum{X_i}}{n} )=\frac{Var(X_i)}{n} Var(n∑Xi)=nVar(Xi),此时可以显著降低variance。若各子模型完全相同,则 V a r ( ∑ X i n ) = V a r ( X i ) Var( \frac{\sum{X_i}}{n} )={Var(X_i)} Var(n∑Xi)=Var(Xi),此时不会降低variance。bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低variance。
Sum of uncorrelated variables
Sum of correlated variables
如何理解Bagging各个子模型是不独立的?
模型可以看做n个独立同分布随机样本的函数 f ( X 1 , X 2 , . . . , X n ) f(X_1,X_2,...,X_n) f(X1,X2,...,Xn),其中 X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn是独立同分布的随机变量。如果我们预先设置好,取 X 1 , X 2 , . . . , X n X_1,X_2,...,X_n X1,X2,...,Xn训第一个模型, X n + 1 , X n + 2 , . . . , X 2 n X_{n+1},X_{n+2},...,X_{2n} Xn+1,Xn+2,...,X2n训第二个模型,那么这两个模型是两组不重叠的独立随机变量集合的函数,因此是独立的。但现在bagging相当于从 ( 1 , 2 , . . . , m ) (1,2,...,m) (1,2,...,m)里抽n个数出来,形成模型 f ( X k 1 , X k 2 , . . . X k n ) f(X_{k1},X_{k2},...X_{kn}) f(Xk1,Xk2,...Xkn),那么这样选取的随机变量集合有交叠,就会导致两个模型是两组重叠的随机变量集合的函数,从而不独立.可以考虑一个极端的情形,样本总量是n+1个,每一次重采样取n个样本,那么任意两次的样本都几乎一样,模型也因此几乎一样。
Boosting从优化角度来看,是用forward-stagewise这种贪心法去最小化损失函数。例如,常见的AdaBoost即等价于用这种方法最小化exponential loss:。所谓forward-stagewise,就是在迭代的第n步,求解新的子模型f(x)及步长a(或者叫组合系数),来最小化,这里
是前n-1步得到的子模型的和。因此boosting是在sequential地最小化损失函数,其bias自然逐步下降。但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。所以说boosting主要还是靠降低bias来提升预测精度。
Boosting数据集不需要太大,数据分布不敏感?
27. 特征量很大的时候怎么筛选特征?
28. 如何处理过拟合?
从3个角度:
1)数据:
2)模型:
3)ensemble: