特征工程:特征处理方法

Python022

特征工程:特征处理方法,第1张

如果不同特征的数量级不在一个等级,模型就不是碗形,而是长条形,难收敛。如果是逻辑回归、线性回归,一定要做幅度调整,如果用树模型,就不需要幅度调整。因为树模型是对各个特征一个一个做的,幅度差异不影响。

可以把不同特征调整到[0,1]范围内,(x-min)/(max-min),适用于非高斯分布,可以保留数值大部分信息,但易受到异常值影响。

或者使用standard scaler, ,适用于高斯分布。优点是处理后的数据更加正态化,但是缺点是对分布要求严格。

树模型(决策树、随机森林、GBDT)不需要做数值的缩放,线性模型、SVM、神经网络、KNN、PCA降维都是需要做数值缩放的。

1)加减平均:商品价格高于平均价格多少,用户在某个品类下消费超过平均用户多少,用户连续登录天数超过平均多少。。。

2)分位线:商品属于售出商品价格的多少分位线处。

3)次序型:排在第几位

4)比例类:电商中,好/中/差评 比例,你已超过全国百分之多少的同学。

比如年龄,是一个连续值。如果要通过逻辑回归来判断是否要让座,要同时顾及“尊老”“爱幼”。而激活函数sigmoid函数是 ,如果 是正数,函数是单调增,年龄越大让座可能越大,但是小孩子就不让座了,如果 是负数,函数单调减,只能满足爱幼,不能尊老了。所以,将年龄字段分成[0,6],[7,59],[60,120]三段,变成三个字段,对应就会有三个 来判别,是否应该让座,就可以同时实现尊老和爱幼。

1)等距切分。pd.cut()

2)等频切分,按照分位数切分。pd.qcut()

如果是用逻辑回归模型,就要做离散化,如果使用树模型,如决策树、随机森林,就不一定要做离散化,因为模型本身会给你做离散化。

口红色号,衣服尺码等等

red:--->1

blue:--->2

yellow:--->3

如果用以上的编码方式,不同颜色之间存在了大小关系,而应该是等价的。

red:-->1,0,0

blue:-->0,1,0

yellow:-->0,0,1

拆分成三列,“是否是red”、"是否是blue"、“是否是yellow”。

操作:pd.get_dummies()

哑变量和one hot其实是一件事,就像奇异果和猕猴桃。

相当于multi-hot,有多个1。

比如,我可以建一个词库,一句话里如果含有单词apple,那就在apple这列打1,含有多少单词就打多少个1。但是这种方法比较稀疏,词库太大了。

改进方法:比如我对于每一个领域都有一个词表,比如财经类词表,体育类词表。。。然后有一篇文章,我要对他进行分类,就可以看这篇文章里有多少个词是财经词表里的,有多少词是体育词表里面的。

比如:

性别:[男,女]

爱好:[足球,散步,电视剧]

要用爱好来表达性别

男生中这三个爱好的人数比例是:[2/3, 1/3, 0]

女生中这三个爱好的人数比例是:[0, 1/3, 2/3]

把这三列 [“喜欢足球的概率”,“喜欢散步的概率”,“喜欢电视剧的概率”] 加在对应的性别后面,可以作为新的特征。

4.如果类别特征空间太大,超过了几十个一般就不适用one hot了。比如是中介的ID,可以考虑用Label encoding(直接用1,2,3代替,会产生次序关系,但总好过直接丢弃特征)、Count encoding(出现了多少次就写多少)、Target encoding(根据标签,反过来对特征编码,使用方法就是上面的histogram,但是会造成标签泄露,产生过拟合。可以用交叉验证的思想,分成5折,用4份的数据做编码,然后用剩下的一份做训练。)

既可以作为连续值,也可以作为离散值。

连续值:持续时间(浏览时长)、间隔时间(上次购买距离现在的时间)

离散值:哪个时间段、周几 等,离散后,就是类别型的数据。但不是说一定要做one-hot编码,比如时间段,可以离散化为“上班高峰期”和“非高峰期”。而周几,可以用one-hot,也可以离散为“工作日”和“周末”。

1、词袋模型:就是指上面的hash技巧,文本数据去掉停用词,剩下的词组成list,在词库中的映射稀疏向量。

2、词袋模型的问题: 李雷喜欢韩梅梅  VS 韩梅梅喜欢李雷,丢失了顺序信息。

解决方案:把词袋中的词扩充到n-gram,就是分词的时候,除了“李雷”、“喜欢”、“韩梅梅”,还要加上“李雷喜欢”、“喜欢韩梅梅”。这叫2-gram。在python里的库叫CountVectorizer。

3、新的问题:只统计了频次,但是,出现频次高的一定是重要的吗?

解决方案:使用TF-IDF特征。如果t虽然在文档中出现次数多,但是在其他文档中出现的次数也很多,那么这个词就不重要。

TF(t)=

IDF(t)=

TF-IDF权重=TF(t)*IDF(t)

4、稀疏-->稠密,工具是word2vec,在机器学习中不太好用,在深度学习中用得多。原理比较复杂,先不讲。

比如:

1)购物车购买转化率(用户维度统计特征)

2)商品热度(商品维度统计特征)

3)对不同item点击/收藏/购物车/购买的总计(商品维度统计特征)

4)对不同item点击/收藏/购物车/购买平均每个user的计数(用户维度统计特征)

5)变热门的品牌/商品(商品维度,差值型)

6)最近1/2/3/7天的行为数与平均行为数的比值(用户维度,比例型)

7)商品在类别中的排序(商品维度,次序型)

8)商品交互的总人数(商品维度,求和型)

等等。。。

统计值也可以用来发现一些规律,比如前一天加购物车的商品很有可能第二天购买;加车N件,只买了一件,剩余的不会买。。。

如:张三&&电子产品,李四&&服装,

增加一列,只有同时出现指定的用户和品类的时候,才取1。

第一种组合完全是拍脑袋,所以可以结合使用 决策树模型 (GBDT),用GBDT学习出来的路径,组合成新的特征。不一定是整条路径,选取其中的一小段也可以是一个新的特征。例如下图,“年龄 25 &&是教师” 就是一个新的特征。

1)冗余,部分特征相关度高,消耗计算性能。

2)噪声,有些特征对结果有负影响。

前者只踢掉原本特征里,和结果预测关系不大的列。后者是要在低维空间中,尽量保存住高维的信息。

1)评估 单个 特征和结果值之间的相关程度,排序,留下Top相关的特征部分。

2)Pearson相关系数,

3)缺点:没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉。

python包:SelectKBest(选最重要的K个)、SelectPercentile(选最重要的百分之多少)

看做一个子集搜索问题,筛选各种特征子集,用模型评估效果。

典型的包裹型算法为:递归特征删除算法(recursive feature elimination algorithm)。

做法:

1)先用全量特征跑逻辑回归模型

2)然后系数排序(体现相关性),砍掉5-10%的弱特征,观察准确率/auc的变化。

3)逐步进行,直至准确率/auc出现大的下滑为止。

python包:RFE

L1正则化 + 逻辑回归LR/ linear SVM

L1正则化的效果,是让一些不重要的特征的权重系数变成0。

通常用在 稀疏的高维 数据。

朋友圈很多人都想学python,有一个很重要的原因是它非常适合入门。对于 人工智能算法 的开发,python有其他编程语言所没有的独特优势, 代码量少 ,开发者只需把精力集中在算法研究上面。

本文介绍一个用python开发的,自动与美女尬聊的小软件。以下都是满满的干货,是我工作之余时写的,经过不断优化,现在分享给大家。那现在就让我们抓紧时间开始吧!

准备:

编程工具IDE:pycharm

python版本: 3.6.0

首先新建一个py文件,命名为:ai_chat.py

PS: 以下五步的代码直接复制到单个py文件里面就可以直接运行。为了让读者方便写代码,我把代码都贴出来了,但是排版存在问题,我又把在pycharm的代码排版给截图出来。

第一步: 引入关键包

简单介绍一下上面几个包的作用: pickle 包 是用来对数据序列化存文件、反序列化读取文件,是人类不可读的,但是计算机去读取时速度超快。(就是用记事本打开是乱码)。 而 json包 是一种文本序列化,是人类可读的,方便你对其进行修改(记事本打开,可以看到里面所有内容,而且都认识。) gensim 包 是自然语言处理的其中一个python包,简单容易使用,是入门NLP算法必用的一个python包。 jieba包 是用来分词,对于算法大咖来说效果一般般,但是它的速度非常快,适合入门使用。

以上这些包,不是关键,学习的时候,可以先跳过。等理解整个程序流程后,可以一个一个包有针对性地去看文档。

第二步:静态配置

这里path指的是对话语料(训练数据)存放的位置,model_path是模型存储的路径。

这里是个人编程的习惯,我习惯把一些配置,例如:文件路径、模型存放路径、模型参数统一放在一个类中。当然,实际项目开发的时候,是用config 文件存放,不会直接写在代码里,这里为了演示方便,就写在一起,也方便运行。

第三步: 编写一个类,实现导数据、模型训练、对话预测一体化

首次运行的时候,会从静态配置中读取训练数据的路径,读取数据,进行训练,并把训练好的模型存储到指定的模型路径。后续运行,是直接导入模型,就不用再次训练了。

对于model类,我们一个一个来介绍。

initialize() 函数和 __init__() 函数 是对象初始化和实例化,其中包括基本参数的赋值、模型的导入、模型的训练、模型的保存、最后返回用户一个对象。

__train_model() 函数,对问题进行分词,使用 gesim 实现词袋模型,统计每个特征的 tf-idf , 建立稀疏矩阵,进而建立索引。

__save_model() 函数 和 __load_model() 函数 是成对出现的,很多项目都会有这两个函数,用于保存模型和导入模型。不同的是,本项目用的是文件存储的方式,实际上线用的是数据库

get_answer() 函数使用训练好的模型,对问题进行分析,最终把预测的回答内容反馈给用户。

第四步:写三个工具类型的函数,作为读写文件。

其中,获取对话材料,可以自主修改对话内容,作为机器的训练的数据。我这里只是给了几个简单的对话语料,实际上线的项目,需要大量的语料来训练,这样对话内容才饱满。

这三个工具函数,相对比较简单一些。其中 get_data() 函数,里面的数据是我自己编的,大家可以根据自己的习惯,添加自己的对话数据,这样最终训练的模型,对话方式会更贴近自己的说话方式。

第五步: 调用模型,进行对话预测

主函数main(), 就是你整个程序运行的起点,它控制着所有步骤。

运行结果:

程序后台运行结果:

如果有疑问想获取源码( 其实代码都在上面 ),可以后台私信我,回复:python智能对话。 我把源码发你。最后,感谢大家的阅读,祝大家工作生活愉快!