关于特征工程的一些学习、思考与错误的纠正

特征工程的整体思路:

1. 对于特征的理解、评估

2. 特征处理:

  2.1 特征处理

    2.1.1 特征清洗

      清洗异常、采样

    2.1.2 预处理

      单特征情况:归一化、离散化、哑变量编码、缺失值填充等。数据变换例如log服从正态分布。

      多特征情况:

        降维:PCA、LDA(这个不太了解、待学习)

        特征选择:三种大方法,Filter——x与y之间的关联,Wrapper——目标函数检验(MSE),Embedded——机器学习方法,正则化、决策树、深度学习。

3. 特征监控

有效性分析和监控。

 

Python相关:特征工程主要使用sklearn处理。

 

预处理

所谓无量纲化:

1. 平常所说的标准化就是无量纲化的一种。

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

2. 区间缩放,我记得吴恩达的机器学习教程就是这个方法。

from sklearn.preprocessing import MinMaxScaler

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

注意:标准化与归一化的区别,标准化按列处理,归一化按行处理。

二值化:

from sklearn.preprocessing import Binarizer

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

哑编码:

from sklearn.preprocessing import OneHotEncoder

#哑编码,对IRIS数据集的目标值,返回值为哑编码后的数据
OneHotEncoder().fit_transform(iris.target.reshape((-1,1)))

缺失值填充:

这里写一个填充方法的备忘,其实个人认为相比于均值填充,众数和中位数填充更加准确

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]), iris.data)))

数据变换:

在吴恩达的机器学习非常明确的讲过这个理论,其实就是对原有feature进行“升维”的变换,也就是提升幂次。来达到突出更多特征的目的。

from sklearn.preprocessing import PolynomialFeatures

#多项式转换
#参数degree为度,默认值为2
PolynomialFeatures().fit_transform(iris.data)

特征选择的思路:

方差法,如果特征不发散即方差接近0,直接丢掉。

特征与目标的相关性,相关性高的自然就与目标联系紧密,选择优先度高。

特征选择方法:

Filter(过滤法):发散性和相关性是评分指标,设定阈值选择特征的个数。

方差:

from sklearn.feature_selection import VarianceThreshold

#方差选择法,返回值为特征选择后的数据
#参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(iris.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(iris.data, iris.target)

卡方检验:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

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

互信息法:

from sklearn.feature_selection import SelectKBest
 from minepy import MINE
 
 #由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
 def 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(iris.data, iris.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(iris.data, iris.target)

Embedded(集成法):机器学习方法,得到的特征权值系数用来进行特征选择。

feature_selection的方法之前使用过,不过没有针对性,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)

降维:

这个之前尝试过,但是不知道出了什么错误或者使用的方法不对,结果奇差。还需学习。

PCA:让映射后的样本具有最大的发散性,无监督降维

LDA:让映射后的岩本有最好的分类性能,有监督降维

from sklearn.decomposition import PCA

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

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

参考资料:http://www.cnblogs.com/jasonfreak/p/5448385.html

感谢jasonfreak的博客给我的启发。