特征降维处理

  • 概念:降维是指在某些限定条件下,降低随机变量(特征变量、自变量)个数,得到一组“不相关”主变量的过程。
  • 目的:降维得到的特征变量之间是不相关的,去除冗余特征变量。
  • 方法:特征选择、主成分分析

1.1 特征选择

数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。

方法:

  • Filter(过滤式):主要探究特征本身特点、特征与特征、特征与目标值之间的关联
  • 方差选择法:低方差特征过滤,删除低方差的一些特征。特征方差小:某个特征多样本的值比较相近;特征方差大:某个特征很多样本的值都有差别。再结合方差的大小来考虑这个方式的角度。
  • 相关系数法:相关性高的特征变量进行降维,可以去除不重要特征变量或者从新构造新的特征变量(如:加权求和主成分分析降维度)
  • Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联)
  • 决策树:信息熵、信息增益

  • 正则化:L1、L2

  • 深度学习:卷积等

方差选择法的python模块:sklearn.feature_selection

#构造一组特征值数据
import numpy as np
import pandas as dp
from scipy import stats
np.random.seed(10)
# 先生成一个种子生成器,以后生成的随机数就是一样的,参数为任意数字
x1 = stats.norm.rvs(loc=5,scale=0.0,size=500) 
#均值为5,标准差为0.0的正态分布,随机随机生成500个样本
x2 = stats.t.rvs(10, size=500) 
#生成服从t分布,自由度为10的500个随机数(rvs生成随机数)
x3 = stats.norm.rvs(loc=1,scale=0.5,size=500) 
#均值为1,标准差为0.5的正态分布,随机随机生成500个样本
x4 = np.random.rand(500)
x5 = 10*x4+5 + stats.norm.rvs(loc=0,scale=0.0,size=500)  
#stats.norm.rvs(loc=0,scale=0.0,size=500)用来构造残差
x6 = -5*x2 +1 + stats.norm.rvs(loc=0,scale=0.0,size=500)
#暂时不构造目标值y
data = pd.DataFrame({"x1":x1,"x2":x2,"x3":x3,"x4":x4,"x5":x5,"x6":x6})
display(data.sample(5))

python对数据进行降为处理_主成分分析

from sklearn.feature_selection import VarianceThreshold
# 低方差特征过滤
data = data
#1、获取数据,上段代码构造的一组特征值数据data 

transfer = VarianceThreshold(threshold=0.25) 
#2.实例化一个转换器类
   #threshold=0.25:用来设置方差的阀值,这里<=0.25的返回False,
   # 方差的阈值根据实际业务需求设定,默认为0.0
xi = transfer.fit_transform(data) 
#3.#调用fit_transform()
print(xi,"\n",transfer.get_support())
#4.输出过滤后的特征变量
data01=data.iloc[:,transfer.get_support()]
display(data01.head(5))
#虽然x4是一组随机数,但方差<0.25,所以也被过滤掉了

python对数据进行降为处理_主成分分析_02

相关性选择

相关系数(-1,1)。相关性高的特征变量进行降维,可以去除不重要特征变量或者从新构造新的特征变量(如:加权求和主成分分析降维度) 方法:pearson、spearman、Kendall’s Tau。详细的在探索变量间关系时说过,直接看两个例子。

# pearson只能检验两组数据的相关性
from scipy.stats import pearsonr
import pandas as pd
 
#1.数据使用上段代码生成的data01
print("x2-->x3:",stats.pearsonr(data01['x2'],data01['x3']))
print("x2-->x5:",stats.pearsonr(data01['x2'],data01['x5']))
print("x2-->x6:",stats.pearsonr(data01['x2'],data01['x6']))
print("x3-->x5:",stats.pearsonr(data01['x3'],data01['x5']))
print("x3-->x6:",stats.pearsonr(data01['x3'],data01['x6']))
print("x5-->x6:",stats.pearsonr(data01['x5'],data01['x6']))
#返回线性相关度和P值,是不是感觉非常麻烦
'''
结果
x2-->x3: (-0.01, 0.79)  #不相关
x2-->x5: (0.045, 0.31)  #不相关
x2-->x6: (-1.0, 0.0)    #相关
x3-->x5: (-0.07, 0.085) #不相关
x3-->x6: (0.011, 0.791) #不相关
x5-->x6: (-0.045, 0.31) #不相关
'''
# spearman:等级相关系数(Ranked data)检验
from scipy.stats import spearmanr
import pandas as pd
correlation,pvalue=spearmanr(data01) 
#可以直接传入二维表

correlation= pd.DataFrame(correlation,index=data01.columns,columns=data01.columns)
#方便看可以构造为二维表
pvalue= pd.DataFrame(pvalue,index=data01.columns,columns=data01.columns)
display(correlation,pvalue)

python对数据进行降为处理_方差_03

1.2 主成分分析

应用PCA实现特征的降维

  • 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量。
  • 作用:使数据维散压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
  • 应用:回归分析或者聚类分析当中。

APA:sklearn.decomposition.PCA(n_components=None),将数据分解为较低维数空间

  • n_components:
  • 小数:表示保留百分之多少的信息
  • 整数:减少到多少特征
  • PCA.fit_transform(X)X:numpy array格式的数据[n_samples,n_features]
  • 返回值:转换后指定维度的array
# 主成分分析,保留n.n% 的信息
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
 
# 1、数据:使用上面代码生成的data01
display(data01.head(3))

#2.实例化一个转换器类
transfer = PCA(n_components=0.9) #实例化一个转换器类
    # n_components: ·小数:表示保留百分之多少的信息 ·整数:减少到多少特征

#3.#调用fit_transform()
xi = transfer.fit_transform(data01) 
#调用fit_transform()
#查看构成新的几个变量,查看单个变量的方差贡献率
print(xi.shape,transfer.explained_variance_ratio_)  

#4.输出新构造出来的主成分变量
Fi=[ ]
for i in range(1,xi.shape[1]+1):
    F="F" + str(i)
    Fi.append(F)
data02 = pd.DataFrame(xi,columns=Fi)
display(data02.sample(5))

python对数据进行降为处理_主成分分析_04