特征降维
特征降维
为什么要进行特征降维? 特征对训练模型非常重要,当用于训练的数据集包涵一些不重要的特征时,可能会导致模型泛化性能不加 eg:某些特征的取值较为接近,其包含的信息较少 eg:希望特征独立存在对预测产生影响,两个特征同增同减非常相关,不会给模型带来更多的信息 特征降维目的 在某些特定的情况下,降低特征个数 特征降维涉及的知识面比较多,当前阶段常用的方法: 低方差过滤法 PAC 主成分分析降维法 相关系数法(皮尔逊相关系数 斯皮尔曼相关系数)
低方差过滤
低方差过滤法: 指的是删除方差低于某一阈值的特征 特征方差小: 特征值的波动范围小 包含的信息少 模型不易学到信息 特征方差大: 特征值的波动范围大 包含的信息多 便于模型学习 低方差过滤API
sklearn. feature_selection. VarianceThreshold( threshold = 0.0 )
variance_obj. fit_transform( X)
from sklearn. feature_selection import VarianceThreshold
import pandas as pd
data = pd. read_csv( 'data/垃圾邮件分类数据.csv' )
print ( data. shape)
transformer = VarianceThreshold( threshold= 0.1 )
data = transformer. fit_transform( data)
print ( data. shape)
主成分分析PCA
主成分分析(Principal Component Analysis,PCA) PCA 通过对数据维度进行压缩,尽可能降低原数据的维度,损失少了信息,在此过程中可能会舍弃原有数据、创造新的变量 API sklearn.decomposition.PCA(n_components=None) 将数据分解为较低维数空间 n_components: 小数表示保留百分之多少的信息;整数表示减少到多少特征 eg:由20个特征减少到10个 mypcaobj.fit_transform(X) 代码实现
from sklearn. decomposition import PCA
from sklearn. datasets import load_iris
x, y = load_iris( return_X_y= True )
print ( x[ : 5 ] )
transformer = PCA( n_components= 0.95 )
x_pca = transformer. fit_transform( x)
print ( x_pca[ : 5 ] )
transformer = PCA( n_components= 2 )
x_pca = transformer. fit_transform( x)
print ( x_pca[ : 5 ] )
相关系数法
为什么会使用相关系数? 相关系数:反应特征列之间的密切相关程度的统计指标 常见2个相关系数:皮尔逊相关系数、斯皮尔曼相关系数 相关系数的值介于–1与+1之间,即–1 ≤ r ≤ +1。其性质如下: 当 r > 0 时,表示两变量正相关,r < 0 时,两变量为负相关 当 |r| = 1 时,表示两变量为完全相关,当r = 0时,表示两变量间无相关关系 当 0 < |r| < 1时,表示两变量存在一定程度的相关。 且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱 一般可按三级划分: (1) |r| <0.4为低度相关; (2) 0.4≤ |r| <0.7为显著性相关; (3) 0.7 ≤ |r| <1为高度线性相关。
皮尔逊相关系数
举例: 已知广告投入x特征与月均销售额y之间的关系,经过皮尔逊相关系数计算,为高度相关
斯皮尔曼相关系数
import pandas as pd
from sklearn. feature_selection import VarianceThreshold
from scipy. stats import pearsonr
from scipy. stats import spearmanr
from sklearn. datasets import load_iris
data = load_iris( )
data = pd. DataFrame( data. data, columns= data. feature_names)
corr = pearsonr( data[ 'sepal length (cm)' ] , data[ 'sepal width (cm)' ] )
print ( corr, '皮尔逊相关系数:' , corr[ 0 ] , '不相关性概率:' , corr[ 1 ] )
corr = spearmanr( data[ 'sepal length (cm)' ] , data[ 'sepal width (cm)' ] )
print ( corr, '斯皮尔曼相关系数:' , corr[ 0 ] , '不相关性概率:' , corr[ 1 ] )