降维:降维方法总结及部分python实现

不仅仅是大量数据处理冗余需要降维技术,在特征选择的时候往往也会用到降维技术(比如在预测用户行为的时候可能根据相关性剔除一些特征),它可能会对模型带来不稳定的提升(针对具体数据集),总结介绍降维技术的文章以及实操的一些经验。

对于特征选择来说,一般关注前6种即可。

为什么要降维

  • 随着维度数量的减少,存储数据所需的空间会减少
  • 更少的维度导致更少的计算/训练时间
  • 当我们有一个大的维度时,一些算法的表现不佳。因此,需要减少这些维度才能使算法有用
  • 它通过删除冗余的特征来处理多重共线性问题。例如,你有两个变量 - “在跑步机上花费的时间”和“燃烧的卡路里”。这些变量是高度相关的,因为你在跑步机上花费的时间越多,你燃烧的卡路里就越多。因此,存储两个变量都没有意义,只有其中一个可以满足需求
  • 它有助于可视化数据。如前所述,在高维度中可视化数据是非常困难的,因此将我们的空间缩小到2D或3D可以让我们更清晰地绘制和观察数据

常用的降维技术

缺失值比率

对于存在缺失值的数据,缺失率小的特征我们一般进行一些补缺操作,缺失率过大的特征可能包含的信息就比较少,或者对我们的模型来说意义不大了,可以设置一个阈值对这部分特征进行过滤。

# 检查缺失值百分比
train.isnull().sum()/len(train)*100
# 保存变量中缺失的值
a = train.isnull().sum()/len(train)*100

variables = train.columns
variable = [ ]
for i in range(0,12):
if a[i]<=20: #将阈值设置为20%
variable.append(variables[i])

低方差过滤器

如果我们有一个数据集,其中某列的数值基本一致,也就是它的方差非常低,那么这个变量还有价值吗?和上一种方法的思路一致,我们通常认为低方差变量携带的信息量也很少,所以可以把它直接删除。

# 缺失列简单补缺
train[''].fillna(train[''].median, inplace=True)

train[''].fillna(train[''].mode()[0], inplace=True)

#方差查看
train.var()

#设置阈值与上面一致

高相关过滤器

两个变量之间的高度相关意味着它们具有相似的趋势,并且可能携带类似的信息。这可以大大降低某些模型的性能(例如线性回归和逻辑回归模型)。我们可以计算出本质上是数值的独立数值变量之间的相关性。如果相关系数超过某个阈值,我们可以删除其中一个变量(丢弃一个变量是非常主观的,并且应该始终记住该变量)。

X = np.array([[-1, 1, 3], [-2, -1, 2], [-3, -2, 1], [1, 1, 1], [2, 1, 3], [3, 2, 3]])
np.corrcoef(X) # X也可以是[data['label'],data1['label'],data2['label']]的形式
# drop掉相关度高的

随机森林(或XGboost等树模型)

这些集成树模型都会自动计算特征值的重要度,可以直接用训练好的模型调用接口drop掉不重要的特征。

反向特征消除

  • 获取数据集中存在的所有的n个变量,然后使用它们训练模型
  • 然后我们计算模型的性能
  • 现在,我们在消除每个变量(n次)后计算模型的性能,即我们每次都丢弃一个变量并在剩余的n-1个变量上训练模型
  • 我们确定移除变量后对模型性能影响最小(或没有)变化的变量,然后删除该变量

这个方法操作起来倒是非常简单,非常耗时,且具有局限性,一个一个的删除特征或者添加特征对于模型来说可能不明显

批量处理代码可参考sklearn接口

from sklearn.feature_selection import RFE

正向特征选择

  • 我们从一个特征开始。本质上,我们分别使用每个特征训练模型n次
  • 选择性能最佳的变量作为起始变量
  • 然后我们重复这个过程并每次只添加一个变量。保留产生最高性能增长的变量
  • 我们重复这个过程,直到模型的性能没有显著的改进

特点和反向差不多,批量处理代码可参考sklearn接口

from sklearn.feature_selection import f_regression

因子分析

因子分析是一种常见的统计方法,它能从多个变量中提取共性因子,并得到最优解。

主成分分析

通过正交变换将原始的n维数据集变换到一个新的被称做主成分的数据集中,即从现有的大量变量中提取一组新的变量。


from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1, 3], [-2, -1, 2], [-3, -2, 1], [1, 1, 1], [2, 1, 3], [3, 2, 3]])
pca=PCA(n_components=2)pca.fit(X)
print(pca.transform(X))

独立成分分析

独立分量分析(ICA)基于信息理论,是最广泛使用的降维技术之一。PCA和ICA之间的主要区别在于,PCA寻找不相关的因素,而ICA寻找独立因素。

如果两个变量不相关,它们之间就没有线性关系。如果它们是独立的,它们就不依赖于其他变量。例如,一个人的年龄和他吃了什么/看了什么电视无关。

该算法假设给定变量是一些未知潜在变量的线性混合。它还假设这些潜在变量是相互独立的,即它们不依赖于其他变量,因此它们被称为观察数据的独立分量。

from sklearn.decomposition import FastICA
import numpy as np
X = np.array([[-1, 1, 3], [-2, -1, 2], [-3, -2, 1], [1, 1, 1], [2, 1, 3], [3, 2, 3]])
ICA = FastICA(n_components=2, random_state=1)
X=ICA.fit_transform(X)

ISOMAP(基于投影)

在投影技术中,可以通过将其点投影到较低维空间来表示多维数据。当数据强非线性时,可以使用这种技术。

from sklearn import manifold
import numpy as np
X = np.array([[-1, 1, 3], [-2, -1, 2], [-3, -2, 1], [1, 1, 1], [2, 1, 3], [3, 2, 3]])
X = manifold.Isomap(n_neighbors=2, n_components=3, n_jobs=-1).fit_transform(X)
"""
n_neighbors决定每个点的邻居数量
n_components决定流形的坐标数
"""

t-SNE

当数据强非线性时,这种技术也能很好地工作。它对于可视化也非常有效

from sklearn.manifold import TSNE
import numpy as np
X = np.array([[-1, 1, 3], [-2, -1, 2], [-3, -2, 1], [1, 1, 1], [2, 1, 3], [3, 2, 3]])
X = TSNE(n_components=3, n_iter=300).fit_transform(X)

UMAP

这种技术适用于高维数据。与t-SNE相比,它运行的时间更短

import umap
import numpy as np
X = np.array([[-1, 1, 3], [-2, -1, 2], [-3, -2, 1], [1, 1, 1], [2, 1, 3], [3, 2, 3]])
X = umap.UMAP(n_neighbors=5, min_dist=0.3, n_components=3).fit_transform(X)
"""
n_neighbors:确定相邻点的数量。
min_dist:控制允许嵌入的紧密程度,较大的值可确保嵌入点的分布更均匀。
"""

 

参考:

https://www.jianshu.com/p/891573e71f82

https://yq.aliyun.com/articles/634389?utm_content=m_1000015312

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCA(Principal Component Analysis)是一种常用的数据降维方法,它可以将数据转化为低维数据,同时尽可能地保留原始数据的特征信息。 PCA的核心思想是通过线性变换将原始数据映射到新的坐标系中,使得新坐标系下的数据具有最大的方差。换句话说,PCA通过找到数据中最具有代表性的方向(主成分),来实现降维的目的。 下面介绍PCA的具体实现方法: 1. 计算数据的协方差矩阵 对于一个含有n个样本数据集,假设每个样本都是d维向量,则数据的协方差矩阵为:S = 1/n * Σ(xi-μ)(xi-μ)^T,其中μ是所有样本的均值向量。 2. 计算协方差矩阵的特征值和特征向量 对协方差矩阵进行特征值分解,得到特征值λ1, λ2, …, λd和对应的特征向量v1, v2, …, vd。 3. 选择前k个主成分 将特征值从大到小排序,选择前k个特征值对应的特征向量,这些特征向量组成一个d×k的矩阵,称为投影矩阵。 4. 将数据投影到新的坐标系中 将原始数据x乘以投影矩阵,即可将d维数据投影到k维空间中,从而实现降维的目的。 下面给出Python代码实现PCA: ```python import numpy as np def pca(X, k): # 1. 计算协方差矩阵 cov = np.cov(X.T) # 2. 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(cov) # 3. 选择前k个主成分 sort_index = np.argsort(eigenvalues)[::-1] topk_eigenvectors = eigenvectors[:,sort_index][:,:k] # 4. 将数据投影到新的坐标系中 new_X = X.dot(topk_eigenvectors) return new_X ``` 其中,X是一个$n \times d$的矩阵,表示含有n个样本,每个样本是d维向量的数据集;k是要降到的维数。函数返回一个$n \times k$的矩阵,表示降维后的数据集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值