机器学习过程中的数据预处理和特征选择⽅法
1、数据清洗
数据清洗(data cleaning)是在过程中⼀个不可缺少的环节,其数据的清洗结果直接关系到模型效果以及最终的结论。在实际的⼯作中,数据清洗通常占开发过程的50%-80%左右的时间。
数据清洗过程:
(1)数据预处理
在数据预处理过程主要考虑两个⽅⾯,如下:吃药能吃萝卜吗
选择数据处理⼯具:关系型数据库或者Python
查看数据的元数据以及数据特征:⼀是查看元数据,包括字段解释、数据来源等⼀切可以描述数据的信息;另外是抽取⼀部分数据,通过⼈⼯查看的⽅式,对数据本⾝做⼀个⽐较直观的了解,并且初步发现⼀些问题,为之后的数据处理做准备。
(2)缺省值清洗
缺省值是数据中最常见的⼀个问题,处理缺省值有很多⽅式,主要包括以下四个步骤进⾏缺省值处理:
确定缺省值范围
在进⾏确定缺省值范围的时候,对每个字段都计算其缺失⽐例,然
后按照缺失⽐例和字段重要性分别指定不同的策略。
去除不需要的字段
在进⾏去除不需要的字段的时候,需要注意的是:删除操作最好不要直接操作与原始数据上,最好的是抽取部分数据进⾏删除字段后的模型构建,查看模型效果,如果效果不错,那么再到全量数据上进⾏删除字段操作。总⽽⾔之:该过程简单但是必须慎⽤,不过⼀般效果不错,删除⼀些丢失率⾼以及重要性低的数据可以降低模型的训练复杂度,同时⼜不会降低模型的效果。
填充缺省值内容
填充缺省值内容是⼀个⽐较重要的过程,也是我们常⽤的⼀种缺省值解决⽅案,⼀般采⽤下⾯⼏种⽅式进⾏数据的填充:
1. 以业务知识或经验推测填充缺省值
2. 以同⼀字段指标的计算结果(均值、中位数、众数等)填充缺省值
3. 以不同字段指标的计算结果来推测性的填充缺省值,⽐如通过⾝份证号码计算年龄、通过收货地址来推测家庭住址、通过访问的IP地
址来推测家庭/公司/学校的家庭住址等等
重新获取数据
如果某些指标⾮常重要,但是缺失率有⽐较⾼,⽽且通过其它字段没法⽐较精准的计算出指标值的情况下,那么就需要和数据产⽣⽅(业务⼈员、数据收集⼈员等)沟通协商,是否可以通过其它的渠道获取相关的数据,也就是进⾏重新获取数据的操作。
(3)格式内容清洗
⼀般情况下,数据是由⽤户/访客产⽣的,也就有很⼤的可能性存在格式和内容上不⼀致的情况,所以在进⾏模型构建之前需要先进⾏数据的格式内容清洗操作。格式内容问题主要有以下⼏类:
时间、⽇期、数值、半全⾓等显⽰格式不⼀致:直接将数据转换为⼀类格式即可,该问题⼀般出现在多个数据源整合的情况下。
内容中有不该存在的字符:最典型的就是在头部、中间、尾部的空格等问题,这种情况下,需要以半⾃动校验加半⼈⼯⽅式来找出问题,并去除不需要的字符。
内容与该字段应有的内容不符:⽐如姓名写成了性别、⾝份证号写成⼿机号等问题。
(4)逻辑错误清洗
主要是通过简单的逻辑推理发现数据中的问题数据,防⽌结果⾛偏,主要包含以下⼏个步骤:
数据去重
去除/替换不合理的值
去除/重构不可靠的字段值(修改⽭盾的内容)
(5)去除不需要的数据
⼀般情况下,我们会尽可能多的收集数据,但是不是所有的字段数据都是可以应⽤到模型构建过程的,
也不是说将所有的字段属性都放到构建模型中,最终模型的效果就⼀定会好,实际上来讲,字段属性越多,模型的构建就会越慢,所以有时候可以考虑将不要的字段进⾏删除操作。在进⾏该过程的时候,要注意备份原始数据。
(6)关联性验证
如果数据有多个来源,那么有必要进⾏关联性验证,该过程常应⽤到多数据源合并的过程中,通过验证数据之间的关联性来选择⽐较正确的特征属性,⽐如:汽车的线下购买信息和电话客服问卷信息,两者之间可以通过姓名和⼿机号进⾏关联操作,匹配两者之间的车辆信息是否是同⼀辆,如果不是,那么就需要进⾏数据调整。
2、特征转换
特征转换主要指将原始数据中的字段数据进⾏转换操作,从⽽得到适合进⾏算法模型构建的输⼊数据(数值型数据),在这个过程中主要包括但不限于以下⼏种数据的处理:
⽂本数据转换为数值型数据
缺省值填充
定性特征属性哑编码
定量特征属性⼆值化
特征标准化与归⼀化
机器学习的模型算法均要求输⼊的数据必须是数值型的,所以对于⽂本类型的特征属性,需要进⾏⽂本数据转换,也就是需要将⽂本数据转换为数值型数据。常⽤⽅式如下:
词袋法(BOW/TF)
TF-IDF(Term frequency-inver document frequency)
HashTF
词袋法
词袋法(Bag of words,BOW)是最早应⽤于NLP和IR领域的⼀种⽂本处理模型,该模型忽略⽂本的语法和语序,⽤⼀组⽆序的单词(words)来表达⼀段⽂字或者⼀个⽂档,词袋法中使⽤单词在⽂档中出现的次数(频数)来表⽰⽂档。
抹茶奶冻词集法
词集法(Set of words,SOW)是词袋法的⼀种变种,应⽤的⽐较多,和词袋法的原理⼀样,是以⽂档中的单词来表⽰⽂档的⼀种的模型,区别在于:词袋法使⽤的是单词的频数,⽽在词集法中使⽤的是单词是否出现,如果出现赋值为1,否则为0。
TF-IDF
在词袋法或者词集法中,使⽤的是单词的词频或者是否存在来进⾏表⽰⽂档特征,但是不同的单词在不同⽂档中出现的次数不同,⽽且有些单词仅仅在某⼀些⽂档中出现(例如专业名称等等),也就是说不同单词对于⽂本⽽⾔具有不同的重要性,那么,如何评估⼀个单词对于⼀个⽂本的重要性呢?
单词的重要性随着它在⽂本中出现的次数成正⽐增加,也就是单词的出现次数越多,该单词对于⽂本的重要性就越⾼。同时单词的重要性会随着在语料库中出现的频率成反⽐下降,也就是单词在语料库中出现的频率越⾼,表⽰该单词与常见,也就是该单词对于⽂本的重要性越低。
TF-IDF(Item frequency-inver document frequency)是⼀种常⽤的⽤于信息检索与数据挖掘的常⽤加权技术,TF的意思是词频(Item Frequency),IDF的意思是逆向⽂件频率(Inver Document Frequency)。TF-IDF可以反映语料中单词对⽂档/⽂本的重要程度。
假设单词⽤t表⽰,⽂档⽤d表⽰,语料库⽤D表⽰,那么N(t,D)表⽰包含单词t的⽂档数量,|D|表⽰⽂档数量,|d|表⽰⽂档d中的所有单词数量。N(t,d)表⽰在⽂档d中单词t出现的次数。
TF IDF(t,d,D)TF(t,d)IDF(t,D)=TF(t,d)∗IDF(t,D)=∣d∣N(t,d)=log(N(t,D)+1∣D∣+1)
TF-IDF除了使⽤默认的tf和idf公式外,tf和idf公式还可以使⽤⼀些扩展之后公式来进⾏指标的计算,常⽤的公式有:
有两个⽂档,单词统计如下,请分别计算各个单词在⽂档中的TF-IDF值以及这些⽂档使⽤单词表⽰的特征向量。
HashTF-IDF
不管是前⾯的词袋法还是TF-IDF,都避免不了计算⽂档中单词的词频,当⽂档数量⽐较少、单词数量⽐较少的时候,我们的计算量不会太⼤,但是当这个数量上升到⼀定程度的时候,程序的计算效率就会降低下去,这个时候可以通过HashTF的形式来解决该问题。HashTF的计算规则是:在计算过程中,不计算词频,⽽是计算单词进⾏hash后的hash值的数量(有的模型中可能存在正则化操作)。
HashTF的特点:运⾏速度快,但是⽆法获取⾼频词,有可能存在单词碰撞问题(hash值⼀样)。
Scikit-learn 中进⾏⽂本特征提取
鱼胶
在Scikit-learn中,对于⽂本数据主要提供了三种⽅式将⽂本数据转换为数值型的特征向量,同时提供了⼀种对TF-IDF公式改版的公式。所有的转换⽅式均位于模块:sklearn.。
用餐礼仪名称
描述CountVectorizer
以词袋法的形式表⽰⽂档HashingVectorizer
以HashingTF的模型来表⽰⽂档的特征向量TfidfVectorizer 以TF-IDF的模型来表⽰⽂档的特征向量,等价于先做CountVectorizer,然后做TfidfTransformer转换操作的结果
TfidfTransformer
使⽤改进的TF-IDF公式对⽂档的特征向量矩阵(数值型的)进⾏重计算的操作,TFIDF=TF*(IDF+1)。备注:该转换常应⽤到
CountVectorizer或者HashingVectorizer之后Scikit-learn 中进⾏缺省值填充
对于缺省的数据,在处理之前⼀定需要进⾏预处理操作,⼀般采⽤中位数、均值或者众数来进⾏填充,在Scikit-learn中主要通过Imputer 类来实现对缺省值的填充。
哑编码
哑编码(OneHotEncoder):对于定性的数据(也就是分类的数据),可以采⽤N位的状态寄存器来对N个状态进⾏编码,每个状态都有⼀个独⽴的寄存器位,并且在任意状态下只有⼀位有效。哑编码是⼀种常⽤的将特征数字化的⽅式。⽐如有⼀个特征属性:
[‘male’,‘female’],那么male使⽤向量[1,0]表⽰,female使⽤[0,1]表⽰。
⼆值化
⼆值化(Binarizer):对于定量的数据根据给定的阈值,将其进⾏转换,如果⼤于阈值,那么赋值为1;否则赋值为0。
标准化
标准化:基于特征属性的数据(也就是特征矩阵的列),获取均值和⽅差,然后将特征值转换⾄服从标准正态分布。计算公式如下:
区间缩放法
区间缩放法:是指按照数据的⽅差特性对数据进⾏缩放操作,将数据缩放到给定区间上,常⽤的计算⽅式如下。
X_stdX_scaled =X.max −X.minX −X.min =X_std ∗(max −min)+min
归⼀化
归⼀化:和标准化不同,归⼀化是基于矩阵的⾏进⾏数据处理,其⽬的是将矩阵的⾏均转换为“单位向量”,l2规则转换公式如下:
x =′S
x −X
x =
′x (j )∑j =1m 2
x
科普知识大全数据多项式扩充变换
多项式数据变换主要是指基于输⼊的特征数据按照既定的多项式规则构建更多的输出特征属性,⽐如输⼊特征属性为[a,b],当设置degree 为2的时候,那么输出的多项式特征为。
3、
当做完特征转换后,实际上可能会存在很多的特征属性,⽐如:多项式扩展转换、⽂本数据转换等等,但是太多的特征属性的存在可能会导致模型构建效率降低,同时模型的效果有可能会变的不好,那么这个时候就需要从这些特征属性中选择出影响最⼤的特征属性作为最后构建模型的特征属性列表。在选择模型的过程中,通常从两⽅⾯来选择特征:特征是否发散:如果⼀个特征不发散,⽐如⽅差解决于0,也就是说这样的特征对于样本的区分没有什么作⽤
特征与⽬标的相关性:如果与⽬标相关性⽐较⾼,应当优先选择特征选择的⽅法主要有以下三种:
Filter:过滤法,按照发散性或者相关性对各个特征进⾏评分,设定阈值或者待选择阈值的个数,从⽽选择特征;常⽤⽅法包括⽅差选择法、相关系数法、卡⽅检验、互信息法等Wrapper:包装法,根据⽬标函数(通常是预测效果评分),每次选择若⼲特征或者排除若⼲特征;常⽤⽅法主要是递归特征消除法Embedded:嵌⼊法,先使⽤某些机器学习的算法和模型进⾏训练,得到各个特征的权重系数,根据系数从⼤到⼩选择特征;常⽤⽅法主要是基于惩罚项的特征选择法
⽅差选择法
先计算各个特征属性的⽅差值,然后根据阈值,获取⽅差⼤于阈值的特征。
相关系数法
先计算各个特征属性对于⽬标值的相关系数以及相关系数的P值,然后获取⼤于阈值的特征属性。
卡⽅检验
检查定性⾃变量对定性因变量的相关性:
递归特征消除法抽丝剥茧意思
使⽤⼀个基模型来进⾏多轮训练,每轮训练后,消除若⼲权值系数的特征,再基于新的特征集进⾏下⼀轮训练。
基于惩罚项的特征选择法
好看花边
在使⽤惩罚项的基模型,除了可以筛选出特征外,同时还可以进⾏操作。
基于树模型的特征选择法
树模型中GBDT在构建的过程会对特征属性进⾏权重的给定,所以GBDT也可以应⽤在基模型中进⾏特征选择。
4、特征选取/降维
当特征选择完成后,可以直接可以进⾏训练模型了,但是可能由于特征矩阵过⼤,导致计算量⽐较⼤,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维⽅法除了基于L1的惩罚模型外,还有主成分析法(PCA)和线性判别分析法(LDA),这两种⽅法的本质都是将原始数据映射到维度更低的样本空间中,但是采⽤的⽅式不同,PCA是为了让映射后的样本具有更⼤的发散性,LDA是为了让映射后的样本有最好的分类性能。
主成分分析(PCA )
米酒鸡蛋的功效与作用[1,a ,b ,a ,ab ,b ]22χ=2∑E
(A −E )2
将⾼维的特征向量合并成为低维度的特征属性,是
⼀种⽆监督的降维⽅法。
⼆维到⼀维降维:
多维情况—协⽅差矩阵:
线性判别分析(LDA)
LDA是⼀种基于分类模型进⾏特征属性合并的操作,是⼀种有监督的降维⽅法。
5、异常数据处理
6、
⾃然语⾔处理:即实现⼈机间⾃然语⾔通信,或实现⾃然语⾔理解和⾃然语⾔⽣成。
主要技术:汉字词法分析、句法分析、语义分析、⽂本⽣成、语⾔识别。
应⽤场景:⽂本分类和聚类、信息检索和过滤、机器翻译。
Python中汉字分词包:jieba,Python开发的中⽂分词模块。
分词:来把连续的汉字分隔成更具有语⾔语义学上意义的词。这个过程就叫做分词。
分词的常见⽅法:
1. 词典匹配:匹配⽅式可以从左到右,从右到左。对于匹配中遇到的多种分段可能性,通常会选取分隔出来词的数⽬最⼩的
2. 基于统计的⽅法:隐马尔可夫模型(HMM)、最⼤熵模型(ME),估计相邻汉字之间的关联性,进⽽实现切分
3. 基于深度学习:神经⽹络抽取特征、联合建模
Jieba分词原理
字符串匹配:把汉字串与词典中的词条进⾏匹配,识别出⼀个词
理解分词法:通过分词⼦系统、句法语义⼦系统、总控部分来模拟⼈对句⼦的理解
统计分词法:建⽴⼤规模语料库,通过隐马尔可夫模型或其他模型训练,进⾏分词
Jieba分词使⽤
jieba分词模式:全模式:jieba.cut(str,cut_all=True),精确模式:jieba.cut(str),搜索引擎模式:jieba.cut_for_arch(str)分词特征提取:返回TF/IDF权重最⼤的关键词,默认返回20个,act_tags(str,topK=20)
⾃定义词典:帮助切分⼀些⽆法识别的新词,加载词典jieba.load_urdict(‘’)
调整词典:add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。使⽤
suggest_freq(gment, tune=True) 可调节单个词语的词频