一.概念
学习过Machine Learning的一定听过这句话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
所谓特征工程,做的就是【 最大限度地从原始数据中提取特征点以供算法和模型使用】这么一件事。

二.模块
特征工程大体可以分为以下几大模块
1.特征采集:主要基于业务理解,找出满足需求的数据,设计如何获取及存储特征点,并且评估其准确率、覆盖率、采集难度等
2.特征处理:
    2.1采样:合法样本筛选(排除异常样本)、样本权重、数据不均衡等处理
    2.2预处理:
         2.2.1单特征:归一化、离散化、数据变换、缺失值等
         2.2.2多特征:降维(PCA、LDA)、迭代特征子集(完全搜索、启发式搜索)、决策树等
3.特征校正:特征有效性分析、特征监控、模型维护

三.常用方法

很多人都选择scikit-learn,因为其提供了较为完整的特征处理方法,包括数据处理,特征选择,降维等

数据处理相关:

标准化

from sklearn.preprocessing import StandardScaler#标准化,返回值为标准化后的数据
StandardScaler().fit_transform(data)

区间缩放法

from sklearn.preprocessing import MinMaxScaler#区间缩放,返回值为缩放到[0, 1]区间的数据
MinMaxScaler().fit_transform(data)

归一化

from sklearn.preprocessing import Normalizer#归一化,返回值为归一化后的数据
Normalizer().fit_transform(data)

二值化

from sklearn.preprocessing import Binarizer#二值化,阈值设置为3,返回值为二值化后的数据
Binarizer(threshold=3).fit_transform(data)

缺失值计算

from numpy import vstack, array, nan
from sklearn.preprocessing import Imputer#缺失值计算,返回值为计算缺失值后的数据
#参数missing_value为缺失值的表示形式,默认为NaN
#参数strategy为缺失值填充方式,默认为mean(均值)
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), data)))

数据转换

preproccessing库提供了PolynomialFeatures()、FunctionTransformer()等方法可以进行常用函数转换

from sklearn.preprocessing import PolynomialFeatures#多项式转换
#参数degree为度,默认值为2
PolynomialFeatures().fit_transform(data)from numpy import log1pfrom sklearn.preprocessing import FunctionTransformer#自定义转换函数为对数函数的数据变换
#第一个参数是单变元函数
FunctionTransformer(log1p).fit_transform(data)

数据选择相关:

方差选择法

from sklearn.feature_selection import VarianceThreshold#方差选择法,返回值为特征选择后的数据
#参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(data)

相关系数法

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(data, target)

卡方检验

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(data, target)

互信息法

from sklearn.feature_selection import SelectKBestfrom minepy import MINE#由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5def mic(x, y):m = MINE()m.compute_score(x, y)return (m.mic(), 0.5)#选择K个最好的特征,返回特征选择后的数据
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(data, target)

Wrapper递归特征消除法

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(data, target)

Embedded惩罚项特征选择法

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression#带L1惩罚项的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(data, target)

实际上,L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要。故,可结合L2惩罚项来优化。具体操作为:若一个特征在L1中的权值为1,选择在L2中权值差别不大且在L1中权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个新的逻辑回归模型:

from sklearn.linear_model import LogisticRegressionclass 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 = thresholdLogisticRegression.__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逻辑回归的权值系数不为0if coef != 0:idx = [j]#对应在L2逻辑回归中的权值系数coef1 = self.l2.coef_[i][j]for k in range(cntOfCol):coef2 = self.l2.coef_[i][k]#在L2逻辑回归中,权值系数之差小于设定的阈值,且在L1中对应的权值为0if 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] = meanreturn self

结合带L1以及L2惩罚项:

from sklearn.feature_selection import SelectFromModel#带L1和L2惩罚项的逻辑回归作为基模型的特征选择
#参数threshold为权值系数之差的阈值
SelectFromModel(LR(threshold=0.5, C=0.1)).fit_transform(data, target)

基于树模型的特征选择法

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier#GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(data, target)

降维相关:

常见的降维方法有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。

PCA

from sklearn.decomposition import PCA#主成分分析法,返回降维后的数据
#参数n_components为主成分数目
PCA(n_components=2).fit_transform(data)

LDA

from sklearn.lda import LDA#线性判别分析法,返回降维后的数据
#参数n_components为降维后的维数
LDA(n_components=2).fit_transform(data, target)

四.总结
特征工程比较核心的模块就是特征的预处理,说白了就是在进入算法前解决输入数据信息冗余、存在值缺失等问题。
所以很多时候,机器学习中对于数据提取特征的好坏程度可能比算法、模型还重要。

五.相关学习资源

http://scikit-learn.org/stable/index.html

https://www.zhihu.com/question/29316149

人工智障学习笔记——机器学习(1)特征工程相关推荐

  1. 人工智障学习笔记——机器学习(16)降维小结

    机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式. ...

  2. 人工智障学习笔记——机器学习(4)支持向量机

    一.概念 支持向量机(Support Vector Machine),简称SVM.是常见的一种判别方法.在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别.分类以及回归分析. SVM的主要思 ...

  3. 人工智障学习笔记——机器学习(5)朴素贝叶斯

    一.概念 1.1贝叶斯定理:假设H[1],H[2]-,H[n]互斥且构成一个完全事件,已知它们的概率P(H[i]),i=1,2,-,n,现观察到某事件A与H[1],H[2]-,H[n]相伴随机出现,且 ...

  4. 人工智障学习笔记——机器学习(3)决策树

    一.概念 决策树(Decision Tree)是一种十分常用的分类方法.也是监督学习的一种,是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可 ...

  5. 人工智障学习笔记——机器学习(15)t-SNE降维

    一.概念 t-SNE(t分布随机邻域嵌入)是一种用于探索高维数据的非线性降维算法.它将多维数据映射到适合于人类观察的两个或多个维度. t-SNE主要包括两个步骤:第一.t-SNE构建一个高维对象之间的 ...

  6. 人工智障学习笔记——机器学习(12)LDA降维

    一.概念 LDA:Linear Discriminant Analysis (也有叫做Fisher Linear Discriminant).与PCA一样,是一种线性降维算法.不同于PCA只会选择数据 ...

  7. 人工智障学习笔记——机器学习(11)PCA降维

    一.概念 Principal Component Analysis(PCA):主成分分析法,是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中表示,即把原先的n个特征用 ...

  8. 人工智障学习笔记——机器学习(9)最大期望算法

    一.概念 最大期望算法,也就是著名的em算法,他起源于一条dog 没错,就是这个 好吧不扯蛋了,em算法(Expectation Maximization Algorithm,又译期望最大化算法),是 ...

  9. 人工智障学习笔记——机器学习(7)FM/FFM

    一.概念 FM(分解机模型)和FFM(基于域的分解机模型)是最近几年提出的模型,主要用于预估CTR/CVR,凭借其在数据量比较大并且特征稀疏的情况下,仍然能够得到优秀的性能和效果的特性,屡次在各大公司 ...

最新文章

  1. 10年Python大牛倾力打造系统Python学习流程图!
  2. 如何用一句话得罪 95% 的中国人?昨天这家公司做到了...
  3. ATO/MTO类机械制造业特点以及ERP需求分析(三)
  4. python3和2的区别大吗_python3和2为什么区别大吗
  5. Java面向对象(11)--多态性
  6. 【openMV】霍夫变换---直线提取
  7. WARNING:tensorflow:Entity <bound method GRUCell.call of <tensorflow.python.ops.rnn_cell_impl.GRUCell
  8. 如何使用final阻止重载?如何使用final阻止继承?
  9. 图的遍历(广度优先遍历)- 数据结构和算法61
  10. dos2unix命令解决 Shell 脚本无法执行的问题
  11. TCP/IP常见攻击手段
  12. MCS-51单片机的外部引脚及片外总线
  13. LTK5328内置自适应升压带PBTL模式_2X8W双声道音频功率放大器
  14. WIN10家庭版局域网连接设置(含设置账号密码)
  15. codeblock的c语言编译,CodeBlocks无法编译的原因和解决办法
  16. linux菜鸟入门之系统启动流程
  17. 全面了解风控策略体系
  18. 深入浅出的马尔科夫入门文章
  19. 启动hive的时候master:8020 failed on connection exception
  20. android 模拟返回键

热门文章

  1. 计算机编码原理——不同数据类型存储中文编码
  2. 弹性碰撞后速度方向_IPC: SIGGRAPH 2020开源有限元碰撞独家处理方案
  3. C++:获取图片文件信息-图片名称、类型、像素宽高
  4. 我就传个图片都不通过迈
  5. android view过度动画,为View的切换添加过渡动画
  6. 超级SEO静态页面生成系统源码
  7. 派单o2o全开源版 v11.6.0 全新UI版小程序模块
  8. 二开微信表情包小程序魔改版源码
  9. 星宿UI V1.1.2 跳转小商店+ wordpress微信小程序
  10. java dragged_Java:mouseDragged并在图形界面中移动