目录

  • 特征重要性
  • 一、特征选择
    • 1、Filter方法(过滤式)
      • 1-1 剔除缺失值过多的变量
      • 1-2 方差变化
      • 1-3 相关系数(Correlation coefficient scores)
      • 1-4卡方检验(Chi-squared Test)
      • 1-5 信息增益(Information Gain)
      • 1-4方差分析(F检验)
    • 2、Wrapper方法(封装式)
    • 3、Embedded方法(嵌入式)
      • 1、Backward Feature Elimination(向后特征消除, recursive feature elimination递归特征消除)
      • 2、前向特征选择
  • Python实现
  • 特征初探
    • 评价特征重要性
    • 特征的偏相关性
      • 为偏相关性作图
  • 1、特征选择:过滤式
    • 1-1、通过方差阈值选择特征
    • 1-2、 单变量选择
      • 1-2-1使用可配置方法进行单变量选择
      • 1-2-2按指定方法选择评价值最高的k个特征(卡方、F、互信息)
      • 1-2-3按指定方法根据评价值分位数选择特征
      • 1-2-4通过将正确标签预测为错误标签的比例选择特征
      • 1-2-5通过将错误标签预测为正标签的比例选择特征
      • 1-2-6基于家族模型样本偏差率选择特征
      • 1-2-7卡方检验
      • 1-2-8、F检验(方差分析)
    • 1-3、向后特征消除( recursive feature elimination递归特征消除)
  • 2、特征选择:封装式
    • 2-1、从指定模型中进行特征选择
  • 二、特征预处理
    • 1-1 标准化:常规标准化
      • 类实现
      • 函数实现
    • 1-2 标准化:根据分位点内的数据计算均值和方差,再对总体数据进行标准化
      • 类实现
      • 函数实现
    • 1-3 离差标准化:根据最值进行转换
      • 函数实现
    • 1-4 归一化:用最大绝对值归一化到[-1,1]
      • 类实现
      • 函数实现
    • 1-5 非线性转换:用分位数信息转换到[0,1]
      • 类实现
      • 函数实现
    • 1-6 非线性转换:Yeo-Johnson转换或Box-Cox转换到最相似的正态分布
      • 类实现
      • 函数实现
    • 1-7 正则化:将行方向的向量缩放到单位范数
      • 函数实现
    • 1-8 Box-Cox变换
    • 2 转换编码
      • 2-1 将变量值转换为0~N-1的值
      • 2-2 分类变量编码:0/1哑变量编码(独热编码)
      • 2-3 标签二值化
      • 2-4 多标签二值化
      • 2-5 平均数编码
      • 2-6 将有序分类变量编码为整数数组
      • 2-7 自定义数据转化函数(用到管道中)
    • 3 特征衍生:生成交互整(如多项式)
    • 4 连续变量离散化原则
      • 4-1 连续变量离散化:等距分箱
      • 4-2 连续变量离散化:根据阈值进行0/1化
        • 类实现
        • 函数实现
      • 4-3 卡方分箱(对分类变量的不同水平进行合并)
      • 4-4 分箱效果检验:WOE和IV
  • 三、抽取特征对应的值
    • 3-1 将字典数据转换为数组
    • 3-2 文本特征
      • 从向量中进行词的拆分(空格)并统计个数
      • TF-IDF(Term Frequency-Inverse Document Frequency词频-逆文档频率)
      • 特征散列化
  • 四、特征构造
    • 1、多变量融合
    • 2、分箱计数的优势比和对数优势比
    • 对稀有类进行融合生成一个新类别(back-off分箱)
    • 对分类问题用聚类方法进行特征化

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程包含了特征选择(Feature Selection)、特征抽取(Feature Extraction)、特征构造(Feature Construction)等子问题。

特征重要性选择参考 很好的参考

特征重要性

一、特征选择

特征选择的原则:获取尽可能小的特征子集,不显著降低分类精度,不影响分类分布,特征子集应具有的稳定性、适应性等特点。

1、Filter方法(过滤式)

对各特征进行“打分”,赋予特征不同权重,然后对特征按权重进行排序,从而筛选出特征子集,然后用特征子集来训练模型。

优点:运行速度快。
缺点:无法提供反馈。用选择后的特征子集建模,学习算法无法向特征选择传递对特征的需求。另外,可能处理某个特征时由于某个原因判定该特征不重要,而实际中该特征与其他特征结合起来可能会变得更重。

1-1 剔除缺失值过多的变量

通常一个字段的缺失值比例超过20%即可将变量视为无效变量。对于部分算法,可以将缺失值单独编码成一类。

1-2 方差变化

方差变化过小对预测目标变量无意义。

1-3 相关系数(Correlation coefficient scores)

对于线性回归和逻辑回归模型,高度相关的自变量会降低模型性能,产生共线性,此时需要剔除。相关性度量的方法有:

  1. 皮尔逊相关系数(Pearson Correlation):rij=∑k=1m(xki−xiˉ)(xkj−xjˉ)∑k=1m(xki−xiˉ)2(xkj−xjˉ)2r_{ij}=\frac{\sum_{k=1}^m(x_{ki}-\bar{x_i})(x_{kj}-\bar{x_j})}{\sqrt{\sum_{k=1}^m(x_{ki}-\bar{x_i})^2(x_{kj}-\bar{x_j})^2}}rij=k=1m(xkixiˉ)2(xkjxjˉ)2

    k=1m(xkixiˉ)(xkjxjˉ)
  2. 距离相关系数:克服了Pearson相关系数进队线性关系敏感的缺点
df.corr()

1-4卡方检验(Chi-squared Test)

描述两个事件的独立性,或描述实际观测值与期望值间的偏离程度。值越大,表明实际观察值和期望值间的偏差越大,两个事件的相互独立性越弱。
过程:将X变量分为k个不相交的小区间A1=(a0,a1],A2=(a2,a3]…A_1=(a_0, a_1], A_2=(a_2, a_3]…A1=(a0,a1],A2=(a2,a3],一般各小区间内样本量不少于5个。各区间内样本量为fi,∑fi=nf_i, \sum f_i=nfi,fi=n。假设与期望分布一致时,则fi与pinf_i与p_infipin应该相差不大。 参考
χ2(x,y)=∑(fi−Ti)2Ti\chi^2(x,y)=\sum\frac{(f_i-T_i)^2}{T_i}χ2(x,y)=Ti(fiTi)2,其中fif_ifi是X的i类(或是与另一变量联合产生的一个区间)的样本量,TiT_iTi是理论分布值(前面划分的区间的理论分布)。从而得出X的分布是否与期望的一致,或Y变量的分类与X的不同水平是否有关。
可以将数据zhao 类别和考虑的维度制作成表格,行是行为类别,列数是不同对象,从而自由度是(行数-1)*(列数-1)。一行中总数占全量比重是理论分布,从而不同对象没有差异时,可获取每个单元格理论分布值,进而计算出卡方值。

只适用于分类问题中的离散特征筛选,而不适用于连续特征。要
X1∼χ2(n1),X2∼χ2(n2)X_1 \sim \chi^2(n_1),X_2 \sim \chi^2(n_2)X1χ2(n1)X2χ2(n2),则X1+X2∼χ2(n1+n2)X_1+X_2\sim\chi^2(n_1+n_2)X1+X2χ2(n1+n2)

1-5 信息增益(Information Gain)

A、熵:H(X)=−∑ipilog2pi=∑∣Di∣∣D∣log2∣Di∣∣D∣H(X)=-\sum_ip_ilog_2p_i=\sum\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}H(X)=ipilog2pi=DDilog2DDi
条件熵:H(Y∣X)=∑ipiH(Y∣X=xi)=∑i∣Dxi∣D∑j∣Dx=xi,y=yj∣∣Dx=xi∣log2∣Dx=xi,y=yj∣∣Dx=xi∣H(Y|X)=\sum_ip_iH(Y|X=x_i)=\sum_i\frac{|D_{x_i}|}{D}\sum_j\frac{|D_{x=x_i, y=y_j}|}{|D_{x=x_i}|}log_2\frac{|D_{x=x_i, y=y_j}|}{|D_{x=x_i}|}H(YX)=ipiH(YX=xi)=iDDxijDx=xiDx=xi,y=yjlog2Dx=xiDx=xi,y=yj
熵反映了特征所包含的信息量,值越大,信息量越多,不确定性越弱。但是变量的取值个数越多,信息量也会相对越大(均匀分布时熵最大)。因此熵、信息增益倾向于使取值多的特征的熵或信息增益变大。

B、信息增益:g(D,X)=H(D)−H(D∣X)=(−∑∣Di∣∣D∣log2∣Di∣∣D∣)−∑i∣Dxi∣D(−∑j∣Dx=xi,y=yj∣∣Dx=xi∣log2∣Dx=xi,y=yj∣∣Dx=xi∣)g(D, X)=H(D)-H(D|X)=(-\sum\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|})-\sum_i\frac{|D_{x_i}|}{D}(-\sum_j\frac{|D_{x=x_i, y=y_j}|}{|D_{x=x_i}|}log_2\frac{|D_{x=x_i, y=y_j}|}{|D_{x=x_i}|})g(D,X)=H(D)H(DX)=(DDilog2DDi)iDDxi(jDx=xiDx=xi,y=yjlog2Dx=xiDx=xi,y=yj)
C、信息增益率:gR(D,X)=g(D,X)HX(D),HX(D)=−∑i∣Dx=xi∣∣D∣log2∣Dx=xi∣∣D∣g_R(D,X)=\frac{g(D,X)}{H_X(D)},H_X(D)=-\sum_i\frac{|D_{x=x_i}|}{|D|}log_2\frac{|D_{x=x_i}|}{|D|}gR(D,X)=HX(D)g(D,X)HX(D)=iDDx=xilog2DDx=xi

1-4方差分析(F检验)

参考1 参考2
方差分析结果的显著只能说明两个及以上总体的均值之间存在显著性,但是不能分析出具体是那几个总体的均值不相等,所以还需要进行两两总体均值的比较。方差分析有单因素方差分析、多因素方差分析、协方差分析、多元方差分析、重复测量方差分析、方差成分分析等。
方差分析步骤:1、方差齐性检验;2、计算各项平方和与自由度;3、列出方差分析表,进行F检验,并依据F值对应的p值做出判断;4、事后多重比较。
一、单因素方差检验
主要用于区分一个分类变量的不同水平间均值是否有差异。不同水平就是不同样本组。

  1. 假设:A、每组样本服从正态分布;B、各组对应的样本方差是相等的,即方差齐性;C、各组样本相互独立

正态检验:一种是统计检验的方法:主要有基于峰度和偏度的SW检验、基于拟合度的KS、CVM、AD检验;另一种是用描述的方法:Q-Q图和P-P图、茎叶图,利用四分位数间距和标准差来判断。
方差齐性检验方法:方差比、Hartley检验、Levene检验、BF法、方差同质性(homogeneity of variance)检验方法

  1. 建立假设:H0:不同组的均值相同。H1:不同组的均值不相等或者不全等。
  2. 原理:
    样本与总体均值的差异来自两个方面:
    1)实验条件,即组间差异SSA=∑ikSSAi=∑ik∑j=1n(Xˉi−Xˉ)2SSA=\sum_i^k SSA_i=\sum_i^k\sum_{j=1}^n(\bar X_i-\bar X)^2SSA=ikSSAi=ikj=1n(XˉiXˉ)2Xij是第i组第j个样本,Xˉi是第i组的均值,Xˉ是整体样本的均值X_{ij}是第i组第j个样本,\bar X_i是第i组的均值,\bar X是整体样本的均值XijijXˉiiXˉ)。自由度是k-1。
    2)随机误差,即组内差异SSE=∑ikSSEi=∑ik∑j=1n(Xij−Xˉi)2SSE=\sum_i^k SSE_i=\sum_i^k\sum_{j=1}^n(X_{ij}-\bar X_{i})^2SSE=ikSSEi=ikj=1n(XijXˉi)2。自由度是n-k,n是样本总量,k是组数
    总体偏差平方和SST=SSA+SSE,MSA/MSE=SSA/(k−1)SSE/(n−k)∼F(k−1,n−k)MSA/MSE=\frac{SSA/(k-1)}{SSE/(n-k)} \sim F(k-1, n-k)MSA/MSE=SSE/(nk)SSA/(k1)F(k1,nk)。若处理没有作用,则各组据来自同一总体,此时MSA/MSE ≈\approx 1;若处理有效果,则组间差异较大,各样本来自不同总体,MSA远大于MSE。
  3. 示例:有两组数据,第一组:80、85、96;第二组:110、125、130、145、160
    总体数据的平均值Xˉ=(80+85+96+110+125+130+145+160)/8=116.375\bar X=(80+85+96+110+125+130+145+160)/8 = 116.375Xˉ=(80+85+96+110+125+130+145+160)/8=116.375
    第一组的平均值Xˉ1(80+85+96)/3=87\bar X_1(80+85+96)/3 = 87Xˉ1(80+85+96)/3=87;第二组的平均值Xˉ2=(110+125+130+145+160)/5=134\bar X_2=(110+125+130+145+160)/5 = 134Xˉ2=(110+125+130+145+160)/5=134
    组间平方和SSA=(87−116.375)2×3+(134−116.375)2×5=4141.875SSA= (87-116.375)^2×3 + (134-116.375)^2×5 = 4141.875SSA=(87116.375)2×3+(134116.375)2×5=4141.875
    组内平方和SSE=(80−87)2+(85−87)2+(96−87)2+(110−134)2+(125−134)2+(130−134)2+(145−134)2+(160−134)2=134+1470=1604SSE=(80-87)^2+(85-87)^2+(96-87)^2+(110-134)^2+(125-134)^2+(130-134)^2+(145-134)^2+(160-134)^2=134+1470=1604SSE=(8087)2+(8587)2+(9687)2+(110134)2+(125134)2+(130134)2+(145134)2+(160134)2=134+1470=1604
    总体平方和SST=SSA+SSE=(80−116.375)2+(85−116.375)2+(96−116.375)2+(110−116.375)2+(125−116.375)2+(130−116.375)2+(145−116.375)2+(160−116.375)2=5745.875SST= SSA + SSE=(80-116.375)^2+(85-116.375)^2+(96-116.375)^2+(110-116.375)^2+(125-116.375)^2+(130-116.375)^2+(145-116.375)^2+(160-116.375)^2=5745.875SST=SSA+SSE=(80116.375)2+(85116.375)2+(96116.375)2+(110116.375)2+(125116.375)2+(130116.375)2+(145116.375)2+(160116.375)2=5745.875
    组间均方MSA=SSA/自由度=4141.875/(2−1)=4141.875MSA = SSA/自由度 = 4141.875/(2-1) = 4141.875MSA=SSA/=4141.875/(21)=4141.875
    组内均方MSE=SSE/自由度=1604/(8−2)=267.333MSE = SSE/自由度 = 1604/(8-2) = 267.333MSE=SSE/=1604/(82)=267.333
    F=MSA/MSE=4141.875/267.333=15.4933F = MSA/MSE = 4141.875/267.333 = 15.4933F=MSA/MSE=4141.875/267.333=15.4933
  4. 将一个因素的不同水平拆分成多个变量,从而使用回归,通过回归系数可判断各水平的影响大小;通过回归的F统计量可判断整体是否有差异。

2、Wrapper方法(封装式)

直接把最后要使用的模型作为特征选择的评价函数,仅对部分模型方法有效,如决策树、随机森林等。但运行速度低于Filter方法。参考

3、Embedded方法(嵌入式)

将特征选择嵌入到模型训练当中,建模的同时进行特征选择。如使用L1、L2正则化;随机森林平均不出度减少法/平均精确度减少法;决策树。

1、Backward Feature Elimination(向后特征消除, recursive feature elimination递归特征消除)

可用来实现回归中的变量选择。

  1. 首先获取数据集中存在的所有n个变量,并使用它们训练模型
  2. 然后计算模型的性能
  3. 尝试逐个消除变量,在消除每个变量(n次)后计算模型的性能,即每次都丢弃一个变量并在剩余的n-1个变量上训练模型
  4. 确定其移除产生模型性能最小(或没有)变化的变量,然后删除该变量
  5. 重复此过程,直到不能删除任何变量
    在构建线性回归或Logistic回归模型时,可以使用此方法。

2、前向特征选择

是向后特征消除的相反过程。可以用F值(f_regression())进行检验:

  1. 从一个功能开始。 基本上,我们分别使用每个特征训练模型n次
    2。 选择性能最佳的变量作为起始变量
  2. 然后我们重复这个过程并一次添加一个变量。 保留产生最高性能增长的变量
  3. 重复这个过程,直到模型的性能没有显着改善
    注意:后向特征消除和前向特征选择都很耗时且计算量很大。它们实际上仅用于具有少量输入变量的数据集。

Python实现

特征初探

评价特征重要性

from sklearn.inspection import permutation_importance #0.22版后
permutation_importance(estimator, X, y, scoring=None, n_repeats=5, n_jobs=None, random_state=None,)

estimator指定模型实例(经fit()训练后的模型)。Xy是用于计算特征重要性的数据集(是对此数据通过改变特征对应的样本顺序,用训练出来的模型计算得分变化),对无监督学习y为None。n_repeats指定对一个特征计算重要性时打乱该特征数据顺序的次数。n_jobs指定并行任务数。random_state指定随机种子。返回importances_mean(各特征的重要性均值)、importances_std(各特征的重要性方差)、importances(各特征历次计算的重要性值)构成的字典。

特征的偏相关性

类似于统计中的边际效应,就是在控制其他变量不变的情况下,改变target feature的值,来看模型的fit结果如何变化。在一定程度上解决了指标重要度这个指标无法反应正负关系的问题。

inspection.partial_dependence(estimator, X, features, response_method='auto', percentiles=(0.05, 0.95), grid_resolution=100, method='auto', )

对有“predict_proba”方法的回归或者分类器都支持。
estimator是经fit()训练后的模型实例(要有predict()、predict_proba()或decision_function()方法),不支持多分类。X是训练集。features指定要计算偏相关的变量,数值或者字符串数组,如[0]、[(0,1)]。response_method指定预测的方法,有’auto’、‘predict_proba’、‘decision_function’。percentiles以元组指定计算网格的边界,在[0,1]间。grid_resolution网格中点的个数。method计算预测均值的方法,‘recursion’、‘auto’、‘brute’。

为偏相关性作图

inspection.plot_partial_dependence(estimator, X, features, feature_names=None, target=None, response_method='auto', n_cols=3, grid_resolution=100, percentiles=(0.05, 0.95),method='auto', n_jobs=None, verbose=0, fig=None, line_kw=None, contour_kw=None, ax=None,)

1、特征选择:过滤式

from sklearn import feature_selection

1-1、通过方差阈值选择特征

部分特征的变化对标签无影响时(方差变化很小),可将特征删除

from sklearn import feature_selection
feature_selection.VarianceThreshold(threshold=0.0)

指定方差阈值,将小于该阈值的特征都删除。默认删除有相同方差的特征。仅考虑了特征自身的变化情况。对0/1变量,其服从伯努利分布,方差为p(1-p)
方法variances_ 返回各特征的方差。
fit() transform()

1-2、 单变量选择

1-2-1使用可配置方法进行单变量选择

feature_selection.GenericUnivariateSelect(score_func=<function f_classif at 0x000001AE6FE176A8>, mode='percentile', param=1e-05,)

score_func是以X、y数组为输入,返回(得分, p值)的函数,当mode为’percentile’、‘kbest’时返回得分;函数如feature_selection.chi2卡方检验(分类任务中非负特征)、f_classif方差分析(分类任务中标签和特征间的方差分析)、f_regression(回归任务中标签和特征间的F检验)、mutual_info_regression(连续标签的回归)、mutual_info_classif等。mode指定选择特征重要性的方法,有’percentile’、‘k_best’、‘fpr’、‘fdr’、‘fwe’。param是浮点数或整数。
chi2 , mutual_info_regression , mutual_info_classif 可以处理稀疏数据并保持结果稀疏性
属性scores_各特征的得分。pvalues个特征的p值,若score_func仅返回得分则此项为None
方法fit() transform() fit_transform()

1-2-2按指定方法选择评价值最高的k个特征(卡方、F、互信息)

feature_selection.SelectKBest(score_func=<function f_classif at 0x0000020D98977268>, k=10)

score_func指定选择特征所用评价函数,如chi2、f_classif、mutual_info_classif、f_regression、mutual_info_regression。k指定要保留的特征个数,可以是整数或’all’。
属性scores_返回各特征的按指定方法所得的统计量值(得分)。pvalues_返回对应统计量的p值。
fit(X)拟合模型
score_func(X, y)计算方差分析的F值和p值。返回对象的F、pval属性行数同特征数
get_support(indices=False)返回所选特征的索引
transform(X)从X中选择选中的特征。
inverse_transform(X)逆transform操作,根据已选择的样本数据返回原始总体样本特征数据。
fit_transform(X, y) fit()和transform()的结合。

1-2-3按指定方法根据评价值分位数选择特征

通过评价函数结果的分位数做阈值来选择特征

feature_selection.SelectPercentile(score_func=<function f_classif at 0x000001AE6FE176A8>, percentile=10,)

score_func是以(X,y)为输入,返回(scores, pvalues)的函数,默认f_classif、chi2等。percentile指定阈值的分位数。注意,对有相同评价值的特征,可能会产生意想不到的结果。
方法fit_transform(X,y)

1-2-4通过将正确标签预测为错误标签的比例选择特征

feature_selection.SelectFdr(score_func=<function f_classif at 0x000001AE6FE176A8>, alpha=0.05,)

1-2-5通过将错误标签预测为正标签的比例选择特征

feature_selection.SelectFpr(score_func=<function f_classif at 0x000001AE6FE176A8>, alpha=0.05,)

1-2-6基于家族模型样本偏差率选择特征

它允许超参数搜索评估器来选择最好的单变量特征

feature_selection.SelectFwe(score_func=<function f_classif at 0x000001AE6FE176A8>, alpha=0.05,)

1-2-7卡方检验

# 方法一:
feature_selection.chi2(X, y) #做变量分箱时列是目标变量各水平,行是因变量各水平

属性chi2返回卡方值卡方值pval返回卡方值对应的p值。

# 方法二:
from  scipy.stats import chi2_contingency
chi2_contingency(kf_data) #输入数组,做变量分箱时列是目标变量各水平,行是因变量各水平

1-2-8、F检验(方差分析)

feature_selection.f_classif(X, y) #用于离散的y
feature_selection.f_regression(X, y, center=True) #用于连续的y

通过对变量做回归/分类,获取各变量的F统计量值,从而选择合适的特征。X是特征矩阵或稀疏矩阵。center指定是否先对进行标准化。
属性F返回每个特征对应的F统计量(说明该特征不同水平间是否有区别)。pval返回每个F值对应的p值

1-3、向后特征消除( recursive feature elimination递归特征消除)

对特征重要度进行排序,然后逐个剔除以判断对模型的影响

feature_selection.RFE(estimator, n_features_to_select=None, step=1, verbose=0,)
# from sklearn.linear_model import LinearRegression
# from sklearn.feature_selection import RFE
# from sklearn import datasets
# lreg = LinearRegression()
# rfe = RFE(lreg, 10)
# rfe = rfe.fit_transform(df, train.Item_Outlet_Sales)
# [(i, r) for i, j, r in zip(cols, rfe_model.support_, rfe_model.ranking_, rfe_model.scoring_) if not j]

给定一个外部的估计器,可以对特征赋予一定的权重(比如,线性模型的相关系数)。通过考虑越来越小的特征集合来递归的选择特征。会集成所用模型的方法,如fit、predict等。
1、评估器在初始的特征集合上面训练,特征的重要性通过coef_属性或者feature_importances_属性来获得。 然后,从当前的特征集合中移除最不重要的特征。在特征集合上不断的重复递归这个步骤,直到最终达到所需要的特征数量为止。estimator是估计器实例化对象,如SVC()、LogisticRegression()。n_features_to_select指定选择特征数。step每次删除的特征个数,当小于1时,每次去除权重最小的特征。verbose指定是否输出结果。
属性n_features_保留的特征个数。support_是否支持某一特征(True是支持,即保留)。ranking_各特征对应的排名。estimator_指定的拟合器。

feature_selection.RFECV(estimator, step=1, min_features_to_select=1, cv=None, scoring=None, verbose=0, n_jobs=None,)#带交叉验证

利用交叉验证(是对删除不同step个特征后的结果进行平均,不是不同行)进行网格搜索获取向后特征消除的最佳结果。如果减少特征会造成性能损失,那么将不会去除任何特征。用于选取单模型特征效果较好。

但也有几个缺点:

  1. 计算量大导致运行需要较长时间。
  2. 随着学习器的改变,最佳特征组合也会改变,有时会造成不利影响。所以适合在模型确定后进行特征再次选择。
  3. 在都没有达到最小特征数的情况下,更改最小特征数运行结果会发生变化。

scoring指定衡量模型好坏的评分方法。min_features_to_select最少保留特征数(如果模型有特征数量限制,如随机森林设置了最大特征数,则此变量需要大于等于该值)。
属性n_features_最终选择的最佳特征个数。grid_scores_网格搜索后历次迭代不同特征组合得到的score平均值。ranking_每个特征的得分。support_指示一个特征是否入选最后特征。

2、特征选择:封装式

2-1、从指定模型中进行特征选择

feature_selection.SelectFromModel(estimator, threshold=None, prefit=False, norm_order=1, max_features=None,)
# 也可以通过模型直接进行选择,如随机森林:
# importances = model.feature_importances_
# indices = np.argsort(importances)[-9:]  # top 10 features

estimator指定模型估计器,模型必须在拟合数据后有feature_importances_或coef_(回归中的系数)属性。threshold指定特征重要性阈值,仅保留≥\ge该值的特征,也可以是’median’、‘mean’从而以所有特征的该值作为阈值(也可是’1.25*mean’形式进行缩放)。prefit是否已进行拟合(模型已使用fit()),为True时要使用transform()且不能与cross_val_score()、GridSeachCV()及类似重复的估计器同时使用;为False时要先用fit()拟合再用transform()进行转换。norm_order指定当模型估计器coef_是二维数据时,用哪列与threshold进行比较。max_features指定选择后的做多特征个数,若不与threshold同时使用可将后者设置为np.inf。
属性estimator_返回模型(仅当模型是未用fit()时),可再获取’coef_’。threshold_返回阈值。
方法fit(X,y) transform() get_support()返回特征是否被选择。

二、特征预处理

对于数据的缩放,常用的有log变换(缓解拖尾情况)、标准化、归一化等,避免不同特征间度量单位差异造成统计特性失衡,具有相同重要性。

fom sklearn import processing

类可以被用到Pipeline中进行流处理。
对于数据变化较小的特征,还可以利用数据增强(将特征扩大N倍)来实现放大变化效果,从而查看特征对结果的影响。
1)当数据比较符合正态分布,需要使用距离、协方差来度量相似性时(如SVM、KNN)、或用PCA进行降维时,一般使用标准化;
2)在不涉及距离度量、协方差计算、数据不太符合正态分布时,一般用其他归一化方法;
3)基于树模型的方法一般不需要进行特征的归一化,如随机森林。

1-1 标准化:常规标准化

类实现

preprocessing.StandardScaler(copy=True, with_mean=True, with_std=True)

可用于稀疏矩阵(行csr或列csc)。fit()拟合的均值和方差被存储起来供之后transform()进行转化,或是直接用fit_transform()进行拟合转化。
copy指定是否复制转换时的数据,False将用转换后的数据替换转换前的数据(对非NumPy数组或scipy.sparse CSR矩阵仍将复制)。with_mean是否减去均值进行中心化(对稀疏矩阵无效并将引发异常,否则将改变稀疏矩阵结构)。with_std是否除以标准方差进行标准化。
属性scale_用数据进行归一化拟合后的值(fit()中X对应的处理结果) mean_每个特征的均值 var_每个特征的方差 std_标准方差。n_samples_seen_被处理器处理的样本量,会随fit()的样本而变化,但不会最partial_fit()的样本变化
方法fit(X)对样本X(数组)进行拟合获得均值和方差。X可以是scipy.sparse.csr_matrix()行或scipy.sparse.csc_matrix()列产生的系数矩阵(with_mean要设为False)。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。
inverse_transform(X, copy=None)对标准化的数据X反向根据训练数据的均值和方差获得对应的原始数据。
get_params()获取对象参数。set_params()设置参数。
partial_fit(X)在线fit方法。适用于大数据或从数据流获取的数据。

函数实现

processing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)

X按指定轴元素方向进行标准化。with_mean是否中心化。with_std是否标准化。copy是否复制数据。
属性scale_标准化后的特征的值 mean_每个特征的均值 var_每个特征的方差 n_samples_seen_被处理器处理的样本量,会随fit()的样本而变化,但不会最partial_fit()的样本变化

1-2 标准化:根据分位点内的数据计算均值和方差,再对总体数据进行标准化

类实现

preprocessing.RobustScaler(with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)

通过指定上下分位点来获取数据计算均值和方差,再依此对总体数据进行标准化,从而剔除异常值影响。
with_centering是否在标准化前减去均值(中心化)。with_scaling是否进行标准化。quantile_range指定上下界的分位点(0,100)。copy指定是否复制转换时的数据,False将用转换后的数据替换转换前的数据。
方法fit(X)对样本X进行拟合获得分位点内的均值和方差。X可以是scipy.sparse.csr_matrix()行或scipy.sparse.csc_matrix()列产生的系数矩阵(with_mean要设为False)。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。
inverse_transform(X, copy=None)对标准化的数据X反向根据训练数据的均值和方差获得对应的原始数据。

函数实现

preprocessing.robust_scale(X, axis=0, with_centering=True, with_scaling=True, quantile_range=(25.0, 75.0), copy=True)

1-3 离差标准化:根据最值进行转换

preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True)

容易受到异常值的影响。将特征归一化到feature_range指定的范围内( Xscaled=X−Xminaxis=0Xmaxaxis=0−Xminaxis=0∗(max−min)+min)X_{scaled}=\frac{X-X_{min}^{axis=0}}{X_{max}^{axis=0} - X_{min}^{axis=0}}* (max-min)+min)Xscaled=Xmaxaxis=0Xminaxis=0XXminaxis=0(maxmin)+min)) 。copy指定是否复制转换时的数据,False将用转换后的数据替换转换前的数据。
属性scale_用数据进行归一化拟合后的值(fit()中X对应的处理结果) mean_每个特征的均值 var_每个特征的方差 n_samples_seen_被处理器处理的样本量,会随fit()的样本而变化,但不会最partial_fit()的样本变化。min_每个特征的最小调整。data_min_data_max_每个特征的最值。data_range_每个特征的范围。
方法fit(X)对样本X进行拟合,获得各特征的最值。
partial_fit(X, y=None)主要用于输入数据是数据流时,会将数据作为块进行处理。X指定拟合的数据。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X(数组)进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体,返回数组。
inverse_transform(X, copy=None)对标准化的数据X反向根据训练数据的均值和方差获得对应的原始数据。

函数实现

preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True)

1-4 归一化:用最大绝对值归一化到[-1,1]

类实现

preprocessing.MaxAbsScaler(copy=True)

不会对数据进行偏移,也不会改变稀疏性。可以用于稀疏CSR或CSC矩阵。 Xscaled=X∣Xmaxaxis=0∣X_{scaled}=\frac{X}{|X_{max}^{axis=0}|}Xscaled=Xmaxaxis=0X
copy指定是否复制转换时的数据,False将用转换后的数据替换转换前的数据。
属性max_abs_返回最大离差
方法fit(X)对样本X进行拟合获得特征的最大值。
partial_fit(X, y=None)主要用于输入数据是数据流时,会将数据作为块进行处理。X指定拟合的数据。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。
inverse_transform(X, copy=None)对标准化的数据X反向根据训练数据的均值和方差获得对应的原始数据。

函数实现

preprocessing.maxabs_scale(X, axis=0, copy=True)

1-5 非线性转换:用分位数信息转换到[0,1]

类实现

preprocessing.QuantileTransformer(n_quantiles=1000, output_distribution="uniform", ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=True)

将数据转换为均匀分布或正态分布。会破坏特征间的相关性和距离。可以减少异常值的影响。
n_quantiles指定要计算的分为点数。ouput_distribution指定输出数据的分布,"uniform"均匀分布或"normal"正态分布。ignore_implicit_zeros是否忽略系数矩阵中的0。subsample估计分位点时所用的样本量。random_state指定随机种子。copy指定是否复制转换时的数据,False将用转换后的数据替换转换前的数据。
方法fit(X)对样本X进行拟合获得分位数。
partial_fit(X, y=None)主要用于输入数据是数据流时,会将数据作为块进行处理。X指定拟合的数据。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。
inverse_transform(X, copy=None)对标准化的数据X反向根据训练数据的均值和方差获得对应的原始数据。

函数实现

preprocessing.quantile_transform(X, axis=0, n_quantiles=1000, output_distribution=’uniform’, ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=False)

1-6 非线性转换:Yeo-Johnson转换或Box-Cox转换到最相似的正态分布

Yeo-Johnson转换:λ\lambdaλ决定最大似然估计

Box-Cox转换:只能对正值进行处理。λ\lambdaλ决定最大似然估计

类实现

preprocessing.PowerTransformer(method="yeo-johnson", standardize=True, copy=True)

method指定转换方法,有"yeo-johnson"和"box-cox"。standardize是否将结果进行标准化(0均值、单位方差)
方法fit(X)对样本X进行拟合。
partial_fit(X, y=None)主要用于输入数据是数据流时,会将数据作为块进行处理。X指定拟合的数据。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。
inverse_transform(X, copy=None)对标准化的数据X反向根据训练数据的均值和方差获得对应的原始数据。

函数实现

preprocessing.power_transform(X, method="warn", standardize=True, copy=True)

1-7 正则化:将行方向的向量缩放到单位范数

如果后面要使用如点积或其他核方法计算两个样本间的相似性时,该方法很有用。主要思想是对样本计算其p-范数,然后对该样本中每个元素除以该范数X′=x∑xi2X'=\frac{x}{\sqrt{\sum x_i^2}}X=xi2

x。主要用在文本分类和聚类中,如对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。
∣∣X∣∣p=(∣x1∣p+∣x2∣p+...+∣xn∣p)1p||X||_p=(|x1|^p+|x2|^p+...+|xn|^p)^{\frac{1}{p}}Xp=(x1p+x2p+...+xnp)p1

preprocessing.Normalizer(norm="l2", copy=True)

norm指定正则化方法,有对样本"l1"、“l2”、“max”,为0时对变量进行正则化。
方法fit(X)对样本X进行拟合。
partial_fit(X, y=None)主要用于输入数据是数据流时,会将数据作为块进行处理。X指定拟合的数据。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。

函数实现

preprocessing.normalize(X, norm="l2", axis=1, copy=True, return_norm=False)

1-8 Box-Cox变换

KNN、贝叶斯、回归要求特征是正态分布的。
在做线性回归的过程中,一般线性模型假定; Y=Xβ + ε, 其中ε满足正态分布,但是利用实际数据建立回归模型时,个别变量的系数通不过。例如往往不可观测的误差 ε 可能是和预测变量相关的,不服从正态分布,于是给线性回归的最小二乘估计系数的结果带来误差,为了使模型满足线性性、独立性、方差齐性以及正态性,需改变数据形式,故应用box-cox转换。变换之后,可以一定程度上减小不可观测的误差和预测变量的相关性。

from sklearn.preprocessing import PowerTransformer
PowerTransformer(method='box-cox', standardize=False, copy=True) #变换可以将来自不同分布的数据映射到正态分布stats.boxcox(data1)[0] #对数据进行BOX-COX变换

方法lambdas_ 得到一个浮点数组,转换过程中所选择的参数
method :可选,接受一个字符串值,默认是’yeo-johnson’(指明幂变换方式以 Yeo-Johnson transform方式实现,此种方式下数据集可以含有正负值)、‘box-cox’(指明幂变换方式以the Box-Cox transform 方式实现,此种方式下数据集只能是正值,不允许有负值);Box-Cox变换对于lognormal and chi-squared分布,表现好于Yeo-Johnson变换。standardize可选,接受一个boolean值,默认是 ‘True’ ,设置为True可将零均值单位方差归一化应用于变换后的输出
copy :是否复制数据

2 转换编码

2-1 将变量值转换为0~N-1的值

将变量按水平个数编码成0~N-1的值。隐含假设,不同类别间存在一种顺序关系。

preprocessing.LabelEncoder()

属性classes_类别的数组。对应的编码从0开始。
方法fit(y)y是变量中的唯一值,将其作为分类的依据
transform(y)用于按照fit()中的唯一值将指定变量y转换为对应的0~N-1值
inverse_transform(y)逆向转换编码成原数据。

2-2 分类变量编码:0/1哑变量编码(独热编码)

将一个分类特征的各水平用(1,0,0,0,…)进行编码,从过二值化的方式生成n个新的特征,每个新特征对应一个类别,是该类别时标记为1,不是则标记为0。
只能用于数值性变量,而不能用于字符串型变量。对字符串型变量,可以先用LabelEncoder()转换成连续数值型,再进行独热编码
对种类较多的变量,有时也可以仅对其中部分值进行onehot编码。
onehot编码也可用pd.get_dummies()直接实现。

preprocessing.OneHotEncoder(n_values=None, categorical_features=None, categories=None, sparse=True, dtype=<class ‘numpy.float64’>, handle_unknown=’error’)

n_values指定每个变量值的个数,"auto"自动识别、整数(最大变量值个数)、数组(每个变量的之个数)。categories_features指定要转换的分类变量的索引,或布尔值序列选择列,"all"所有列。categories表示每个特征的类别,可以是"auto"自动分析、值列表(按顺序各列。dtype转换成的数据类型,默认np.float64。sparse是否返回为稀疏矩阵,为False时返回正常数组。handle_unknown指定做转换时对未知水平的处理方式,"error"产生异常、"ignore"忽略该水平。
属性active_features_被使用的分类变量列表。feature_indices_被使用的特征对应的列索引。n_values_各特征中最大的水平个数。
方法fit(X)对样本X进行拟合。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。
get_feature_names()返回输出特征的名称。

2-3 标签二值化

功能类似OneHotEncoder(),但可以直接对字符串型变量进行编码

from sklearn.preprocessing import LabelBinarizer
LabelBinarizer(neg_label=0, pos_label=1, sparse_output=False)

2-4 多标签二值化

是标签二值化的拓展,一个特征的每个值,实际是由多个标签构成的。如兴趣爱好(‘健身’, ‘电影’, ‘音乐’)

from sklearn.preprocessing import MultiLabelBinarizer
MultiLabelBinarizer(classes=None, sparse_output=False)

classes是标签类别的顺序,从而各列分别表示一个值。如[(‘健身’, ‘电影’), (‘音乐’, )]会被表示成[[1,1,0],[0,0,1]]

2-5 平均数编码

参考
平均数编码是一种有监督的编码方式,主要使用经验贝叶斯方法,适用于分类和回归问题,若一个特征是定性的,且水平数很多(如家庭地址),可以用此方法。
先验概率:数据点属于标签yyy的某一分类targettargettarget的概率:P(y=target)P(y=target)P(y=target)
后验概率:在特征variablevariablevariable的某一分类水平kkk下,数据点属于标签yyy的某一分类targettargettarget的概率:P(y=target∣variable=k)P(y=target|variable=k)P(y=targetvariable=k),由此对变量variable可得到C-1列(比实际分类少一个,因为∑=1\sum=1=1)。
最终编码的概率估算:利用估算的先验概率和后验概率来计算编码所用概率P^\hat PP^,而不是已知数据的平均值1C\frac{1}{C}C1
P^=λ∗P(y=target)+(1−λ)P(target=y∣variable=k)\hat P=\lambda*P(y=target)+(1-\lambda)P(target=y|variable=k)P^=λP(y=target)+(1λ)P(target=yvariable=k),其中λ(n)=11+e(n−k)/f\lambda(n)=\frac{1}{1+e^{(n-k)/f}}λ(n)=1+e(nk)/f1是先验概率的权重,其中nnn是特征类别的个数,kkk是特征的某一类别kkk出现的次数,fff是控制在拐点附近的斜率,值越大,坡越缓。
n=kn=kn=k时,λ=0.5\lambda=0.5λ=0.5;当n>kn \gt kn>k时,λ<0.5\lambda \lt 0.5λ<0.5若测试集中出现了新的特征类别(围在训练样本中出现),则λ=1\lambda=1λ=1;一个特征类别在训练集内出现的次数越多,后验概率的可信度就越高,其权重也越大。
下图是k=1k=1k=1时不同fff对权重函数的影响情况。

2-6 将有序分类变量编码为整数数组

preprocessing.OrdinalEncoder(categories='auto', dtype=<class 'numpy.float64'>,)

从0开始对分类变量各水平逐个进行编码转换为数值。categories指定分类策略,'auto’从训练集中自动决策(按训练集中各水平出现的顺序指定转换后对应的列)、水平列表(第i个是期望第i列水平)。dtypes指定输出的数据类型,默认np.float64。
方法:fit(X) transform() fit_transform() inverse_transform()

2-7 自定义数据转化函数(用到管道中)

preprocessing.FunctionTransformer(func=None, inverse_func=None, validate=None, accept_sparse=False, pass_y=’deprecated’, check_inverse=True, kw_args=None, inv_kw_args=None)

func是自定义数据转换函数。inverse_func用于逆转结果的函数。validate在调用func前是否对输入X进行检查(转换为二维数组或稀疏矩阵)。accept_sparse指定func是否接受稀疏矩阵作为输入。pass_y用transform进行转换时是否有输入y。check_inversekw_args以字典传递给func的参数。inv_kw_args以字典传递给inverse_func的参数。
方法fit(X) transform(X) fit_transform(X)

3 特征衍生:生成交互整(如多项式)

根据fit()方法的输入值如(X1,X2,X3)(X_1, X_2, X_3)(X1,X2,X3)生成多项式(1,X1,X2,X3,X12,X1X2,X1X3,X22,X2X3,X32,X1X2X3)(1, X_1, X_2, X_3, X_1^2, X_1X_2, X_1X_3, X_2^2, X_2X_3, X_3^2, X_1X_2X_3)(1,X1,X2,X3,X12,X1X2,X1X3,X22,X2X3,X32,X1X2X3)对应的数据数组,会对所有变量的进行由低到高次幂的组合。

preprocessing.PolynomialFeatures(degree=2, interaction_only=False, include_bias=True)

degree指定多项式的幂次,默认2。interaction_only是否只生成交互项,非交互项(如a2a^2a2)将被省略,默认False。include_bias是否包含截距项,默认包含。
属性powers_输入特征个数与输出特征构成的数组。
方法fit(X) transform(X) fit_transform(X)

4 连续变量离散化原则

最大差异最大化;组内差异最小;每组占比不低于5%;必须包含有目标标签。分箱后的变量对因变量要有影响
优势:

  1. 特征对异常数据有很强的鲁棒性,降低过拟合风险。
  2. 增强线性模型的表达能力,单变量离散为多个后相当于引入了非线性,能够提升模型的表达能力。
  3. 离散化后可进行特征的交叉。

方法:

  1. 等频划分,如每100个样本一组。
  2. 等宽划分,如每隔10划分为一组。
  3. 特殊点划分,如用四份位点进行划分。
  4. 合并:先将数据分为小份,然后两两合并,判断合并效果(卡方检验、信息增益);
  5. 分割:选择合适分割点将数据一分为二,判断合并效果
  6. K均值聚类分箱:对待分箱特征进行归一化处理;用灯具发设定初始聚类中心进行聚类;将得到的相邻的聚类中心点的中心作为分类的划分点;重新计算每个聚类中心,然后重新划分数据,知道每个聚类中心不在变化,得到最终的聚类结果。
  7. 最小熵法分箱:通过二分法逐渐进行划分,每次都用信息增益或信息增益率来选择最佳分割点。

4-1 连续变量离散化:等距分箱

preprocessing.KBinsDiscretizer(n_bins=5, encode="onehot", strategy="quantile")

分箱是从负无穷到正无穷。
n_bins指定分箱个数。encode指定数据经分箱后的编码方式(输出),“onehot”(0/1编码,返回稀疏矩阵,其他特征在有右侧)、 “onehot-dense”(0/1编码,返回数组)、"ordinal"返回识别各分箱的整数数组。strategy识别分箱宽度的方法,"uniform"等距、"quantile"等分位数、"kmeans"k均值聚类。可用sklearn.compose.ColumnTransformer实现仅对部分特征的离散化处理
属性n_bins_分箱个数 bin_edges_分箱的边界。
方法fit(X)对样本X进行拟合。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。

4-2 连续变量离散化:根据阈值进行0/1化

类实现

preprocessing.Binarizer(threshold=0.0, copy=True)

若输入为稀疏矩阵,则仅非0值会被转换。
threshold指定阈值,大于该值的设置为1,小于等于该值的设置为0。
方法fit(X)对样本X进行拟合(实际什么也不做,仅在transform()进行转换)。
transform(X, copy)根据拟合后的均值和方差对数据X进行转化。
fit_transform(X, y=None, **fit_params)对样本X进行拟合获得均值和方差,并进行数据的转化。y指定要从X中进行转换的样本的索引。是fit().transform()的合体。

函数实现

preprocessing.binarize(X, threshold=0.0, copy=True)

4-3 卡方分箱(对分类变量的不同水平进行合并)

对连续变量,判断相邻的两个区间是否有分布差异。用于分类变量间的独立性检验,衡量实际值和理论值的差异程度。
【卡方检验理论】若K各独立的随机变量满足标准正态分布,则这K个随机变量的平方和服从自由度为k的卡方检验。
χ2=∑i∑j(Aij−Eij)2Eij\chi^2=\sum_i\sum_j\frac{(A_{ij}-E_{ij})^2}{E_{ij}}χ2=ijEij(AijEij)2
AijA_{ij}Aij是第iii区间第jjj类的实例的数量,Eij=Ni∗CjNE_{ij}=\frac{N_i*C_j}{N}Eij=NNiCjAijA_{ij}Aij的期望频率,NNN是总样本数,NiN_iNi是第iii组的样本数,CjC_jCj是第jjj类样本在全样本中的比例。
拒绝原假设说明独立,可以合并,接受原假设说明不独立,不能合并。

步骤:(0) 预先设定一个卡方的阈值;
(1)根据要离散化的属性对样本进行排序;每个实例属于一个区间;
(2)合并区间:
1.计算每一对相邻区间的卡方值;
2.将卡方值最小的一对区间合并;

分箱限制:
(1)限制最终的分箱个数,最大分箱个数一般取10到15个;
(2)卡方阈值:迭代合并直到最小卡方值超过设定阈值为;

# 方法一:
from  scipy.stats import chi2_contingency
chi2_contingency(kf_data) #输入二维数组,列是目标变量各水平,行是因变量各水平
#方法二:
from sklearn import feature_selection
feature_selection.chi2(X, y)

4-4 分箱效果检验:WOE和IV

在通过最大信息增益、信息增益率等方法确定分割点后。可以再用IV进行检验分箱效果,判断单个变量的预测能力
IV(informatin value):IV值衡量单个变量的预测能力,用于连续变量的分箱。
IV=∑(BiB−GiG)∗WOEiIV=\sum(\frac{B_i}{B}-\frac{G_i}{G})*WOE_iIV=(BBiGGi)WOEi,其中WOEi=ln(Bi/BGi/G)=ln(Bi/GiB/G)WOE_i=ln(\frac{B_i/B}{G_i/G})=ln(\frac{B_i/G_i}{B/G})WOEi=ln(Gi/GBi/B)=ln(B/GBi/Gi)
WOEWOEWOE反映的是在自变量每个分组下坏人对好人的比例,和总体中坏人对好人的比例之间的差异。WOEWOEWOE值越大,说明这一分组效果越好,越能区分响应和未响应样本。WOE≤0WOE \le 0WOE0说明分组后还不如原来总体响应能力。
IV是BiB−GiG\frac{B_i}{B}-\frac{G_i}{G}BBiGGi的加权原因:乘后可以保证WOE和是正值;体现了变量当前分组中个体的数量占整体个体数量的比例,对变量预测能里的影响(对WOE进行了量的加权)。参考

范围 质量
<0.03 无预测能力
0.03~0.1
0.1~0.3
0.3~0.5
>= 0.5 极高(值得怀疑)

三、抽取特征对应的值

from sklearn import feature_extraction

中文分词可用jieba(见有道云笔记re模块中的笔记)

3-1 将字典数据转换为数组

feature_extraction.DictVectorizer(dtype, separator="=", sparse=True, sort=True)

sparse为False时返回数组,True时返回scipy.sparse矩阵(对一个数组中的数据,仅用索引元组和具体值表示数组中对应位置的非0和非空数据,可用toarray()转为数组),如
sort是否将返回的属性feature_names_和vocabulary_进行排序。
属性feature_names_特征名的列表(顺序同sparse=False输出数组时的列顺序) vocabulary_映射特征名称对应索引例的字典
方法fit_transform(X)(之后常跟toarray()方法)将字典转换成Numpy的数组或scipy.sparse的矩阵(数据框的values)。X是字典或包含字典的迭代器(如字典构成的列表)。返回sparse矩阵。对值是字符串的特征,将会被转换为"特征=值"的形式作为列名,值用1表示是0为否。
get_feature_names()获取特征列表,顺序同sparse=False时的列顺序。
inverse_transform(X)X时数组或sparse矩阵。返回转换之前的字典格式。
transform(X)按照之前的标准对X进行转换

3-2 文本特征

从分词后的结果数据(一个文档的不同词以空格拼接)中获取词频用CountVectorizer(),返回结果是X;之后可以对X用TfidfTransformer()获取tf-idf值;也可以直接用TfidfVectorizer()对分词分词后的文档直接进行处理。

从向量中进行词的拆分(空格)并统计个数

feature_extraction.text.CountVectorizer(input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern='(?u)\\b\\w\\w+\\b', ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class 'numpy.int64'>,)

不支持中文分词。参考
token_pattern指定获取词的正则表达式。stop_words指定停用词列表。ngram_range以元组(最少个数, 最多个数)控制分词时单词个数(多少个单词视为一个词)。分词模式有三种:单个词语级别TF-IDF(矩阵代表了每个词语在不同文档中的TF-IDF分数);多个词N-gram级别TF-IDF(N-grams是多个词语在一起的组合,这个矩阵代表了N-grams的TF-IDF分数);词性级别TF-IDF(矩阵代表了语料中多个词性的TF-IDF分数)。
方法fit_transform(X)统计的各词的词频数。X是文档矩阵(每行一个文档)或包含文本字符串的可迭代对象。不会对单个字母进行统计。拟合并转换后返回词频的sparse矩阵,
get_feature_names()获取分词后的单词。
inverse_transform(X)X是数组或sparse矩阵。返回转换之前的单词列表。
todense() 将稀疏矩阵返回为numpy的array,每行对应X列表中的一个元素。也可以是toarray()

TF-IDF(Term Frequency-Inverse Document Frequency词频-逆文档频率)

feature_extraction.text.TfidfVectorizer(input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, analyzer='word', stop_words=None, token_pattern='(?u)\\b\\w\\w+\\b', ngram_range=(1, 1), max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class 'numpy.float64'>, norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False,)

对中文需要先分词,在用特定分隔符合并,用token_pattern指定分词方式。TfidfVectorizer并不适用朴素贝叶斯算法(sklearn的多项式朴素贝叶斯需要文本的表示采用CountVectorizer类),TfidfVectorizer默认行向量是单位化(行和为1)后的,适用于线性模型。训练集与测试集的比例会影响词项的idf值计算(TfidfVectorizer默认输入文本矩阵每行表示一篇文本,不同文本中相同词项的tf值不同,因此tf值与词项所在文本有关,idf值与数据集文本数和包含词项的文本数有关,因此应先拆分数据集用训练集训练后,在对测试集计算TF-IDF)。逆文档频率没有考虑类词项在类别间的分布,idf值只是考虑了词项在所有文本间的分布特性,并不涉及类别,因此TfidfVectorizer的输入也不需要提供类别信息。
TF-IDF思想:如果某次或短语在一片文章中出现的概率高,并且在其他文章中很少出现,则认为该词或短语具有很好的类别区分能力,主要用于评估一个词对于词料库的重要性。Term Frequency词频:一个词在一篇文档中出现的次数文档中出现次数最多的词的次数\frac{一个词在一篇文档中出现的次数}{文档中出现次数最多的词的次数}(有的不除以分母),sklearn中TF(某词t,某文档d)=一个词在一篇文档中出现的次数TF(某词t, 某文档d)=一个词在一篇文档中出现的次数TF(t,d)=。Inverse Document Frequency逆文档频率:log⁡(文档中词的总数量该词出现的文档数+1)\log(\frac{文档中词的总数量}{该词出现的文档数+1})log(+1),sklearn中是平滑版IDF=log训练文档个数+1包含该词的文档数+1+1log\frac{训练文档个数+1}{包含该词的文档数+1}+1log+1+1+1,非平滑版IDF(某词t)=log训练文档个数包含该词的文档数+1IDF(某词t)=log\frac{训练文档个数}{包含该词的文档数}+1IDF(t)=log+1TF−IDF=TF∗IDFTF-IDF=TF*IDFTFIDF=TFIDF(有的不加1),用于评价词的重要性。TF-IDF向量可以由不同级别的分词产生:单个词语级别TF-IDF(矩阵代表了每个词语在不同文档中的TF-IDF分数);多个词N-gram级别TF-IDF(N-grams是多个词语在一起的组合,这个矩阵代表了N-grams的TF-IDF分数);词性级别TF-IDF(矩阵代表了语料中多个词性的TF-IDF分数)。返回词的权重矩阵。参考
input指定输入内容方式,'content’文本(文档)、'filename’文件名, ‘file’有"read"方法的对象(类似文件的对象)。encoding指定编码方式。decode_error指定遇到文本解码错误时对文本的处理方法,‘ignore’忽略本条文档数据、‘strict’、‘replace’。strip_accents在预处理步骤中去除编码规则(accents),“ascii"是一种快速的方法,仅适用于有一个直接的ASCII字符映射,“unicode"是一个稍慢一些的方法,None(默认)什么都不做。lowercase在令牌标记前转换所有的字符为小写。preprocessor是callable或 None,当保留令牌和”n-gram“生成步骤时,覆盖预处理(字符串变换)的阶段。tokenizer是callable或 None,当保留预处理和n-gram生成步骤时,覆盖字符串令牌步骤。analyzer定义特征为词’word’或’n-gram’字符,如果传递给它的调用被用于抽取未处理输入源文件的特征序列。stop_words指定停用词,如果未english,用于英语内建的停用词列表,如果未list,该列表被假定为包含停用词,列表中的所有词都将从令牌中删除, 如果None,不使用停用词;max_df可以被设置为范围[0.7, 1.0)的值,基于内部预料词频来自动检测和过滤停用词。 token_pattern使用正则表达式来分词,其默认参数为r”(?u)\b\w\w+\b”,其中的两个\w决定了其匹配长度至少为2的单词,默认值只匹配长度≥2的单词,一般来说,长度为1的单词在英文中一般是无足轻重的,但在中文里,就可能有一些很重要的单字词,所以设置匹配规则为:token_pattern=r"(?u)\b\w+\b";仅当analyzer == ‘word’时才被使用。ngram_range要提取的n-gram的n-values的下限和上限范围,将text分成min,min+1,min+2,…max 个不同的词组(比如’Python is useful’中ngram_range(1,3)之后可得到’Python’ ‘is’ ‘useful’ ‘Python is’ ‘is useful’ 和’Python is useful’如果是ngram_range (1,1) 则只能得到单个单词’Python’ ‘is’和’useful’)。min_dfmax_df设置文档频次,从而实现特征选择,当构建词汇表时,严格忽略低于/高于给出阈值的文档频率的词条,语料指定的停用词;如果是浮点值,该参数代表文档的比例,整型绝对计数值,如果词汇表不为None,此参数被忽略。max_features指定最大特征(词项)个数。vocabulary是词典索引,例如vocabulary={“我”:0,“喜欢”:1,“相国大人”:2},原则上应与输出一致;max_df和min_df在给定vocabulary参数时会失效。binarydtypenorm指定计算每个文档对应的TF-IDF后,对数据进行归一化的方法,‘l2’是vv12+v22…\frac{v}{\sqrt{v_1^2+v_2^2…}}v12+v22

v,另外’l1’、None。use_idf启动inverse-document-frequency重新计算权重。smooth_idf 计算idf的时候log(分子/分母)分母有可能是0,smooth_idf会采用log(分子/(1+分母))的方式解决。sublinear_tf计算tf值采用亚线性策略,比如以前算tf是词频,现在用1+log(tf)来充当词频。
方法:
get_feature_names()对拟合后的数据获取单词列表(VSM矩阵的列名,顺序同数组列顺序)

vocabulary_获取各词项对应的词频
idf_查看计算好的每个词的idf
fit()进行拟合,
transform(x)利于X是文本或包含文本字符串的可迭代对象拟合的模型。(会用到训练样本集中包含词的量来计算idf;df是只利用x计算词项出现频次)来对新输入项计算td-idf值。对于短文本来说,tfidf值中的tf部分大部分只能取0和1,数值区别的地方在于idf值,而对于同一个词项来说idf值不管在什么测试文本上都是一样的,它只是相当于给每个特征词赋予了一个权值,这个权值会减小那些常见词语,提高不太常见的词语。参考
fit_transform(X)拟合并转换,X是文本或包含文本字符串的可迭代对象。构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式。返回sparse矩阵(可用toarray()转为数组)。返回对象有toarray()查看输入文本列表的分词后产生的VSM矩阵。
inverse_transform(X)X是数组或sparse矩阵。返回转换之前的单词列表。

feature_extraction.text.TfidfTransformer()
feature_extraction.text.HashingVectorizer()

特征散列化

feature_extraction.FeatureHasher(n_features=None, input_type='string)

四、特征构造

1、多变量融合

2、分箱计数的优势比和对数优势比

优势比通过定义在两个二值变量之间,用于衡量两个变量间联系强度:“当X为真时,Y在多大程度上更可能为真?”。使用时,如:”A点击广告的概率在多大程度上高于他不点击广告的概率”和“其他人点击广告的率在多大程度上高于他们不点击广告的概率”这两个问题的比。计算时要使用双向列联表:

用户 点击 未点击 总计
A 5 120 125
不是A 995 18880 19875
总计 1000 19000 20000
优势比(用户A,点击)=$\frac{P(Y=1 X=1)/P(Y=0 X=1)}{P(Y=1)/P(Y=0 X=0)}=frac{(5/125)/(120/125)}{(995/19875)/(18880/19875)}=0.17906$,可理解为个例与平均的差距,对其他样例也做同样处理。

也适用于具有多个值的大型大型分类变量:优势比(用户,点击)=5/125120/125=0.04166\frac{5/125}{120/125}=0.04166120/1255/125=0.04166
由于概率比值容易特别小或特别大,所以可以 等号两边同时取对数,从而转换为对数优势比。

对稀有类进行融合生成一个新类别(back-off分箱)

对分类变量,某些类别数据量会特别少,可将其单独作为一类,或是作为几类处理,此方法成为back-off。于此同时,还可以再添加一个特征用来指示样本是否进行了back-off分箱

对分类问题用聚类方法进行特征化

通过现有的全部特征或部分特征,通过无监督的聚类方法进行聚类,生成一个含有多个种类的特征,从而衍生新的特征或替换原有特征。在进行聚类时,也可以先将标签作为特征,待聚类后获取类的中心点,从而以此中心点作为初始化中心点,再次利用没有标签的特征重新训练数据进行类。
除用生成的类别作为特征,也可以用样本距离其所属类中心的距离的倒数作为特征(距中心越近重要性越强)

2-1、特征:特征选择、特征预处理(缩放)、特征抽取、特征构造相关推荐

  1. ML之FE之FS:特征工程/数据预处理—特征选择之利用过滤式filter、包装式wrapper、嵌入式Embedded方法(RF/SF)进行特征选择(mushroom蘑菇数据集二分类预测)最全案例应用

    ML之FE之FS:特征工程/数据预处理-特征选择之利用过滤式filter.包装式wrapper.嵌入式Embedded方法(RF/SF)进行特征选择(mushroom蘑菇数据集二分类预测)案例应用 利 ...

  2. EOF-DataScience:数据预处理/特征工程之线性变换—四种特征缩放Scaling算法简介、标准化standardization、归一化Normalization的概述与区别

    DataScience:数据预处理/特征工程之线性变换-四种特征缩放Scaling算法简介.标准化standardization.归一化Normalization的概述与区别 目录 数据处理中常见的四 ...

  3. 大厂面试机器学习算法(0):特征工程 | 数据预处理

    文章目录 数据分桶(分箱) 卡方分桶 等距分桶 等频分桶 聚类分桶 无量纲化 数据规范化 数据正则化 数据清洗 数据缺失 噪音数据 数据不一致 特征选择与特征提取 特征选择 特征提取 数据分桶(分箱) ...

  4. 图像算法九:【图像特征提取】特征降维、PCA人脸特征抽取、局部二进制

    PCA数学理论: 关于PCA的理论,资料很多,公式也一大把,本人功底有限,理论方面这里就不列出了.下面主要从应用的角度大概来讲讲具体怎么实现数据集的降维. 把原始数据中每个样本用一个向量表示,然后把所 ...

  5. python特征选择后显示选取的特征名_特征选择 (feature_selection)

    特征选择 (feature_selection) 本文主要参考sklearn(0.18版为主,部分0.17)的1.13节的官方文档,以及一些工程实践整理而成. 当数据预处理完成后,我们需要选择有意义的 ...

  6. 特征重要性、特征集成+FeatureUnion、特征选择变换器+ColumnTransformer、标签特征变换+TransformedTargetRegressor、特征质量、自动学习数据中的特征

    特征重要性.特征集成+FeatureUnion.特征选择变换器+ColumnTransformer.标签特征变换+TransformedTargetRegressor.特征质量.自动学习数据中的特征 ...

  7. 基于模型(Model-based)进行特征选择(feature selection)并可视化特征重要性(feature importance)

    基于模型(Model-based)进行特征选择(feature selection)并可视化特征重要性(feature importance) sklean 中的 SelectFromModel进行特 ...

  8. 机器学习中的特征——特征选择的方法以及注意点

    机器学习中的特征--特征选择的方法以及注意点 https://blog.csdn.net/google19890102/article/details/40019271 关于机器学习中的特征我有话要说 ...

  9. ML之FE:特征工程/数据预处理中的数据异常值的概述、检测方法、处理方法技巧总结之详细攻略

    ML之FE:特征工程/数据预处理中的数据异常值的概述.检测方法.处理方法技巧总结之详细攻略 目录 异常值 异常值的概述(简介/原因/影响) 异常值的检测方法

  10. 第四章:特征X的预处理(参考学习B站莫烦追随者-Python数据挖掘)

    第四章:特征X的预处理

最新文章

  1. Io 异常: The Network Adapter could not establish the connection(转)
  2. 动物为什么会预知地震,地震后为什么会下雨?
  3. 总结基于ArcGIS Server 9.2 Dot Net ADF的WebGIS项目部署问题
  4. SSM整合时配置文件的编写
  5. [单刷APUE系列]第五章——标准I/O库
  6. WCF 附录 高级主题 系列文章
  7. [别被脱库]—数据库的初恋~
  8. php ajax 重复提交,ThinkPHP防止重复提交表单的方法实例分析
  9. P7323-[WC2021]括号路径【并查集,启发式合并】
  10. 【BZOJ1880】[Sdoi2009]Elaxia的路线 最短路+DP
  11. linux中循环删除脚本,shell脚本:遍历删除
  12. Phase retrieval交替投影
  13. 换行样式不要首行缩进_修改文档样式库中的“正文”样式,使得文档中所有正文段落首行缩进2个字符。...
  14. JavaMail(2)——给多人发送、抄送
  15. CPU负载均衡之loadavg计算
  16. 数据挖掘导论——Python练习
  17. ResNet 残差网络
  18. WebBrowser无法显示招商银行密码输入控件的问题
  19. java生成pdf旋转_如何使用Java旋转PDF文档中的图像?
  20. 谢烟客---------Linux之bash编程

热门文章

  1. 大连理工大学计算机考研资料汇总
  2. 项目-Twitter WeRateDogs评分分析
  3. 11.16模拟赛总结
  4. CTraceRoute封装跟踪路由功能
  5. Head First java——战舰游戏代码
  6. 大象医生.Net 版消息系统架构
  7. mysql三级分区,MySQL3-分区与分表
  8. sql 使用保留字作为字段
  9. Java Swing实现Mybatis3代码生成器,使用jtattoo第三方java Swing美化包
  10. HTML入门必看-含源码案例(表格-列表-表单-图片-视频-音频)