赞
踩
特征工程是数据分析中最耗时间和精力的一部分工作。数据和特征决定了机器学习的上限,而模型和算法则是逼近这个上限。因此,特征工程就变得尤为重要了。特征工程的主要工作就是对特征的处理,包括数据的采集,数据预处理,特征选择,甚至降维技术等跟特征有关的工作。
特征是数据中抽取出来的对结果预测有用的信息。
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
(1)特征工程是将原始数据转化为特征,能更好表示预测模型处理的实际问题,提升对于未知数据预测的准确性。
(2)更好的特征意味着更强的灵活度、更好的特征意味着只需要用简单模型、更好的特征意味着更好的结果。
注:不可信的样本丢掉,缺省值极多的字段考虑不用(即删掉)
from sklearn.preprocessing import Imputer
处理方法比较简单,比如某特征的取值是高,中和低,那么我们就可以创建三个取值为0或者1的特征,将高编码为1,0,0,中编码为0,1,0,低编码为0,0,1。也就是说,之前的一个特征被我们转化为了三个特征。
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
这个一般用于深度学习中。比如对于用户的ID这个特征,如果要使用独热编码,则维度会爆炸,如果使用特征嵌入维度就低很多了。对于每个要嵌入的特征,我们会有一个特征嵌入矩阵,这个矩阵的行很大,对应我们该特征的数目。比如用户ID,如果有100万个,那么嵌入的特征矩阵的行就是100万。但是列一般比较小,比如可以取20。这样每个用户ID就转化为了一个20维的特征向量,进而参与深度学习模型。
在tensorflow中,我们可以先随机初始化一个特征嵌入矩阵,对于每个用户,可以用tf.nn.embedding_lookup找到该用户的特征嵌入向量。特征嵌入矩阵会在反向传播的迭代中优化。
连续特征的离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。
首先要确定分类数,然后将连续特征值映射到这些分类值(等宽法、等频法、一维聚类)。
比如我们根据连续值特征的分位数,将该特征分为高,中和低三个特征。将分位数从00.3的设置为低,0.30.7的设置为中,0.7~1的设置为高。
一维聚类的方法包括两个步骤,首先将连续特征的值用聚类算法(如K-Means算法)进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续特征值并做同一标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。
(3)使用梯度提升树(GDBT)将连续值转化为离散值
在sklearn中,我们可以用GradientBoostingClassifier的 apply方法很方便的得到样本离散化后的特征,然后使用独热编码即可
数据规范化处理是数据挖掘的一项基础工作。不同的评价指标往往具有不同的量纲,数值间的差别可能很大,不进行处理可能会影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区域,便于进行综合分析。
具体的方法是求出样本特征x的均值mean和标准差std,然后用**(x-mean)/std**来代替原特征。这样特征就变成了均值为0,方差为1。该方法是当前用的最多的数据标准化方法。
from sklearn.preprocessing import StandardScaler
最小 - 最大标准化也成为离差标准化,是对原始数据的线性变换,将数值映射到[0,1]之间。
具体的方法是求出样本特征x的最大值max和最小值min,然后用(x-min)/(max-min)来代替原特征。如果我们希望将数据映射到任意一个区间[a,b],而不是[0,1],那么也很简单。用(x-min)(b-a)/(max-min)+a来代替原特征即可。
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import Normalizer
即计算出所有样本的时间到某一个未来时间之间的数值差距,这样这个差距是UTC的时间差,从而将时间特征转化为连续值。
根据时间所在的年,月,日,星期几,小时数,将一个时间特征转化为若干个离散特征,这种方法在分析具有明显时间趋势的问题比较好用。
直接把文本数据丢给模型,模型是无法解释的,因此需要把文本型的数据用数值表示。去掉停用词,标点符号,留下表达实际含义的词组成列表,在词库中映射稀疏向量。
"""对文本进行特征值化""" def countvec(): """ 对文本数据进行特征值化 CountVectorizer() 返回词频矩阵 CountVectorizer.fit_transform(X) X: 文本或者包含文本字符串的可迭代对象 返回值: 返回sparsejuz CountVectorizer.inverse_transform(X) X: array数组或者sparse矩阵 返回值: 转换之前数据格式 CountVectorizer.get_feature_names() 返回值: 单词列表 :return: None """ from sklearn.feature_extraction.text import CountVectorizer # 实例化CountVectorizer vector = CountVectorizer() # 调用fit_transform输入并转换数据 # data = vector.fit_transform(["life is sort, i like woman", "life is too long, i dislike python"]) data = vector.fit_transform(["生活是美好的,我喜欢女人", "生命太长了,我不喜欢python"]) """ 1、 统计所有文章当中所有的词,重复的只看做一次 2、 对每篇文章,在词的列表里面进行统计 每个词出现的次数 3、 单个字母或汉字不统计 """ # 打印结果 print(vector.get_feature_names()) # ['dislike', 'is', 'life', 'like', 'long', 'python', 'sort', 'too', 'woman'] print(data.toarray()) # [[0 1 1 1 0 0 1 0 1] # [1 1 1 0 1 1 0 1 0]]
它的思想是:在整个语言环境中,句子T的出现概率是由组成T的N个词组成的。
# 方法调用:from sklearn.feature_extraction.text import TfidfVectorizer """使用jieba做分词处理""" def cutword(): import jieba text1 = "九月六号我们上海一行18位人员搭乘吉祥航空飞机到达成都,接机司机很准时把我们送到成都友豪锦江宾馆。第二天一早来迎接我们的导游小辣椒和司机林师傅。小辣椒身材娇小美丽大方,一上车就热情洋溢地为我们介绍了这次旅行的注意事项和行程。小辣椒知识丰富,一路上为我们讲解了羌族,藏族的风土人情和沿途的历史变迁。游览九寨沟和黄龙细心的小辣椒为我们准备了风景佈局图,我们也很省力的领略了风景如画,童话世界的九寨沟。地震后的九寨沟依旧很美,壮观的瀑布,五彩的池水美得让你流连忘返,感叹大自然的鬼斧神工。这是一次很愉快的旅行,虽然很累但是这些都是值得的。最后要感谢司机林师傅态度好,技术高超,一路开车很平稳,到达酒店还上下帮我们拿行李,再次谢谢小辣椒和林师傅,你们辛苦了!真的是很不错的一次旅行体验!作为一个上班族,难得请假出来一次,还是挺好的,从住宿啊,饮食啊,行程中所有的车坐的特别舒服,即使坐很久也不会说很累。行程中。杜导的讲解很仔细也很到位,很感谢杜导的陪伴,杜导也辛苦了!九寨沟和黄龙的美景真的是世界上独一份的,选这条线路果然没错!此次导游小辣椒,全程安排的井井有条,司机蓝师傅热情,车技也是一流的。初入九寨沟,就被其大自然的鬼斧神工所深深震撼,从犀牛池到老虎海,从五花海到五彩池……每个景点都是人惊叹不已,恬静的镜湖,俊美的翠湖,秀丽的芳草湖,迷人的藏龙湖,神奇的五彩湖…… 美丽的风景随处可见。 白天看风景,晚上看风情。晚上我们欣赏了大型歌舞《九寨千古情》。这是极度震撼的视觉盛宴,是一生必看的演出。《九寨千古情》分为《九寨传说》、《古羌战歌》、《汉藏和亲》、《大爱无疆》、《天地吉祥》等场。优美而神秘的藏羌歌舞带你进入穿越时空之旅,辉煌的大唐皇宫展现了文成公主汉藏和亲的壮举。5D实景和高科技手段再现了阿坝州512汶川大地震的惨烈场面,山崩地裂、房倒屋塌,整个剧院和数千个座位强烈震动,3000立方大洪水瞬间倾泻而下……一个个真实的故事、一幅幅感人的画面展现了中华民族万众一心抗震救灾的大爱无疆。 人间瑶池——黄龙。高山雪水和涌出地表的岩溶水交融流淌,经过漫长岁月的累积,绘出了黄龙奇观的一幅幅。黄龙,真不愧为人间瑶池之美誉,只有当自己身在其中的时候才能感受到这里独特的美,感觉拍出来的照片也还原不出它的美丽。这是一次愉快的旅行,虽然很累,但是美得让你流连忘返的景色足以让你确信,这些都是值得的。第一天:小朋友近距离感受到了国宝熊猫的憨态可掬。国宝确实不是盖的,小朋很喜欢。8-9小时车程来到九寨沟。但是窗外的高原景色会让你些许忘却原来旅途这么久。第二天:天公作美,艳阳高照,预期的雨没有下下来。这是我们第一次邂逅迷人的九寨,九寨的美景果然是名不虚传。五彩池湖底颜色在阳光的烘托下,不同角度展现出不同的颜色,五彩斑斓。长海,镜海等每一处的景点都给人不同的视觉冲击,最后让你应接不暇,审美都疲劳了。第三天:下雨了,心中不免为今天黄龙之行抹上了一层阴影。另外,前一天游览了九寨,审美可能疲劳了。九寨更多是自然鬼斧神工的静态美,而黄龙是那种黄色溪底映照下,晶莹剔透的溪水汹涌奔腾向下的动态美。不一样的视觉和听觉体现,觉得游览完九寨,再游黄龙是完全值得的。没有领略阳光下的黄龙虽然是一种遗憾,但也是再来黄龙的动力。最后,需要感谢本次导游小辣椒女士,服务热情周到且细心,旅途中她的歌声和丰富景点介绍大大缓解了长途旅行的劳累。也感谢本次大巴司机蓝师傅,驾驶技术杠杠的。必须为他们二位周到的服务点赞司机态度好,技术又好,还帮忙上下拿行李,导游挺贴心的,我爸一路上玩得很开心,风景很好。就是要选择携程自营5钻,贵是贵些,想便宜就报非携程的,拉你在商店待几个小时,羊毛出在羊身上。就想让老人开心,舒舒服服地玩,多花钱值得!非常感谢导游彭明英,看我爸是独自一人,年龄大了,亲自陪着他上黄龙山,非常感谢!我因为工作,无法亲自陪伴老人,彭导游帮助了我,谢谢!以后还要给我爸选择更多的携程自营团,让辛苦了一辈子的老人,稍稍满足一下山水乐趣!" text2 = "一路走过大熊猫基地,九寨沟,黄龙,看了许多的风景,真心建议大家能支持一下国内的旅游业,多看看,多感受一下祖国的风土人情,这几天的旅***程,虽然很累,但是在行程中抬头就能看到的雪山,彩池,总能安慰心灵,瞬间充电,真正是肉体疲惫,心灵和眼睛在进化,同时表扬一下我们的杜导,是一个老实憨厚的本地小伙,从交谈中,我能感觉出他对脚下这片土地的热爱,对家乡的热爱,希望九寨尽快恢复地震带来的伤害,重新恢复他的美!感谢小贾全程对所有团员不厌其烦的讲解及细微之至的照顾和帮助,司机何师傅娴熟的驾驶技术,让这一场看似还蛮辛苦的旅程都变得轻松和愉快。尤其要表扬小贾,除了对线路的熟悉、历史地理人文都讲解得生动有趣之外,对古诗词佳句拿捏得当张口即来,让同行的新五年级小朋友赞叹不已自愧不如。2017年的九寨沟地震,2020年的疫情让九寨沟甚至整个旅游业都如履薄冰,也让各行各业都非常不容易。也正是在这样的大环境下,让我们又有幸重新对祖国的美好河山有了新的进一步的认识,让我们可以近距离的了解我们的祖国在党的领导下发展的是如此的强大。想起一路上小贾说,到九寨沟的高铁也正在建设中,路过这宏伟的工程,真心觉得一切的一切真的是太不容易了。九寨沟的风景是我不曾见过的美丽,沿途一路祖国的基建也让我感触许久。九寨归来不看水,再看还回九寨沟!希望有机会二刷、三刷九寨沟,也希望还有机会可以遇到这么专业的导游和司机师傅!携程的老顾客,选择九寨沟、黄龙A线双飞保姆车五天之游完美结束,所报的线路价格虽然贵了点,但四晚酒店的住宿、餐标与众不同,这对于我们体力不支的老年游客来说,睡好吃好是维一的要求,另一方面也省了不少的心。 出发前经网上了解的九寨沟、黄龙自然风光,与亲临实地景色迷人的风景对比确实百闻不如一见!青山绿水,自然风光感叹大自然的鬼斧神工,天地合造的自然美景意犹未尽。 导游“小鱼 ”讲解耐心细致,她爱岗敬业,各方面安排有条不紊,工作高度负责,尤其对老年游客关心无微不至,非常细心周到,使我们老年游客对黄龙景点因高反有缓解心里的压力。 宽敞的保姆车尾号308大巴司机李师傅车技特别专业,长途跋涉非常辛苦!他爱车如爱小老婆,车内清洁又卫生[微笑] 美丽的九寨沟、黄龙有缘下次再见!第一次旅游这么多天的,都还舍不得走了,玩的特别开心,特别适合散心旅游,整个游玩都没有购物的,特别值得一玩彭导非常好,一路上很耐心很生动地为我们讲解。买票也很积极。司机也很好,车容整洁,驾驶技术一流。" text3 = '这次的行程非常顺利,安排的非常好,司机俞师傅号称“穿山甲”,开车技术杠杠滴~导游白永洪非常细心和耐心,把我们照顾的妥妥贴贴,一路上耐心讲解,对我们也很关心,很负责任,最后把我们送到目的地才走,非常感谢俞师傅和白导,这次的旅程有了你们非常愉快!行程安排的很合理,紧凑,一路风景很美,住宿很舒服,最最重要的美食,很好吃哦!非常开心的一次旅行,没有任何强行消费。导游小贾解说非常详细,体贴用心。为人热情和善。这3天最辛苦的是司机林师傅。两个8小时行程确保车上每位乘客的安全。在这里再次感谢林师傅的小贾,感谢相遇,感谢你们让我和妈妈对成都、对阿垻藏族留下美好的回忆!旅游是一次心灵的净化和精神上的放松,一路上导游耐心讲解九寨的风土人情,幽默风趣整个车上行程不会觉得枯燥,住宿环境也挺好的,风景优美空气质量好,真心九寨归来不看水计划了很久的一次旅行,一直向往的九寨沟我终于来了,这里是避暑旅游的胜地,一路的风景都让人心旷神怡流连忘返,导游热情细心,耐心的给我们介绍每一个景点,会给我们很多建议。以后还会再来的。' con1 = jieba.cut(text1) con2 = jieba.cut(text2) con3 = jieba.cut(text3) # 转换成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表转换成字符串 c1 = ' '.join(content1) c2 = ' '.join(content2) c3 = ' '.join(content3) # print(c1) # print(c2) # print(c3) return c1, c2, c3 """tf-idf文本特征值化""" def tfidfvec(): """ tf-idf特征值化 :return: """ c1, c2, c3 = cutword() from sklearn.feature_extraction.text import TfidfVectorizer tf_vector = TfidfVectorizer() data = tf_vector.fit_transform([c1,c2,c3]) print(tf_vector.get_feature_names()) print(data.toarray())
异常数据的清洗,目标是将原始数据中异常的数据清除。
比如我们可以用KMeans聚类将训练样本分成若干个簇,如果某一个簇里的样本数很少,而且簇质心和其他所有的簇都很远,那么这个簇里面的样本极有可能是异常特征样本了。我们可以将其从训练集过滤掉。
主要是使用iForest或者one class SVM,使用异常点检测的机器学习算法来过滤所有的异常点。
例如极差,四分位数间距,均差,标准差等,这种方法适合于挖掘单变量的数值型数据。全距(Range),又称极差,是用来表示统计资料中的变异量数(measures of variation) ,其最大值与最小值之间的差距;四分位距通常是用来构建箱形图,以及对概率分布的简要图表概述。
主要通过距离方法来检测异常点,将数据集中与大多数点之间距离大于某个阈值的点视为异常点,主要使用的距离度量方法有绝对距离 ( 曼哈顿距离 ) 、欧氏距离和马氏距离等方法。
考察当前点的周围密度,可以发现局部异常点,例如LOF算法
它按照特征的发散性或者相关性指标对各个特征进行评分,设定评分阈值或者待选择阈值的个数,选择合适的特征。
使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。(方差越大的特征,那么我们可以认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。在实际应用中,我们会指定一个方差的阈值,当方差小于这个阈值的特征会被我们筛掉。)
from sklearn.feature_selection import VarianceThreshold
这个主要用于输出连续值的监督学习算法中。我们分别计算所有训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。即使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
卡方检验可以检验某个特征分布和输出值分布之间的相关性。
经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距。
我们还可以使用F检验和t检验,它们都是使用假设检验的方法,只是使用的统计分布不是卡方分布,而是F分布和t分布而已。
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
即从信息熵的角度分析各个特征和输出值之间的关系评分。在决策树算法中我们讲到过互信息(信息增益)。互信息值越大,说明该特征和输出值之间的相关性越大。
经典的互信息也是评价定性自变量对定性因变量的相关性。
from sklearn.feature_selection import SelectKBest
from minepy import MINE
注:过滤法特征选择的缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉。
根据目标函数,通常是预测效果评分,每次选择部分特征,或者排除部分特征。
递归消除特征法使用一个机器学习模型来进行多轮训练,每轮训练后,消除若干权值系数的对应的特征,再基于新的特征集进行下一轮训练。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小来选择特征。(类似于Filter方法,但是是通过训练来确定特征的优劣。)
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。
最常用的是使用L1正则化和L2正则化来选择特征。正则化惩罚项越大,那么模型的系数就会越小。当正则化惩罚项大到一定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0. 但是我们会发现一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的。也就是说,我们选择特征系数较大的特征。常用的L1正则化和L2正则化来选择特征的基学习器是逻辑回归。(L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。具体操作为:若一个特征在L1中的权值为1,选择在L2中权值差别不大且在L1中权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个新的逻辑回归模型)
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
可以使用决策树或者GBDT。一般来说,可以得到特征系数coef或者可以得到特征重要度(feature importances)的算法才可以做为嵌入法的基学习器。
树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型。
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
在数据挖掘的过程中,为了提取更有用的信息,挖掘更深层次的模式,提高挖掘结果的精度,我们需要利用已有的特征集构造出新的特征,并加入到现有的特征集合中。(即我们从业务特征中自己去寻找高级数据特征)
在Kaggle之类的算法竞赛中,高分团队主要使用的方法除了集成学习算法,剩下的主要就是在高级特征上面做文章。所以寻找高级特征是模型优化的必要步骤之一。当然,在第一次建立模型的时候,我们可以先不寻找高级特征,得到基准模型后,再寻找高级特征进行优化。(比如有车的路程特征和时间间隔特征,我们就可以得到车的平均速度这个二级特征。根据车的速度特征,我们就可以得到车的加速度这个三级特征等)
寻找高级特征最常用的方法有:若干项特征加和,若干项特征之差,若干项特征乘积,若干项特征除商。
寻找高级特征它是根据业务和模型需要而得,而不是随便的两两组合形成高级特征,这样容易导致特征爆炸,反而没有办法得到较好的模型。
一般而言,聚类的时候高级特征尽量少一点,分类回归的时候高级特征适度的多一点。
当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
from sklearn.decomposition import PCA """PCA主成分分析""" def pca(): """ PCA: 本质:PCA是一种分析、简化数据集的技术 目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。 作用:可以消减回归分析或聚类分析中特征的数量 语法: PCA(n_components=None) 将数据分解为较为低维空间 PCA.fit=transform(X) X: numpy array 格式的数据[n_samples,n_features] 返回值: 转换后的指定维度的array Returns:None """ from sklearn.decomposition import PCA p = PCA(n_components=0.9) a = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]] data = p.fit_transform(a) print(data)
from sklearn.lda import LDA
在对文本数据进行向量化以后,由于是稀疏矩阵太稀疏,同样可以使用降维技术,这里使用的是奇异值分解。
from sklearn.decomposition import TruncatedSVD
注:降维技术不是特征选择,降维是把高维数据的特征映射到低维空间中,而特征选择是在高维空间中直接剔除部分特征,选出重要特征。
a = [[2, 8, 4, 5],
[6, 3, 0, 8],
[5, 4, 9, 1]]
data = p.fit_transform(a)
print(data)
from sklearn.lda import LDA
在对文本数据进行向量化以后,由于是稀疏矩阵太稀疏,同样可以使用降维技术,这里使用的是奇异值分解。
from sklearn.decomposition import TruncatedSVD
注:降维技术不是特征选择,降维是把高维数据的特征映射到低维空间中,而特征选择是在高维空间中直接剔除部分特征,选出重要特征。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。