主成分分析(Principal Component Analysis, PCA)是一种常用的数据降维技术,它可以在保留数据集中最重要的特征的同时,减少数据的维度。PCA通过创建一个新的特征空间来实现这一点,这个新空间是由原始数据的主成分(即方差最大的方向)定义的。
本篇所用数据:
链接: 训练数据
提取码: 9hgj
数据的特征又叫做数据的维度,所谓降维,即是减少数据的特征。
相较于随机森林的不同,随机森林是筛选出权重较大的特征,其余的特征都进行特征工程处理(即去除)。
但是PCA降维可以理解为将所有的特征压缩到另一个特征空间,将多个维度的特征映射在一个维度上,从而减少它总的维度。
优点:
缺点:
PCA(n_components=None,copy=True,whiten=False,svd_solver='auto',tol=0.0,
iterated_power='auto',random_state=None)
主要参数:
-- n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。
指定整数,表示要降维到的目标,【比如十维的数据,指定n_components=5,表示将十维数据降维到五维】
如果为小数,表示累计方差百分比。
-- copy: 类型:bool,True或者False,缺省时默认为True。表示是否在运行算法时,将原始训练数据复制一份,保护原数据。
-- whiten:判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1.对于PCA降维本身来说,一般不需要白化。 如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。
-- svd_solver:指定奇异值分解SVD的方法,【按默认设置即可】,有4个可以选择的值:
- randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。
- full则是传统意义上的SVD,使用了scipy库对应的实现。
- arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的 sparse SVD实现。
- 默认是auto,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。
目标流程:使用PCA进行特征降维 -----> 使用逻辑回归模型进行分类任务
使用pandas库的read_excel函数读取名为’hua.xlsx’的Excel文件,并将内容存储在DataFrame 类型数据data中。
import pandas as pd
data = pd.read_excel('hua.xlsx')
通过iloc索引器,x被设置为DataFrame中除最后一列外的所有列(即特征),而y被设置为最后一列(即目标变量或标签)。
x = data.iloc[:,:-1]
y = data.iloc[:,-1]
导入PCA类并创建一个PCA实例,设置n_components=0.90意味着希望保留的数据方差比例为90%。然后,使用fit方法计算数据的主成分。
from sklearn.decomposition import PCA
pca = PCA(n_components=0.90)
pca.fit(x)
这两行代码分别打印了保留的总方差百分比和每个主成分解释的方差比例。
print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))
print(pca.explained_variance_ratio_)
--------------------
特征所占百分比:0.9287327483408421 #百分结果通常不会与设定值正好相同,但肯定会比设定值大
[0.84389796 0.08483479]
使用transform方法将原始特征x
映射到PCA的主成分空间中,得到降维后的数据new_x。
new_x = pca.transform(x)
print(new_x)
---------------
PCA降维后数据:
[ #展示部分结果
[-0.64329795 0.06460986]
[-1.17974815 0.04201328]
[-0.10025387 0.3220728 ]
[ 0.12824342 0.03129845]
[-1.99954745 0.05762851]
…… ……
]
使用train_test_split函数将降维后的特征new_x和目标变量y划分为训练集和测试集,测试集占20%。
x_train,x_test,y_train,y_test = train_test_split(new_x,y,test_size=0.2,random_state=0)
导入LogisticRegression类并创建一个实例,然后使用训练数据x_train和y_train来训练模型。
from sklearn.linear_model import LogisticRegression
classifier_PCA = LogisticRegression()
classifier_PCA.fit(x_train,y_train)
使用训练好的模型对训练集和测试集进行预测,并使用classification_report函数打印出分类报告,包括精确度、召回率、F1分数等指标,以评估模型在训练集和测试集上的性能。
from sklearn import metrics
train_pre = classifier_PCA.predict(x_train)
print(metrics.classification_report(y_train,train_pre))
--------------------
precision recall f1-score support
0 0.92 0.96 0.94 25
1 0.96 0.93 0.94 27
accuracy 0.94 52
macro avg 0.94 0.94 0.94 52
weighted avg 0.94 0.94 0.94 52
test_pre = classifier_PCA.predict(x_test)
print(metrics.classification_report(y_test,test_pre))
-------------------
precision recall f1-score support
0 1.00 1.00 1.00 5
1 1.00 1.00 1.00 9
accuracy 1.00 14
macro avg 1.00 1.00 1.00 14
weighted avg 1.00 1.00 1.00 14
这样我们就完成了使用PCA进行特征降维,并使用逻辑回归模型进行分类任务的完整流程。
本篇介绍了: