机器学习中的主成分分析(PCA)的实现

        在机器学习领域,有效处理高维数据是至关重要的。主成分分析(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的数据集Xy划分为训练集(x_train_no_pcay_train_no_pca)和测试集(x_test_no_pcay_test_no_pca)。再使用PCA对原始数据集X进行降维处理,设置保留90%的方差。PCA模型拟合原始数据集后,将数据转换为新的特征矩阵new_x。最后,将降维后的数据集new_x划分为使用PCA后的训练集(x_trainy_train)和测试集(x_testy_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_pcay_train_no_pca进行模型训练。接着,分别对训练集和测试集进行预测,并输出不使用PCA的分类报告(包括精确率、召回率、F1-score等)和混淆矩阵。

  • LogisticRegression(): 初始化逻辑回归分类器对象。

  • classifier_no_pca.fit(x_train_no_pca, y_train_no_pca): 使用不经过PCA处理的训练集x_train_no_pcay_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_trainy_train进行模型训练。最后,对训练集和测试集进行预测,并输出使用PCA后的分类报告和混淆矩阵。

  • classifier.fit(x_train, y_train): 使用经过PCA处理的训练集x_trainy_train对逻辑回归模型进行训练。

  • train_pred = classifier.predict(x_train): 对使用PCA后的训练集进行预测,得到预测结果train_pred

  • test_pred = classifier.predict(x_test): 对使用PCA后的测试集进行预测,得到预测结果test_pred

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值