原创

机器学习手册08---特征工程(特征降维篇)


1.什么是降维

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。因为在训练的时候,我们都是使用特征进行学习,如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大。

avatar

【常见的降维方法】:(1)特征选择(2)主成分分析

2.特征选择

2.1特征选择定义

数据中包含沉余或无关变量,旨从原有特征中找出主要特征。

2.2特征选择主要方法

(1)过滤器(主要探究特征本身特点,特征与特征和目标值之间的关联):方差选择法、相关系数等...

(2)嵌入式(算法自动选择特征):决策树(信息熵、信息增益)、正则化(L1、L2)、深度学习(卷积等)

2.3低方差特征过滤

删除低方法的一些特征(可能包含信息较少)

from sklearn import datasets
from sklearn.feature_selection import VarianceThreshold

def var_thr():
    """
    特征选择:过滤低方差特征
    """
    # 1.载入数据
    data = datasets.load_iris()
    features = data.data
    print("转化前的特征值大小:\n", features.shape)

    # 2.实例化一个对象
    transfer = VarianceThreshold(threshold=0.5)

    # 3.创建大方差特征矩阵
    transfer_data = transfer.fit_transform(features)

    print("转化后的特征值大小:\n", transfer_data.shape)

    # 查看4个特征的方差
    print(transfer.fit(features).variances_)


if __name__ == '__main__':
    var_thr()
转化前的特征值大小:
 (150, 4)
转化后的特征值大小:
 (150, 3)
 [0.68112222 0.18871289 3.09550267 0.57713289]

【说明】:最初一共有4个特征,经过过滤后,去掉了一个方差低于0.5的特征,此时还剩3个特征。如果特征已经经过标准化处理(平均值为0,方差为1),则方差过滤将不起作用!

2.4相关系数过滤

皮尔森相关系数:反映变量之间相关关系密切程度的统计指标。

相关系数的值介于-1与+1之间,即-1≤r≤+1,其性质如下:

(1)当r>0时,表示两变量正相关,r<0时,两变量为负相关;

(2)当r=|1|时,表示两变量为完全相关,当r=0时,表示狼变量无相关关系;

(3)当0<|r|<1时,表示两变量存在一定程度的相关,|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱;

【说明】:一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著相关;0.7≤|r|<1为高度线性相关

from scipy.stats import pearsonr

def pea():
    """
    特征选择:皮尔逊相关系数
    """
    
    # 1.载入数据
    x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 39.4, 45.2, 55.4, 60.9]
    x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 49.0, 52.8, 59.4, 63.5]

    # 2.判断
    ret = pearsonr(x1, x2)
    print("皮尔逊相关系数的结果是: \n", ret)


if __name__ == '__main__':
    pea()
皮尔逊相关系数的结果是: 
 (0.9945938827605758, 3.804970651259313e-08)

【利用相关矩阵检查是否存在较高相关性的特征,如果存在删除一个】:

import pandas as pd
import numpy as np

# 创建一个特征矩阵,其中包含两个高度相关的特征
features = np.array([[1, 1, 1],
                     [2, 2, 0],
                     [3, 3, 1],
                     [4, 4, 0],
                     [5, 5, 1],
                     [6, 6, 0],
                     [7, 7, 1],
                     [8, 7, 0],
                     [9, 7, 1]])

# 将特征矩阵转换成DataFrame
dataframe = pd.DataFrame(features)

# 创建相关矩阵
corr_matrix = dataframe.corr().abs()

# 选择相关矩阵的上三角阵
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(np.bool))

# 找到相关性大于0.95的特征列的索引
to_drop = [column for column in upper.columns if any(upper[column]) > 0.95]

# 删除特征
dataframe.drop(dataframe.columns[to_drop], axis=1).head(3)

# 相关矩阵
print(dataframe.corr())
          0         1         2
0  1.000000  0.976103  0.000000
1  0.976103  1.000000 -0.034503
2  0.000000 -0.034503  1.000000

3.主成分分析PCA

高维数据转化为地位数据的过程,在此过程中可能会舍弃原有数据、创造新的变量。数据维数的压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

应用:回归分析、聚类分析

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn import datasets

# 加载数据
digits = datasets.load_digits()

# 标准化特征矩阵
features = StandardScaler().fit_transform(digits.data)

# 创建可以保留的99%信息量(用方差表示)的PCA
pca = PCA(n_components=0.99, whiten=True)

# 执行PCA
features_pca = pca.fit_transform(features)

print(features.shape)
print(features_pca.shape)
(1797, 64)
(1797, 54)

【说明】:参数n_components 若为小数,则表示保留百分之多少的信息;若为整数,则表示减少到多少特征。

Python
机器学习
  • 作者:李延松(联系作者)
  • 发表时间:2020-07-25 15:42
  • 版本声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码

评论

留言