特征处理:特征常用处理

属性构造

1)利用已有的属性构造出新的属性,并加入到现有的属性集合中。

举例:在进行防窃漏电诊断建模时,已有属性有供入电量、供出电量。理论上供入电量和供出电量是相等的,但是由于传输过程中存在电能损耗,使得供入电量略大于供出电量,那为了判断用户的是否存在窃漏电行为,可以构造一个新的指标----线损率

线损率 = (供入电量-供出电量)/供入电量

线损率正常范围一般在3%-15%,远远超过这个范围,就可以认为这个用户很可能存在窃漏电行为

2)合并属性:将一些旧属性合并为新属性

生成多项式特征

通过考虑输入数据的非线性特征,常常增加模型的复杂性。一个简单而常用的方法是多项式特征,可以获得特征的高阶和交互项。

import numpy as np

from sklearn.preprocessing import PolynomialFeatures

X = np.arange(9).reshape(3, 9)

>>>                                               

array([ [0, 1, 2],

      [3, 4, 5],

      [6, 7, 8]])

poly = PolynomialFeatures(2)

poly.fit_transform(X) 

>>>                         

array([ [ 1.,  0.,  1.,  2.,  0.,  0.,  0.,  1.,  2.,  4.],

      [ 1.,  3.,  4.,  5.,  9., 12., 15., 16., 20., 25.],

      [ 1.,  6.,  7.,  8., 36., 42., 48., 49., 56., 64.]])

在一些情况下,只需要功能之间的交互项,并且可以通过设置得到interaction_only=True

poly = PolynomialFeatures(2,  interaction_only=True)

poly.fit_transform(X) 

>>> 

array([ [ 1.,  0.,  1.,  2.,  0.,  0.,  2.],

      [ 1.,  3.,  4.,  5., 12., 15., 20.],

      [ 1.,  6.,  7.,  8., 42., 48., 56.]])

特征选择:决策树归纳

利用决策树的归纳方法对初始数据进行分类归纳学习,获得一个初始决策数,所有没有出现在这个决策树上的属性均可认为是无关属性,因此将这些属性从初始集合中删除,就可以获得一个较优的属性子集。

特征选择:过滤型

1、原理

使用发散性或相关性指标对各个特征进行评分,选择分数大于阈值的特征或者选择前K个分数最大的特征。具体来说,计算每个特征的发散性,移除发散性小于阈值的特征/选择前k个分数最大的特征;计算每个特征与标签的相关性,移除相关性小于阈值的特征/选择前k个分数最大的特征。

2、方差选择法(发散性)

使用方差作为特征评分标准,如果某个特征的取值差异不大,通常认为该特征对区分样本的贡献度不大,因此在构造特征过程中去掉方差小于阈值的特征。

注意:方差较小的特征很少,方差选择法简单但不好用,一般作为特征选择的预处理步骤,先去掉方差较小的特征,然后使用其他特征选择方法选择特征。

代码实现:

from sklearn.datasets import load_iris

iris = load_iris()

print("iris特征名称 ",iris.feature_names)

print("iris特征矩阵 ",iris.data)

# 特征选择--方差选择法

from sklearn.feature_selection import VarianceThreshold

vt = VarianceThreshold(threshold = 1)  # threshold为方差的阈值,默认0,阈值方差太小,能够过滤掉的特征和少,反之太多

vt = vt.fit_transform(iris.data)       # 函数返回值为特征选择后的特征

print("方差选择法选择的特征 ",vt)

3、卡方检验法(相关性)(分类问题)

使用统计量卡方检验作为特征评分标准,卡方检验值越大,相关性越强(卡方检验是评价定性自变量对定性因变量相关性的统计量)

代码实现:

# 载入数据

from sklearn.datasets import load_iris

iris = load_iris()

# 特征选择

from sklearn.feature_selection import SelectKBest # 移除topK外的特征

from sklearn.feature_selection import chi2        # 卡方检验

skb = SelectKBest(chi2,k=2)

new_data = skb.fit_transform(iris.data,iris.target)

4、皮尔森相关系数法法(相关性)(回归问题)

使用pearson系数作为特征评分标准,相关系数绝对值越大,相关性越强(相关系数越接近于1或-1时,相关性越强;相关系数越接近于0时,相关性越弱)。特点:皮尔森相关系数法能够衡量线性相关的特征集。

代码实现:

from sklearn.datasets import load_iris

irisdata = load_iris()

# 特征选择(pearson相关系数法)

from sklearn.feature_selection import SelectKBest  # 移除topK外的特征

from scipy.stats import pearsonr                   # 计算皮尔森相关系数

from numpy import array

"""

# 函数返回值:保留topk特征,移除topk外特征

# 第一个参数:皮尔森相关系数(输入特征矩阵和目标向量,输出二元组(评分,P),二数组第i项为第i个特征的评分和p值

# 第二个参数:topK个数

"""

#shape(irisdata.data)=n*4, shape(irisdata.target)=1*n, 所以在计算Pearsonr相关系数时要转置

skb = SelectKBest(lambda X, Y: tuple(map(tuple,array(list(map(lambda x:pearsonr(x, Y), X.T))).T)), k=3)

skb = skb.fit_transform(irisdata.data, irisdata.target)

5、互信息系数法(相关性)

特点:互信息系数法能够衡量各种相关性的特征集,计算相对复杂。

特征选择:包裹型

把特征选择看作一个特征子集搜索问题,筛选各种特征子集,用模型评估效果。

典型的包裹型算法为“递归特征删除算法”(recursive feature elimination algorithm)

比如使用逻辑回归:

(1)用全量特征跑一个模型

(2)根据现行模型的系数(系数越大,相关性越大),删掉5-10%的弱特征,观察准确率/AUC的变化

(3)逐步进行,直至准确率/AUC出现大的下滑停止

包裹型特征选择python包:

from sklearn.feature_selection import RFE

from skleaen.linear_model import LinearRegression

boston = load_boston()

X = boston[“data”]

Y = boston[“target”]

names = boston[“feature_names”]

lr = LinearRegression()

rfe = RFE(lr, n_feature_to_select=1)

rfe.fit(X, Y)

#打印排序后的特征结果

print sorted(zip(map(lamada x: round(x, 4), rfe.ranking_), names))

特征选择:嵌入型

根据模型来分析特征的重要性(有别于上面包裹型的特征选择方式)

最常见的方式是用正则化方式来做特征选择,例如使用L1正则化的LR模型,会得到一些系数为0的权重值。

嵌入型特征选择Python包

from sklearn.svm import LinearSVC

from sklearn.datasets import load_iris

from sklearn.feature_selection import SelectFromModel

iris = load_iris()

X, y = iris.data, iris.target

X.shape

>>>(150,4)

lsvc = LinearSVC(C=0.01, penalty=”l1”, dual=False).fit(X, y)

model = SelectFromModel(lsvc, prefit=True)

X_new = model.transform(X)

X_new.shape

>>>(150, 3)

原文地址:https://www.cnblogs.com/yongfuxue/p/10095380.html