开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2019.10.14
1)常见简易画图
2)检查缺失情况
#移除缺失值climate.dropna(axis=0,inplace=True)#检查缺失个数climate.isnull().sum()3)变量类别转换
需要还原一下:
Demo:
经过上面的处理,模型的精度可以达到0.73177,但我们可以继续优化吗?那是肯定的。
我们可以先看看所有特征的分布(特征少的时候可以这么看):
1)Z分数标准化
最为常用的标准化技术,利用了统计学中的z分数思想,也就是将数据转换为均值为0,标准差为1的分布,其在python中的调用方法:
2)min-max标准化
min-max标准化和z-score类似,其公式为:(X-Xmin)/(Xmax-Xmin)
在python中的调用方法:
#min-max标准化fromsklearn.preprocessingimportMinMaxScaler#实例化方法min_max=MinMaxScaler()#使用min-max标准化pima_min_maxed=pd.DataFrame(min_max.fit_transform(pima.fillna(-9)),columns=pima_columns)3)行归一化
行归一化针对的是每一行数据,不同于上面的两种方法(针对列),对行进行处理是为了保证每行的向量长度一样(也就是单位范围,unitnorm),有L1、L2范数。
如果我们对变量进行处理之后,效果仍不是非常理想,就需要进行特征构建了,也就是衍生新变量。
而在这之前,我们需要了解我们的数据集,先前两节中我们了解到了可以通过data.info和data.describe()来查看,同时结合数据等级(定类、定序、定距、定比)来理解变量。
本小节中我们使用一个自定义数据集。
首先我们需要对分类变量进行填充操作,类别变量一般用众数或者特殊值来填充,回顾之前的内容,我们也还是采取Pipeline的方式来进行,因此可以事先基于TransformMixin基类来对填充的方法进行封装,然后直接在Pipeline中进行调用,代码可以参考:
又或者利用scikit-learn的Imputer类来实现填充,而这个类有一个Strategy的方法自然就被继承过来用了,包含的有mean、median、most_frequent可供选择。
对上面的两种填充进行流水线封装:
完成了分类变量的填充工作,接下来就需要对分类变量进行编码了(因为大多数的机器学习算法都是无法直接对类别变量进行计算的),一般有两种办法:独热编码以及标签编码。
1)独热编码
独热编码主要是针对定类变量的,也就是不同变量值之间是没有顺序大小关系的,我们一般可以使用scikit_learn里面的OneHotEncoding来实现的,但我们这里还是使用自定义的方法来加深理解。
2)标签编码
标签编码是针对定序变量的,也就是有顺序大小的类别变量,就好像案例中的变量ordinal_column的值(dislike、somewhatlike和like可以分别用0、1、2来表示),同样的可以写个自定义的标签编码器:
3)数值变量分箱操作
以上的内容是对类别变量的一些简单处理操作,也是比较常用的几种,接下来我们就对数值变量进行一些简单处理方法的讲解。
有的时候,虽然变量值是连续的,但是只有转换成类别才有解释的可能,比如年龄,我们需要分成年龄段,这里我们可以使用pandas的cut函数来实现。
综上,我们可以对上面自定义的方法一并在Pipeline中进行调用,Pipeline的顺序为:
1)用imputer填充缺失值
2)独热编码city和boolean
3)标签编码ordinal_column
4)分箱处理quantitative_column
代码为:
这一小节我们使用一个新的数据集(人体胸部加速度数据集),我们先导入数据:
这边只介绍一种多项式生成新特征的办法,调用PolynomialFeatures来实现。
在流水线中的实现代码:
1)bagofwords
词袋法分成3个步骤,分别是分词(tokenizing)、计数(counting)、归一化(normalizing)。
2)CountVectorizer
将文本转换为矩阵,每列代表一个词语,每行代表一个文档,所以一般出来的矩阵会是非常稀疏的,在sklearn.feature_extraction.text中调用CountVectorizer即可使用。
3)TF-IDF
TF-IDF向量化器由两个部分组成,分别为代表词频的TF部分,以及代表逆文档频率的IDF,这个TF-IDF是一个用于信息检索和聚类的词加权方法,在sklearn.feature_extraction.text中调用TfidfVectorizer即可。
TF:即TermFrequency,词频,也就是单词在文档中出现的频率。
IDF:即InverseDocumentFrequency,逆文档频率,用于衡量单词的重要度,如果单词在多份文档中出现,就会被降低权重。
好了,经过了上面的特征衍生操作,我们现在拥有了好多好多的特征(变量)了,全部丢进去模型训练好不好?当然是不行了,这样子既浪费资源又效果不佳,因此我们需要做一下特征筛选,而特征筛选的方法大致可以分为两大类:基于统计的特征筛选和基于模型的特征筛选。
在进行特征选择之前,我们需要搞清楚一个概念:到底什么是更好的?有什么指标可以用来量化呢?
我们可以通过封装一个方法,把上面提及到的指标封装起来,方便后续的调用,代码如下:
通过上面的操作,我们可以创建一个模型性能基准线,用于对比后续优化的效果。接下来介绍一些常用的特征选择方法。
(2)假设检验也就是p值,作为一种统计检验,在特征选择中,假设测试得原则是:”特征与响应变量没有关系“(零假设)为真还是假。我们需要对每个变量进行检测,检测其与target有没有显著关系。可以使用SelectKBest和f_classif来实现。一般P值是介于0-1之间,简而言之,p值越小,拒绝零假设的概率就越大,也就是这个特征与target关系更大。
(1)对于文本特征,sklearn.feature_extraction.text里的CountVectorizer有自带的特征筛选的参数,分别是max_features、min_df、max_df、stop_words,可以通过搜索这些参数来进行特征选择,可以结合SelectKBest来实现流水线。
(2)针对树模型,我们可以直接调用不同树模型算法里的特征重要度来返回特征重要度,比如DecisionTreeClassifier里的feature_importances_,(除此之外还有RandomForest、GBDT、XGBoost、ExtraTreesClassifier等等)都可以直接返回每个特征对于本次拟合的重要度,从而我们可以剔除重要度偏低的特征,可以结合SelectFromModel来实现流水线。
(3)使用正则化来筛选变量(针对线性模型)。有两种常用的正则化方法:L1正则化(Lasso)和L2正则化(岭)。
(1)如果特征是分类变量,那么可以从SelectKBest开始,用卡方或者基于树的选择器来选择变量;
(3)如果是二分类问题,可以考虑使用SelectFromModel和SVC;