属性构造
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)