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( 联机事务处理)类型的应用中,通过索引机制或给表分区等手段,可以简化查询操作步骤,并提升查询效率。
- 适用场景:
1、适合随机的增删改查操作;
2、需要在行中选取所有属性的查询操作;
3、需要频繁插入或更新的操作,其操作与索引和行的大小更为相关。
(2)列存储:列式存储(Column-based)是相对于行式存储来说的,新兴的 Hbase、HP Vertica、EMC Greenplum 等分布式数据库均采用列式存储。在基于列式存储的数据库中, 数据是按照列为基础逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。OLAP(联机分析处理)等情况下,将数据按照列存储会更高效,每一列都可以成为索引,投影很高效。缺点是查询是选择完成时,需要对选择的列进行重新组装。
- 适用场景:
1、查询过程中,可针对各列的运算并发执行(SMP),最后在内存中聚合完整记录集,最大可能降低查询响应时间;
2、可在数据列中高效查找数据,无需维护索引(任何列都能作为索引),查询过程中能够尽量减少无关IO,避免全表扫描;
3、因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。
4. K-Means算法原理及改进,遇到异常值怎么办?评估算法的指标有哪些?
- k-means原理:
在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。
改进:
a. kmeans++:初始随机点选择尽可能远,避免陷入局部解。方法是n+1个中心点选择时,对于离前n个点选择到的概率更大
b. mini batch kmeans:每次只用一个子集做重入类并找到类心(提高训练速度)
c. ISODATA:对于难以确定k的时候,使用该方法。思路是当类下的样本小时,剔除;类下样本数量多时,拆分
d. kernel kmeans:kmeans用欧氏距离计算相似度,也可以使用kernel映射到高维空间再聚类 - 遇到异常值:
a. 有条件的话使用密度聚类或者一些软聚类的方式先聚类,剔除异常值。不过本来用kmeans就是为了快,这么做有些南辕北辙了
b. 局部异常因子LOF:如果点p的密度明显小于其邻域点的密度,那么点p可能是异常值
c. 多元高斯分布异常点检测
d. 使用PCA或自动编码机进行异常点检测:使用降维后的维度作为新的特征空间,其降维结果可以认为剔除了异常值的影响(因为过程是保留使投影后方差最大的投影方向)
e. isolation forest:基本思路是建立树模型,一个节点所在的树深度越低,说明将其从样本空间划分出去越容易,因此越可能是异常值。是一种无监督的方法,随机选择n个sumsampe,随机选择一个特征一个值。iTree能有效检测异常的假设是:异常点一般都是非常稀有的,在iTree中会很快被划分到叶子节点,因此可以用叶子节点到根节点的路径h(x)长度来判断一条记录x是否是异常点;
f. winsorize:对于简单的,可以对单一维度做上下截取
异常值检测的6个算法:https://blog.csdn.net/smileyan9/category_10026084.html - 评估聚类算法的指标:
a. 外部法(基于有标注):Jaccard系数、纯度
b. 内部法(无标注):内平方和WSS和外平方和BSS
c. 此外还要考虑到算法的时间空间复杂度、聚类稳定性等
数据集 D = { x 1 , x 2 , . . , x m } D=\lbrace x_1,x_2,..,x_m \rbrace D={x1,x2,..,xm},假定通过聚类给出的簇划分为 C = { C 1 , C 2 , . . , C k } C=\lbrace C_1,C_2,..,C_k \rbrace C={C1,C2,..,Ck},参考模型给出的划分簇 C ∗ = { C 1 ∗ , C 2 ∗ , . . , C s ∗ } C^*=\lbrace C_1^*,C_2^*,..,C_s^* \rbrace C∗={C1∗,C2∗,..,Cs∗},令 λ , λ ∗ \lambda,\lambda^* λ,λ∗分别表示 C , C ∗ C,C^* C,C∗对应簇的标记向量。我们将样本两两配对考虑。
a = ∣ S S ∣ , S S = ( x i , x j ) ∣ λ i = λ j , λ i ∗ = λ j ∗ , i < j a=|SS|,SS={(x_i,x_j)|\lambda_i=\lambda_j,\lambda_i^*=\lambda_j^*,i<j} a=∣SS∣,SS=(xi,xj)∣λi=λj,λi∗=λj∗,i<j
b = ∣ S D ∣ , S D = ( x i , x j ) ∣ λ i = λ j , λ i ∗ ≠ λ j ∗ , i < j b=|SD|,SD={(x_i,x_j)|\lambda_i=\lambda_j,\lambda_i^*\neq\lambda_j^*,i<j} b=∣SD∣,SD=(xi,xj)∣λi=λj,λi∗=λj∗,i<j
c = ∣ D S ∣ , D S = ( x i , x j ) ∣ λ i ≠ λ j , λ i ∗ = λ j ∗ , i < j c=|DS|,DS={(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda_i^*=\lambda_j^*,i<j} c=∣DS∣,DS=(xi,xj)∣λi=λj,λi∗=λj∗,i<j
d = ∣ D D ∣ , D D = ( x i , x j ) ∣ λ i ≠ λ j , λ i ∗ ≠ λ j ∗ , i < j d=|DD|,DD={(x_i,x_j)|\lambda_i\neq\lambda_j,\lambda_i^*\neq\lambda_j^*,i<j} d=∣DD∣,DD=(xi,xj)∣λi=λj,λi∗=λj∗,i<j
SS表示包含了在C中隶属于相同簇且在 C ∗ C^* C∗中也隶属于相同簇的样本对。
SD表示包含了在C中隶属于相同簇且在 C ∗ C^* C∗中也隶属于不同簇的样本对。
…以此类推
a + b + c + d = m ( m − 1 ) / 2 a+b+c+d=m(m-1)/2 a+b+c+d=m(m−1)/2
- 外部指标:将聚类结果与某个“参考模型”进行比较
(a)Jaccard系数
J C = a a + b + c JC=\frac{a}{a+b+c} JC=a+b+ca
(b)FM指数
J C = a a + b ⋅ a a + c JC=\sqrt{\frac{a}{a+b}\cdot\frac{a}{a+c}} JC=a+ba⋅a+ca
(c)Rand指数
R I = 2 ( a + d ) m ( m − 1 ) RI=\frac{2(a+d)}{m(m-1)} RI=m(m−1)2(a+d)
(d)纯度Purity
P u r i t y ( Ω , C ) = 1 N ∑ k max j ∣ w k ∩ c j ∣ Purity(\Omega,C)=\frac{1}{N}\sum_k \max_{j}|w_k\cap c_j | Purity(Ω,C)=N1k∑jmax∣wk∩cj∣
N表示样本总数, Ω = { w 1 , . . , w K } \Omega=\lbrace w_1,..,w_K \rbrace Ω={w1,..,wK} 聚类簇划分。 C = { w 1 , . . , w J } C=\lbrace w_1,..,w_J \rbrace C={w1,..,wJ}真实类标。上述过程即给每个「聚类簇」分配一个「类别」,且「为这个类别的样本」在该簇中「出现的次数最多」,然后计算所有 K 个聚类簇的这个次数之和再归一化即为最终值。
上诉性能度量在[0,1],越大越好。 - 内部指标:直接考察聚类结果而不利用任何参考模型
考虑聚类结果的簇划分 C = { C 1 , C 2 , . . . , C k } C=\lbrace C_1,C_2,...,C_k \rbrace C={C1,C2,...,Ck}
a v g ( C ) avg(C) avg(C)对应簇C内样本间的平均距离: a v g ( C ) = 2 ∣ C ∣ ( ∣ C ∣ − 1 ) ∑ 1 ≤ i < j ≤ ∣ C ∣ d i s t ( x i , x j ) avg(C)=\frac{2}{|C|(|C|-1)}\sum_{1\leq i<j \leq |C|} dist(x_i,x_j) avg(C)=∣C∣(∣C∣−1)2∑1≤i<j≤∣C∣dist(xi,xj)
d i a m ( C ) diam(C) diam(C)对应簇C内样本间的最远距离: d i a m ( C ) = m a x 1 ≤ i < j ≤ ∣ C ∣ d i s t ( x i , x j ) diam(C)=max_{1\leq i<j \leq |C|} dist(x_i,x_j) diam(C)=max1≤i<j≤∣C∣dist(xi,xj)
d m i n ( C i , C j ) dmin(C_i,C_j) dmin(Ci,Cj)对应簇 C i , C j C_i,C_j Ci,Cj间最近样本间距离: d m i n ( C i , C j ) = m i n x i ∈ C i , x j ∈ C j d i s t ( x i , x j ) dmin(C_i,C_j)=min_{x_i \in C_i,x_j \in C_j} dist(x_i,x_j) dmin(Ci,Cj)=minxi∈Ci,xj∈Cjdist(xi,xj)
d c e n ( C i , C j ) dcen(C_i,C_j) dcen(Ci,Cj)对应簇 C i . C j C_i.C_j Ci.Cj中心点的距离: d c e n ( C i , C j ) = d i s t ( μ i , μ j ) dcen(C_i,C_j)=dist(\mu_i,\mu_j) dcen(Ci,Cj)=dist(μi,μj)
(a)DB指数,值越小越好
D B I = 1 k ∑ i = 1 k max j ≠ i ( a v g ( C i ) + a v g ( C j ) d c e n ( C i , C j ) ) DBI = \frac{1}{k} \sum_{i=1}^{k} \max_{j\neq i}(\frac{avg(C_i)+avg(C_j)}{dcen(C_i,C_j)}) DBI=k1i=1∑kj=imax(dcen(Ci,Cj)avg(Ci)+avg(Cj))
(b)Dunn指数,值越大越好
D I = min 1 ≤ j ≤ k { min j ≠ i ( d m i n ( C i , C j ) max 1 ≤ l ≤ k d i a m ( C l ) ) } DI=\min_{1\leq j\leq k}\lbrace \min_{j\neq i}(\frac{dmin(C_i,C_j)}{\max_{1\leq l \leq k}diam(C_l)}) \rbrace DI=1≤j≤kmin{j=imin(max1≤l≤kdiam(Cl)dmin(Ci,Cj))}
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. 数据库与数据仓库的区别。
- 简单理解下数据仓库是多个数据库以一种方式组织起来
- 数据库强调范式,尽可能减少冗余
- 数据库采用行存储,数据仓库一般采用列存储(行存储与列存储区别见题3)
- 数据仓库强调查询分析的速度,优化读取操作,主要目的是快速做大量数据的查询
- 数据仓库定期写入新数据,但不覆盖原有数据,而是给数据加上时间戳标签
- 数据仓库的特征是面向主题、集成、相对稳定、反映历史变化,存储数历史数据;数据库是面向事务的,存储在线交易数据
- 数据仓库的两个基本元素是维表和事实表,维是看待问题的角度,比如时间、部门等,事实表放着要查询的数据
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阶段形成的<k,v>是<uid-category,1>
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. 余弦距离与欧式距离求相似度的差别。
- 欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。
余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。 - 总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。
(1)例如,统计两部剧的用户观看行为,用户A的观看向量为(0,1),用户B为(1,0);此时二者的余弦距很大,而欧氏距离很小;我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当使用余弦距离。
(2)而当我们分析用户活跃度,以登陆次数(单位:次)和平均观看时长(单:分钟)作为特征时,余弦距离会认为(1,10)、(10,100)两个用户距离很近;但显然这两个用户活跃度是有着极大差异的,此时我们更关注数值绝对差异,应当使用欧氏距离。
25. 数据清理中,处理缺失值的方法是?
由于调查、编码和录入误差,数据中可能存在一些无效值和缺失值,需要给予适当的处理。常用的处理方法有:估算,整例删除,变量删除和成对删除。
- 估算(estimation)。最简单的办法就是用某个变量的样本均值、中位数或众数代替无效值和缺失值。这种办法简单,但没有充分考虑数据中已有的信息,误差可能较大。另一种办法就是根据调查对象对其他问题的答案,通过变量之间的相关分析或逻辑推论进行估计。例如,某一产品的拥有情况可能与家庭收入有关,可以根据调查对象的家庭收入推算拥有这一产品的可能性。
- 整例删除(casewise deletion)是剔除含有缺失值的样本。由于很多问卷都可能存在缺失值,这种做法的结果可能导致有效样本量大大减少,无法充分利用已经收集到的数据。因此,只适合关键变量缺失,或者含有无效值或缺失值的样本比重很小的情况。
- 变量删除(variable deletion)。如果某一变量的无效值和缺失值很多,而且该变量对于所研究的问题不是特别重要,则可以考虑将该变量删除。这种做法减少了供分析用的变量数目,但没有改变样本量。
- 成对删除(pairwise deletion)是用一个特殊码(通常是9、99、999等)代表无效值和缺失值,同时保留数据集中的全部变量和样本。但是,在具体计算时只采用有完整答案的样本,因而不同的分析因涉及的变量不同,其有效样本量也会有所不同。这是一种保守的处理方法,最大限度地保留了数据集中的可用信息。
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. 特征量很大的时候怎么筛选特征?
- 过滤式:相关系数、假设检验(卡方检验、t检验、F检验)、互信息、Relief算法
- 包裹式:递归消除特征法、LVW
- 嵌入式:L1范数正则化、
28. 如何处理过拟合?
从3个角度:
1)数据:
- 从数据源头获取更多数据
- 根据当前数据集估计数据分布参数,使用该分布产生更多数据。
- 数据增强(Data Augmentation)
- 保留验证集
- 获取额外数据进行交叉验证
2)模型:
- 降低模型复杂度:
a. 对于神经网络:减少网络的层数、神经元个数等均可以限制网络的拟合能力。dropout,在向前传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型的泛化性更强,因为它不会太依赖某些局部的特征。。
b. 对于决策树:限制树深,剪枝,限制叶节点数量。
c. 增大分割平面间隔 - 特征选择、特征降维
- early stopping
- 正则化(限制权值weight-decay):将权值的大小作为惩罚项加入到损失函数里。
- 增加噪声
3)ensemble:
- Bagging
- Boosting