作者:胖熊酱 著作权归作者所有。AI开发者获得授权转载,禁止二次转载 https://zhuanlan.zhihu.com/p/79873148
注:封面图片来自网络
最近正在准备面试,故整理了很多面试准备资料。
1.什么是Python?使用Python有什么好处?
Python是一种编程语言,它有对象、模块、线程、异常处理和自动内存管理。
它简洁、简单、方便、容易扩展,有许多自带的数据结构,而且它开源。
2.什么是PEP8?
PEP8是一个编程规范,内容是一些关于如何让你的程序更具可读性的建议。
3.什么是pickling和unpickling?
Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其转储到一个文件中——这个过程叫做pickling。反之从存储的字符串文件中提取原始Python对象的过程,叫做unpickling。
4.Python是如何被解释的?
Python是一种解释性语言,它的源代码可以直接运行。Python解释器会将源代码转换成中间语言,之后再翻译成机器码再执行。
5.Python是怎样管理内存的?
Python的内存管理是由私有heap空间管理的。所有的Python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。为Python的heap空间分配内存是由Python的内存管理模块进行的,其核心API会提供一些访问该模块的方法供程序员使用。Python有自带的垃圾回收系统,它回收并释放没有被使用的内存,让它们能够被其他程序使用。
6.有哪些工具可以帮助debug或做静态分析?
PyChecker是一个静态分析工具,它不仅能报告源代码中的错误,并且会报告错误类型和复杂度。Pylint是检验模块是否达到代码标准的另一个工具。
7.什么是Python装饰器?
Python装饰器是Python中的特有变动,可以使修改函数变得更容易。
8.数组和元组之间的区别是什么?
数组和元组之间的区别:数组内容是可以被修改的,而元组内容是只读的。另外,元组可以被哈希,比如作为字典的关键字。
9.参数按值传递和引用传递是怎样实现的?
Python中的一切都是类,所有的变量都是一个对象的引用。引用的值是由函数确定的,因此无法被改变。但是如果一个对象是可以被修改的,你可以改动对象。
10.字典推导式和列表推导式是什么?
它们是可以轻松创建字典和列表的语法结构。
11.Python都有哪些自带的数据结构?
Python自带的数据结构分为可变的和不可变的。可变的有:数组、集合、字典;不可变的有:字符串、元组、数。
12.什么是Python的命名空间?
在Python中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作——这就是命名空间。它就好像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象。
13.Python中的lambda是什么?
这是一个常被用于代码中的单个表达式的匿名函数。
14.为什么lambda没有语句?
匿名函数lambda没有语句的原因,是它被用于在代码被执行的时候构建新的函数对象并且返回。
15.Python中的pass是什么?
Pass是一个在Python中不会被执行的语句。在复杂语句中,如果一个地方需要暂时被留白,它常常被用于占位符。
16.Python中什么是遍历器?
遍历器用于遍历一组元素,比如列表这样的容器。
17.Python中的unittest是什么?
在Python中,unittest是Python中的单元测试框架。它拥有支持共享搭建、自动测试、在测试中暂停代码、将不同测试迭代成一组,等等的功能。
18.在Python中什么是slicing?
Slicing是一种在有序的对象类型中(数组,元组,字符串)节选某一段的语法。
19.在Python中什么是构造器?
生成器是实现迭代器的一种机制。它功能的实现依赖于yield表达式,除此之外它跟普通的函数没有两样。
20.Python中的docstring是什么?
Python中文档字符串被称为docstring,它在Python中的作用是为函数、模块和类注释生成文档。
21.如何在Python中拷贝一个对象?
如果要在Python中拷贝一个对象,大多时候你可以用copy.copy()或者copy.deepcopy()。但并不是所有的对象都可以被拷贝。
22.Python中的负索引是什么?
Python中的序列索引可以是正也可以是负。如果是正索引,0是序列中的第一个索引,1是第二个索引。如果是负索引,(-1)是最后一个索引而(-2)是倒数第二个索引。
23.如何将一个数字转换成一个字符串?
你可以使用自带函数str()将一个数字转换为字符串。如果你想要八进制或者十六进制数,可以用oct()或hex()。
24.Xrange和range的区别是什么?
Xrange用于返回一个xrange对象,而range用于返回一个数组。不管那个范围多大,Xrange都使用同样的内存。
25.Python中的模块和包是什么?
在Python中,模块是搭建程序的一种方式。每一个Python代码文件都是一个模块,并可以引用其他的模块,比如对象和属性。
一个包含许多Python代码的文件夹是一个包。一个包可以包含模块和子文件夹。
作为一种解释型、交互式、面向对象的高级编程语言,Python和别的一些使用标点符号的语言不同,它使用了大量的英语单词作为关键字,因而具有很好的可读性。而且Python跟其他编程语言相比,有着更少的语法结构,因而深受个人和企业的喜爱。
1. 给你一个无序数组,怎么才能合理采样?
- 无序数组是相对有序数组而言的,无序数组并不等于随机,我们要做的是将无序数组洗牌,得到随机排列。 对于无序数组,n个元素能产生n!种排序。如果洗牌算法能产生n!种不同的结果,并且这些结果产生的概率相等,那么这个洗牌算法是正确的。 方法:for i in range(len(n)): swap(arr[i], arr[random(i,n)]) 这段代码是对随机确定数组第一位的值,然后递归对剩余的数组进行相同的过程,可以产生n!中等可能的排序情况。
2. 常用的Python库有哪些?
- numpy:矩阵运算
- sklearn:常用机器学习和数据挖掘工具库
- scipy:基于numpy做高效的数学计算,如积分、线性代数、稀疏矩阵等
- pandas:将数据用表的形式进行操作
- matplotlib:数据可视化工具
- seaborn:数据可视化工具
- keras/tensorflow/theano:深度学习工具包
- NLTK:自然语言处理工具包
- beautifulsoap:网页文档解析工具
3. 行存储和列存储的区别。(列式数据库,更符合人类阅读习惯)
- 行存储:传统数据库的存储方式,同一张表内的数据放在一起,插入更新很快。缺点是每次查询即使只涉及几列,也要把所有数据读取. 列存储:OLAP等情况下,将数据按照列存储会更高效,每一列都可以成为索引,投影很高效。缺点是查询是选择完成时,需要对选择的列进行重新组装。 “当你的核心业务是 OLTP 时,一个行式数据库,再加上优化操作,可能是个最好的选择。 当你的核心业务是 OLAP 时,一个列式数据库,绝对是更好的选择”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,随机选择一个特征一个值。 f.winsorize:对于简单的,可以对单一维度做上下截取
- 评估聚类算法的指标: a. 外部法(基于有标注):Jaccard系数、纯度 b. 内部法(无标注):内平方和WSS和外平方和BSS c. 此外还要考虑到算法的时间空间复杂度、聚类稳定性等
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,对应的特征向量就是新的坐标轴(采用最大方差理论解释,参考:blog.csdn.net/huang1024)
- 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. LR
- 用于分类问题的线性回归
- 采用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.订单量下降什么因素影响? 基于对业务的理解。内部原因:经营问题,设计问题;外部原因:天气原因,整个大环境影响,其他竞争对手采取行动等
27.根据已有数据如何判断用户的一些未来行为? 基于对业务数据的理解,脑洞要大。
28.聚类有哪些算法,kmeans算法有什么缺点?
k-means聚类算法 k-means是划分方法中较经典的聚类算法之一。由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。目前,许多算法均围绕着该算法进行扩展和改进。 k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。k-means算法的处理过程如下:首先,随机地 选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。 这个过程不断重复,直到准则函数收敛。
步骤: (1) 任意选择k个对象作为初始的簇中心; (2) repeat; (3) 根据簇中对象的平均值,将每个对象(重新)赋予最类似的簇; (4) 更新簇的平均值,即计算每个簇中对象的平均值; (5) until不再发生变化。
层次聚类算法 根据层次分解的顺序是自底向上的还是自上向下的,层次聚类算法分为凝聚的层次聚类算法和分裂的层次聚类算法。
凝聚型层次聚类的策略是先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有对象都在一个簇中,或者某个终结条件被满足。绝大多数层次聚类属于凝聚型层次聚类,它们只是在簇间相似度的定义上有所不同。
采用最小距离的凝聚层次聚类算法流程: (1) 将每个对象看作一类,计算两两之间的最小距离; (2) 将距离最小的两个类合并成一个新类; (3) 重新计算新类与所有类之间的距离; (4) 重复(2)、(3),直到所有类最后合并成一类。
SOM聚类算法
该算法假设在输入对象中存在一些拓扑结构或顺序,可以实现从输入空间(n维)到输出平面(2维)的降维映射,其映射具有拓扑特征保持性质,与实际的大脑处理有很强的理论联系。 SOM网络包含输入层和输出层。输入层对应一个高维的输入向量,输出层由一系列组织在2维网格上的有序节点构成,输入节点与输出节点通过权重向量连接。 学习过程中,找到与之距离最短的输出层单元,即获胜单元,对其更新。同时,将邻近区域的权值更新,使输出节点保持输入向量的拓扑特征。
FCM聚类算法
FCM算法是一种以隶属度来确定每个数据点属于某个聚类程度的算法。该聚类算法是传统硬聚类算法的一种改进。
四种聚类算法中,在运行时间及准确度方面综合考虑,k-means和FCM相对优于其他。但是,各个算法还是存在固定缺点:k-means聚类算法的初 始点选择不稳定,是随机选取的,这就引起聚类结果的不稳定,本实验中虽是经过多次实验取的平均值,但是具体初始点的选择方法还需进一步研究;层次聚类虽然 不需要确定分类数,但是一旦一个分裂或者合并被执行,就不能修正,聚类质量受限制;FCM对初始聚类中心敏感,需要人为确定聚类数,容易陷入局部最优 解;SOM与实际大脑处理有很强的理论联系。但是处理时间较长,需要进一步研究使其适应大型数据库。
(cnblogs.com/William_Fir)
29.如何理解线性回归?
确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法
线性回归有很多实际用途。分为以下两大类:
如果目标是预测或者映射,线性回归可以用来对观测数据集的和X的值拟合出一个预测模型。当完成这样一个模型以后,对于一个新增的X值,在没有给定与它相配对的y的情况下,可以用这个拟合过的模型预测出一个y值。这是比方差分析进一步的作用,就是根据现在,预测未来。虽然,线性回归和方差都是需要因变量为连续变量,自变量为分类变量,自变量可以有一个或者多个,但是,线性回归增加另一个功能,也就是凭什么预测未来,就是凭回归方程。这个回归方程的因变量是一个未知数,也是一个估计数,虽然估计,但是,只要有规律,就能预测未来。
给定一个变量y和一些变量X1,...,Xp,这些变量有可能与y相关,线性回归分析可以用来量化y与Xj之间相关性的强度,评估出与y不相关的Xj,并识别出哪些Xj的子集包含了关于y的冗余信息。
线性回归模型经常用最小二乘逼近来拟合
29.应用多重线性回归进行统计分析时要求满足哪些条件呢?
总结起来可用四个词来描述:线性(自变量和因变量之间存在线性关系)、独立(各观测间相互独立)、正态(残差服从正态分布)、齐性(方差大小不随所有变量取值水平的改变而改变,即方差齐性)。
30.线性回归的因素如果有相关关系,会对模型有什么影响?
多重共线性指自变量问存在线性相关关系,即一个自变量可以用其他一个或几个自变量的线性表达式进行表示。若存在多重共线性,计算自变量的偏回归系数β时,矩阵不可逆,导致β存在无穷多个解或无解。
解决办法:(1)逐步回归:使用逐步回归可以在一定程度上筛选存在多重共线性的自变量组合中对反应变量变异解释较大的变量,而将解释较小的变量排除在模型之外。 但这种方法缺点是当共线性较为严重时,变量自动筛选的方法并不能完全解决问题。
(2) 岭回归:岭回归为有偏估计,但能有效地控制回归系数的标准误大小。
(3) 主成分回归:可以使用主成分分析的方法对存在多重共线性的自变量组合提取主成分,然后以特征值较大的(如大于1)几个主成分与其他自变量一起进行多重线性回归。得出的主成分回归系数再根据主成分表达式反推出原始自变量的参数估计。 该方法在提取主成分时丢失了一部分信息,几个自变量间的多重共线性越强,提取主成分时丢失的信息越少。
(4) 路径分析
Q:主成分分析的两个因子是什么关系?
A:相互独立
31.准确率和召回率哪个更重要些?
A:信息检索、分类、识别、翻译等领域两个最基本指标是召回率(Recall Rate)和准确率(Precision Rate),召回率也叫查全率,准确率也叫查准率,概念公式:
召回率(Recall) = 系统检索到的相关文件 / 系统所有相关的文件总数
准确率(Precision) = 系统检索到的相关文件 / 系统所有检索到的文件总数
注意:准确率和召回率是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下准确率高、召回率就低,召回率低、准确率高,当然如果两者都低,那是什么地方出问题了。
如果是做搜索,那就是保证召回的情况下提升准确率;如果做疾病监测、反垃圾,则是保准确率的条件下,提升召回。
32.都有什么降维方法?
A:缺失值比率 (Missing Values Ratio)该方法的是基于包含太多缺失值的数据列包含有用信息的可能性较少。因此,可以将数据列缺失值大于某个阈值的列去掉。阈值越高,降维方法更为积极,即降维越少。
低方差滤波 (Low Variance Filter)与上个方法相似,该方法假设数据列变化非常小的列包含的信息量少。因此,所有的数据列方差小的列被移除。需要注意的一点是:方差与数据范围相关的,因此在采用该方法前需要对数据做归一化处理。
高相关滤波 (High Correlation Filter)高相关滤波认为当两列数据变化趋势相似时,它们包含的信息也显示。这样,使用相似列中的一列就可以满足机器学习模型。对于数值列之间的相似性通过计算相关系数来表示,对于名词类列的相关系数可以通过计算皮尔逊卡方值来表示。相关系数大于某个阈值的两列只保留一列。同样要注意的是:相关系数对范围敏感,所以在计算之前也需要对数据进行归一化处理。
随机森林/组合树(Random Forests)组合决策树通常又被称为随机森林,它在进行特征选择与构建有效的分类器时非常有用。一种常用的降维方法是对目标属性产生许多巨大的树,然后根据对每个属性的统计结果找到信息量最大的特征子集。Eg,如果我们能能够对一个非常巨大的数据集生成非常层次非常浅的树,每棵树只训练一小部分属性。如果一个属性经常成为最佳分裂属性,那么它很有可能是需要保留的信息特征。对随机森林数据属性的统计评分会向我们揭示与其它属性相比,哪个属性才是预测能力最好的属性。
主成分分析(PCA)通过正交变换将原始的n维数据集变换到一个新的呗称作主成分的数据集中。变换后的结果中,第一个主成分具有最大的方差值,每个后续的成分在与前述主成分正交条件限制下与具有最大方差。降维时仅保存前m个主成分即可保持最大的数据信息量。需要注意的是主成分变换对正交向量的尺度敏感。数据在变换前需要进行归一化处理。同样也需要注意的是,新的主成分并不是由实际系统产生的,因此在进行PCA变换后会丧失数据的解释性。
反向特征消除,所有分类算法先用n个特征进行训练。每次降维操作,采用n-1个特征对分类器训练n次,得到新的n个分类器。将新分类器中错分率变化最小的分类器所用的n-1维特征作为降维后的特征集。不断的对该过程进行迭代,即得到降维后的结果。第k次迭代过程中得到的是n-k维特征分类器。通过选择最大的错误容忍率,我们可以得到在选择分类器上打到指定分类性能最小需要多少个特征。(tech.idcquan.com/dc/784)
我对降维的理解:提取数据中有用的信息,用最少的数据得到最有用的结果。
33.用全部的数据做线性回归,这样是什么错误?
过度拟合
34.如何判断一组数据是否服从正态分布?
1当样本数N<2000,shapiro-wilk的W统计量检验正态性
当样本数N>2000,Kolmogorov-Smirnov的D统计量检验正态性。把样本分布的形状和正态分布想比较,得出一个数值p,如果p小于0.05(给定显著性水平)认为数据不是来自正态分布。反之结论相反。
2 观察正态概率图,如果来自正态分布,图形应该呈现一条直线。
3 绘制数据条形图,如果来自正态分布,条形图呈现钟型
4 偏度系数和峰度系数,如果正态分布,两者都应该是0(适合大样本)
35.如何处理数据缺失值?
1.删除含有缺失值的个案
主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。它将存在缺失值的个案删除。如果数据缺失问题可以通过简单的删除小部分样本来达到目标,那么这个方法是最有效的。当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。
2.可能值插补缺失值
它的思想来源是以最可能的值来插补缺失值比全部删除不完全样本所产生的信息丢失要少。在数据挖掘中,面对的通常是大型的数据库,它的属性有几十个甚至几百个,因为一个属性值的缺失而放弃大量的其他属性值,这种删除是对信息的极大浪费,所以产生了以可能值对缺失值进行插补的思想与方法。常用的有如下几种方法。
(1)均值插补。数据的属性分为定距型和非定距型。如果缺失值是定距型的,就以该属性存在值的平均值来插补缺失的值;如果缺失值是非定距型的,就根据统计学中的众数原理,用该属性的众数(即出现频率最高的值)来补齐缺失的值。
(2)利用同类均值插补。同均值插补的方法都属于单值插补,不同的是,它用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。假设X=(X1,X2…Xp)为信息完全的变量,Y为存在缺失值的变量,那么首先对X或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。如果在以后统计分析中还需以引入的解释变量和Y做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。
(3)极大似然估计(Max Likelihood ,ML)。在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
(4)多重插补(Multiple Imputation,MI)。多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。
多重插补方法分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。
假设一组数据,包括三个变量Y1,Y2,Y3,它们的联合分布为正态分布,将这组数据处理成三组,A组保持原始数据,B组仅缺失Y3,C组缺失Y1和Y2。在多值插补时,对A组将不进行任何处理,对B组产生Y3的一组估计值(作Y3关于Y1,Y2的回归),对C组作产生Y1和Y2的一组成对估计值(作Y1,Y2关于Y3的回归)。
当用多值插补时,对A组将不进行处理,对B、C组将完整的样本随机抽取形成为m组(m为可选择的m组插补值),每组个案数只要能够有效估计参数就可以了。对存在缺失值的属性的分布作出估计,然后基于这m组观测值,对于这m组样本分别产生关于参数的m组估计值,给出相应的预测即,这时采用的估计方法为极大似然法,在计算机中具体的实现算法为期望最大化法(EM)。对B组估计出一组Y3的值,对C将利用 Y1,Y2,Y3它们的联合分布为正态分布这一前提,估计出一组(Y1,Y2)。
上例中假定了Y1,Y2,Y3的联合分布为正态分布。这个假设是人为的,但是已经通过验证(Graham和Schafer于1999),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。
多重插补和贝叶斯估计的思想是一致的,但是多重插补弥补了贝叶斯估计的几个不足。
(1)贝叶斯估计以极大似然的方法估计,极大似然的方法要求模型的形式必须准确,如果参数形式不正确,将得到错误得结论,即先验分布将影响后验分布的准确性。而多重插补所依据的是大样本渐近完整的数据的理论,在数据挖掘中的数据量都很大,先验分布将极小的影响结果,所以先验分布的对结果的影响不大。
(2)贝叶斯估计仅要求知道未知参数的先验分布,没有利用与参数的关系。而多重插补对参数的联合分布作出了估计,利用了参数间的相互关系。
以上四种插补方法,对于缺失值的类型为随机缺失的插补有很好的效果。两种均值插补方法是最容易实现的,也是以前人们经常使用的,但是它对样本存在极大的干扰,尤其是当插补后的值作为解释变量进行回归时,参数的估计值与真实值的偏差很大。相比较而言,极大似然估计和多重插补是两种比较好的插补方法,与多重插补对比,极大似然缺少不确定成分,所以越来越多的人倾向于使用多值插补方法。