python数据挖掘
1 先贴一个鹅厂的招聘信息看下数据挖掘相关的能力要求
1岗位信息
1、计算机、机器学习、统计等相关专业,本科及以上学历,3年以上相关工作经验。
2、有较强的算法基础和编码能力,熟练掌握Python、SQL、Java、Scala等至少一门语言。
3、熟练掌握常见的特征处理方法和机器学习算法,熟练使用各类常见的机器学习算法库,例如sklearn、tensorflow、pytorch、spark mllib等。
4、熟悉金融领域(银行、券商、保险等)的常见业务流程与业务问题,有相关建模经验者优先。
5、善于沟通,工作积极主动,责任心强,具备良好的团队协作能力。 通过腾讯云从业资格证或同等资格认证的优先录取
6、针对客户实际业务问题,负责大规模数据场景下的数据分析和建模工作。
7、针对各类常见的具体业务问题,负责相关案例和应用在产品侧的沉淀与积累。
8、具有扎实的数据结构和算法功底,能熟练应用各类机器学习模型(逻辑回归、聚类、树模型、图网络等);
9、对数据分析和数据挖掘有深入理解,有相关项目经验;
10、能够运用hadoop、spark等大数据计算平台进行数据分析挖掘,熟练掌握python、hivesql、sparkscala,有相关项目经验;
11、有较强学习能力和逻辑思维能力,具备良好的问题分析与解决能力;
12、善于沟通,工作积极主动,责任心强,具备良好的团队协作能力;
13、有toB+toC业务数据分析经验者优先。 通过腾讯云从业资格证或同等资格认证的优先录取。 备注:此岗位为腾讯集团旗下全资子公司编制岗位
2岗位职责
1、负责腾讯会议的数据仓库、数据建模、数据分析、数据可视化开发工作;
2、负责优化现有业务数据分析工具,通过科学方法持续优化数据分析效能;
3、负责提升产品&运营团队基于数据驱动决策的效率和准确性,针对各行业数据的指标进行体系化梳理和建设;
4、负责腾讯会议数据治理,通过数据入库、校验、清洗,保证数据质量;
5、负责腾讯会议的数据标签挖掘、运营模型搭建工作;
6、持续产出行业洞察,跟踪分析竞争对手、行业趋势等,形成商业分析并洞察其中的商业机会。
2 根据岗位信息整理技术能力点
- 数据仓库, 数据建模,数据分析,数据可视化, 数据标签挖掘, 运营模型搭建,行业趋势,商业机会
- 大数据:spark, hadoop, Sql, hivesql, python, sparkscala,
- 统计学:AB test
- 机器学习:逻辑回归、聚类、树模型、图网络, 决策树, 随机森林, xgboost
- 数据预处理:缺失、重复、冲突, 清洗
- 数据入库
- 数据挖掘:tensoflow, keras, pytorch,
- 模型搭建
- 可视化:tableau, power_bi
- 网页抓取
- 数仓工具Hive、MR、Flink、Mysql
- 数仓建模理论,数仓分层、星形模型、雪花模型等,有大规模业务数仓实践经验优
- 握数据etl过程,熟悉spark/hadoop/Hbase/es等大数据处理框架;
- 探索和抽象通用的数据分析方法,如流失预测,归因分析,路径分析,用户分群
- 从事过机器学习平台研发或参加kaggle等比赛获得优异成绩者优先
3 数据挖掘的应用场景思考
- 做版本规划的时候,如何设立指标来进行功能验证?
- 功能上线后,如何做数据复盘?
- 如何通过数据来快速定位问题?
- 在众多的数据中如何识别哪些是需要呈现的重要数据
- 通过数据仅能让你找到局部最大值,而更高的山峰只会建立在你更广阔的视野与深厚的认知上。
4 技术学习
4.1 数据分析流程梳理
数据分析:用适当的统计方法对收集来的数据进行分析,以求最大化的开发数据资料的功能, 发挥数据的作用, 是为了提取有用的信息和形成结论而对数据加以详细研究和概括总结的过程。
数据挖掘:从海量的数据库中选择、探索、识别出有效的、新颖的、具有潜在效用的乃至最终可理解的模式以获取商业利益的非平凡的过程
定义挖掘目标:问题和想达到的效果, 明确分析的目的和思路
- 为什么展开数据分析,遇到什么问题,有没有其他更好的办法
- 方法:逻辑树分析法, 5w2h, 4p营销理论, PEST分析法
- 想多一点点
####数据取样:相关性, 可靠性,有效性
- 来自:数据库,问卷,互联网,公开出版物
####数据探索:异常值分析, 缺失值分析, 相关性分析,周期分析
####数据预处理:筛选, 变量转换, 缺失值处理,坏数据处理,数据标准化, 主成分分析,属性选择, 数据规约
- 数据清洗–》数据加工
- 从业务角度检查数据:不完整性, 噪音数据, 类型冲突, 单位冲突
- 从技术角度检查数据:统计描述, 箱体图,直方图, 散点图——》 数据预分析过程
- 数据分析方法: 对比分析, 交叉分析, 漏斗图分析, 矩阵关联分析,综合评价分析,杜邦分析
- 对比分析:将两个或两个以上的数据进行比较, 分析他们的差异, 从而揭示这些数据所代表的事务发展变化情况和规律性。 特地昂是非常直观的看出事务某方面的变化和差距, 并且可以准确、量化的表示出这种变化或者差距是多少。 例如列出国内各省的人均消费金额,对比差异
- 交叉分析:通常用于分析两个变量之间的关系,即同时将两个有一定联系的变量及其值交叉排列在一张表格内,是各个变量值成为不同变量的交叉节点, 形成交叉表, 从而分析交叉表中变量之间的关系。比如每月星巴克卖出的咖啡中白咖啡和黑咖啡的占比
- 漏斗分析:漏斗图是一个适合业务流程比较规范、周期比较长、各流程环节涉及复杂业务过程比较多的管理分析工具。是对业务流程最直观的一种表现形式, 可以快速发现业务流程中存在问题的环节。比如浏览商品-》放入购物车-》生成订单-》支付订单-》完成交易,每一步的转换率怎样
- 矩阵关联分析:是指根据事务的两个重要属性作为横纵轴, 组成一个坐标系, 在两坐标轴上分辨按某一标准进行刻度划分,构成四个象限, 将要分析的每个事务对应投身至这四个象限内, 直观的将两个属性的关联性表现出来, 进而分析每一个事务在这两个属性上的表现, 为决策者提供重要的参考依据。
挖掘建模:根据哪类问题(分类,聚类,关联规则, 时序模式, 智能推荐),选择合适的算法
- 常用的数据挖掘的方法:回归分析,关联分析,决策树,聚类分析, 因子分析,神经网络
- 回归分析:线性回归, 非线性回归, logistic回归
- 关联分析:推荐系统常用
- 决策树:决策树中最顶部的结点称为根结点, 是整个决策树的开始。 每个决策结点代表一个问题或者决策,结点连线代表某个属性满足的条件, 每个叶结点代表一种分类结果。
- 聚类分析:根据研究对象多个变量取值情况利用分类算法将研究对象划分到相对同质的多个群组, 使得群组内对象之间具有较高相似度,不通群组间对象之间差异较大——层次聚类法, k-means均值聚类法:随机选择k个对象,每个对象初试的代表一个类的平均值或者中心, 对剩余每个对象,根据其到各类中心的欧式距离,被划分到最近的类;然后重新计算每个类的中心值。不断重复这个过程,直到所有的样本都不能再分到任何一类为止。
模型评价:对比
模型发布
数据展示
- a picture is worth a thousand words;
- 表格、图表(成分图、排序(直方图),频率分布(直方图、折线图), 相关性(矩阵、散点), 多位图(多重数据比较))、词云图、 地域分布图、艺术图
- Excel, spss, sas, matlab, stata, T
撰写报告
- 分析的目的和背景:目的,数据来源
- 主要分析结果:1,2, x
- 总结与建议:
- 详细分析:1XXXX,图表,结果, 2xxxx, 图表,结果
- 附录:参考数据,模型说明等
心得体会
- 分析的关键在于从起伏跌宕中发现规律和信息
- 宁缺毋滥,切记过度推理
4.2 数据分析工具
- Hadoop, sqlserver, mysql, TDW(腾讯大数据平台)
- http://www.199it.com/ 中文互联网数据咨询
4.3 常见的数据分析、挖掘模型
分类模型:解决的是事务自动学习,然后进行类别判定的问题
聚类模型:解决的是将数据对象自动组成对象划定为不同类族
预测模型:解决根据已有实测规律,预测下一周期数据的问题
关联模型:解决大规模数据集中,寻找有关联关系的数据的问题
推荐模型:解决基于现有数据进行有效推荐
4.4 机器学习
4.4.1 有监督学习
K-近邻算法
决策树
逻辑回归
svm
朴素贝叶斯
4.1.2 无监督学习
K-means
PCA
FP-growth
关联规则
PageRank
4.1.3 分类模型常用算法
朴素贝叶斯
svm
k-近邻
逻辑回归
决策树
4.1.4 聚类模型常用算法
对大量未标注的数据集进行特征处理–》按照数据内在相似性将数据集划分为多个类别–》使类别内的数据相似度较大,而类别间的数据相似度较小
4.2 spark
4.5 数据分析技术点梳理
5.1 数据分析方法
1)拆解
①树形拆解
适合构成类数据分析,每一个数据由多个子项构成
下一层是上一层的支撑和论据
②线性拆解
适合流程分析,挖掘用户操作流程中的问题点
关注相邻项间的转化和用户流失情况
优化方向:去掉过程步骤等
5.2 数据清洗和特征处理
https://tech.meituan.com/2015/02/10/machinelearning-data-feature-process.html
https://www.cnblogs.com/jasonfreak/p/5448385.html
其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
数据清洗=>特征
标注数据生成=>模型学习=>模型应用
蓝色-离线
绿色-在线
主要的区别在于1.不需要清洗标注数据,只需要处理得到特征数据,在线模型使用特征数据预测出样本可能的标签。2.最终生成数据的用处,最终生成的数据主要用于模型的预测,而不是训练。 在离线的处理部分,可以进行较多的实验和迭代,尝试不同的样本采样、样本权重、特征处理方法、特征组合方法等,最终得到一个最优的方法,在离线评估得到好的结果后,最终将确定的方案在线上使用。 另外,由于在线和离线环境不同,存储数据、获取数据的方法存在较大的差异。例如离线数据获取可以将数据存储在Hadoop,批量地进行分析处理等操作,并且容忍一定的失败。而在线服务获取数据需要稳定、延时小等,可以将数据建入索引、存入KV存储系统等。
离线我们用常用的衡量排序结果的AUC指标,在线的我们通过ABTest来测试算法对下单率、用户转化率等指标的影响。
模型评价: 离线AUC, 在线ABTest
- AUC:AUC值为ROC曲线下的面积,是一个概率值,越大越好。简单来说这个指标的含义其实就是随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。AUC是一个二分类模型的评价指标,还有很多其他指标比如logloss,accuracy,precision。在数据挖掘比赛中,AUC和logloss比accuracy更常用。因为很多机器学习的模型对分类问题的预测结果都是概率,如果要计算accuracy,需要先把概率转化成类别,这就需要手动设置一个阈值,如果对一个样本的预测概率高于阈值,那该样本就被预测为正样本,低于这个阈值,则为负样本。所以这个阈值很大程度上影响了accuracy的计算。然而,使用AUC和logloss可以避免把预测概率转换成类别。
- Logloss: logloss越小越好,物理意义为:衡量预估ctr与实际ctr的拟合程度。
数据获取:准确性, 难度、数据量大小
- 数据采样:随机采样,固定比例采样
- 1.结合业务情况进行数据的过滤,例如去除crawler抓取,spam,作弊等数据。
- 2.异常点检测,采用异常点检测算法对样本进行分析,常用的异常点检测算法包括 - 偏差检测,例如聚类,最近邻等。 - 基于统计的异常点检测算法 例如极差,四分位数间距,均差,标准差等,这种方法适合于挖掘单变量的数值型数据。全距(Range),又称极差,是用来表示统计资料中的变异量数(measures of variation) ,其最大值与最小值之间的差距;四分位距通常是用来构建箱形图,以及对概率分布的简要图表概述。 - 基于距离的异常点检测算法,主要通过距离方法来检测异常点,将数据集中与大多数点之间距离大于某个阈值的点视为异常点,主要使用的距离度量方法有绝对距离 ( 曼哈顿距离 ) 、欧氏距离和马氏距离等方法。 - 基于密度的异常点检测算法,考察当前点周围密度,可以发现局部异常点,例如LOF算法
- 数据采样:随机采样,固定比例采样
特征分类
- 离线特征获取方案 离线可以使用海量的数据,借助于分布式文件存储平台,例如HDFS等,使用例如MapReduce,Spark等处理工具来处理海量的数据等
- 在线特征获取方案 在线特征比较注重获取数据的延时,由于是在线服务,需要在非常短的时间内获取到相应的数据,对查找性能要求非常高,可以将数据存储在索引、kv存储等。而查找性能与数据的数据量会有矛盾,需要折衷处理,我们使用了特征分层获取方案
- 特征数据只有在和标注数据合并之后,才能用来做为模型的训练
- 可以将特征分为(1)Low level特征和High level特征。(2)稳定特征与动态特征。(3)二值特征、连续特征、枚举特征。
- Low level特征是较低级别的特征,主要是原始特征,不需要或者需要非常少的人工处理和干预,例如文本特征中的词向量特征,图像特征中的像素点,用户id,商品id等。Low level特征一般维度比较高,不能用过于复杂的模型。High level特征是经过较复杂的处理,结合部分业务逻辑或者规则、模型得到的特征,例如人工打分,模型打分等特征,可以用于较复杂的非线性模型。Low level 比较针对性,覆盖面小。长尾样本的预测值主要受high level特征影响。 高频样本的预测值主要受low level特征影响。
- 稳定特征是变化频率(更新频率)较少的特征,例如评价平均分,团购单价格等,在较长的时间段内都不会发生变化。动态特征是更新变化比较频繁的特征,有些甚至是实时计算得到的特征,例如距离特征,2小时销量等特征。或者叫做实时特征和非实时特征。针对两类特征的不同可以针对性地设计特征存储和更新方式,例如对于稳定特征,可以建入索引,较长时间更新一次,如果做缓存的话,缓存的时间可以较长。对于动态特征,需要实时计算或者准实时地更新数据,如果做缓存的话,缓存过期时间需要设置的较短。
- 二值特征主要是0/1特征,即特征只取两种值:0或者1,例如用户id特征:目前的id是否是某个特定的id,词向量特征:某个特定的词是否在文章中出现等等。连续值特征是取值为有理数的特征,特征取值个数不定,例如距离特征,特征取值为是0~正无穷。枚举值特征主要是特征有固定个数个可能值,例如今天周几,只有7个可能值:周1,周2,…,周日。在实际的使用中,我们可能对不同类型的特征进行转换,例如将枚举特征或者连续特征处理为二值特征。枚举特征处理为二值特征技巧:将枚举特征映射为多个特征,每个特征对应一个特定枚举值,例如今天周几,可以把它转换成7个二元特征:今天是否是周一,今天是否是周二,…,今天是否是周日。连续值处理为二值特征方法:先将连续值离散化(后面会介绍如何离散化),再将离散化后的特征切分为N个二元特征,每个特征代表是否在这个区间内。
特征选择
特征选择的目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。 特征选择的一般过程如下图所示:主要分为产生过程,评估过程,停止条件和验证过程
特征抽取和归一化之后,如果发现特征太多,导致模型无法训练,或很容易导致模型过拟合,则需要对特征进行选择,挑选有价值的特征。
- Filter:
假设特征子集对模型预估的影响互相独立,选择一个特征子集,分析该子集和数据Label的关系,如果存在某种正相关,则认为该特征子集有效。衡量特征子集和数据Label关系的算法有很多,如Chi-square,Information Gain。
- Wrapper:
选择一个特征子集加入原有特征集合,用模型进行训练,比较子集加入前后的效果,如果效果变好,则认为该特征子集有效,否则认为无效。
- Embedded:
将特征选择和模型训练结合起来,如在损失函数中加入L1 Norm ,L2 Norm。
完全搜索(Complete)
- 广度优先搜索( Breadth First Search ) 广度优先遍历特征子空间。枚举所有组合,穷举搜索,实用性不高。
- 分支限界搜索( Branch and Bound ) 穷举基础上加入分支限界。例如:剪掉某些不可能搜索出比当前最优解更优的分支。 其他,如定向搜索 (Beam Search ),最优优先搜索 ( Best First Search )等
启发式搜索(Heuristic)
- 序列前向选择( SFS , Sequential Forward Selection ) 从空集开始,每次加入一个选最优。
- 序列后向选择( SBS , Sequential Backward Selection ) 从全集开始,每次减少一个选最优。
- 增L去R选择算法 ( LRS , Plus-L Minus-R Selection ) 从空集开始,每次加入L个,减去R个,选最优(L>R)或者从全集开始,每次减去R个,增加L个,选最优(L<R)。
其他如双向搜索( BDS , Bidirectional Search ),序列浮动选择( Sequential Floating Selection )等
随机搜索(Random)
- 随机产生序列选择算法(RGSS, Random Generation plus Sequential Selection) 随机产生一个特征子集,然后在该子集上执行SFS与SBS算法。
- 模拟退火算法( SA, Simulated Annealing ) 以一定的概率来接受一个比当前解要差的解,而且这个概率随着时间推移逐渐降低
- 遗传算法( GA, Genetic Algorithms ) 通过交叉、突变等操作繁殖出下一代特征子集,并且评分越高的特征子集被选中参加繁殖的概率越高。
随机算法共同缺点:依赖随机因素,有实验结果难重现。
特征选择—相关性
对特征的有效性进行分析,得到各个特征的特征权重,根据是否与模型有关可以分为1.与模型相关特征权重,使用所有的特征数据训练出来模型,看在模型中各个特征的权重,由于需要训练出模型,模型相关的权重与此次学习所用的模型比较相关。不同的模型有不同的模型权重衡量方法。例如线性模型中,特征的权重系数等。2.与模型无关特征权重。主要分析特征与label的相关性,这样的分析是与这次学习所使用的模型无关的。与模型无关特征权重分析方法包括(1)交叉熵,(2)Information Gain,(3)Odds ratio,(4)互信息,(5)KL散度等
于重要的特征进行监控与有效性分析,了解模型所用的特征是否存在问题,当某个特别重要的特征出问题时,需要做好备案,防止灾难性结果
特征选择–距离
- 运用距离度量进行特征选择是基于这样的假设:好的特征子集应该使得属于同一类的样本距离尽可能小,属于不同类的样本之间的距离尽可能远。常用的距离度量(相似性度量)包括欧氏距离、标准化欧氏距离、马氏距离等。
特征选择–一致性
- 若样本1与样本2属于不同的分类,但在特征A、 B上的取值完全一样,那么特征子集{A,B}不应该选作最终的特征集
特征处理
无量纲化
标准化:标准化需要计算特征的均值和标准差,公式表达为, 代码from sklearn.preprocessing import StandardScaler
区间缩放法:区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为,代码 from sklearn.preprocessing import MinMaxScaler
特征归一化: Normalizer
- 主要用于单个特征的处理。 - 归一化 不同的特征有不同的取值范围,在有些算法中,例如线性模型或者距离相关的模型像聚类模型、knn模型等,特征的取值范围会对最终的结果产生较大影响,例如二元特征的取值范围为[0,1],而距离特征取值可能是[0,正无穷),在实际使用中会对距离进行截断,例如[0,3000000],但是这两个特征由于取值范围不一致导致了模型可能会更偏向于取值范围较大的特征,为了平衡取值范围不一致的特征,需要对特征进行归一化处理,将特征取值归一化到[0,1]区间。常用的归一化方法包括1.函数归一化,通过映射函数将特征取值映射到[0,1]区间,例如最大最小值归一化方法,是一种线性的映射。还有通过非线性函数的映射,例如log函数等。
- 2.分维度归一化,可以使用最大最小归一化方法,但是最大最小值选取的是所属类别的最大最小值,即使用的是局部最大最小值,不是全局的最大最小值。
- 3.排序归一化,不管原来的特征取值是什么样的,将特征按大小排序,根据特征所对应的序给予一个新的值。
标准化和归一化的区别:简单来说,标准化是依照特征矩阵的列处理数据,其通过求z-score(标准分数)的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:
对定量特征二值化:定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0
1
2
3
41 from sklearn.preprocessing import Binarizer
2
3 #二值化,阈值设置为3,返回值为二值化后的数据
4 Binarizer(threshold=3).fit_transform(iris.data)对定性特征亚编码
one-hot独热编码介绍 https://blog.csdn.net/qq_41853758/article/details/81252174
独热码,在英文文献中称做 one-hot code, 又称独热编码、一位有效编码,直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
自然状态码为:000,001,010,011,100,101 独热编码为:000001,000010,000100,001000,010000,100000
离散化–等值划分,等量划分
离散化 在上面介绍过连续值的取值空间可能是无穷的,为了便于表示和在模型中处理,需要对连续值特征进行离散化处理。常用的离散化方法包括等值划分和等量划分。等值划分是将特征按照值域进行均分,每一段内的取值等同处理。例如某个特征的取值范围为[0,10],我们可以将其划分为10段,[0,1),[1,2),…,[9,10)。等量划分是根据样本总数进行均分,每段等量个样本划分为1段。例如距离特征,取值范围[0,3000000],现在需要切分成10段,如果按照等比例划分的话,会发现绝大部分样本都在第1段中。使用等量划分就会避免这种问题,最终可能的切分是[0,100),[100,300),[300,500),..,[10000,3000000],前面的区间划分比较密,后面的比较稀疏。正如上文所言,独热编码(哑变量 dummy variable)是因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。
为什么特征向量要映射到欧式空间? 将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
缺省值处理 from sklearn.preprocessing import Imputer
- 有些特征可能因为无法采样或者没有观测值而缺失,例如距离特征,用户可能禁止获取地理位置或者获取地理位置失败,此时需要对这些特征做特殊的处理,赋予一个缺省值。缺省值如何赋予,也有很多种方法。例如单独表示,众数,平均值等
数据变换:常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的
特征降维
在介绍特征降维之前,先介绍下特征升维。在机器学习中,有一个VC维理论。根据VC维理论,VC维越高,打散能力越强,可容许的模型复杂度越高。在低维不可分的数据,映射到高维是可分。可以想想,给你一堆物品,人脑是如何对这些物品进行分类,依然是找出这些物品的一些特征,例如:颜色,形状,大小,触感等等,然后根据这些特征对物品做以归类,这其实就是一个先升维,后划分的过程。比如我们人脑识别香蕉。可能首先我们发现香蕉是黄色的。这是在颜色这个维度的一个切分。但是很多东西都是黄色的啊,例如哈密瓜。那么怎么区分香蕉和哈密瓜呢?我们发现香蕉形状是弯曲的。而哈密瓜是圆形的,那么我们就可以用形状来把香蕉和哈密瓜划分开了,即引入一个新维度:形状,来区分。这就是一个从“颜色”一维特征升维到二维特征的例子。
那问题来了,既然升维后模型能力能变强,那么是不是特征维度越高越好呢?为什么要进行特征降维&特征选择?主要是出于如下考虑:1. 特征维数越高,模型越容易过拟合,此时更复杂的模型就不好用。2. 相互独立的特征维数越高,在模型不变的情况下,在测试集上达到相同的效果表现所需要的训练样本的数目就越大。 3. 特征数量增加带来的训练、测试以及存储的开销都会增大。4.在某些模型中,例如基于距离计算的模型KMeans,KNN等模型,在进行距离计算时,维度过高会影响精度和性能。5.可视化分析的需要。在低维的情况下,例如二维,三维,我们可以把数据绘制出来,可视化地看到数据。当维度增高时,就难以绘制出来了。在机器学习中,有一个非常经典的维度灾难的概念。用来描述当空间维度增加时,分析和组织高维空间,因体积指数增加而遇到各种问题场景。例如,100个平均分布的点能把一个单位区间以每个点距离不超过0.01采样;而当维度增加到10后,如果以相邻点距离不超过0.01小方格采样单位超一单位超正方体,则需要10^20 个采样点。
正是由于高维特征有如上描述的各种各样的问题,所以我们需要进行特征降维和特征选择等工作。特征降维常用的算法有PCA,LDA等。特征降维的目标是将高维空间中的数据集映射到低维空间数据,同时尽可能少地丢失信息,或者降维后的数据点尽可能地容易被区分 .是对数据在高维空间下的一个投影转换,通过一定的投影规则将原来从一个角度看到的多个维度映射成较少的维度
PCA算法 (主成分分析)通过协方差矩阵的特征值分解能够得到数据的主成分,以二维特征为例,两个特征之间可能存在线性关系(例如运动的时速和秒速度),这样就造成了第二维信息是冗余的。PCA的目标是发现这种特征之间的线性关系,并去除。
出发思想不同。PCA主要是从特征的协方差角度,去找到比较好的投影方式,即选择样本点投影具有最大方差的方向.在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好
LDA算法(线性判别分析) 考虑label,降维后的数据点尽可能地容易被区分. LDA则更多的是考虑了分类标签信息,寻求投影后不同类别之间数据点距离更大化以及同一类别数据点距离最小化,即选择分类性能最好的方向. LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”
降维后可用维度数量不同。LDA降维后最多可生成C-1维子空间(分类标签数-1),因此LDA与原始维度N数量无关,只有数据标签分类数量有关;而PCA最多有n维度可用,即最大可以选择全部可用维度。
上图左侧是PCA的降维思想,它所作的只是将整组数据整体映射到最方便表示这组数据的坐标轴上,映射时没有利用任何数据内部的分类信息。因此,虽然PCA后的数据在表示上更加方便(降低了维数并能最大限度的保持原有信息),但在分类上也许会变得更加困难;上图右侧是LDA的降维思想,可以看到LDA充分利用了数据的分类信息,将两组数据映射到了另外一个坐标轴上,使得数据更易区分了(在低维上就可以区分,减少了运算量)。
线性判别分析LDA算法由于其简单有效性在多个领域都得到了广泛地应用,是目前机器学习、数据挖掘领域经典且热门的一个算法;但是算法本身仍然存在一些局限性:
当样本数量远小于样本的特征维数,样本与样本之间的距离变大使得距离度量失效,使LDA算法中的类内、类间离散度矩阵奇异,不能得到最优的投影方向,在人脸识别领域中表现得尤为突出
LDA不适合对非高斯分布的样本进行降维
LDA在样本分类信息依赖方差而不是均值时,效果不好
LDA可能过度拟合数据
LDA用于降维,和PCA有很多相同,也有很多不同的地方,因此值得好好的比较一下两者的降维异同点。
首先我们看看相同点:
1)两者均可以对数据进行降维。
2)两者在降维时均使用了矩阵特征分解的思想。
3)两者都假设数据符合高斯分布。
我们接着看看不同点:
1)LDA是有监督的降维方法,而PCA是无监督的降维方法
2)LDA降维最多降到类别数k-1的维数,而PCA没有这个限制。
3)LDA除了可以用于降维,还可以用于分类。
4)LDA选择分类性能最好的投影方向,而PCA选择样本点投影具有最大方差的方向。
1 | 当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样: |
5.3 特征选择
当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
- 特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
- 特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。
根据特征选择的形式又可以将特征选择方法分为3种:
- Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
- Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
- Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
我们使用sklearn中的feature_selection库来进行特征选择。
5.3.1 方差选择法
用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:
4.6 sklearn进行数据挖掘
https://www.cnblogs.com/jasonfreak/p/5448462.html
4.6.1 关键技术
并行处理,流水线处理,自动化调参,持久化是使用sklearn优雅地进行数据挖掘的核心。并行处理和流水线处理将多个特征处理工作,甚至包括模型训练工作组合成一个工作(从代码的角度来说,即将多个对象组合成了一个对象)。在组合的前提下,自动化调参技术帮我们省去了人工调参的反锁。训练好的模型是贮存在内存中的数据,持久化能够将这些数据保存在文件系统中,之后使用时无需再进行训练,直接从文件系统中加载即可
- 并行处理:并行处理使得多个特征处理工作能够并行地进行。根据对特征矩阵的读取方式不同,可分为整体并行处理和部分并行处理。整体并行处理,即并行处理的每个工作的输入都是特征矩阵的整体;部分并行处理,即可定义每个工作需要输入的特征矩阵的列
- 部分并行处理: 整体并行处理有其缺陷,在一些场景下,我们只需要对特征矩阵的某些列进行转换,而不是所有列。pipeline并没有提供相应的类(仅OneHotEncoder类实现了该功能),需要我们在FeatureUnion的基础上进行优化
- 流水线处理: pipeline包提供了Pipeline类来进行流水线处理。流水线上除最后一个工作以外,其他都要执行fit_transform方法,且上一个工作输出作为下一个工作的输入。最后一个工作必须实现fit方法,输入为上一个工作的输出;但是不限定一定有transform方法,因为流水线的最后一个工作可能是训练!
- 自动化调参:网格搜索为自动化调参的常见技术之一,grid_search包提供了自动化调参的工具,包括GridSearchCV类。穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。
- 存在问题:原始数据集划分成训练集和测试集以后,其中测试集除了用作调整参数,也用来测量模型的好坏;这样做导致最终的评分结果比实际效果要好。 耗时
- 对训练集再进行一次划分,分成训练集和验证集,这样划分的结果就是:原始数据划分为3份,分别为:训练集、验证集和测试集;其中训练集用来模型训练,验证集用来调整参数,而测试集用来衡量模型表现好坏。
- 持久化: externals.joblib包提供了dump和load方法来持久化和加载内存数据: