关于特征工程的一些学习思考与错误的纠正
Posted fancyutech
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于特征工程的一些学习思考与错误的纠正相关的知识,希望对你有一定的参考价值。
特征工程的整体思路:
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的博客给我的启发。
以上是关于关于特征工程的一些学习思考与错误的纠正的主要内容,如果未能解决你的问题,请参考以下文章