在机器学习领域,有效处理高维数据是至关重要的。主成分分析(PCA)是一种强大的技术,可以在减少数据维度的同时保留重要特征。本博客将探讨如何使用Python和sklearn库应用PCA来提升分类任务的性能。
一、PCA是什么?
PCA是一种统计方法,用于降低数据集中变量的数量,同时尽可能保留数据的信息。它通过将原始变量转换为一组新的变量(称为主成分),这些新变量是原始变量的线性组合,并且按照它们在数据中解释的方差大小进行排序。
二、数据集概述
我们将使用名为hua.xlsx
的数据集,其中包含特征和目标变量。我们的目标是使用逻辑回归来预测目标变量,分别使用和不使用PCA进行比较。
三、实施步骤
1. 加载和预处理数据
from sklearn.decomposition import PCA # 导入PCA模块
import pandas as pd # 导入pandas库,用于数据处理
from sklearn.model_selection import train_test_split # 导入train_test_split函数,用于数据集划分
from sklearn.linear_model import LogisticRegression # 导入LogisticRegression类,用于逻辑回归模型
from sklearn.metrics import classification_report, confusion_matrix # 导入评估指标相关的函数
data = pd.read_excel(".\hua.xlsx") # 使用pandas读取Excel文件中的数据,存入data变量
X = data.iloc[:, :-1] # 从数据中提取所有特征列,存入X变量
y = data.iloc[:, -1] # 从数据中提取最后一列作为目标变量,存入y变量
首先导入必要的库,并使用Pandas加载名为hua.xlsx
的Excel数据集。X
是特征数据,通过iloc
方法选取除最后一列外的所有列;y
是目标变量,通过iloc
选取最后一列数据。
-
X=data.iloc[:, :-1]
: 使用iloc
方法选取所有行和除最后一列外的所有列作为特征数据集X
。 -
y=data.iloc[:, -1]
: 使用iloc
方法选取所有行和最后一列作为目标变量y
。
2. 数据集划分
# 不使用PCA的数据集划分
x_train_no_pca, x_test_no_pca, y_train_no_pca, y_test_no_pca = train_test_split(X, y, test_size=0.2, random_state=0)
# 使用train_test_split函数划分数据集,将特征和目标变量分为训练集和测试集,test_size=0.2表示测试集占20%,random_state=0保证每次运行划分结果一致
# 使用PCA
pca = PCA(n_components=0.90) # 创建PCA对象,保留90%的方差
pca.fit(X) # 在特征数据上拟合PCA模型
new_x = pca.transform(X) # 对特征数据进行PCA降维处理
x_train, x_test, y_train, y_test = train_test_split(new_x, y, test_size=0.2, random_state=0)
# 使用PCA后的数据再次划分为训练集和测试集,保持相同的参数设置
这部分代码将数据集划分为训练集和测试集。通过train_test_split
函数将不使用PCA的数据集X
和y
划分为训练集(x_train_no_pca
和y_train_no_pca
)和测试集(x_test_no_pca
和y_test_no_pca
)。再使用PCA对原始数据集X
进行降维处理,设置保留90%的方差。PCA模型拟合原始数据集后,将数据转换为新的特征矩阵new_x
。最后,将降维后的数据集new_x
划分为使用PCA后的训练集(x_train
和y_train
)和测试集(x_test
和y_test
)。
-
pca.fit(X)
: 对特征数据集X
进行PCA拟合,即学习主成分。 -
new_x = pca.transform(X)
: 使用学习到的PCA模型对原始特征数据集X
进行变换,得到降维后的新特征矩阵new_x
。 -
train_test_split(new_x, y, test_size=0.2, random_state=0)
: 将经过PCA处理后的特征数据集new_x
和目标变量y
再次划分为使用PCA后的训练集和测试集。
3. 构建和评估模型
(1)不使用PCA的逻辑回归模型
# 不使用PCA的逻辑回归模型训练和预测
classifier_no_pca = LogisticRegression() # 创建逻辑回归分类器对象
classifier_no_pca.fit(x_train_no_pca, y_train_no_pca) # 在训练数据上训练模型
train_pred_no_pca = classifier_no_pca.predict(x_train_no_pca) # 对训练集进行预测
test_pred_no_pca = classifier_no_pca.predict(x_test_no_pca) # 对测试集进行预测
# 输出不使用PCA的分类报告和混淆矩阵
print("不使用PCA的结果:")
print("训练集报告:")
print(classification_report(y_train_no_pca, train_pred_no_pca)) # 输出训练集的分类报告
print("测试集报告:")
print(classification_report(y_test_no_pca, test_pred_no_pca)) # 输出测试集的分类报告
print("混淆矩阵:")
print(confusion_matrix(y_test_no_pca, test_pred_no_pca)) # 输出测试集的混淆矩阵
使用逻辑回归模型对未经PCA处理的数据进行训练和预测。首先,实例化一个LogisticRegression
对象,然后使用训练集x_train_no_pca
和y_train_no_pca
进行模型训练。接着,分别对训练集和测试集进行预测,并输出不使用PCA的分类报告(包括精确率、召回率、F1-score等)和混淆矩阵。
-
LogisticRegression()
: 初始化逻辑回归分类器对象。 -
classifier_no_pca.fit(x_train_no_pca, y_train_no_pca)
: 使用不经过PCA处理的训练集x_train_no_pca
和y_train_no_pca
对逻辑回归模型进行训练。 -
train_pred_no_pca = classifier_no_pca.predict(x_train_no_pca)
: 对训练集进行预测,得到预测结果train_pred_no_pca
。 -
test_pred_no_pca = classifier_no_pca.predict(x_test_no_pca)
: 对测试集进行预测,得到预测结果test_pred_no_pca
。
(2)使用PCA的逻辑回归模型
# 使用PCA的逻辑回归模型训练和预测
classifier = LogisticRegression() # 创建逻辑回归分类器对象
classifier.fit(x_train, y_train) # 在使用PCA后的训练数据上训练模型
train_pred = classifier.predict(x_train) # 对训练集进行预测
test_pred = classifier.predict(x_test) # 对测试集进行预测
# 输出使用PCA的分类报告和混淆矩阵
print("使用PCA的结果:")
print("训练集报告:")
print(classification_report(y_train, train_pred)) # 输出使用PCA后训练集的分类报告
print("测试集报告:")
print(classification_report(y_test, test_pred)) # 输出使用PCA后测试集的分类报告
print("混淆矩阵:")
print(confusion_matrix(y_test, test_pred)) # 输出使用PCA后测试集的混淆矩阵
这部分代码类似于上一部分,不同之处在于这里使用了经过PCA处理后的数据进行模型训练和预测。同样,实例化一个LogisticRegression
对象,然后使用PCA处理后的训练集x_train
和y_train
进行模型训练。最后,对训练集和测试集进行预测,并输出使用PCA后的分类报告和混淆矩阵。
-
classifier.fit(x_train, y_train)
: 使用经过PCA处理的训练集x_train
和y_train
对逻辑回归模型进行训练。 -
train_pred = classifier.predict(x_train)
: 对使用PCA后的训练集进行预测,得到预测结果train_pred
。 -
test_pred = classifier.predict(x_test)
: 对使用PCA后的测试集进行预测,得到预测结果test_pred
。