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