特征降维
前言
- 用于训练的数据集特征对模型的性能有着极其重要的作用。如果训练数据中包含一些不重要的特征,可能导致模型的泛化性能不佳。例如:
- 1.某些特征的取值较为接近,其包含的信息较少
- 我们希望特征独立存在,对预测产生影响,具有相关性的特征可能并不会给模型带来更多的信息,但是并不是说相关性完全无用。
降维 是指在某些限定条件下,降低特征个数, 我们接下来介绍集中特征降维的方法:
一、低方差过滤法
- 指的是删除方差低于某些阈值的一些特征。因为:
- 1、特征方差小:某个特征大多样本的值比较相近
- 2、特征方差大:某个特征很多样本的值都有差别
相关的API :sklearn.feature_selection.VarianceThreshold
- 参数:
- VarianceThreshold(threshold=0.0)
- 在数据集中,删除方差低于 threshold 的特征将被删除,默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
代码演示:
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
# 1. 读取数据集
data = pd.read_csv('data/垃圾邮件分类数据.csv')
print(data.shape) # (971, 25734)
# 2. 使用方差过滤法
transformer = VarianceThreshold(threshold=0.1)
data = transformer.fit_transform(data)
print(data.shape) # (971, 1044)
二、主成分分析法 (PCA)
- PCA 通过对数据维数进行压缩,尽可能降低原数据的维数(复杂度),损失少量信息,在此过程中可能会舍弃原有数据、创造新的变量。
有关的API :from sklearn.decomposition import PCA
- 参数:
- PCA(n_components=2)
- n_components:
- 小数表示保留百分之多少的信息;
- 整数表示减少到多少特征 eg 由20个特征减少到10个
- n_components:
- PCA(n_components=2)
代码演示:
from sklearn.decomposition import PCA # 导入PCA的包
from sklearn.datasets import load_iris # 导入 鸢尾花 数据集
# 1. 加载数据集
x, y = load_iris(return_X_y=True)
print(x[:5])
# [[5.1 3.5 1.4 0.2]
# [4.9 3. 1.4 0.2]
# [4.7 3.2 1.3 0.2]
# [4.6 3.1 1.5 0.2]
# [5. 3.6 1.4 0.2]]
# 2. 保留指定比例的信息
transformer = PCA(n_components=0.95)
x_pca = transformer.fit_transform(x)
print(x_pca[:5])
# [[-2.68412563 0.31939725]
# [-2.71414169 -0.17700123]
# [-2.88899057 -0.14494943]
# [-2.74534286 -0.31829898]
# [-2.72871654 0.32675451]]
# 3. 保留指定数量特征
transformer = PCA(n_components=2)
x_pca = transformer.fit_transform(x)
print(x_pca[:5])
# [[-2.68412563 0.31939725]
# [-2.71414169 -0.17700123]
# [-2.88899057 -0.14494943]
# [-2.74534286 -0.31829898]
# [-2.72871654 0.32675451]]
三、相关系数法
- 特征之间的相关系数法可以反映变量之间相关关系密切程度。
3.1 皮尔逊相关系数 (pearsonr)
3.1.1 定义与取值
- 皮尔逊相关系数用于衡量两个连续变量之间的线性关系强度和方向。其取值范围在-1到1之间,具体含义如下:
- 当相关系数为1时,表示两个变量完全正相关,即当一个变量增加时,另一个变量也增加,且呈直线关系。
- 当相关系数为-1时,表示两个变量完全负相关,即当一个变量增加时,另一个变量减少,且呈直线关系。
- 当相关系数为0时,表示两个变量没有线性关系,但可能存在非线性关系。
3.1.2 公式
- 对于一组观测值 ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . . , ( x n , y n ) (x_1, y_1),(x_2, y_2),....,(x_n, y_n) (x1,y1),(x2,y2),....,(xn,yn),皮尔逊相关系数可以使用以下公式计算:
r = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n} (x_i - \bar{x})^2 \sum_{i=1}^{n} (y_i - \bar{y})^2}} r=∑i=1n(xi−xˉ)2∑i=1n(yi−yˉ)2∑i=1n(xi−xˉ)(yi−yˉ)
-
x ˉ \bar{x} xˉ 和 y ˉ \bar{y} yˉ 分别表示 x x x 和 y y y 的样本平均值
-
x i x_i xi 和 y i y_i yi 表示两个变量的第 i i i 个观测值
3.1.3 特点
- 线性关系:皮尔逊相关系数只能用于度量两个变量之间的线性关系,不能反映非线性关系。
- 正态分布:要求变量服从正态分布,否则皮尔逊相关系数可能无法准确反映变量之间的相关性。
- 对称性:皮尔逊相关系数在两个变量之间是对称的,即 r ( x , y ) = r ( y , x ) r ( x , y ) = r ( y , x ) r ( x , y ) = r ( y , x ) r(x,y)=r(y,x)r(x, y) = r(y, x)r(x,y)=r(y,x) r(x,y)=r(y,x)r(x,y)=r(y,x)r(x,y)=r(y,x)。
- 敏感性:皮尔逊相关系数对数据的极端值较为敏感,极端值可能会影响相关系数的计算结果。
3.1.4 举例说明
-
假设有两组数据
- X = ( 75 , 85 , 65 , 90 , 70 ) X = (75,85,65,90,70) X=(75,85,65,90,70)
- Y = ( 70 , 81 , 60 , 88 , 65 ) Y=(70,81,60,88,65) Y=(70,81,60,88,65)
-
1、计算均值
- X 的平均值 X ˉ = 75 + 85 + 65 + 90 + 70 5 = 385 5 = 77 X的平均值 \bar X = \frac{75+85+65+90+70}{5} = \frac{385}{5} = 77 X的平均值Xˉ=575+85+65+90+70=5385=77
- X 的平均值 Y ˉ = 70 + 81 + 60 + 88 + 65 5 = 364 5 = 72.8 X的平均值\ \bar Y = \frac{70+81+60+88+65}{5} = \frac{364}{5} = 72.8 X的平均值 Yˉ=570+81+60+88+65=5364=72.8
-
2、计算偏差
- X 的偏差 X i − X ˉ : ( 75 − 77 ) , ( 85 − 77 ) , ( 65 − 77 ) , ( 90 − 77 ) , ( 70 − 77 ) = 2 , 8 , − 12 , − 13 , − 7 X 的偏差 X_i - \bar X : (75-77),(85-77),(65-77),(90-77),(70-77) = 2,8,-12,-13,-7 X的偏差Xi−Xˉ:(75−77),(85−77),(65−77),(90−77),(70−77)=2,8,−12,−13,−7
- Y 的偏差 Y i − Y ˉ : ( 70 − 72.8 ) , ( 81 − 72.8 ) , ( 60 − 72.8 ) , ( 88 − 72.8 ) , ( 65 − 72.8 ) = − 2.8 , 8.2 , − 12.8 , 15.2 , − 7.8 Y 的偏差 Y_i - \bar Y : (70-72.8),(81-72.8),(60-72.8),(88-72.8),(65-72.8)=-2.8,8.2,-12.8,15.2,-7.8 Y的偏差Yi−Yˉ:(70−72.8),(81−72.8),(60−72.8),(88−72.8),(65−72.8)=−2.8,8.2,−12.8,15.2,−7.8
- ∑ ( X i − X ˉ ) ( Y i − Y ˉ ) = ( 2 ) ( − 2.8 ) + ( 8 ) ( 8.2 ) + ( − 12 ) ( − 12.8 ) + ( − 13 ) ( 15.2 ) + ( − 7 ) ( − 7.8 ) = ( − 5.6 ) + ( 65.6 ) + ( 153.6 ) + ( − 197.6 ) + ( 54.6 ) = 70.6 \sum(X_i - \bar X)(Y_i - \bar Y)=(2)(-2.8)+(8)(8.2)+(-12)(-12.8)+(-13)(15.2)+(-7)(-7.8)=(-5.6)+(65.6)+(153.6)+(-197.6)+(54.6)=70.6 ∑(Xi−Xˉ)(Yi−Yˉ)=(2)(−2.8)+(8)(8.2)+(−12)(−12.8)+(−13)(15.2)+(−7)(−7.8)=(−5.6)+(65.6)+(153.6)+(−197.6)+(54.6)=70.6
-
3、计算协方差
- ∑ ( X i − X ˉ ) 2 = 2 2 + 8 2 + ( − 12 ) 2 + ( − 13 ) 2 + 7 2 = 431 \sqrt{\sum(X_i - \bar X)^2}=\sqrt{2^2+8^2+(-12)^2+(-13)^2+7^2}=\sqrt{431} ∑(Xi−Xˉ)2=22+82+(−12)2+(−13)2+72=431
- ∑ ( Y i − Y ˉ ) 2 = ( − 2.8 ) 2 + ( 8.2 ) 2 + ( − 12.8 ) 2 + ( 15.2 ) 2 + ( − 7.8 ) 2 = 530.8 \sqrt{\sum(Y_i - \bar Y)^2}=\sqrt{(-2.8)^2+(8.2)^2+(-12.8)^2+(15.2)^2+(-7.8)^2}=\sqrt{530.8} ∑(Yi−Yˉ)2=(−2.8)2+(8.2)2+(−12.8)2+(15.2)2+(−7.8)2=530.8
-
4、计算皮尔逊相关系数
- r = 70.6 431 ⋅ 530.8 ≈ 70.6 20.7605 ⋅ 23.0391 ≈ 0.1476051064526402 r = \frac{70.6}{\sqrt{431}\cdot \sqrt{530.8}}≈\frac{70.6}{20.7605\cdot 23.0391}≈0.1476051064526402 r=431⋅530.870.6≈20.7605⋅23.039170.6≈0.1476051064526402
3.1.5 代码演示
代码演示:
import pandas as pd
from scipy.stats import pearsonr
from sklearn.datasets import load_iris
# 1. 读取数据集(鸢尾花数据集)
data = load_iris()
data = pd.DataFrame(data.data, columns=data.feature_names)
# 2. 皮尔逊相关系数
corr = pearsonr(data['sepal length (cm)'], data['sepal width (cm)'])
print(corr, '皮尔逊相关系数:', corr[0], '不相关性概率:', corr[1])
# (-0.11756978413300204, 0.15189826071144918) 皮尔逊相关系数: -0.11756978413300204 不相关性概率: 0.15189826071144918
3.2 斯皮尔曼相关系数 (spearmanr)
- 斯皮尔曼相关系数(Spearman’s rank correlation coefficient)是一种重要的统计指标,用于衡量两个变量之间的关联程度。
3.2.1 定义
- 斯皮尔曼相关系数以Charles Spearman的名字命名,通常用希腊字母 ρ ρ ρ 表示。它是一种非参数指标,即与数据的分布无关,主要应用于等级变量性质的数据。
3.2.2 公式
- 斯皮尔曼等级相关系数是基于两组数据的等级而不是它们的实际数值来计算的。如果两个变量 X X X 和 Y Y Y 的的等级分别是 R X R_X RX 和 R Y R_Y RY,那么斯皮尔曼相关系数 ρ ρ ρ 可以通过以下公式计算:
ρ = 1 − 6 ∑ i = 1 n d i 2 n ( n 2 − 1 ) \rho = 1 - \frac{6 \sum_{i=1}^{n} d_i^2}{n(n^2 - 1)} ρ=1−n(n2−1)6∑i=1ndi2
-
d i d_i di 是第 i i i 对数据的等级差 (即 R X i − R Y i R_{X_i} - R_{Y_i} RXi−RYi)
-
n n n 是配对数据的数量
3.2.3 计算步骤
- 1、确定等级:对于每一对数据 X i X_i Xi 和 Y i Y_i Yi 分别找出 X X X 列和 Y Y Y 列中的等级 R X i R_{X_i} RXi 和 R Y i R_{Y_i} RYi。如果有相同的数据值,则给这些相同值分配平均等级。
- 2、计算等级差的平方和:计算每对数据的等级差 d i = R X i − R Y i d_i = R_{X_i} - R_{Y_i} di=RXi−RYi,然后求出所有 d i d_i di 的平方和 ∑ d i 2 \sum{d_i^2} ∑di2。
- 3、带入公式:将 ∑ d i 2 \sum{d_i^2} ∑di2 和 n n n 带入上述公式。计算 ρ ρ ρ
3.2.4 取值范围与解释
-
斯皮尔曼相关系数的取值范围在-1到1之间:
- 正值:表示正相关,即当一个变量增加时,另一个变量也趋向于增加
- 负值:表示负相关,即当一个变量增加时,另一个变量趋向于减少
- 零值:表示两个变量之间没有单调关系或趋向性
3.2.5 特点与优势
- 非参数性质:斯皮尔曼相关系数不依赖于任何参数的先验知识,因此适用于各种类型的数据,包括非线性关系的数据。
- 鲁棒性:由于秩次本身不受异常值的影响,斯皮尔曼相关系数对异常值具有更好的鲁棒性。
- 适用性广:斯皮尔曼相关系数不仅适用于线性关系的数据,还适用于等级变量和具有有序性的数据。
3.2.6 举例说明
-
假设有两组数据
- X = ( 10 , 2 , 36 , 4 , 80 , 50 , 20 , 1 , 65 , 17 ) X = (10,2,36,4,80,50,20,1,65,17) X=(10,2,36,4,80,50,20,1,65,17)
- Y = ( 30 , 3 , 50 , 5 , 100 , 80 , 40 , 2 , 90 , 30 ) Y=(30,3,50,5,100,80,40,2,90,30) Y=(30,3,50,5,100,80,40,2,90,30)
-
1、计算等级
- X 的等级为 ( 5 , 1 , 8 , 2 , 10 , 7 , 6 , 1 , 9 , 3 ) X 的等级为 (5,1,8,2,10,7,6,1,9,3) X的等级为(5,1,8,2,10,7,6,1,9,3)
- Y 的等级为 ( 7 , 1 , 9 , 2 , 10 , 8 , 6 , 1 , 10 , 7 ) Y 的等级为 (7,1,9,2,10,8,6,1,10,7) Y的等级为(7,1,9,2,10,8,6,1,10,7)
-
2、计算等级差的平方和
- d = ( 5 − 7 , 1 − 1 , 8 − 9 , 2 − 2 , 10 − 10 , 7 − 8 , 6 − 6 , 1 − 1 , 9 − 10 , 3 − 7 ) d = (5−7, 1−1, 8−9, 2−2, 10−10, 7−8, 6−6, 1−1, 9−10, 3−7) d=(5−7,1−1,8−9,2−2,10−10,7−8,6−6,1−1,9−10,3−7)
- d = ( − 2 , 0 , − 1 , 0 , 0 , − 1 , 0 , 0 , − 1 , − 4 ) d = (-2, 0, -1,0,0,-1,0,0,-1,-4) d=(−2,0,−1,0,0,−1,0,0,−1,−4)
- ∑ d 2 = 4 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + 16 = 23 \sum{d^2 = 4+0+1+0+0+1+0+0+1+16} = 23 ∑d2=4+0+1+0+0+1+0+0+1+16=23
-
3、代入公式计算 ρ ρ ρ
- n = 10 n=10 n=10
- ρ = 1 − 6 ⋅ 23 10 ( 1 0 2 − 1 ) = 1 − 139 990 = 1 − 0.13939394 = 0.8606 ρ = 1 - \frac{6 \cdot 23}{10(10^2-1)} = 1 - \frac{139}{990} = 1 - 0.13939394 = 0.8606 ρ=1−10(102−1)6⋅23=1−990139=1−0.13939394=0.8606
3.2.7 代码演示
代码演示:
import pandas as pd
from scipy.stats import spearmanr
from sklearn.datasets import load_iris
# 1. 读取数据集(鸢尾花数据集)
data = load_iris()
data = pd.DataFrame(data.data, columns=data.feature_names)
# 2. 斯皮尔曼相关系数
corr = spearmanr(data['sepal length (cm)'], data['sepal width (cm)'])
print(corr, '斯皮尔曼相关系数:', corr[0], '不相关性概率:', corr[1])
# SpearmanrResult(correlation=-0.166777658283235, pvalue=0.04136799424884587) 斯皮尔曼相关系数: -0.166777658283235 不相关性概率: 0.04136799424884587
总结
- 总结了 在机器学习的数据处理的时候对特征进行降维的三种办法。