主成分分析-PCA

一、简介

1.意义

PCA(主成分分析,Principal Component Analysis)是一种常用的数据降维技术。它的主要目的是通过线性变换将原始数据转换到新的坐标系统中,这个新坐标系统的各个坐标轴(即主成分)是原始数据的主要特征方向,这些方向上的数据方差最大,且各坐标轴之间相互正交。通过这种方式,PCA可以在保留数据重要特征的同时,减少数据的维度,简化数据,便于后续的数据处理和分析。

2.PCA的应用

PCA在数据分析和机器学习领域有广泛的应用,包括:

  • 数据压缩:通过减少数据的维度,可以显著减少数据存储和传输的成本。
  • 特征提取:PCA可以帮助识别数据中的关键特征,这对于后续的数据分析和建模非常有用。
  • 数据可视化:在将高维数据降维到2维或3维后,可以使用散点图、热力图等方式进行可视化分析。
  • 噪声去除:PCA可以通过去除较小的特征值对应的特征向量来降低噪声的干扰。

3.PCA参数解释

PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

  1. n_components
    功能:决定PCA算法应该保留的主成分数量。
    取值:
    整数k:表示保留前k个主成分。
    小数(0,1]之间的数:表示保留的主成分的方差百分比,例如0.9表示保留90%的方差。
    如果设置为None(默认值),则保留所有主成分。
  2. copy
    功能:是否在运行算法时,将原始训练数据复制一份。
    取值:
    True(默认值):复制数据,以免修改原始数据。
    False:直接在原始数据上进行计算。
  3. whiten
    功能:决定是否对数据进行白化处理。
    取值:
    True:对数据进行白化,即对每个特征进行归一化,使得每个特征的方差都为1。在某些应用中,白化可以提高数据的可解释性。
    False(默认值):不进行白化。
  4. svd_solver
    功能:决定使用的SVD(奇异值分解)求解器的类型。
    取值:
    ‘auto’(默认值):根据输入数据的大小和特征数量自动选择最合适的求解器。
    ‘full’:使用传统的SVD方法,适用于较小的数据集。
    ‘arpack’:使用scipy库中的稀疏SVD实现,适用于大型数据集。
    ‘randomized’:使用一种随机算法来加快SVD的计算速度,适用于大型数据集且主成分数目较少的情况。
  5. tol
    功能:决定奇异值分解的收敛容差。
    取值:默认为0.0,表示使用默认的收敛容差。较小的值会产生更精确的结果,但也会增加计算时间。
  6. iterated_power
    功能:决定幂迭代方法的迭代次数。
    取值:默认为’auto’,表示使用一种启发式方法选择迭代次数。通常不需要手动调整这个参数。
  7. random_state
    功能:决定随机数生成器的种子,用于在使用’randomized’求解器时控制随机性。
    取值:
    如果设置为None(默认值),则随机数生成器使用当前系统时间作为种子。
    设置为整数时,将使用该整数作为随机数生成器的种子,以确保结果的可重复性。

二、代码实现

1. 数据预处理

from sklearn.decomposition import PCA
import pandas as pd

data = pd.read_excel('.\hua.xlsx')

# 数据划分
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
  • 使用pandas库的read_excel函数从指定的Excel文件(.\hua.xlsx)中加载数据,并将其存储在DataFrame对象data中。
  • X被设置为data中除最后一列外的所有列,包含特征(自变量)。y被设置为data的最后一列,包含目标变量(因变量)。

2. 主成分分析(PCA)

pca = PCA(n_components=0.90) # 实列化PCA对象
pca.fit(X) #进行训练,不需要传入y

print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))
print(pca.explained_variance_ratio_)

print('PCA降维后数据:')
new_x = pca.transform(X)
print(new_x) # 数据X在主成分空间中的表示,具体来说,这个方法将数据X从原始特征空间转换到主成分空间

  • 实例化PCA类,其中n_components=0.90表示希望保留原始数据90%的方差。fit方法用于计算数据X的主成分。
  • 打印出通过PCA保留的方差百分比总和以及每个主成分解释的方差百分比。
  • 将原始数据X转换到由PCA找到的主成分构成的新空间中。

3. 数据划分

from  sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest = train_test_split(new_x, y, test_size=0.2, random_state=0)
xtrain1,xtest1,ytrain1,ytest1 = train_test_split(X, y, test_size=0.2, random_state=0)
  • 使用train_test_split函数将数据集分为训练集和测试集。对于降维后的数据new_x和原始数据X,都进行了这样的划分,并使用了相同的随机种子(random_state=0)以确保可重复性。

4. 模型训练与评估

from sklearn.linear_model import LogisticRegression

classifier = LogisticRegression()
classifier1 = LogisticRegression()
classifier.fit(xtrain,ytrain)
classifier1.fit(xtrain1,ytrain1)
# 训练测试集
from sklearn import metrics
train_pred = classifier.predict(xtrain)
print(metrics.classification_report(ytrain, train_pred))

test_pred = classifier.predict(xtest)
print(metrics.classification_report(ytest, test_pred))
print(classifier.score(xtest, ytest))

train1_pred = classifier1.predict(xtrain1)
print(metrics.classification_report(ytrain1, train1_pred))
test1_pred = classifier1.predict(xtest1)
print(metrics.classification_report(ytest1, test1_pred))
print(classifier1.score(xtest1, ytest1))
  • 创建了两个逻辑回归分类器实例,并使用不同的训练数据(降维后的和未降维的)来训练它们。
  • 对于每个模型,都使用训练集进行预测,并计算了训练集上的分类报告和准确率。然后,使用测试集进行预测,并计算了测试集上的分类报告和准确率。

5.全部代码

from sklearn.decomposition import PCA
import pandas as pd

data = pd.read_excel('.\hua.xlsx')

# 数据划分
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

pca = PCA(n_components=0.90) # 实列化PCA对象
pca.fit(X) #进行训练,不需要传入y

print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))
print(pca.explained_variance_ratio_)

print('PCA降维后数据:')
new_x = pca.transform(X)
print(new_x) # 数据X在主成分空间中的表示,具体来说,这个方法将数据X从原始特征空间转换到主成分空间

from  sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest = train_test_split(new_x, y, test_size=0.2, random_state=0)
xtrain1,xtest1,ytrain1,ytest1 = train_test_split(X, y, test_size=0.2, random_state=0)

# 导入逻辑回归分类器
from sklearn.linear_model import LogisticRegression

classifier = LogisticRegression()
classifier1 = LogisticRegression()
classifier.fit(xtrain,ytrain)
classifier1.fit(xtrain1,ytrain1)

# 训练测试集
from sklearn import metrics
train_pred = classifier.predict(xtrain)
print(metrics.classification_report(ytrain, train_pred))

test_pred = classifier.predict(xtest)
print(metrics.classification_report(ytest, test_pred))
print(classifier.score(xtest, ytest))

train1_pred = classifier1.predict(xtrain1)
print(metrics.classification_report(ytrain1, train1_pred))
test1_pred = classifier1.predict(xtest1)
print(metrics.classification_report(ytest1, test1_pred))
print(classifier1.score(xtest1, ytest1))

代码展示了如何使用PCA进行特征降维,并使用逻辑回归分类器在降维后的数据和原始数据上训练模型。通过比较两个模型在训练集和测试集上的性能,可以评估PCA对模型性能的影响。

三、总结

PCA(Principal Component Analysis,主成分分析)作为一种常用的数据分析技术,在数据降维、特征提取等方面具有显著的优势,但同时也存在一些局限性。以下是PCA的优缺点分析:

1.PCA的优点

  • 数据降维:PCA通过线性变换将原始数据转换为一组新的互相独立的变量,即主成分。这些主成分保留了原始数据中的最大方差,从而在降低数据维度的同时保留了关键信息,有助于数据的可视化、理解和进一步分析。
  • 去除冗余特征:在高维数据中,往往存在高度相关的特征,这些特征不仅增加了计算复杂度,还可能引入噪音。PCA可以自动识别和去除这些冗余特征,简化数据模型,提高分析效率。
  • 去除噪音:PCA在降维的同时,可以通过选择保留高方差的主成分来抑制低方差特征(通常对应噪音或不重要信息)的影响,从而提高数据的信噪比。
  • 数据解释性:PCA生成的主成分虽然是原始特征的线性组合,但它们通常具有更好的解释性,可以揭示数据中的隐藏模式和结构。
  • 计算简便:PCA算法相对简单,计算效率高,适合处理大规模数据集。

2.PCA的缺点

  • 数据信息损失:PCA在降维过程中会丢失一部分原始数据信息,特别是那些方差较小的次要成分。
  • 对异常值敏感:PCA对异常值非常敏感,异常值的存在可能会影响主成分的准确性。
  • 依赖数据的线性关系:PCA基于数据的线性关系进行降维,对于非线性关系的数据,PCA的效果可能不理想。
  • 可解释性差:虽然PCA生成的主成分具有一定的解释性,但它们是原始特征的线性组合,可能不如原始特征直观易懂。

综上所述,PCA作为一种强大的数据分析工具,在数据降维、特征提取等方面具有显著优势,但在使用过程中也需要注意其局限性,并根据具体问题的要求和数据的特点来选择是否使用PCA以及如何使用PCA。

  • 32
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值