亦菲喊你来学机器学习(20) --PCA数据降维

文章目录

  • PCA数据降维
    • 一、降维
    • 二、优缺点
    • 三、参数
    • 四、实例应用
      • 1. 读取文件
      • 2. 分离特征和目标变量
      • 3. 使用PCA进行降维
      • 4. 打印特征所占百分比和具体比例
      • 5. PCA降维后的数据
      • 6. 划分数据集
      • 7. 训练逻辑回归模型
      • 8. 评估模型性能
  • 总结

PCA数据降维

主成分分析(Principal Component Analysis, PCA)是一种常用的数据降维技术,它可以在保留数据集中最重要的特征的同时,减少数据的维度。PCA通过创建一个新的特征空间来实现这一点,这个新空间是由原始数据的主成分(即方差最大的方向)定义的。

本篇所用数据:
链接: 训练数据
提取码: 9hgj

一、降维

数据的特征又叫做数据的维度,所谓降维,即是减少数据的特征。

相较于随机森林的不同,随机森林是筛选出权重较大的特征,其余的特征都进行特征工程处理(即去除)。

但是PCA降维可以理解为将所有的特征压缩到另一个特征空间,将多个维度的特征映射在一个维度上,从而减少它总的维度。

二、优缺点

优点

  1. 计算方法简单,容易实现。
  2. 可以减少指标筛选的工作量。
  3. 消除变量间的多重共线性。
  4. 在一定程度上能减少噪声数据。

缺点

  1. 特征必须是连续型变量。
  2. 无法解释降维后的数据是什么。
  3. 贡献率小的成分有可能更重要。

三、参数

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: 类型:boolTrue或者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进行特征降维 -----> 使用逻辑回归模型进行分类任务

1. 读取文件

使用pandas库的read_excel函数读取名为’hua.xlsx’的Excel文件,并将内容存储在DataFrame 类型数据data中。

import pandas as pd  
data = pd.read_excel('hua.xlsx')

2. 分离特征和目标变量

通过iloc索引器,x被设置为DataFrame中除最后一列外的所有列(即特征),而y被设置为最后一列(即目标变量或标签)。

x = data.iloc[:,:-1]  
y = data.iloc[:,-1]

3. 使用PCA进行降维

导入PCA类并创建一个PCA实例,设置n_components=0.90意味着希望保留的数据方差比例为90%。然后,使用fit方法计算数据的主成分。

from sklearn.decomposition import PCA  
pca = PCA(n_components=0.90)  
pca.fit(x)

4. 打印特征所占百分比和具体比例

这两行代码分别打印了保留的总方差百分比和每个主成分解释的方差比例。

print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))  
print(pca.explained_variance_ratio_)
--------------------
特征所占百分比:0.9287327483408421	#百分结果通常不会与设定值正好相同,但肯定会比设定值大
[0.84389796 0.08483479]

5. PCA降维后的数据

使用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]
 …… ……
]

6. 划分数据集

使用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)

7. 训练逻辑回归模型

导入LogisticRegression类并创建一个实例,然后使用训练数据x_train和y_train来训练模型。

from sklearn.linear_model import LogisticRegression  
classifier_PCA = LogisticRegression()  
classifier_PCA.fit(x_train,y_train)

8. 评估模型性能

使用训练好的模型对训练集和测试集进行预测,并使用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进行特征降维,并使用逻辑回归模型进行分类任务的完整流程。

总结

本篇介绍了:

  1. PCA降维指的是减少数据特征。
  2. PCA适用于:
    1. 数据维度高的时候
    2. 将数据可视化时:将维度转化为二维或三维等
  3. 完整的PCA处理流程。

你可能感兴趣的:(机器学习,人工智能,深度学习,python,算法,sklearn)