机器学习手册学习笔记--利用特征提取进行特征降维

264 阅读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)
#参数 whiten=True,表示对每一个主成分都进行转换以保证它们的平均值为 0、方差为 1
# svd_solver="randomized",代表使用随机方法找到第一个主成分(这种方法通常速度很快)

features_pca = pca.fit_transform(features)
print("Original number of features:", features.shape[1])
print("Reduced number of features:", features_pca.shape[1])

核PCA 对线性不可分数据进行特征降维

核(kernel,也叫核函数)能够将线性不可分数据映射到更高的维度,数据在这个维度是线性可分的,我们把这种方式叫作核机制(kernel trick)。

参数 kernel来指定。常用的核函数是高斯径向基函数(rbf),其他的核函数还有多项式核(poly)和 sigmoid 核(sigmoid)。我们甚至可以指定一个线性(linear)映射。

from sklearn.decomposition import PCA, KernelPCA
from sklearn.datasets import make_circles
# 创建线性不可分数据
features, _ = make_circles(n_samples=1000, random_state=1, noise=0.1,factor=0.1)
# 应用基于径向基函数(Radius Basis FunctionRBF)核的 Kernel PCA 方法
kpca = KernelPCA(kernel="rbf", gamma=15, n_components=1)
features_kpca = kpca.fit_transform(features)
print("Original number of features:", features.shape[1])
print("Reduced number of features:", features_kpca.shape[1])

线性判别分析(LDA) 通过最大化类间可分性进行特征降维

将特征数据映射到一个可以使类间可分性最大的成分坐标轴上。

from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
iris = datasets.load_iris()
features = iris.data
target = iris.target

# 创建并运行 LDA,然后用它对特征做变换
lda = LinearDiscriminantAnalysis(n_components=1)
features_lda = lda.fit(features, target).transform(features)
#explain_variance_ratio_ 的输出,该排序数组表示每个输出的特征所保留的信息量(用方差表示)
print("Original number of features:", features.shape[1])
print("Reduced number of features:", features_lda.shape[1])

用于确定适合的维数,给定解释比例

def select_n_components(var_ratio, goal_var: float) -> int:
        # 设置总方差的初始值
        total_variance = 0.0
        # 设置特征数量的初始值
        n_components = 0
        # 遍历方差百分比数组的元素
        for explained_variance in var_ratio:
            # 将该百分比加入总方差
            total_variance += explained_variance
            # n_components 的值加 1
            n_components += 1
            # 如果达到目标阈值
            if total_variance >= goal_var:
            # 结束遍历
                break
        # 返回 n_components 的值
        return n_components

非负矩阵分解法(NMF) 对非负特征矩阵降维 无监督的线性降维

该方法不会告诉我们输出特征中保留了原始数据的信息量

可以分解矩阵(将特征矩阵分解为多个矩阵,其乘积近似于原始矩阵),将特征矩阵转换为表示样本与特征之间潜在关系的矩阵

from sklearn.decomposition import NMF
from sklearn import datasets
digits = datasets.load_digits()
features = digits.data

# 创建 NMF,进行变换并应用
nmf = NMF(n_components=10, random_state=1)
features_nmf = nmf.fit_transform(features)
print("Original number of features:", features.shape[1])
print("Reduced number of features:", features_nmf.shape[1])

截断奇异值分解(TSVD) 对稀疏数据进行特征降维

TSVD 有一个问题,其输出值的符号会在多次拟合中不断变化(这是由其使用随机数生成器的方式决定的)。一个简单的解决方法是对每个预处理管道只使用一次 fit 方法,然后多次使用 transform 方法。

from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import TruncatedSVD
from scipy.sparse import csr_matrix
from sklearn import datasets
import numpy as np

digits = datasets.load_digits()
features = StandardScaler().fit_transform(digits.data)
features_sparse = csr_matrix(features)

# 创建 tsvd
tsvd = TruncatedSVD(n_components=10)
# 在稀疏矩阵上执行 TSVD
features_sparse_tsvd = tsvd.fit(features_sparse).transform(features_sparse)
print("Original number of features:", features_sparse.shape[1])
print("Reduced number of features:", features_sparse_tsvd.shape[1])