如何使用Python Scikit-learn进行降维?
降维是一种无监督机器学习方法,用于减少每个数据样本的特征变量数量并选择一组主要特征。主成分分析(PCA)是Sklearn中可用的流行降维算法之一。
在本教程中,我们将使用Python Scikit-learn(Sklearn)进行主成分分析和增量主成分分析的降维。
使用主成分分析(PCA)
PCA是一种统计方法,通过分析原始数据集的特征将数据线性投影到新的特征空间中。PCA的主要概念是选择数据的“主要”特征并基于这些特征构建特征。它将为我们提供新的数据集,该数据集尺寸较小,但具有与原始数据集相同的信息。
示例
在下面的示例中,我们将使用两个组件初始化PCA,并使用Scikit-learn软件包默认提供的Iris植物数据集进行数据拟合。
# 导入所需的包
from sklearn import datasets
from sklearn import decomposition
# 加载鸢尾花数据集
iris = datasets.load_iris()
# 打印数据集详细信息
print('特征名称 : '+str(iris.feature_names))
print('\n')
print('特征大小 : '+str(iris.data.shape))
print('\n')
print('目标名称 : '+str(iris.target_names))
print('\n')
print('目标大小 : '+str(iris.target.shape))
X_iris, Y_iris = iris.data, iris.target
# 初始化PCA并拟合数据
pca_2 = decomposition.PCA(n_components=2)
pca_2.fit(X_iris)
# 将鸢尾花数据转换为新维度(具有 2 个特征)
X_iris_pca2 = pca_2.transform(X_iris)
# 打印新数据集
print('变换后的新数据集大小 : ', X_iris_pca2.shape)
print('\n')
# 获取数据的最大方差方向
print("成分 : ", pca_2.components_)
print('\n')
# 获取每个成分解释的方差量
print("解释的方差量 : ",pca_2.explained_variance_)
print('\n')
# 获取每个成分解释的方差百分比
print("解释的方差百分比 : ",pca_2.explained_variance_ratio_)
print('\n')
# 获取每个成分的奇异值
print("奇异值 : ",pca_2.singular_values_)
print('\n')
# 获取估计的噪声协方差
print("噪声方差 : ",pca_2.noise_variance_)
输出
它将产生以下输出−
特征名称 : ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
特征大小 : (150, 4)
目标名称 : ['setosa' 'versicolor' 'virginica']
目标大小 : (150,)
变换后的新数据集大小 : (150, 2)
成分 : [[ 0.36138659 -0.08452251 0.85667061 0.3582892 ]
[ 0.65658877 0.73016143 -0.17337266 -0.07548102]]
解释的方差量 : [4.22824171 0.24267075]
解释的方差百分比 : [0.92461872 0.05306648]
奇异值 : [25.09996044 6.01314738]
噪声方差 : 0.051022296508184406
使用增量主成分分析(IPCA)
增量主成分分析(IPCA)用于解决主成分分析(PCA)最大的限制,即PCA仅支持批处理,这意味着所有要处理的输入数据都应适合内存。
Scikit-learn ML库提供了sklearn.decomposition.IPCA模块,可以通过在连续获取的数据块上使用其partial_fit方法或启用np.memmap,一个映射到内存的文件,而不将整个文件加载到内存中,从而实现Out-of-Core PCA。
与PCA相同,使用IPCA进行分解时,输入数据被居中但未对每个要素进行缩放,然后应用SVD。
示例
在下面的示例中,我们将使用Scikit-learn包默认提供的Iris植物数据集,使用IPCA(初始化为2个组件和批量大小为20)进行拟合。
# 导入必要的包
from sklearn import datasets
from sklearn import decomposition
# 加载鸢尾植物数据集
iris = datasets.load_iris()
# 输出数据集的详细信息
print('特征名称:'+str(iris.feature_names))
print('\n')
print('特征大小:'+str(iris.data.shape))
print('\n')
print('目标名称:'+str(iris.target_names))
print('\n')
print('目标大小:'+str(iris.target.shape))
X_iris, Y_iris = iris.data, iris.target
# 初始化PCA并拟合数据
ipca_2 = decomposition.IncrementalPCA(n_components=2, batch_size=20)
ipca_2.fit(X_iris)
# 将鸢尾花数据转换到新的维度(包括2个特征)
X_iris_ipca2 = ipca_2.transform(X_iris)
# 输出新的数据集
print('转换后的数据集大小:', X_iris_ipca2.shape)
print('\n')
# 获取数据中最大方差的方向
print("组成部分:" , ipca_2.components_)
print('\n')
# 获取每个组件解释的方差量
print("解释的方差:" ,ipca_2.explained_variance_)
print('\n')
# 获取每个组件解释的方差百分比
print("解释的方差比率:" ,ipca_2.explained_variance_ratio_)
print('\n')
# 获取每个组件的奇异值
print("奇异值:" ,ipca_2.singular_values_)
print('\n')# 获取估计的噪声协方差
print("噪声方差:" ,ipca_2.noise_variance_)
输出
将会产生以下输出 −
特征名称:['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
特征大小:(150, 4)
目标名称:['setosa' 'versicolor' 'virginica']
目标大小:(150,)
转换后的数据集大小:(150, 2)
组成部分: [[ 0.3622612 -0.0850586 0.85634557 0.35805603]
[ 0.64678214 0.73999163 -0.17069766 -0.07033882]]
解释的方差: [4.22535552 0.24227125]
解释的方差比率: [0.92398758 0.05297912]
奇异值: [25.09139241 6.0081958 ]
噪声方差: 0.00713274779746683
极客教程