sklearn 怎么对特征进行数字签名的特征

1.lasso(下面的case实验成功,在6w+,163维度上未实验成功,可能由于特征的区分度不足引发)
from sklearn.linear_model import RandomizedLasso
from sklearn.datasets import load_boston
boston = load_boston()
X = boston[&data&]
Y = boston[&target&]
names = boston[&feature_names&]
rlasso = RandomizedLasso(alpha=0.025)
rlasso.fit(X, Y)
print &Features sorted by their score:&
print sorted(zip(map(lambda x: round(x, 4), rlasso.scores_),
names), reverse=True)
2.通过模型设置特征
2.1 通过logistic进行筛选:linear_model.LogisticRegression(C=0.4,penalty='l1',solver='liblinear') &C为正则项目,C值约小,特征中为0的项目约多,反之越少
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11074次
排名:千里之外
原创:75篇
(2)(7)(2)(1)(5)(2)(2)(1)(3)(1)(2)(2)(4)(3)(2)(13)(15)(1)(7)(4) 如何使用sklearn进行数据挖掘?
 如何使用sklearn进行数据挖掘?
http://mp./s?__biz=MzA4MTI0Mjc0OA==&mid=&idx=4&sn=b4cb41fe9f94a7952dbb6eecacd08f15&scene=0#wechat_redirect2016文| jasonfreak整理| 数据家cdo.ren目录1 使用sklearn进行数据挖掘  1.1 数据挖掘的步骤  1.2 数据初貌  1.3 关键技术2 并行处理  2.1 整体并行处理  2.2 部分并行处理3 流水线处理4 自动化调参5 持久化6 回顾7 总结8 参考资料1 使用sklearn进行数据挖掘1.1 数据挖掘的步骤  数据挖掘通常包括数据采集,数据分析,特征工程,训练模型,模型评估等步骤。使用sklearn工具可以方便地进行特征工程和模型训练工作,在中,我们最后留下了一些疑问:特征处理类都有三个方法fit、transform和fit_transform,fit方法居然和模型训练方法fit同名(不光同名,参数列表都一样),这难道都是巧合?  显然,这不是巧合,这正是sklearn的设计风格。我们能够更加优雅地使用sklearn进行特征工程和模型训练工作。此时,不妨从一个基本的数据挖掘场景入手:  我们使用sklearn进行虚线框内的工作(sklearn也可以进行文本特征提取)。通过分析sklearn源码,我们可以看到除训练,预测和评估以外,处理其他工作的类都实现了3个方法:fit、transform和fit_transform。从命名中可以看到,fit_transform方法是先调用fit然后调用transform,我们只需要关注fit方法和transform方法即可。  transform方法主要用来对特征进行转换。从可利用信息的角度来说,转换分为无信息转换和有信息转换。无信息转换是指不利用任何其他信息进行转换,比如指数、对数函数转换等。有信息转换从是否利用目标值向量又可分为无监督转换和有监督转换。无监督转换指只利用特征的统计信息的转换,统计信息包括均值、标准差、边界等等,比如标准化、PCA法降维等。有监督转换指既利用了特征信息又利用了目标值信息的转换,比如通过模型选择特征、LDA法降维等。通过总结常用的转换类,我们得到下表:包类参数列表类别fit方法有用说明sklearn.preprocessingStandardScaler特征无监督Y标准化sklearn.preprocessingMinMaxScaler特征无监督Y区间缩放sklearn.preprocessingNormalizer特征无信息N正则化sklearn.preprocessingBinarizer特征无信息N定量特征二值化sklearn.preprocessingOneHotEncoder特征无监督Y定性特征编码sklearn.preprocessingImputer特征无监督Y缺失值计算sklearn.preprocessingPolynomialFeatures特征无信息N多项式变换(fit方法仅仅生成了多项式的表达式)sklearn.preprocessingFunctionTransformer特征无信息N自定义函数变换(自定义函数在transform方法中调用)sklearn.feature_selectionVarianceThreshold特征无监督Y方差选择法sklearn.feature_selectionSelectKBest特征无监督Y自定义特征评分选择法sklearn.feature_selectionchi2特征无监督Y卡方检验选择法sklearn.feature_selectionRFE特征+目标值有监督Y递归特征消除法sklearn.feature_selectionSelectFromModel特征+目标值有监督Y自定义模型训练选择法sklearn.decompositionPCA特征无监督YPCA降维sklearn.ldaLDA特征+目标值有监督YLDA降维  不难看到,只有有信息的转换类的fit方法才实际有用,显然fit方法的主要工作是获取特征信息和目标值信息,在这点上,fit方法和模型训练时的fit方法就能够联系在一起了:都是通过分析特征和目标值,提取有价值的信息,对于转换类来说是某些统计量,对于模型来说可能是特征的权值系数等。另外,只有有监督的转换类的fit和transform方法才需要特征和目标值两个参数。fit方法无用不代表其没实现,而是除合法性校验以外,其并没有对特征和目标值进行任何处理,Normalizer的fit方法实现如下:1&def&fit(self,&X,&y=None):
2&&&&&&&&&"""Do&nothing&and&return&the&estimator&unchanged
3&&&&&&&&&This&method&is&just&there&to&implement&the&usual&API&and&hence
4&&&&&&&&&work&in&pipelines.
5&&&&&&&&&"""
6&&&&&&&&&X&=&check_array(X,&accept_sparse='csr')
7&&&&&&&&&return&self  基于这些特征处理工作都有共同的方法,那么试想可不可以将他们组合在一起?在本文假设的场景中,我们可以看到这些工作的组合形式有两种:流水线式和并行式。基于流水线组合的工作需要依次进行,前一个工作的输出是后一个工作的输入;基于并行式的工作可以同时进行,其使用同样的输入,所有工作完成后将各自的输出合并之后输出。sklearn提供了包pipeline来完成流水线式和并行式的工作。1.2 数据初貌&  在此,我们仍然使用IRIS数据集来进行说明。为了适应提出的场景,对原数据集需要稍微加工:&1&from&numpy&import&hstack,&vstack,&array,&median,&nan&
&2&from&numpy.random&import&choice&
&3&from&sklearn.datasets&import&load_iris&
&5&#特征矩阵加工&
&6&#使用vstack增加一行含缺失值的样本(nan,&nan,&nan,&nan)&
&7&#使用hstack增加一列表示花的颜色(0-白、1-黄、2-红),花的颜色是随机的,意味着颜色并不影响花的分类&
&8&iris.data&=&hstack((choice([0,&1,&2],&size=iris.data.shape[0]+1).reshape(-1,1),&vstack((iris.data,&array([nan,&nan,&nan,&nan]).reshape(1,-1)))))&
&9&#目标值向量加工
&10&#增加一个目标值,对应含缺失值的样本,值为众数
&11&iris.target&=&hstack((iris.target,&array([median(iris.target)])))1.3 关键技术  并行处理,流水线处理,自动化调参,持久化是使用sklearn优雅地进行数据挖掘的核心。并行处理和流水线处理将多个特征处理工作,甚至包括模型训练工作组合成一个工作(从代码的角度来说,即将多个对象组合成了一个对象)。在组合的前提下,自动化调参技术帮我们省去了人工调参的反锁。训练好的模型是贮存在内存中的数据,持久化能够将这些数据保存在文件系统中,之后使用时无需再进行训练,直接从文件系统中加载即可。2 并行处理  并行处理使得多个特征处理工作能够并行地进行。根据对特征矩阵的读取方式不同,可分为整体并行处理和部分并行处理。整体并行处理,即并行处理的每个工作的输入都是特征矩阵的整体;部分并行处理,即可定义每个工作需要输入的特征矩阵的列。2.1 整体并行处理  pipeline包提供了FeatureUnion类来进行整体并行处理:&1&from&numpy&import&log1p&
&2&from&sklearn.preprocessing&import&FunctionTransformer&
&3&from&sklearn.preprocessing&import&Binarizer&
&4&from&sklearn.pipeline&import&FeatureUnion&
&6&#新建将整体特征矩阵进行对数函数转换的对象&
&7&step2_1&=&('ToLog',&FunctionTransformer(log1p))&
&8&#新建将整体特征矩阵进行二值化类的对象&
&9&step2_2&=&('ToBinary',&Binarizer())
&10&#新建整体并行处理对象
&11&#该对象也有fit和transform方法,fit和transform方法均是并行地调用需要并行处理的对象的fit和transform方法
&12&#参数transformer_list为需要并行处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象
&13&step2&=&('FeatureUnion',&FeatureUnion(transformer_list=[step2_1,&step2_2,&step2_3]))2.2 部分并行处理  整体并行处理有其缺陷,在一些场景下,我们只需要对特征矩阵的某些列进行转换,而不是所有列。pipeline并没有提供相应的类(仅OneHotEncoder类实现了该功能),需要我们在FeatureUnion的基础上进行优化:&1&from&sklearn.pipeline&import&FeatureUnion,&_fit_one_transformer,&_fit_transform_one,&_transform_one&
&2&from&sklearn.externals.joblib&import&Parallel,&delayed&
&3&from&scipy&import&sparse&
&4&import&numpy&as&np&
&5&&6&#部分并行处理,继承FeatureUnion&7&class&FeatureUnionExt(FeatureUnion):&
&8&&&&&#相比FeatureUnion,多了idx_list参数,其表示每个并行工作需要读取的特征矩阵的列&
&9&&&&&def&__init__(self,&transformer_list,&idx_list,&n_jobs=1,&transformer_weights=None):
&10&&&&&&&&&self.idx_list&=&idx_list
&11&&&&&&&&&FeatureUnion.__init__(self,&transformer_list=map(lambda&trans:(trans[0],&trans[1]),&transformer_list),&n_jobs=n_jobs,&transformer_weights=transformer_weights)
&13&&&&&#由于只部分读取特征矩阵,方法fit需要重构
&14&&&&&def&fit(self,&X,&y=None):
&15&&&&&&&&&transformer_idx_list&=&map(lambda&trans,&idx:(trans[0],&trans[1],&idx),&self.transformer_list,&self.idx_list)
&16&&&&&&&&&transformers&=&Parallel(n_jobs=self.n_jobs)(
&17&&&&&&&&&&&&&#从特征矩阵中提取部分输入fit方法
&18&&&&&&&&&&&&&delayed(_fit_one_transformer)(trans,&X[:,idx],&y)
&19&&&&&&&&&&&&&for&name,&trans,&idx&in&transformer_idx_list)20&&&&&&&&&self._update_transformer_list(transformers)
&21&&&&&&&&&return&self
&23&&&&&#由于只部分读取特征矩阵,方法fit_transform需要重构
&24&&&&&def&fit_transform(self,&X,&y=None,&**fit_params):
&25&&&&&&&&&transformer_idx_list&=&map(lambda&trans,&idx:(trans[0],&trans[1],&idx),&self.transformer_list,&self.idx_list)
&26&&&&&&&&&result&=&Parallel(n_jobs=self.n_jobs)(
&27&&&&&&&&&&&&&#从特征矩阵中提取部分输入fit_transform方法
&28&&&&&&&&&&&&&delayed(_fit_transform_one)(trans,&name,&X[:,idx],&y,
&29&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&self.transformer_weights,&**fit_params)
&30&&&&&&&&&&&&&for&name,&trans,&idx&in&transformer_idx_list)
&32&&&&&&&&&Xs,&transformers&=&zip(*result)
&33&&&&&&&&&self._update_transformer_list(transformers)
&34&&&&&&&&&if&any(sparse.issparse(f)&for&f&in&Xs):35&&&&&&&&&&&&&Xs&=&sparse.hstack(Xs).tocsr()
&36&&&&&&&&&else:
&37&&&&&&&&&&&&&Xs&=&np.hstack(Xs)38&&&&&&&&&return&Xs
&40&&&&&#由于只部分读取特征矩阵,方法transform需要重构
&41&&&&&def&transform(self,&X):
&42&&&&&&&&&transformer_idx_list&=&map(lambda&trans,&idx:(trans[0],&trans[1],&idx),&self.transformer_list,&self.idx_list)
&43&&&&&&&&&Xs&=&Parallel(n_jobs=self.n_jobs)(
&44&&&&&&&&&&&&&#从特征矩阵中提取部分输入transform方法
&45&&&&&&&&&&&&&delayed(_transform_one)(trans,&name,&X[:,idx],&self.transformer_weights)
&46&&&&&&&&&&&&&for&name,&trans,&idx&in&transformer_idx_list)
&47&&&&&&&&&if&any(sparse.issparse(f)&for&f&in&Xs):
&48&&&&&&&&&&&&&Xs&=&sparse.hstack(Xs).tocsr()
&49&&&&&&&&&else:
&50&&&&&&&&&&&&&Xs&=&np.hstack(Xs)51&&&&&&&&&return&Xs  在本文提出的场景中,我们对特征矩阵的第1列(花的颜色)进行定性特征编码,对第2、3、4列进行对数函数转换,对第5列进行定量特征二值化处理。使用FeatureUnionExt类进行部分并行处理的代码如下:&1&from&numpy&import&log1p&
&2&from&sklearn.preprocessing&import&OneHotEncoder&
&3&from&sklearn.preprocessing&import&FunctionTransformer&
&4&from&sklearn.preprocessing&import&Binarizer&
&6&#新建将部分特征矩阵进行定性特征编码的对象&
&7&step2_1&=&('OneHotEncoder',&OneHotEncoder(sparse=False))&
&8&#新建将部分特征矩阵进行对数函数转换的对象&
&9&step2_2&=&('ToLog',&FunctionTransformer(log1p))
&10&#新建将部分特征矩阵进行二值化类的对象
&11&step2_3&=&('ToBinary',&Binarizer())
&12&#新建部分并行处理对象
&13&#参数transformer_list为需要并行处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象
&14&#参数idx_list为相应的需要读取的特征矩阵的列
&15&step2&=&('FeatureUnionExt',&FeatureUnionExt(transformer_list=[step2_1,&step2_2,&step2_3],&idx_list=[[0],&[1,&2,&3],&[4]]))3 流水线处理  pipeline包提供了Pipeline类来进行流水线处理。流水线上除最后一个工作以外,其他都要执行fit_transform方法,且上一个工作输出作为下一个工作的输入。最后一个工作必须实现fit方法,输入为上一个工作的输出;但是不限定一定有transform方法,因为流水线的最后一个工作可能是训练!  根据本文提出的场景,结合并行处理,构建完整的流水线的代码如下:&1&from&numpy&import&log1p&
&2&from&sklearn.preprocessing&import&Imputer&
&3&from&sklearn.preprocessing&import&OneHotEncoder&
&4&from&sklearn.preprocessing&import&FunctionTransformer&
&5&from&sklearn.preprocessing&import&Binarizer&
&6&from&sklearn.preprocessing&import&MinMaxScaler&
&7&from&sklearn.feature_selection&import&SelectKBest&
&8&from&sklearn.feature_selection&import&chi2&
&9&from&sklearn.decomposition&import&PCA
&10&from&sklearn.linear_model&import&LogisticRegression
&11&from&sklearn.pipeline&import&Pipeline
&13&#新建计算缺失值的对象
&14&step1&=&('Imputer',&Imputer())
&15&#新建将部分特征矩阵进行定性特征编码的对象
&16&step2_1&=&('OneHotEncoder',&OneHotEncoder(sparse=False))
&17&#新建将部分特征矩阵进行对数函数转换的对象
&18&step2_2&=&('ToLog',&FunctionTransformer(log1p))
&19&#新建将部分特征矩阵进行二值化类的对象
&20&step2_3&=&('ToBinary',&Binarizer())
&21&#新建部分并行处理对象,返回值为每个并行工作的输出的合并
&22&step2&=&('FeatureUnionExt',&FeatureUnionExt(transformer_list=[step2_1,&step2_2,&step2_3],&idx_list=[[0],&[1,&2,&3],&[4]]))
&23&#新建无量纲化对象
&24&step3&=&('MinMaxScaler',&MinMaxScaler())
&25&#新建卡方校验选择特征的对象
&26&step4&=&('SelectKBest',&SelectKBest(chi2,&k=3))
&27&#新建PCA降维的对象
&28&step5&=&('PCA',&PCA(n_components=2))
&29&#新建逻辑回归的对象,其为待训练的模型作为流水线的最后一步
&30&step6&=&('LogisticRegression',&LogisticRegression(penalty='l2'))
&31&#新建流水线处理对象
&32&#参数steps为需要流水线处理的对象列表,该列表为二元组列表,第一元为对象的名称,第二元为对象
&33&pipeline&=&Pipeline(steps=[step1,&step2,&step3,&step4,&step5,&step6])4 自动化调参  网格搜索为自动化调参的常见技术之一,grid_search包提供了自动化调参的工具,包括GridSearchCV类。对组合好的对象进行训练以及调参的代码如下:1&from&sklearn.grid_search&import&GridSearchCV
3&#新建网格搜索对象
4&#第一参数为待训练的模型
5&&#param_grid为待调参数组成的网格,字典格式,键为参数名称(格式“对象名称__子对象名称__参数名称”),值为可取的参数值列表
6&&grid_search&=&GridSearchCV(pipeline,&param_grid={'FeatureUnionExt__ToBinary__threshold':[1.0,&2.0,&3.0,&4.0],&'LogisticRegression__C':[0.1,&0.2,&0.4,&0.8]})
7&#训练以及调参8&grid_search.fit(iris.data,&iris.target)5 持久化  externals.joblib包提供了dump和load方法来持久化和加载内存数据:1&#持久化数据
2&#第一个参数为内存中的对象
3&#第二个参数为保存在文件系统中的名称
4&#第三个参数为压缩级别,0为不压缩,3为合适的压缩级别
5&dump(grid_search,&'grid_search.dmp',&compress=3)
6&#从文件系统中加载数据到内存中7&grid_search&=&load('grid_search.dmp')6 回顾包类或方法说明sklearn.pipelinePipeline流水线处理sklearn.pipelineFeatureUnion并行处理sklearn.grid_searchGridSearchCV网格搜索调参externals.joblibdump数据持久化externals.joblibload从文件系统中加载数据至内存  注意:组合和持久化都会涉及pickle技术,,将lambda定义的函数作为FunctionTransformer的自定义转换函数将不能pickle化。7 总结  2015年我设计了一个,其以Mysql数据库作为原始数据源,提供了“灵活的”特征提取、特征处理的配置方法,同时重新封装了数据、特征和模型,以方便调度系统识别。说灵活,其实也只是通过配置文件的方式定义每个特征的提取和处理的sql语句。但是纯粹使用sql语句来进行特征处理是很勉强的,除去特征提取以外,我又造了一回轮子,原来sklearn提供了这么优秀的特征处理、工作组合等功能。所以,我在这个博客中先不提任何算法和模型,先从数据挖掘工作的第一步开始,使用基于Python的各个工具把大部分步骤都走了一遍(抱歉,我暂时忽略了特征提取),希望这样的梳理能够少让初学者走弯路吧。7 参考资料数据家www.cdo.ren为懂数据更懂生活的你呈现更多精彩融入数据圈子 |QQ群&
发表评论:
TA的最新馆藏强化文明参观保护动物的理念,加强宣传监督管理。
比基尼模特与鲨鱼一起游泳,甚至抱着一起拍照。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  作者:jasonfreak
  1 使用sklearn进行数据挖掘
  1.1 数据挖掘的步骤
  数据挖掘通常包括数据采集,数据分析,特征工程,训练模型,模型评估等步骤。使用sklearn工具可以方便地进行特征工程和模型训练工作,在《使用sklearn做单机特征工程》中,我们最后留下了一些疑问:特征处理类都有三个方法fit、transform和fit_transform,fit方法居然和模型训练方法fit同名(不光同名,参数列表都一样),这难道都是巧合?
  显然,这不是巧合,这正是sklearn的设计风格。我们能够更加优雅地使用sklearn进行特征工程和模型训练工作。此时,不妨从一个基本的数据挖掘场景入手:
  我们使用sklearn进行虚线框内的工作(sklearn也可以进行文本特征提取)。通过分析sklearn源码,我们可以看到除训练,预测和评估以外,处理其他工作的类都实现了3个方法:fit、transform和fit_transform。从命名中可以看到,fit_transform方法是先调用fit然后调用transform,我们只需要关注fit方法和transform方法即可。
  transform方法主要用来对特征进行转换。从可利用信息的角度来说,转换分为无信息转换和有信息转换。无信息转换是指不利用任何其他信息进行转换,比如指数、对数函数转换等。有信息转换从是否利用目标值向量又可分为无监督转换和有监督转换。无监督转换指只利用特征的统计信息的转换,统计信息包括均值、标准差、边界等等,比如标准化、PCA法降维等。有监督转换指既利用了特征信息又利用了目标值信息的转换,比如通过模型选择特征、LDA法降维等。通过总结常用的转换类,我们得到下表:
  不难看到,只有有信息的转换类的fit方法才实际有用,显然fit方法的主要工作是获取特征信息和目标值信息,在这点上,fit方法和模型训练时的fit方法就能够联系在一起了:都是通过分析特征和目标值,提取有价值的信息,对于转换类来说是某些统计量,对于模型来说可能是特征的权值系数等。另外,只有有监督的转换类的fit和transform方法才需要特征和目标值两个参数。fit方法无用不代表其没实现,而是除合法性校验以外,其并没有对特征和目标值进行任何处理,Normalizer的fit方法实现如下:
  基于这些特征处理工作都有共同的方法,那么试想可不可以将他们组合在一起?在本文假设的场景中,我们可以看到这些工作的组合形式有两种:流水线式和并行式。基于流水线组合的工作需要依次进行,前一个工作的输出是后一个工作的输入;基于并行式的工作可以同时进行,其使用同样的输入,所有工作完成后将各自的输出合并之后输出。sklearn提供了包pipeline来完成流水线式和并行式的工作。
  1.2 数据初貌
  在此,我们仍然使用IRIS数据集来进行说明。为了适应提出的场景,对原数据集需要稍微加工:
  1.3 关键技术
  并行处理,流水线处理,自动化调参,持久化是使用sklearn优雅地进行数据挖掘的核心。并行处理和流水线处理将多个特征处理工作,甚至包括模型训练工作组合成一个工作(从代码的角度来说,即将多个对象组合成了一个对象)。在组合的前提下,自动化调参技术帮我们省去了人工调参的反锁。训练好的模型是贮存在内存中的数据,持久化能够将这些数据保存在文件系统中,之后使用时无需再进行训练,直接从文件系统中加载即可。
  2 并行处理
  并行处理使得多个特征处理工作能够并行地进行。根据对特征矩阵的读取方式不同,可分为整体并行处理和部分并行处理。整体并行处理,即并行处理的每个工作的输入都是特征矩阵的整体;部分并行处理,即可定义每个工作需要输入的特征矩阵的列。
  2.1 整体并行处理
  pipeline包提供了FeatureUnion类来进行整体并行处理:
  2.2 部分并行处理
  整体并行处理有其缺陷,在一些场景下,我们只需要对特征矩阵的某些列进行转换,而不是所有列。pipeline并没有提供相应的类,需要我们在FeatureUnion的基础上进行优化:
  View Code
  在本文提出的场景中,我们对特征矩阵的第1列(花的颜色)进行定性特征编码,对第2、3、4列进行对数函数转换,对第5列进行定量特征二值化处理。使用FeatureUnionExt类进行部分并行处理的代码如下:
  3 流水线处理
  pipeline包提供了Pipeline类来进行流水线处理。流水线上除最后一个工作以外,其他都要执行fit_transform方法,且上一个工作输出作为下一个工作的输入。最后一个工作必须实现fit方法,输入为上一个工作的输出;但是不限定一定有transform方法,因为流水线的最后一个工作可能是训练!
  根据本文提出的场景,结合并行处理,构建完整的流水线的代码如下:
  4 自动化调参
  网格搜索为自动化调参的常见技术之一,grid_search包提供了自动化调参的工具,包括GridSearchCV类。对组合好的对象进行训练以及调参的代码如下:
  5 持久化
  externals.joblib包提供了dump和load方法来持久化和加载内存数据:
  6 回顾
  注意:组合和持久化都会涉及pickle技术,在sklearn的技术文档中有说明,将lambda定义的函数作为FunctionTransformer的自定义转换函数将不能pickle化。
  7 总结
  2015年我设计了一个基于sklearn的自动化特征工程的工具,其以Mysql数据库作为原始数据源,提供了“灵活的”特征提取、特征处理的配置方法,同时重新封装了数据、特征和模型,以方便调度系统识别。说灵活,其实也只是通过配置文件的方式定义每个特征的提取和处理的sql语句。但是纯粹使用sql语句来进行特征处理是很勉强的,除去特征提取以外,我又造了一回轮子,原来sklearn提供了这么优秀的特征处理、工作组合等功能。所以,我在这个博客中先不提任何算法和模型,先从数据挖掘工作的第一步开始,使用基于Python的各个工具把大部分步骤都走了一遍(抱歉,我暂时忽略了特征提取),希望这样的梳理能够少让初学者走弯路吧。
  via:cnblogs
  转载请注明来自36大数据():36大数据& 使用sklearn优雅地进行数据挖掘
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
36大数据是一个专注大数据、大数据应用案例、数据分析、数据...
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:使用sklearn做单机特征工程 - jasonfreak - 博客园
1 特征工程是什么?2 数据预处理  2.1 无量纲化    2.1.1 标准化    2.1.2 区间缩放法    2.1.3 标准化与归一化的区别  2.2 对定量特征二值化  2.3 对定性特征哑编码  2.4 缺失值计算  2.5 数据变换  2.6 回顾3 特征选择  3.1 Filter    3.1.1 方差选择法    3.1.2 相关系数法    3.1.3 卡方检验    3.1.4 互信息法
  3.2 Wrapper
    3.2.1 递归特征消除法  3.3 Embedded    3.3.1 基于惩罚项的特征选择法    3.3.2 基于树模型的特征选择法  3.4 回顾4 降维  4.1 主成分分析法(PCA)  4.2 线性判别分析法(LDA)  4.3 回顾5 总结6 参考资料
1 特征工程是什么?
  有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:
  特征处理是特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。首次接触到sklearn,通常会被其丰富且方便的算法模型库吸引,但是这里介绍的特征处理库也十分强大!
  本文中使用sklearn中的来对特征处理功能进行说明。IRIS数据集由Fisher在1936年整理,包含4个特征(Sepal.Length(花萼长度)、Sepal.Width(花萼宽度)、Petal.Length(花瓣长度)、Petal.Width(花瓣宽度)),特征值都为正浮点数,单位为厘米。目标值为鸢尾花的分类(Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),Iris Virginica(维吉尼亚鸢尾))。导入IRIS数据集的代码如下:
1 from sklearn.datasets import load_iris
3 #导入IRIS数据集
4 iris = load_iris()
6 #特征矩阵
7 iris.data
9 #目标向量
10 iris.target
2 数据预处理
  通过特征提取,我们能得到未经处理的特征,这时的特征可能有以下问题:
不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。
信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心&及格&或不&及格&,那么需要将定量的考分,转换成&1&和&0&表示及格和未及格。二值化可以解决这一问题。
定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征。最简单的方式是为每一种定性值指定一个定量值,但是这种方式过于灵活,增加了调参的工作。:假设有N种定性值,则将这一个特征扩展为N种特征,当原始特征值为第i种定性值时,第i个扩展特征赋值为1,其他扩展特征赋值为0。哑编码的方式相比直接指定的方式,不用增加调参的工作,对于线性模型来说,使用哑编码后的特征可达到非线性的效果。
存在缺失值:缺失值需要补充。
信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。
  我们使用sklearn中的preproccessing库来进行数据预处理,可以覆盖以上问题的解决方案。
2.1 无量纲化
  无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。
2.1.1 标准化
  标准化需要计算特征的均值和标准差,公式表达为:
  使用preproccessing库的StandardScaler类对数据进行标准化的代码如下:
1 from sklearn.preprocessing import StandardScaler
3 #标准化,返回值为标准化后的数据
4 StandardScaler().fit_transform(iris.data)
2.1.2 区间缩放法
  区间缩放法的思路有多种,常见的一种为利用两个最值进行缩放,公式表达为:
  使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下:
1 from sklearn.preprocessing import MinMaxScaler
3 #区间缩放,返回值为缩放到[0, 1]区间的数据
4 MinMaxScaler().fit_transform(iris.data)
2.1.3 标准化与归一化的区别
  简单来说,标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为&单位向量&。规则为l2的归一化公式如下:
  使用preproccessing库的Normalizer类对数据进行归一化的代码如下:
1 from sklearn.preprocessing import Normalizer
3 #归一化,返回值为归一化后的数据
4 Normalizer().fit_transform(iris.data)
2.2 对定量特征二值化
  定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,公式表达如下:
  使用preproccessing库的Binarizer类对数据进行二值化的代码如下:
1 from sklearn.preprocessing import Binarizer
3 #二值化,阈值设置为3,返回值为二值化后的数据
4 Binarizer(threshold=3).fit_transform(iris.data)
2.3 对定性特征哑编码
  由于IRIS数据集的特征皆为定量特征,故使用其目标值进行哑编码(实际上是不需要的)。使用preproccessing库的OneHotEncoder类对数据进行哑编码的代码如下:
1 from sklearn.preprocessing import OneHotEncoder
3 #哑编码,对IRIS数据集的目标值,返回值为哑编码后的数据
4 OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))
2.4 缺失值计算
  由于IRIS数据集没有缺失值,故对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失。使用preproccessing库的Imputer类对数据进行缺失值计算的代码如下:
1 from numpy import vstack, array, nan
2 from sklearn.preprocessing import Imputer
4 #缺失值计算,返回值为计算缺失值后的数据
5 #参数missing_value为缺失值的表示形式,默认为NaN
6 #参数strategy为缺失值填充方式,默认为mean(均值)
7 Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))
2.5 数据变换
  常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。4个特征,度为2的多项式转换公式如下:
  使用preproccessing库的PolynomialFeatures类对数据进行多项式转换的代码如下:
1 from sklearn.preprocessing import PolynomialFeatures
3 #多项式转换
4 #参数degree为度,默认值为2
5 PolynomialFeatures().fit_transform(iris.data)
  基于单变元函数的数据变换可以使用一个统一的方式完成,使用preproccessing库的FunctionTransformer对数据进行对数函数转换的代码如下:
1 from numpy import log1p
2 from sklearn.preprocessing import FunctionTransformer
4 #自定义转换函数为对数函数的数据变换
5 #第一个参数是单变元函数
6 FunctionTransformer(log1p).fit_transform(iris.data)
StandardScaler
标准化,基于特征矩阵的列,将特征值转换至服从标准正态分布
MinMaxScaler
区间缩放,基于最大最小值,将特征值转换到[0, 1]区间上
Normalizer
基于特征矩阵的行,将样本向量转换为&单位向量&
基于给定阈值,将定量特征按阈值划分
OneHotEncoder
将定性数据编码为定量数据
缺失值计算
计算缺失值,缺失值可填充为均值等
PolynomialFeatures
多项式数据转换
多项式数据转换
FunctionTransformer
自定义单元数据转换
使用单变元的函数来转换数据
3 特征选择
  当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。
  根据特征选择的形式又可以将特征选择方法分为3种:
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
  我们使用sklearn中的feature_selection库来进行特征选择。
3.1 Filter
3.1.1 方差选择法
  使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:
1 from sklearn.feature_selection import VarianceThreshold
3 #方差选择法,返回值为特征选择后的数据
4 #参数threshold为方差的阈值
5 VarianceThreshold(threshold=3).fit_transform(iris.data)
3.1.2 相关系数法
  使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:
1 from sklearn.feature_selection import SelectKBest
2 from scipy.stats import pearsonr
4 #选择K个最好的特征,返回选择特征后的数据
5 #第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
6 #参数k为选择的特征个数
7 SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
3.1.3 卡方检验
  经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:
  。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:
1 from sklearn.feature_selection import SelectKBest
2 from sklearn.feature_selection import chi2
4 #选择K个最好的特征,返回选择特征后的数据
5 SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
3.1.4 互信息法
  经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:
  为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:
1 from sklearn.feature_selection import SelectKBest
2 from minepy import MINE
4 #由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
5 def mic(x, y):
m = MINE()
m.compute_score(x, y)
return (m.mic(), 0.5)
10 #选择K个最好的特征,返回特征选择后的数据
11 SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
3.2 Wrapper
3.2.1 递归特征消除法
  递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:
1 from sklearn.feature_selection import RFE
2 from sklearn.linear_model import LogisticRegression
4 #递归特征消除法,返回特征选择后的数据
5 #参数estimator为基模型
6 #参数n_features_to_select为选择的特征个数
7 RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(iris.data, iris.target)
3.3 Embedded
3.3.1 基于惩罚项的特征选择法
  使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:
1 from sklearn.feature_selection import SelectFromModel
2 from sklearn.linear_model import LogisticRegression
4 #带L1惩罚项的逻辑回归作为基模型的特征选择
5 SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
  ,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。具体操作为:若一个特征在L1中的权值为1,选择在L2中权值差别不大且在L1中权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个新的逻辑回归模型:
1 from sklearn.linear_model import LogisticRegression
3 class LR(LogisticRegression):
def __init__(self, threshold=0.01, dual=False, tol=1e-4, C=1.0,
fit_intercept=True, intercept_scaling=1, class_weight=None,
random_state=None, solver='liblinear', max_iter=100,
multi_class='ovr', verbose=0, warm_start=False, n_jobs=1):
#权值相近的阈值
self.threshold = threshold
LogisticRegression.__init__(self, penalty='l1', dual=dual, tol=tol, C=C,
fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight=class_weight,
random_state=random_state, solver=solver, max_iter=max_iter,
multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)
#使用同样的参数创建L2逻辑回归
self.l2 = LogisticRegression(penalty='l2', dual=dual, tol=tol, C=C, fit_intercept=fit_intercept, intercept_scaling=intercept_scaling, class_weight = class_weight, random_state=random_state, solver=solver, max_iter=max_iter, multi_class=multi_class, verbose=verbose, warm_start=warm_start, n_jobs=n_jobs)
def fit(self, X, y, sample_weight=None):
#训练L1逻辑回归
super(LR, self).fit(X, y, sample_weight=sample_weight)
self.coef_old_ = self.coef_.copy()
#训练L2逻辑回归
self.l2.fit(X, y, sample_weight=sample_weight)
cntOfRow, cntOfCol = self.coef_.shape
#权值系数矩阵的行数对应目标值的种类数目
for i in range(cntOfRow):
for j in range(cntOfCol):
coef = self.coef_[i][j]
#L1逻辑回归的权值系数不为0
if coef != 0:
#对应在L2逻辑回归中的权值系数
coef1 = self.l2.coef_[i][j]
for k in range(cntOfCol):
coef2 = self.l2.coef_[i][k]
#在L2逻辑回归中,权值系数之差小于设定的阈值,且在L1中对应的权值为0
if abs(coef1-coef2) & self.threshold and j != k and self.coef_[i][k] == 0:
idx.append(k)
#计算这一类特征的权值系数均值
mean = coef / len(idx)
self.coef_[i][idx] = mean
return self
  使用feature_selection库的SelectFromModel类结合带L1以及L2惩罚项的逻辑回归模型,来选择特征的代码如下:
1 from sklearn.feature_selection import SelectFromModel
3 #带L1和L2惩罚项的逻辑回归作为基模型的特征选择
4 #参数threshold为权值系数之差的阈值
5 SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(iris.data, iris.target)
3.3.2 基于树模型的特征选择法
  树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:
1 from sklearn.feature_selection import SelectFromModel
2 from sklearn.ensemble import GradientBoostingClassifier
4 #GBDT作为基模型的特征选择
5 SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
VarianceThreshold
方差选择法
SelectKBest
可选关联系数、卡方校验、最大信息系数作为得分计算的方法
递归地训练基模型,将权值系数较小的特征从特征集合中消除
SelectFromModel
训练基模型,选择权值系数较高的特征
  当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。
4.1 主成分分析法(PCA)
  使用decomposition库的PCA类选择特征的代码如下:
1 from sklearn.decomposition import PCA
3 #主成分分析法,返回降维后的数据
4 #参数n_components为主成分数目
5 PCA(n_components=2).fit_transform(iris.data)
4.2 线性判别分析法(LDA)
  使用lda库的LDA类选择特征的代码如下:
1 from sklearn.lda import LDA
3 #线性判别分析法,返回降维后的数据
4 #参数n_components为降维后的维数
5 LDA(n_components=2).fit_transform(iris.data, iris.target)
decomposition
主成分分析法
线性判别分析法
  再让我们回归一下本文开始的特征工程的思维导图,我们可以使用sklearn完成几乎所有特征处理的工作,而且不管是数据预处理,还是特征选择,抑或降维,它们都是通过某个类的方法fit_transform完成的,fit_transform要不只带一个参数:特征矩阵,要不带两个参数:特征矩阵加目标向量。这些难道都是巧合吗?还是故意设计成这样?方法fit_transform中有fit这一单词,它和训练模型的fit方法有关联吗?接下来,我将在中阐述其中的奥妙!
6 参考资料
Trackbacks - 0

我要回帖

更多关于 数字签名的特征 的文章

 

随机推荐