以前相关文章目录:html
说到特征工程,就不得不提有这么一句话在业界普遍流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已,从而可见,特征工程的重要程度。python
那么什么是特征工程?首先先看下特征,
特征: 是指数据中抽取出来的对结果预测有用的信息,也就是数据的相关属性。
特征工程:使用专业背景知识和技巧处理数据,使得 特征能在机器学习算法上发挥更好的做用的过程算法
意义:
1.更好的特征意味着更强的灵活度数组
2.更好的特征意味着只需用简单模型,就能够训练出很好的效果app
3.更好的特征意味着能够训练出更好的结果dom
整个流程能够用下面这种图来归纳 机器学习
在肯定好咱们的目标后,咱们首先要作的就是根据业务场景,分析要实现咱们的目标须要哪些数据。也就是基于业务理解,尽量找出对因变量有影响的全部自变量。 好比:我如今要预测用户对商品的下单状况,或者我要给 用户作商品推荐,那我须要采集什么信息呢? 能够分为三个方向去采集,分布式
而后,咱们针对咱们所须要的数据,须要进行可用性评估函数
在肯定好咱们须要的特征以后,接下来就要进行考虑特征的获取和存储,主要分为离线特征获取和在线特征获取工具
1 离线特征获取方案
离线可使用海量的数据,借助于分布式文件存储平台,例如HDFS等,使用例如MapReduce,Spark等处理工具来处理海量的数据等。
2 在线特征获取方案
在线特征比较注重获取数据的延时,因为是在线服务,须要在很是短的时间内获取到相应的数据,对查找性能要求很是高,能够将数据存储在索引、kv存储等。而查找性能与数据的数据量会有矛盾,须要折衷处理,咱们使用了特征分层获取方案,以下图所示。
接下来就是特征工程中最重要的,也是咱们主要在作的,特征处理了
在特征处理中,首先须要进行的是特征清洗,主要作两件事情
如何检测异常数据呢?主要有下面几种
1.基于统计的异常点检测算法
(1).简单统计分析:
好比对属性值进行一个描述性的统计,从而查看哪些值是不合理的,好比针对年龄来讲,咱们规定范围维 [0,100],则不在这个范围的样本,则就认为是异常样本
(2).3δ原则(δ为方差):
当数据服从正态分布:根据正态分布的定义可知,距离平均值3δ以外的几率为 P(|x-μ|>3δ) <= 0.003 ,这属于极小几率事件,在默认状况下咱们能够认定,距离超过平均值3δ的样本是不存在的。 所以,当样本距离平均值大于3δ,则认定该样本为异常值
(3).经过极差和四分位数间距,进行异常数据的检测
2.基于距离的异常点检测算法(其实和K近邻算法的思想同样)
主要经过距离方法来检测异常点,将一个数据点与大多数点之间距离大于某个阈值的点视为异常点,主要使用的距离度量方法有绝对距离(曼哈顿距离)、欧氏距离和马氏距离等方法
3.基于密度的异常点检测算法
考察当前点周围密度,能够发现局部异常点
对于一个特征来讲
数据采样主要是为了处理样本不均衡问题的。好比有些状况下,获取来的数据,正负样本个数差距很大,而大多数模型对正负样本比是敏感的(好比逻辑回归),因此,须要经过数据采样,来使数据正负样本均衡
在处理样本不均衡问题时,主要分为两种状况
正负样本个数差距很大,而且同时正负样本个数自己也很大,这个时候能够采起下采样方法。
下采样:对训练集里面样本数量较多的类别(多数类)进行欠采样,抛弃一些样原本缓解类不平衡。
正负样本个数差距很大,而且同时正负样本个数自己比较小,这个时候能够采起上采样方法。
上采样:对训练集里面样本数量较少的类别(少数类)进行过采样,合成新的样原本缓解类不平衡。 这个时候会用到一个很是经典的过采样算法SMOTE(关于过采样SMOTE算法,在以前的一篇文章中(机器学习项目实战 交易数据异常检测),里面有进行说明和应用,在这块再也不重复)
对于不一样类型的特征,处理方式不一样,下面分别来概述
数值型特征,通常须要作如下几个方面处理
须要查看对应特征的最大值,最小值,平均值,方差等,从而对数据进行更好的分析,
下面以sklearn中的自带的鸢尾花数据集为例,经过代码来演示
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris() #获取数据集
# iris.data[:5] # 展现数据集的前5个数据
series = pd.Series(iris.data[:,0])
series.describe() #经过describe方法,能够直接得到当前特征下数据的总数,均值,方差,各个分位数,以及最大最小值等
复制代码
count 150.000000
mean 5.843333
std 0.828066
min 4.300000
25% 5.100000
50% 5.800000
75% 6.400000
max 7.900000
dtype: float64
复制代码
(1).标准化:标准化须要计算对应特征下数据的均值和方差,而后看当前特征下每一个值距离均值多少个方差,具体公式以下:
(2).区间缩放法:区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,具体公式以下:
(3)标准化和归一化的区别:能够这样来区分,对于一个m个样本,n个特征的m*n的特征矩阵,一行表示的是一个样本数据,包含n个特征,一列表示一个特征下的m个样本数据。上面所说的标准化是针对的特征矩阵的列处理数据,将样本的特征值转换到同一量纲下,而归一化则是依据特征矩阵的行进行处理数据,若是将一行数据看作一个向量的化,至关于向量的单位化
上面两个方法(标准化和区间缩放分),sklearn中已经帮咱们封装好了,具体代码以下
from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(iris.data) #标准化
from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(iris.data)
复制代码
array([[0.22222222, 0.625 , 0.06779661, 0.04166667],
[0.16666667, 0.41666667, 0.06779661, 0.04166667],
[0.11111111, 0.5 , 0.05084746, 0.04166667],
[0.08333333, 0.45833333, 0.08474576, 0.04166667],
[0.19444444, 0.66666667, 0.06779661, 0.04166667],
[0.30555556, 0.79166667, 0.11864407, 0.125 ],
[0.08333333, 0.58333333, 0.06779661, 0.08333333],
[0.19444444, 0.58333333, 0.08474576, 0.04166667],
[0.02777778, 0.375 , 0.06779661, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.30555556, 0.70833333, 0.08474576, 0.04166667],
[0.13888889, 0.58333333, 0.10169492, 0.04166667],
[0.13888889, 0.41666667, 0.06779661, 0. ],
[0. , 0.41666667, 0.01694915, 0. ],
[0.41666667, 0.83333333, 0.03389831, 0.04166667],
[0.38888889, 1. , 0.08474576, 0.125 ],
[0.30555556, 0.79166667, 0.05084746, 0.125 ],
[0.22222222, 0.625 , 0.06779661, 0.08333333],
[0.38888889, 0.75 , 0.11864407, 0.08333333],
[0.22222222, 0.75 , 0.08474576, 0.08333333],
[0.30555556, 0.58333333, 0.11864407, 0.04166667],
[0.22222222, 0.70833333, 0.08474576, 0.125 ],
[0.08333333, 0.66666667, 0. , 0.04166667],
[0.22222222, 0.54166667, 0.11864407, 0.16666667],
[0.13888889, 0.58333333, 0.15254237, 0.04166667],
[0.19444444, 0.41666667, 0.10169492, 0.04166667],
[0.19444444, 0.58333333, 0.10169492, 0.125 ],
[0.25 , 0.625 , 0.08474576, 0.04166667],
[0.25 , 0.58333333, 0.06779661, 0.04166667],
[0.11111111, 0.5 , 0.10169492, 0.04166667],
[0.13888889, 0.45833333, 0.10169492, 0.04166667],
[0.30555556, 0.58333333, 0.08474576, 0.125 ],
[0.25 , 0.875 , 0.08474576, 0. ],
[0.33333333, 0.91666667, 0.06779661, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.19444444, 0.5 , 0.03389831, 0.04166667],
[0.33333333, 0.625 , 0.05084746, 0.04166667],
[0.16666667, 0.45833333, 0.08474576, 0. ],
[0.02777778, 0.41666667, 0.05084746, 0.04166667],
[0.22222222, 0.58333333, 0.08474576, 0.04166667],
[0.19444444, 0.625 , 0.05084746, 0.08333333],
[0.05555556, 0.125 , 0.05084746, 0.08333333],
[0.02777778, 0.5 , 0.05084746, 0.04166667],
[0.19444444, 0.625 , 0.10169492, 0.20833333],
[0.22222222, 0.75 , 0.15254237, 0.125 ],
[0.13888889, 0.41666667, 0.06779661, 0.08333333],
[0.22222222, 0.75 , 0.10169492, 0.04166667],
[0.08333333, 0.5 , 0.06779661, 0.04166667],
[0.27777778, 0.70833333, 0.08474576, 0.04166667],
[0.19444444, 0.54166667, 0.06779661, 0.04166667],
[0.75 , 0.5 , 0.62711864, 0.54166667],
[0.58333333, 0.5 , 0.59322034, 0.58333333],
[0.72222222, 0.45833333, 0.66101695, 0.58333333],
[0.33333333, 0.125 , 0.50847458, 0.5 ],
[0.61111111, 0.33333333, 0.61016949, 0.58333333],
[0.38888889, 0.33333333, 0.59322034, 0.5 ],
[0.55555556, 0.54166667, 0.62711864, 0.625 ],
[0.16666667, 0.16666667, 0.38983051, 0.375 ],
[0.63888889, 0.375 , 0.61016949, 0.5 ],
[0.25 , 0.29166667, 0.49152542, 0.54166667],
[0.19444444, 0. , 0.42372881, 0.375 ],
[0.44444444, 0.41666667, 0.54237288, 0.58333333],
[0.47222222, 0.08333333, 0.50847458, 0.375 ],
[0.5 , 0.375 , 0.62711864, 0.54166667],
[0.36111111, 0.375 , 0.44067797, 0.5 ],
[0.66666667, 0.45833333, 0.57627119, 0.54166667],
[0.36111111, 0.41666667, 0.59322034, 0.58333333],
[0.41666667, 0.29166667, 0.52542373, 0.375 ],
[0.52777778, 0.08333333, 0.59322034, 0.58333333],
[0.36111111, 0.20833333, 0.49152542, 0.41666667],
[0.44444444, 0.5 , 0.6440678 , 0.70833333],
[0.5 , 0.33333333, 0.50847458, 0.5 ],
[0.55555556, 0.20833333, 0.66101695, 0.58333333],
[0.5 , 0.33333333, 0.62711864, 0.45833333],
[0.58333333, 0.375 , 0.55932203, 0.5 ],
[0.63888889, 0.41666667, 0.57627119, 0.54166667],
[0.69444444, 0.33333333, 0.6440678 , 0.54166667],
[0.66666667, 0.41666667, 0.6779661 , 0.66666667],
[0.47222222, 0.375 , 0.59322034, 0.58333333],
[0.38888889, 0.25 , 0.42372881, 0.375 ],
[0.33333333, 0.16666667, 0.47457627, 0.41666667],
[0.33333333, 0.16666667, 0.45762712, 0.375 ],
[0.41666667, 0.29166667, 0.49152542, 0.45833333],
[0.47222222, 0.29166667, 0.69491525, 0.625 ],
[0.30555556, 0.41666667, 0.59322034, 0.58333333],
[0.47222222, 0.58333333, 0.59322034, 0.625 ],
[0.66666667, 0.45833333, 0.62711864, 0.58333333],
[0.55555556, 0.125 , 0.57627119, 0.5 ],
[0.36111111, 0.41666667, 0.52542373, 0.5 ],
[0.33333333, 0.20833333, 0.50847458, 0.5 ],
[0.33333333, 0.25 , 0.57627119, 0.45833333],
[0.5 , 0.41666667, 0.61016949, 0.54166667],
[0.41666667, 0.25 , 0.50847458, 0.45833333],
[0.19444444, 0.125 , 0.38983051, 0.375 ],
[0.36111111, 0.29166667, 0.54237288, 0.5 ],
[0.38888889, 0.41666667, 0.54237288, 0.45833333],
[0.38888889, 0.375 , 0.54237288, 0.5 ],
[0.52777778, 0.375 , 0.55932203, 0.5 ],
[0.22222222, 0.20833333, 0.33898305, 0.41666667],
[0.38888889, 0.33333333, 0.52542373, 0.5 ],
[0.55555556, 0.54166667, 0.84745763, 1. ],
[0.41666667, 0.29166667, 0.69491525, 0.75 ],
[0.77777778, 0.41666667, 0.83050847, 0.83333333],
[0.55555556, 0.375 , 0.77966102, 0.70833333],
[0.61111111, 0.41666667, 0.81355932, 0.875 ],
[0.91666667, 0.41666667, 0.94915254, 0.83333333],
[0.16666667, 0.20833333, 0.59322034, 0.66666667],
[0.83333333, 0.375 , 0.89830508, 0.70833333],
[0.66666667, 0.20833333, 0.81355932, 0.70833333],
[0.80555556, 0.66666667, 0.86440678, 1. ],
[0.61111111, 0.5 , 0.69491525, 0.79166667],
[0.58333333, 0.29166667, 0.72881356, 0.75 ],
[0.69444444, 0.41666667, 0.76271186, 0.83333333],
[0.38888889, 0.20833333, 0.6779661 , 0.79166667],
[0.41666667, 0.33333333, 0.69491525, 0.95833333],
[0.58333333, 0.5 , 0.72881356, 0.91666667],
[0.61111111, 0.41666667, 0.76271186, 0.70833333],
[0.94444444, 0.75 , 0.96610169, 0.875 ],
[0.94444444, 0.25 , 1. , 0.91666667],
[0.47222222, 0.08333333, 0.6779661 , 0.58333333],
[0.72222222, 0.5 , 0.79661017, 0.91666667],
[0.36111111, 0.33333333, 0.66101695, 0.79166667],
[0.94444444, 0.33333333, 0.96610169, 0.79166667],
[0.55555556, 0.29166667, 0.66101695, 0.70833333],
[0.66666667, 0.54166667, 0.79661017, 0.83333333],
[0.80555556, 0.5 , 0.84745763, 0.70833333],
[0.52777778, 0.33333333, 0.6440678 , 0.70833333],
[0.5 , 0.41666667, 0.66101695, 0.70833333],
[0.58333333, 0.33333333, 0.77966102, 0.83333333],
[0.80555556, 0.41666667, 0.81355932, 0.625 ],
[0.86111111, 0.33333333, 0.86440678, 0.75 ],
[1. , 0.75 , 0.91525424, 0.79166667],
[0.58333333, 0.33333333, 0.77966102, 0.875 ],
[0.55555556, 0.33333333, 0.69491525, 0.58333333],
[0.5 , 0.25 , 0.77966102, 0.54166667],
[0.94444444, 0.41666667, 0.86440678, 0.91666667],
[0.55555556, 0.58333333, 0.77966102, 0.95833333],
[0.58333333, 0.45833333, 0.76271186, 0.70833333],
[0.47222222, 0.41666667, 0.6440678 , 0.70833333],
[0.72222222, 0.45833333, 0.74576271, 0.83333333],
[0.66666667, 0.45833333, 0.77966102, 0.95833333],
[0.72222222, 0.45833333, 0.69491525, 0.91666667],
[0.41666667, 0.29166667, 0.69491525, 0.75 ],
[0.69444444, 0.5 , 0.83050847, 0.91666667],
[0.66666667, 0.54166667, 0.79661017, 1. ],
[0.66666667, 0.41666667, 0.71186441, 0.91666667],
[0.55555556, 0.20833333, 0.6779661 , 0.75 ],
[0.61111111, 0.41666667, 0.71186441, 0.79166667],
[0.52777778, 0.58333333, 0.74576271, 0.91666667],
[0.44444444, 0.41666667, 0.69491525, 0.70833333]])
复制代码
离散化是数值型特征很是重要的一个处理,其实就是要将数值型数据转化成类别型数据
连续值的取值空间多是无穷的,为了便于表示和在模型中处理,须要对连续值特征进行离散化处理
在工业界,不多直接将连续值做为特征喂给逻辑回归模型,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样作的优点有如下几点:
稀疏向量内积乘法运算速度快,计算结果方便存储,容易scalable(扩展)。
离散化后的特征对异常数据有很强的鲁棒性:好比一个特征是年龄>30是1,不然0。若是特征没有离散化,一个异常数据“年龄300岁”会给模型形成很大的干扰。
逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每一个变量有单独的权重,至关于为模型引入了非线性,可以提高模型表达能力,加大拟合。
离散化后能够进行特征交叉,由M N个变量变为M*N个变量,进一步引入非线性,提高表达能力。
特征离散化后,模型会更稳定,好比若是对用户年龄离散化,20-30做为一个区间,不会由于一个用户年龄长了一岁就变成一个彻底不一样的人。固然处于区间相邻处的样本会恰好相反,因此怎么划分区间是门学问。
经常使用的离散化方法包括等值划分和等量划分。
(1).等值划分是将特征按照值域进行均分,每一段内的取值等同处理。例如某个特征的取值范围为[0,10],咱们能够将其划分为10段,[0,1),[1,2),...,[9,10)。
(2).等量划分是根据样本总数进行均分,每段等量个样本划分为1段。例如距离特征,取值范围[0,3000000],如今须要切分红10段,若是按照等比例划分的话,会发现绝大部分样本都在第1段中。使用等量划分就会避免这种问题,最终可能的切分是[0,100),[100,300),[300,500),..,[10000,3000000],前面的区间划分比较密,后面的比较稀疏
下面看下代码实现
ages = np.array([20, 22,25,27,21,23,37,31,61,45,41,32]) #一些年龄数据
# 经过 pandas中的cut方法能够分割数据
# factory = pd.cut(ages,4) #arr原始数据 , 4:要分割成几段
factory = pd.cut(ages,4,labels=['Youth', 'YoungAdult', 'MiddleAged', 'Senior']) #lable,对于每一个类别能够本身命名
# factory = pd.cut(arr,bins=[18,25,35,60,100],labels=['a','b','c','d']) #bins 本身指定的分割界限
# factory.dtype #CategoricalDtype,能够看到,cut后返回的是一个Categorical 类型的对象
test = np.array(factory) #获取出分类后的数据
test
# factory.codes # array([0, 0, 0, 0, 0, 0, 1, 1, 3, 2, 2, 1], dtype=int8)
复制代码
array(['Youth', 'Youth', 'Youth', 'Youth', 'Youth', 'Youth', 'YoungAdult',
'YoungAdult', 'Senior', 'MiddleAged', 'MiddleAged', 'YoungAdult'],
dtype=object)
复制代码
# 下面看下等量划分
# 经过 pandas中的qcut方法能够分割数据
factory = pd.qcut(ages,4)
# factory
factory.value_counts() #能够看到,经过等量划分,每一个类别中的数据个数都同样
复制代码
(19.999, 22.75] 3
(22.75, 29.0] 3
(29.0, 38.0] 3
(38.0, 61.0] 3
dtype: int64
复制代码
对于类别型数据,最主要的一个处理,就是进行one-hot编码,看具体例子
# 建立一个简单的原始数据
testdata = pd.DataFrame({'age':[4,6,3,3],'pet':['cat','dog','dog','fish']})
testdata
复制代码
age | pet | |
---|---|---|
0 | 4 | cat |
1 | 6 | dog |
2 | 3 | dog |
3 | 3 | fish |
#第一种方法,经过pandas中的提供的get_dummies方法
pd.get_dummies(testdata,columns=['pet']) #第一个参数为原始数据,columns传入须要编码转换的特征,能够为多个,返回新的数据
复制代码
age | pet_cat | pet_dog | pet_fish | |
---|---|---|---|---|
0 | 4 | 1 | 0 | 0 |
1 | 6 | 0 | 1 | 0 |
2 | 3 | 0 | 1 | 0 |
3 | 3 | 0 | 0 | 1 |
testdata.pet.values.reshape(-1,1)
复制代码
array([['cat'],
['dog'],
['dog'],
['fish']], dtype=object)
复制代码
#第二种方法,使用sklearn中的OneHotEncoder方法
from sklearn.preprocessing import OneHotEncoder
OneHotEncoder().fit_transform(testdata.age.values.reshape(-1,1)).toarray()
复制代码
array([[0., 1., 0.],
[0., 0., 1.],
[1., 0., 0.],
[1., 0., 0.]])
复制代码
#OneHotEncoder不能对String型的数值作处理,对String类型作处理的话须要先进行转换
# OneHotEncoder().fit_transform(testdata.pet.values.reshape(-1,1)).toarray() #会报错
from sklearn.preprocessing import LabelEncoder
petvalue = LabelEncoder().fit_transform(testdata.pet)
print(petvalue) # [0 1 1 2] 将字符串类别转换成整型类别
OneHotEncoder().fit_transform(petvalue.reshape(-1,1)).toarray() #能够看到结果和上面经过get_dummies转换出的结果相同
复制代码
[0 1 1 2]
array([[1., 0., 0.],
[0., 1., 0.],
[0., 1., 0.],
[0., 0., 1.]])
复制代码
对于时间型数据来讲,便可以把它转换成连续值,也能够转换成离散值。
好比持续时间(单页浏览时长),间隔时间(上次购买/点击离如今的时间)
好比一天中哪一个时间段(hour_0-23) ,一周中星期几(week_monday...) ,一年中哪一个星期 ,工做日/周末 , 一年中哪一个季度 等
#下面看个例子,这个数据是一个2年内按小时作的自行车租赁数据
import pandas as pd
data = pd.read_csv('kaggle_bike_competition_train.csv', header = 0, error_bad_lines=False)
data.head() #先看下数据的样子,打印前5行
复制代码
datetime | season | holiday | workingday | weather | temp | atemp | humidity | windspeed | casual | registered | count | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2011-01-01 00:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 81 | 0.0 | 3 | 13 | 16 |
1 | 2011-01-01 01:00:00 | 1 | 0 | 0 | 1 | 9.02 | 13.635 | 80 | 0.0 | 8 | 32 | 40 |
2 | 2011-01-01 02:00:00 | 1 | 0 | 0 | 1 | 9.02 | 13.635 | 80 | 0.0 | 5 | 27 | 32 |
3 | 2011-01-01 03:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 75 | 0.0 | 3 | 10 | 13 |
4 | 2011-01-01 04:00:00 | 1 | 0 | 0 | 1 | 9.84 | 14.395 | 75 | 0.0 | 0 | 1 | 1 |
#下面咱们只看datatime这个时间类型属性,
#首先,咱们能够将它切分红
data = data.iloc[:,:1] #只看datatime这个属性
temp = pd.DatetimeIndex(data['datetime'])
data['date'] = temp.date #日期
data['time'] = temp.time #时间
data['year'] = temp.year #年
data['month'] = temp.month #月
data['day'] = temp.day #日
data['hour'] = temp.hour #小时
data['dayofweek'] = temp.dayofweek #具体星期几
data['dateDays'] = (data.date - data.date[0]) #生成一个时间长度特征 ['0days','0days',...,'1days',...]
data['dateDays'] = data['dateDays'].astype('timedelta64[D]') #转换成float型
data
复制代码
datetime | date | time | year | month | day | hour | dayofweek | dateDays | |
---|---|---|---|---|---|---|---|---|---|
0 | 2011-01-01 00:00:00 | 2011-01-01 | 00:00:00 | 2011 | 1 | 1 | 0 | 5 | 0.0 |
1 | 2011-01-01 01:00:00 | 2011-01-01 | 01:00:00 | 2011 | 1 | 1 | 1 | 5 | 0.0 |
2 | 2011-01-01 02:00:00 | 2011-01-01 | 02:00:00 | 2011 | 1 | 1 | 2 | 5 | 0.0 |
3 | 2011-01-01 03:00:00 | 2011-01-01 | 03:00:00 | 2011 | 1 | 1 | 3 | 5 | 0.0 |
4 | 2011-01-01 04:00:00 | 2011-01-01 | 04:00:00 | 2011 | 1 | 1 | 4 | 5 | 0.0 |
5 | 2011-01-01 05:00:00 | 2011-01-01 | 05:00:00 | 2011 | 1 | 1 | 5 | 5 | 0.0 |
6 | 2011-01-01 06:00:00 | 2011-01-01 | 06:00:00 | 2011 | 1 | 1 | 6 | 5 | 0.0 |
7 | 2011-01-01 07:00:00 | 2011-01-01 | 07:00:00 | 2011 | 1 | 1 | 7 | 5 | 0.0 |
8 | 2011-01-01 08:00:00 | 2011-01-01 | 08:00:00 | 2011 | 1 | 1 | 8 | 5 | 0.0 |
9 | 2011-01-01 09:00:00 | 2011-01-01 | 09:00:00 | 2011 | 1 | 1 | 9 | 5 | 0.0 |
10 | 2011-01-01 10:00:00 | 2011-01-01 | 10:00:00 | 2011 | 1 | 1 | 10 | 5 | 0.0 |
11 | 2011-01-01 11:00:00 | 2011-01-01 | 11:00:00 | 2011 | 1 | 1 | 11 | 5 | 0.0 |
12 | 2011-01-01 12:00:00 | 2011-01-01 | 12:00:00 | 2011 | 1 | 1 | 12 | 5 | 0.0 |
13 | 2011-01-01 13:00:00 | 2011-01-01 | 13:00:00 | 2011 | 1 | 1 | 13 | 5 | 0.0 |
14 | 2011-01-01 14:00:00 | 2011-01-01 | 14:00:00 | 2011 | 1 | 1 | 14 | 5 | 0.0 |
15 | 2011-01-01 15:00:00 | 2011-01-01 | 15:00:00 | 2011 | 1 | 1 | 15 | 5 | 0.0 |
16 | 2011-01-01 16:00:00 | 2011-01-01 | 16:00:00 | 2011 | 1 | 1 | 16 | 5 | 0.0 |
17 | 2011-01-01 17:00:00 | 2011-01-01 | 17:00:00 | 2011 | 1 | 1 | 17 | 5 | 0.0 |
18 | 2011-01-01 18:00:00 | 2011-01-01 | 18:00:00 | 2011 | 1 | 1 | 18 | 5 | 0.0 |
19 | 2011-01-01 19:00:00 | 2011-01-01 | 19:00:00 | 2011 | 1 | 1 | 19 | 5 | 0.0 |
20 | 2011-01-01 20:00:00 | 2011-01-01 | 20:00:00 | 2011 | 1 | 1 | 20 | 5 | 0.0 |
21 | 2011-01-01 21:00:00 | 2011-01-01 | 21:00:00 | 2011 | 1 | 1 | 21 | 5 | 0.0 |
22 | 2011-01-01 22:00:00 | 2011-01-01 | 22:00:00 | 2011 | 1 | 1 | 22 | 5 | 0.0 |
23 | 2011-01-01 23:00:00 | 2011-01-01 | 23:00:00 | 2011 | 1 | 1 | 23 | 5 | 0.0 |
24 | 2011-01-02 00:00:00 | 2011-01-02 | 00:00:00 | 2011 | 1 | 2 | 0 | 6 | 1.0 |
25 | 2011-01-02 01:00:00 | 2011-01-02 | 01:00:00 | 2011 | 1 | 2 | 1 | 6 | 1.0 |
26 | 2011-01-02 02:00:00 | 2011-01-02 | 02:00:00 | 2011 | 1 | 2 | 2 | 6 | 1.0 |
27 | 2011-01-02 03:00:00 | 2011-01-02 | 03:00:00 | 2011 | 1 | 2 | 3 | 6 | 1.0 |
28 | 2011-01-02 04:00:00 | 2011-01-02 | 04:00:00 | 2011 | 1 | 2 | 4 | 6 | 1.0 |
29 | 2011-01-02 06:00:00 | 2011-01-02 | 06:00:00 | 2011 | 1 | 2 | 6 | 6 | 1.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
10856 | 2012-12-18 18:00:00 | 2012-12-18 | 18:00:00 | 2012 | 12 | 18 | 18 | 1 | 717.0 |
10857 | 2012-12-18 19:00:00 | 2012-12-18 | 19:00:00 | 2012 | 12 | 18 | 19 | 1 | 717.0 |
10858 | 2012-12-18 20:00:00 | 2012-12-18 | 20:00:00 | 2012 | 12 | 18 | 20 | 1 | 717.0 |
10859 | 2012-12-18 21:00:00 | 2012-12-18 | 21:00:00 | 2012 | 12 | 18 | 21 | 1 | 717.0 |
10860 | 2012-12-18 22:00:00 | 2012-12-18 | 22:00:00 | 2012 | 12 | 18 | 22 | 1 | 717.0 |
10861 | 2012-12-18 23:00:00 | 2012-12-18 | 23:00:00 | 2012 | 12 | 18 | 23 | 1 | 717.0 |
10862 | 2012-12-19 00:00:00 | 2012-12-19 | 00:00:00 | 2012 | 12 | 19 | 0 | 2 | 718.0 |
10863 | 2012-12-19 01:00:00 | 2012-12-19 | 01:00:00 | 2012 | 12 | 19 | 1 | 2 | 718.0 |
10864 | 2012-12-19 02:00:00 | 2012-12-19 | 02:00:00 | 2012 | 12 | 19 | 2 | 2 | 718.0 |
10865 | 2012-12-19 03:00:00 | 2012-12-19 | 03:00:00 | 2012 | 12 | 19 | 3 | 2 | 718.0 |
10866 | 2012-12-19 04:00:00 | 2012-12-19 | 04:00:00 | 2012 | 12 | 19 | 4 | 2 | 718.0 |
10867 | 2012-12-19 05:00:00 | 2012-12-19 | 05:00:00 | 2012 | 12 | 19 | 5 | 2 | 718.0 |
10868 | 2012-12-19 06:00:00 | 2012-12-19 | 06:00:00 | 2012 | 12 | 19 | 6 | 2 | 718.0 |
10869 | 2012-12-19 07:00:00 | 2012-12-19 | 07:00:00 | 2012 | 12 | 19 | 7 | 2 | 718.0 |
10870 | 2012-12-19 08:00:00 | 2012-12-19 | 08:00:00 | 2012 | 12 | 19 | 8 | 2 | 718.0 |
10871 | 2012-12-19 09:00:00 | 2012-12-19 | 09:00:00 | 2012 | 12 | 19 | 9 | 2 | 718.0 |
10872 | 2012-12-19 10:00:00 | 2012-12-19 | 10:00:00 | 2012 | 12 | 19 | 10 | 2 | 718.0 |
10873 | 2012-12-19 11:00:00 | 2012-12-19 | 11:00:00 | 2012 | 12 | 19 | 11 | 2 | 718.0 |
10874 | 2012-12-19 12:00:00 | 2012-12-19 | 12:00:00 | 2012 | 12 | 19 | 12 | 2 | 718.0 |
10875 | 2012-12-19 13:00:00 | 2012-12-19 | 13:00:00 | 2012 | 12 | 19 | 13 | 2 | 718.0 |
10876 | 2012-12-19 14:00:00 | 2012-12-19 | 14:00:00 | 2012 | 12 | 19 | 14 | 2 | 718.0 |
10877 | 2012-12-19 15:00:00 | 2012-12-19 | 15:00:00 | 2012 | 12 | 19 | 15 | 2 | 718.0 |
10878 | 2012-12-19 16:00:00 | 2012-12-19 | 16:00:00 | 2012 | 12 | 19 | 16 | 2 | 718.0 |
10879 | 2012-12-19 17:00:00 | 2012-12-19 | 17:00:00 | 2012 | 12 | 19 | 17 | 2 | 718.0 |
10880 | 2012-12-19 18:00:00 | 2012-12-19 | 18:00:00 | 2012 | 12 | 19 | 18 | 2 | 718.0 |
10881 | 2012-12-19 19:00:00 | 2012-12-19 | 19:00:00 | 2012 | 12 | 19 | 19 | 2 | 718.0 |
10882 | 2012-12-19 20:00:00 | 2012-12-19 | 20:00:00 | 2012 | 12 | 19 | 20 | 2 | 718.0 |
10883 | 2012-12-19 21:00:00 | 2012-12-19 | 21:00:00 | 2012 | 12 | 19 | 21 | 2 | 718.0 |
10884 | 2012-12-19 22:00:00 | 2012-12-19 | 22:00:00 | 2012 | 12 | 19 | 22 | 2 | 718.0 |
10885 | 2012-12-19 23:00:00 | 2012-12-19 | 23:00:00 | 2012 | 12 | 19 | 23 | 2 | 718.0 |
10886 rows × 9 columns
temp
复制代码
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 01:00:00',
'2011-01-01 02:00:00', '2011-01-01 03:00:00',
'2011-01-01 04:00:00', '2011-01-01 05:00:00',
'2011-01-01 06:00:00', '2011-01-01 07:00:00',
'2011-01-01 08:00:00', '2011-01-01 09:00:00',
...
'2012-12-19 14:00:00', '2012-12-19 15:00:00',
'2012-12-19 16:00:00', '2012-12-19 17:00:00',
'2012-12-19 18:00:00', '2012-12-19 19:00:00',
'2012-12-19 20:00:00', '2012-12-19 21:00:00',
'2012-12-19 22:00:00', '2012-12-19 23:00:00'],
dtype='datetime64[ns]', name='datetime', length=10886, freq=None)
复制代码
在实际项目中,并非维数越高越好,为何要进行降维操做,主要是出于一下考虑
正是因为高维特征有如上描述的各类各样的问题,因此咱们须要进行特征降维和特征选择等工做。特征降维经常使用的算法有PCA,LDA等。特征降维的目标是将高维空间中的数据集映射到低维空间数据,同时尽量少地丢失信息,或者降维后的数据点尽量地容易被区分 关于PCA算法,在以前的文章有介绍 PCA算法分析
当数据预处理完成后,咱们须要选择有意义的特征输入机器学习的算法和模型进行训练。
特征选择的目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减小特征个数,提升模型精确度,减小运行时间的目的。另外一方面,选取出真正相关的特征简化模型,协助理解数据产生的过程。
根据特征选项的形式,能够将特征选择方法分为三种
使用方差选择法,先要计算各个特征的方差,而后根据阈值,选择方差大于阈值的特征。
from sklearn.feature_selection import VarianceThreshold
# iris.data[:,0].var() #0.6811222222222223
# iris.data[:,1].var() #0.18675066666666668
# iris.data[:,2].var() #3.092424888888889
# iris.data[:,3].var() #0.5785315555555555
#threshold:比较的方差的阈值,返回方差大于阈值的特征对应的数据。针对上面的鸢尾花数据集,只会返回第三列数据
# VarianceThreshold(threshold=3).fit_transform(iris.data)
复制代码
使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。
用feature_selection库的SelectKBest类结合相关系数来选择特征的代码以下
#首先看下皮尔森相关系数的计算
from scipy.stats import pearsonr #用来计算相关系数
np.random.seed(0) #设置相同的seed,每次生成的随机数相同
size = 300
test = np.random.normal(0,1,size)
# print("加入低噪声后:",pearsonr(test,test+np.random.normal(0,1,size))) #返回的第一个值为相关系数,第二个值为P值
# print("加入高噪声后:",pearsonr(test,test+np.random.normal(0,10,size)))
#相关系统越高,p值越小
from sklearn.feature_selection import SelectKBest
#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: list(np.array(list(map(lambda x:pearsonr(x, Y), X.T))).T), k=2).fit_transform(iris.data, iris.target)
复制代码
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
复制代码
经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与指望的差距,构建统计量:
用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码以下:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
复制代码
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
复制代码
把特征选择看作一个特征子集搜索问题,筛选各类特 征子集,用模型评估效果。
典型的包裹型算法为 “递归特征删除算 法”
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
好比用逻辑回归,怎么作这个事情呢?
① 用全量特征跑一个模型
② 根据线性模型的系数(体现相关性),删掉5-10%的弱特征,观 察准确率/auc的变化
③ 逐步进行,直至准确率/auc出现大的下滑中止
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
复制代码
array([[3.5, 0.2],
[3. , 0.2],
[3.2, 0.2],
[3.1, 0.2],
[3.6, 0.2],
[3.9, 0.4],
[3.4, 0.3],
[3.4, 0.2],
[2.9, 0.2],
[3.1, 0.1],
[3.7, 0.2],
[3.4, 0.2],
[3. , 0.1],
[3. , 0.1],
[4. , 0.2],
[4.4, 0.4],
[3.9, 0.4],
[3.5, 0.3],
[3.8, 0.3],
[3.8, 0.3],
[3.4, 0.2],
[3.7, 0.4],
[3.6, 0.2],
[3.3, 0.5],
[3.4, 0.2],
[3. , 0.2],
[3.4, 0.4],
[3.5, 0.2],
[3.4, 0.2],
[3.2, 0.2],
[3.1, 0.2],
[3.4, 0.4],
[4.1, 0.1],
[4.2, 0.2],
[3.1, 0.1],
[3.2, 0.2],
[3.5, 0.2],
[3.1, 0.1],
[3. , 0.2],
[3.4, 0.2],
[3.5, 0.3],
[2.3, 0.3],
[3.2, 0.2],
[3.5, 0.6],
[3.8, 0.4],
[3. , 0.3],
[3.8, 0.2],
[3.2, 0.2],
[3.7, 0.2],
[3.3, 0.2],
[3.2, 1.4],
[3.2, 1.5],
[3.1, 1.5],
[2.3, 1.3],
[2.8, 1.5],
[2.8, 1.3],
[3.3, 1.6],
[2.4, 1. ],
[2.9, 1.3],
[2.7, 1.4],
[2. , 1. ],
[3. , 1.5],
[2.2, 1. ],
[2.9, 1.4],
[2.9, 1.3],
[3.1, 1.4],
[3. , 1.5],
[2.7, 1. ],
[2.2, 1.5],
[2.5, 1.1],
[3.2, 1.8],
[2.8, 1.3],
[2.5, 1.5],
[2.8, 1.2],
[2.9, 1.3],
[3. , 1.4],
[2.8, 1.4],
[3. , 1.7],
[2.9, 1.5],
[2.6, 1. ],
[2.4, 1.1],
[2.4, 1. ],
[2.7, 1.2],
[2.7, 1.6],
[3. , 1.5],
[3.4, 1.6],
[3.1, 1.5],
[2.3, 1.3],
[3. , 1.3],
[2.5, 1.3],
[2.6, 1.2],
[3. , 1.4],
[2.6, 1.2],
[2.3, 1. ],
[2.7, 1.3],
[3. , 1.2],
[2.9, 1.3],
[2.9, 1.3],
[2.5, 1.1],
[2.8, 1.3],
[3.3, 2.5],
[2.7, 1.9],
[3. , 2.1],
[2.9, 1.8],
[3. , 2.2],
[3. , 2.1],
[2.5, 1.7],
[2.9, 1.8],
[2.5, 1.8],
[3.6, 2.5],
[3.2, 2. ],
[2.7, 1.9],
[3. , 2.1],
[2.5, 2. ],
[2.8, 2.4],
[3.2, 2.3],
[3. , 1.8],
[3.8, 2.2],
[2.6, 2.3],
[2.2, 1.5],
[3.2, 2.3],
[2.8, 2. ],
[2.8, 2. ],
[2.7, 1.8],
[3.3, 2.1],
[3.2, 1.8],
[2.8, 1.8],
[3. , 1.8],
[2.8, 2.1],
[3. , 1.6],
[2.8, 1.9],
[3.8, 2. ],
[2.8, 2.2],
[2.8, 1.5],
[2.6, 1.4],
[3. , 2.3],
[3.4, 2.4],
[3.1, 1.8],
[3. , 1.8],
[3.1, 2.1],
[3.1, 2.4],
[3.1, 2.3],
[2.7, 1.9],
[3.2, 2.3],
[3.3, 2.5],
[3. , 2.3],
[2.5, 1.9],
[3. , 2. ],
[3.4, 2.3],
[3. , 1.8]])
复制代码
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码以下:
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
#带L1惩罚项的逻辑回归做为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
复制代码
array([[5.1, 3.5, 1.4],
[4.9, 3. , 1.4],
[4.7, 3.2, 1.3],
[4.6, 3.1, 1.5],
[5. , 3.6, 1.4],
[5.4, 3.9, 1.7],
[4.6, 3.4, 1.4],
[5. , 3.4, 1.5],
[4.4, 2.9, 1.4],
[4.9, 3.1, 1.5],
[5.4, 3.7, 1.5],
[4.8, 3.4, 1.6],
[4.8, 3. , 1.4],
[4.3, 3. , 1.1],
[5.8, 4. , 1.2],
[5.7, 4.4, 1.5],
[5.4, 3.9, 1.3],
[5.1, 3.5, 1.4],
[5.7, 3.8, 1.7],
[5.1, 3.8, 1.5],
[5.4, 3.4, 1.7],
[5.1, 3.7, 1.5],
[4.6, 3.6, 1. ],
[5.1, 3.3, 1.7],
[4.8, 3.4, 1.9],
[5. , 3. , 1.6],
[5. , 3.4, 1.6],
[5.2, 3.5, 1.5],
[5.2, 3.4, 1.4],
[4.7, 3.2, 1.6],
[4.8, 3.1, 1.6],
[5.4, 3.4, 1.5],
[5.2, 4.1, 1.5],
[5.5, 4.2, 1.4],
[4.9, 3.1, 1.5],
[5. , 3.2, 1.2],
[5.5, 3.5, 1.3],
[4.9, 3.1, 1.5],
[4.4, 3. , 1.3],
[5.1, 3.4, 1.5],
[5. , 3.5, 1.3],
[4.5, 2.3, 1.3],
[4.4, 3.2, 1.3],
[5. , 3.5, 1.6],
[5.1, 3.8, 1.9],
[4.8, 3. , 1.4],
[5.1, 3.8, 1.6],
[4.6, 3.2, 1.4],
[5.3, 3.7, 1.5],
[5. , 3.3, 1.4],
[7. , 3.2, 4.7],
[6.4, 3.2, 4.5],
[6.9, 3.1, 4.9],
[5.5, 2.3, 4. ],
[6.5, 2.8, 4.6],
[5.7, 2.8, 4.5],
[6.3, 3.3, 4.7],
[4.9, 2.4, 3.3],
[6.6, 2.9, 4.6],
[5.2, 2.7, 3.9],
[5. , 2. , 3.5],
[5.9, 3. , 4.2],
[6. , 2.2, 4. ],
[6.1, 2.9, 4.7],
[5.6, 2.9, 3.6],
[6.7, 3.1, 4.4],
[5.6, 3. , 4.5],
[5.8, 2.7, 4.1],
[6.2, 2.2, 4.5],
[5.6, 2.5, 3.9],
[5.9, 3.2, 4.8],
[6.1, 2.8, 4. ],
[6.3, 2.5, 4.9],
[6.1, 2.8, 4.7],
[6.4, 2.9, 4.3],
[6.6, 3. , 4.4],
[6.8, 2.8, 4.8],
[6.7, 3. , 5. ],
[6. , 2.9, 4.5],
[5.7, 2.6, 3.5],
[5.5, 2.4, 3.8],
[5.5, 2.4, 3.7],
[5.8, 2.7, 3.9],
[6. , 2.7, 5.1],
[5.4, 3. , 4.5],
[6. , 3.4, 4.5],
[6.7, 3.1, 4.7],
[6.3, 2.3, 4.4],
[5.6, 3. , 4.1],
[5.5, 2.5, 4. ],
[5.5, 2.6, 4.4],
[6.1, 3. , 4.6],
[5.8, 2.6, 4. ],
[5. , 2.3, 3.3],
[5.6, 2.7, 4.2],
[5.7, 3. , 4.2],
[5.7, 2.9, 4.2],
[6.2, 2.9, 4.3],
[5.1, 2.5, 3. ],
[5.7, 2.8, 4.1],
[6.3, 3.3, 6. ],
[5.8, 2.7, 5.1],
[7.1, 3. , 5.9],
[6.3, 2.9, 5.6],
[6.5, 3. , 5.8],
[7.6, 3. , 6.6],
[4.9, 2.5, 4.5],
[7.3, 2.9, 6.3],
[6.7, 2.5, 5.8],
[7.2, 3.6, 6.1],
[6.5, 3.2, 5.1],
[6.4, 2.7, 5.3],
[6.8, 3. , 5.5],
[5.7, 2.5, 5. ],
[5.8, 2.8, 5.1],
[6.4, 3.2, 5.3],
[6.5, 3. , 5.5],
[7.7, 3.8, 6.7],
[7.7, 2.6, 6.9],
[6. , 2.2, 5. ],
[6.9, 3.2, 5.7],
[5.6, 2.8, 4.9],
[7.7, 2.8, 6.7],
[6.3, 2.7, 4.9],
[6.7, 3.3, 5.7],
[7.2, 3.2, 6. ],
[6.2, 2.8, 4.8],
[6.1, 3. , 4.9],
[6.4, 2.8, 5.6],
[7.2, 3. , 5.8],
[7.4, 2.8, 6.1],
[7.9, 3.8, 6.4],
[6.4, 2.8, 5.6],
[6.3, 2.8, 5.1],
[6.1, 2.6, 5.6],
[7.7, 3. , 6.1],
[6.3, 3.4, 5.6],
[6.4, 3.1, 5.5],
[6. , 3. , 4.8],
[6.9, 3.1, 5.4],
[6.7, 3.1, 5.6],
[6.9, 3.1, 5.1],
[5.8, 2.7, 5.1],
[6.8, 3.2, 5.9],
[6.7, 3.3, 5.7],
[6.7, 3. , 5.2],
[6.3, 2.5, 5. ],
[6.5, 3. , 5.2],
[6.2, 3.4, 5.4],
[5.9, 3. , 5.1]])
复制代码
树模型中GBDT也可用来做为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码以下
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
#GBDT做为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
复制代码
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[1.7, 0.4],
[1.4, 0.3],
[1.5, 0.2],
[1.4, 0.2],
[1.5, 0.1],
[1.5, 0.2],
[1.6, 0.2],
[1.4, 0.1],
[1.1, 0.1],
[1.2, 0.2],
[1.5, 0.4],
[1.3, 0.4],
[1.4, 0.3],
[1.7, 0.3],
[1.5, 0.3],
[1.7, 0.2],
[1.5, 0.4],
[1. , 0.2],
[1.7, 0.5],
[1.9, 0.2],
[1.6, 0.2],
[1.6, 0.4],
[1.5, 0.2],
[1.4, 0.2],
[1.6, 0.2],
[1.6, 0.2],
[1.5, 0.4],
[1.5, 0.1],
[1.4, 0.2],
[1.5, 0.1],
[1.2, 0.2],
[1.3, 0.2],
[1.5, 0.1],
[1.3, 0.2],
[1.5, 0.2],
[1.3, 0.3],
[1.3, 0.3],
[1.3, 0.2],
[1.6, 0.6],
[1.9, 0.4],
[1.4, 0.3],
[1.6, 0.2],
[1.4, 0.2],
[1.5, 0.2],
[1.4, 0.2],
[4.7, 1.4],
[4.5, 1.5],
[4.9, 1.5],
[4. , 1.3],
[4.6, 1.5],
[4.5, 1.3],
[4.7, 1.6],
[3.3, 1. ],
[4.6, 1.3],
[3.9, 1.4],
[3.5, 1. ],
[4.2, 1.5],
[4. , 1. ],
[4.7, 1.4],
[3.6, 1.3],
[4.4, 1.4],
[4.5, 1.5],
[4.1, 1. ],
[4.5, 1.5],
[3.9, 1.1],
[4.8, 1.8],
[4. , 1.3],
[4.9, 1.5],
[4.7, 1.2],
[4.3, 1.3],
[4.4, 1.4],
[4.8, 1.4],
[5. , 1.7],
[4.5, 1.5],
[3.5, 1. ],
[3.8, 1.1],
[3.7, 1. ],
[3.9, 1.2],
[5.1, 1.6],
[4.5, 1.5],
[4.5, 1.6],
[4.7, 1.5],
[4.4, 1.3],
[4.1, 1.3],
[4. , 1.3],
[4.4, 1.2],
[4.6, 1.4],
[4. , 1.2],
[3.3, 1. ],
[4.2, 1.3],
[4.2, 1.2],
[4.2, 1.3],
[4.3, 1.3],
[3. , 1.1],
[4.1, 1.3],
[6. , 2.5],
[5.1, 1.9],
[5.9, 2.1],
[5.6, 1.8],
[5.8, 2.2],
[6.6, 2.1],
[4.5, 1.7],
[6.3, 1.8],
[5.8, 1.8],
[6.1, 2.5],
[5.1, 2. ],
[5.3, 1.9],
[5.5, 2.1],
[5. , 2. ],
[5.1, 2.4],
[5.3, 2.3],
[5.5, 1.8],
[6.7, 2.2],
[6.9, 2.3],
[5. , 1.5],
[5.7, 2.3],
[4.9, 2. ],
[6.7, 2. ],
[4.9, 1.8],
[5.7, 2.1],
[6. , 1.8],
[4.8, 1.8],
[4.9, 1.8],
[5.6, 2.1],
[5.8, 1.6],
[6.1, 1.9],
[6.4, 2. ],
[5.6, 2.2],
[5.1, 1.5],
[5.6, 1.4],
[6.1, 2.3],
[5.6, 2.4],
[5.5, 1.8],
[4.8, 1.8],
[5.4, 2.1],
[5.6, 2.4],
[5.1, 2.3],
[5.1, 1.9],
[5.9, 2.3],
[5.7, 2.5],
[5.2, 2.3],
[5. , 1.9],
[5.2, 2. ],
[5.4, 2.3],
[5.1, 1.8]])
复制代码
上述就是关于特征工程的相关说明,至于特征监控相关的内容,目前还没了解过,等后面学习了再进行补充。
再进行完特征工程后,下一步须要作的就是模型选择与调优,下篇文章将主要学习整理这方面的知识
参考文章:
1.blog.csdn.net/rosenor1/ar…
2.www.cnblogs.com/jasonfreak/…
欢迎关注个人我的公众号 AI计算机视觉工坊,本公众号不按期推送机器学习,深度学习,计算机视觉等相关文章,欢迎你们和我一块儿学习,交流。