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