五.特征降维(就是相似的很高的或者无用的特征需要去掉)

Posted lipu123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五.特征降维(就是相似的很高的或者无用的特征需要去掉)相关的知识,希望对你有一定的参考价值。

1.什么是特征降维

降低的对象为二维数组
此处的降维为降低特征的个数
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程

降维的效果就是使得特征和特征之间不相关

如果相关的特征太多的话会造成数据的冗余的

正是因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大

2.两种方法

特征选择
主成分分析(可以理解一种特征提取的方式)

2.1特征选择

2.1.1 定义

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

2.1.2 方法

Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
方差选择法:低方差特征过滤(比如说是否有爪子这一个特征方差一定很小,过滤掉)
相关系数:特征与特征之间的相关程度(如果两个特征非常相关则可以去掉一个,需要计算相关系数)

Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联)
决策树:信息熵、信息增益
正则化:L1、L2
深度学习:卷积等

### 2.1.3 API
>**sklearn.feature_selection**
### 2.1.4 过滤式(方差选择法)

删除低方差的一些特征。再结合方差的大小来考虑这个方式的角度
特征方差小:某个特征大多样本的值比较相近
特征方差大:某个特征很多样本的值都有差别

过滤式API

(1)sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
删除所有方差低于threshold的特征
(2)Variance.fit_transform(X)
--------X:numpy array 格式的数据[n_samples,n_features]
-------返回值:训练集差异低于 threshold 的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。

方法和前面的一样,也是
先实例化一个转化器类
再调用fit_transform

from sklearn.feature_selection import VarianceThreshold
def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1.获取数据
    data=pd.read_csv("factor_returns.csv")
    data=data.iloc[:,1:-2]
    print("data:\\n",data)
    # 2.实例化一个转换器类
    transfer=VarianceThreshold(threshold=10)#具体调
    # 3.调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new:\\n",data_new,data_new.shape)
    return None

2.1.5 相关系数

皮尔逊相关系数(Pearson Correlation Coefficient)
反映变量之间相关关系密切程序的统计指标
如果两个系数相关性很强的话这可以去掉一个

公式

特点
相关系数的值介于-1 与+1 之间,即-1 <= r <= +1。其性质如下:
当 r>0 时,表示两变量正相关,r<0 时,两变量为负相关
当|r|=1 时,表示两变量为完全相关,当 r=0 时,表示两变量间无相关关系
当 0<|r|<1 时,表示两变量存在一定程序的相关。且|r|越接近 1,两变量间线性关系越密切;|r|越接近于 0,表示两变量的线性相关越弱
一般可按三级划分:|r|<0.4 为低度相关;0.4<=r<0.7 为显著性相关;0.7<=|r|<1 为高度线性相关

例如:

=0.9942
相关系数API

from scipy.stats import pearsonr
x: (N,) array_like y: (N,) array_like
Returns: (Pearson\'s correlation coefficient, p-value)

代码:算两个变量之间的相关系数

from scipy.stats import pearsonr

def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1.获取数据
    data=pd.read_csv("factor_returns.csv")
    data=data.iloc[:,1:-2]
    print("data:\\n",data)
    # 2.实例化一个转换器类
    transfer=VarianceThreshold(threshold=10)
    # 3.调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new:\\n",data_new,data_new.shape)

    #计算某两个变量之间的相关系数
    r=pearsonr(data["pe_ratio"],data["pb_ratio"])
    print("相关系数:\\n",r)
    return None

如果两个特征之间的相关系性很高我们应该怎么选择呢
(1)选其中一个
(2)加权求和
(3)主成分分析

2.2主成分分析(PCA)

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

就是将三维的降到二维,它会有一些损失(信息损失了多少),其实一个很直观的反应就是看看我们通过这个二维的图像还能不能看出来这是个水壶

例如这个最后一个降维之后损失的最少,我们还能看出来他是个水壶

再例如将这个二维的降到一维(直线)

这样做是损失的最少


API

sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维数空间
n_components:
小数:表示保留百分之多少的信息
整数:减少到多少特征(比如是个2,就是降到二维)
PCA.fit_transform(X) X:numpy array 格式的数据[n_samples,n_features]
返回值:转换后指定维度的 array

步骤
1、实例化一个转换器类
2、调用fit_transform
代码

from sklearn.decomposition import PCA
def pca_demo():
    """
    PCA降维
    :return:
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]

    # 1、实例化一个转换器类
    # transfer = PCA(n_components=2)#指定降到2维
    transfer = PCA(n_components=0.95)#保留95%的信息

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\\n", data_new)

    return None

具体案例

用户和类别之间的关系

机器学习之特征选择和降维的理解

在机器学习中,特征选择和降维感觉好像差不多,维度都降低了,今天和其他同学交流学习才知道其实不然,区别很大。

 

一般情况下,我们不会使用原始数据直接去进行训练,因为原始数据的特征明显,信息丰富,我们训练后的效果对于训练集非常好,而对于测试集来说就很差了。这就是过拟合问题。

当我们进行特征提取后,维度依然不减,为了解决过拟合问题,就使用降维(常用PCA)或特征选择。

对于特征选择,就是从众多个特征中选择部分特征作为训练集的特征,抛弃剩余部分的特征,这样维度就减少了,但是选中的这部分特征就是原始数据中的特征值。

对于降维,降维与特征选择相比最主要的区别就是降维会发生特征数据值的变化,它是一个高维到低维的映射。

特征选择和降维都是为了解决过拟合问题。

 

以上是关于五.特征降维(就是相似的很高的或者无用的特征需要去掉)的主要内容,如果未能解决你的问题,请参考以下文章

机器学习之特征选择和降维的理解

PCA算法理解及代码实现

Python机器学习及实践——特征降维

Python机器学习及实践——特征降维

特征工程指南

降维-奇异值分解SVD