PCA 降维实战:从原理到电信客户流失数据应用

一、简介

        在机器学习领域,数据的特征维度往往较高,这不仅会增加计算的复杂度,还可能导致过拟合等问题。主成分分析(Principal Component Analysis,简称 PCA)作为一种经典的降维技术,能够在保留数据主要信息的前提下,有效降低数据维度,提升模型训练效率与性能。本文将结合 Python 代码,以电信客户流失数据为例,深入讲解 PCA 的原理与实战应用。

二、PCA 原理概述

        PCA 的核心思想是通过正交变换将原始的高维数据转换到一个新的坐标系下,使得数据在新坐标系下的方差尽可能大,这些方差较大的方向就被称为主成分。通俗来讲,PCA 就是寻找数据中最具有代表性的几个方向,将数据投影到这些方向上,从而实现降维。

主要分为以下步骤:

        数据标准化:对原始数据进行标准化处理,使得每个特征的均值为 0,方差为 1 ,消除不同特征量纲的影响。​

        计算协方差矩阵:根据标准化后的数据计算协方差矩阵,协方差矩阵描述了各个特征之间的相关性。​

        计算特征值和特征向量:对协方差矩阵进行特征分解,得到特征值和特征向量。特征值表示了数据在对应特征向量方向上的方差大小,特征值越大,说明该方向上的数据变化越大,包含的信息越多。​

        选择主成分:按照特征值从大到小的顺序对特征向量进行排序,选取前 k 个特征向量作为主成分。k 的选择可以根据具体需求,比如保留一定比例的方差(如 90%),或者指定具体的维度。​

        数据转换:将原始数据投影到选取的主成分上,得到降维后的数据

 

三、案例实现 

        本文将通过Python代码实现,探讨决策树模型在电信客户流失预测中的应用,并结合PCA降维技术优化模型性能,同时对比降维前后的模型效果。

from sklearn.decomposition import PCA
import pandas as pd
data = pd.read_excel('C:\CODE\机器学习\决策树算法\电信客户流失数据.xlsx')
# 数据划分
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

        导入库:首先从sklearn.decomposition模块导入PCA类,用于执行主成分分析进行数据降维;导入pandas库并简写成pd,用于数据的读取和处理。​

        读取数据:使用pd.read_excel()函数读取本地路径'C:\CODE\机器学习\决策树算法\电信客户流失数据.xlsx'下的 Excel 文件,并将数据存储在data变量中。这里需要注意,如果文件路径中包含空格或特殊字符,可能会导致读取失败,可使用原始字符串(在字符串前加r)或者对路径中的特殊字符进行转义处理 。​

        数据划分:通过iloc方法对数据进行划分。X = data.iloc[:, :-1]表示选取data中除最后一列以外的所有列,作为特征矩阵,即包含客户的各种属性信息;y = data.iloc[:, -1]表示选取data中的最后一列,作为目标变量,即表示客户是否流失。

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 对象:创建PCA类的实例pca,并设置参数n_components=0.90,这意味着模型会自动选择能够保留原始数据 90% 方差的主成分数量,以此来确定降维后的维度。​

        模型训练:调用pca.fit(X)方法,使用特征矩阵X对PCA模型进行训练。在这个过程中,模型会计算数据的协方差矩阵、特征值和特征向量等,以确定主成分的方向和重要性。这里不需要传入目标变量y,因为PCA是一种无监督学习方法,仅依赖数据本身的特征结构进行降维 。​

        查看方差信息:通过pca.explained_variance_ratio_属性获取每个主成分所解释的方差比例。sum(pca.explained_variance_ratio_)计算所有选取主成分解释方差的总和,并打印输出 “特征所占百分比”,帮助我们了解降维后的数据保留了多少原始数据的信息。同时,单独打印pca.explained_variance_ratio_,展示每个主成分具体的方差解释比例。​

        数据降维:调用pca.transform(X)方法,将原始特征矩阵X转换到主成分空间,得到降维后的数据new_x。此时,new_x的维度已经根据之前设定的保留 90% 方差的条件进行了缩减,包含了数据在主成分方向上的投影信息。

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)

         导入函数:从sklearn.model_selection模块导入train_test_split函数,该函数用于将数据集划分为训练集和测试集。​

        划分降维后的数据:使用train_test_split(new_x, y, test_size=0.2, random_state=0)将降维后的数据new_x和对应的目标变量y进行划分。其中,test_size=0.2表示测试集占总数据集的 20%,random_state=0用于设置随机种子,确保每次运行代码时划分的数据集是相同的,方便结果的复现和对比 。划分后得到训练集特征xtrain、测试集特征xtest、训练集目标变量ytrain和测试集目标变量ytest。​

        划分原始数据:同样使用train_test_split(X, y, test_size=0.2, random_state=0)对原始特征矩阵X和目标变量y进行划分,得到另一组训练集和测试集xtrain1、xtest1、ytrain1、ytest1,用于后续与降维后数据训练的模型进行对比。

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier1 = LogisticRegression()
classifier.fit(xtrain,ytrain)
classifier1.fit(xtrain1,ytrain1)

        导入模型:从sklearn.linear_model模块导入LogisticRegression类,即逻辑回归模型,这是一种常用的分类模型,适用于二分类问题,在本案例中用于预测客户是否流失。​

        实例化模型:分别创建两个LogisticRegression类的实例classifier和classifier1,后续将使用它们分别对降维后的数据和原始数据进行训练。​

        模型训练:调用classifier.fit(xtrain,ytrain)使用降维后的训练集xtrain和对应的训练集目标变量ytrain对classifier模型进行训练;调用classifier1.fit(xtrain1,ytrain1)使用原始训练集xtrain1和ytrain1对classifier1模型进行训练。在训练过程中,模型会根据输入的特征和目标变量,学习特征与目标之间的关系,调整模型的参数。

# 训练测试集
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))

        导入评估指标模块:从sklearn库导入metrics模块,该模块提供了多种用于评估分类模型性能的指标和函数。​

        评估降维后模型在训练集上的性能:使用classifier.predict(xtrain)让训练好的classifier模型对降维后的训练集xtrain进行预测,得到预测结果train_pred。然后通过metrics.classification_report(ytrain, train_pred)生成分类报告,展示模型在训练集上的精确率(precision)、召回率(recall)、F1 值(f1-score)等指标,用于评估模型在训练数据上的表现 。​

        评估降维后模型在测试集上的性能:使用classifier.predict(xtest)对降维后的测试集xtest进行预测,得到测试集预测结果test_pred。同样通过metrics.classification_report(ytest, test_pred)生成测试集的分类报告,并使用classifier.score(xtest, ytest)计算模型在测试集上的准确率(accuracy),即预测正确的样本数占总样本数的比例,综合评估模型的泛化能力。​

        评估原始数据模型在训练集和测试集上的性能:对基于原始数据训练的classifier1模型,重复上述步骤。使用classifier1.predict(xtrain1)和classifier1.predict(xtest1)分别对原始训练集xtrain1和测试集xtest1进行预测,通过metrics.classification_report和classifier1.score评估模型在原始数据训练集和测试集上的性能,最后对比两组模型的性能指标,分析 PCA 降维对模型性能的影响。

完整代码:

from sklearn.decomposition import PCA
import pandas as pddata = pd.read_excel('C:\CODE\机器学习\决策树算法\电信客户流失数据.xlsx')# 数据划分
X = data.iloc[:, :-1]
y = data.iloc[:, -1]pca = PCA(n_components=0.90) # 实列化PCA对象
pca.fit(X) #进行训练,不需要传入yprint('特征所占百分比:{}'.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 LogisticRegressionclassifier = 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 降维的原理,并通过 Python 代码在电信客户流失数据上进行了实战演示。PCA 作为一种强大的降维工具,在机器学习和数据分析中有着广泛的应用。通过合理使用 PCA,可以有效处理高维数据,提升模型的性能和效率。希望本文的内容能够帮助读者更好地理解和应用 PCA 降维技术,在实际项目中发挥其优势。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信创时代编程开发语言选择指南:国产替代背景下的技术路径与实践建议

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…

Arcgis10.1的汉化包及破解文件分享

Arcgis10.1的汉化包分享 网上有好多10.2的汉化包,但是10.1的汉化包很少,特在此分析出来给大家 Arcgis10.1破解文件及汉化包: (访问密码: 9784) license manager破解安装文件 另外也分享了license manager破解安装文件,也在相同的分享链接里…

CrewAI Community Version(一)——初步了解以及QuickStart样例

目录 1. CrewAI简介1.1 CrewAI Crews1.2 CrewAI Flows1.3 Crews和Flows的使用情景 2. CrewAI安装2.1 安装uv2.2 安装CrewAI CLI 3. 官网QuickStart样例3.1 创建CrewAI Crews项目3.2 项目结构3.3 .env3.4 智能体角色及其任务3.4.1 agents.yaml3.4.2 tasks.yaml 3.5 crew.py3.6 m…

word选中所有的表格——宏

Sub 选中所有表格()Dim aTable As TableApplication.ScreenUpdating FalseActiveDocument.DeleteAllEditableRanges wdEditorEveryoneFor Each aTable In ActiveDocument.TablesaTable.Range.Editors.Add wdEditorEveryoneNextActiveDocument.SelectAllEditableRanges wdEdito…

Tkinter与ttk模块对比:构建现代 Python GUI 的进化之路

在 Python GUI 开发中,标准库 tkinter 及其子模块 ttk(Themed Tkinter)常被同时使用。本文通过功能对比和实际案例,简单介绍这两个模块的核心差异。 1. 区别 Tkinter:Python 标准 GUI 工具包(1994年集成&…

Linux系统之部署Dillinger个人文本编辑器

Linux系统之部署Dillinger个人文本编辑器 一、Dillinger介绍1.1 Dillinger简介1.2 Dillinger特点1.3 使用场景二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本四、部署Node.js 环境4.1 下载Node.js安装包4.2 解…

从malloc到free:动态内存管理全解析

1.为什么要有动态内存管理 我们已经掌握的内存开辟方法有: int main() {int val 20;//在栈空间上开辟四个字节char arr[20] { 0 };//在栈空间上开辟10个字节的连续空间return 0; }上述开辟的内存空间有两个特点: 1.空间开辟的时候大小已经固定 2.数组…

健身房管理系统设计与实现(springboot+ssm+vue+mysql)含万字详细文档

健身房管理系统设计与实现(springbootssmvuemysql)含万字详细文档 健身房管理系统是一个全面的解决方案,旨在帮助健身房高效管理日常运营。系统主要功能模块包括个人中心、会员管理、员工管理、会员卡管理、会员卡类型管理、教练信息管理、解聘管理、健身项目管理、…

seate TCC模式案例

场景描述 用户下单时,需要创建订单并从用户账户中扣除相应的余额。如果订单创建成功但余额划扣失败,则需要回滚订单创建操作。使用 Seata 的 TCC 模式来保证分布式事务的一致性。 1. 项目结构 假设我们有两个微服务: Order Service&#x…

【Linux】Rhcsa复习5

一、Linux文件系统权限 1、文件的一般权限 文件权限针对三类对象进行定义: owner 属主,缩写u group 属组, 缩写g other 其他,缩写o 每个文件针对每类访问者定义了三种主要权限: r:read 读 w&…

《Operating System Concepts》阅读笔记:p748-p748

《Operating System Concepts》学习第 64 天,p748-p748 总结,总计 1 页。 一、技术总结 1.Transmission Control Protocol(TCP) 重点是要自己能画出其过程,这里就不赘述了。 二、英语总结(生词:3) transfer, transport, tran…

C语言之图像文件的属性

🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 图像文件属性提取系统设计与实现 目录 设计题目设计内容系统分析总体设计详细设计程序实现…

opencv--基础

opencv OpenCV是一个实现数字图像处理和计算机视觉通用算法的开源跨平台库。 链接 opencv中的cv是什么意思 在OpenCV中,"cv" 是 "Computer Vision"(计算机视觉) 的缩写。 opencv的实现语言 opencv的底层实现代码是使…

Java创建对象的方式

1、通过new关键字创建新对象 用new关键字创建对象是我们在开发中最常用的方式,new关键字会为我们在堆内存中开辟一块空间以存放对象的引用(包含对象本身以及内部属性的引用)。 2、通过newInstance()方法创建新对象 newInstance()方法本质上是…

构建具备推理与反思能力的高级 Prompt:LLM 智能代理设计指南

在构建强大的 AI 系统,尤其是基于大语言模型(LLM)的智能代理(Agent)时,Prompt 设计的质量决定了系统的智能程度。传统 Prompt 通常是简单的问答或填空式指令,而高级任务需要更具结构性、策略性和…

猪行为视频数据集

猪行为数据集包含 23 天(超过 6 周)的日间猪行为视频,这些视频由近乎架空的摄像机拍摄。视频已配准颜色和深度信息。数据以每秒 6 帧的速度捕获,并以 1800 帧(5 分钟)为一批次进行存储。大多数帧显示 8 头猪。 这里可以看到颜色和深度图像的示例: 喂食器位于图片底部中…

C++运算符重载详解

C++ 中的运算符重载允许为用户自定义类型(类或结构体)赋予运算符特定功能,使其操作更直观。以下是运算符重载的关键点: 1. 基本语法 成员函数重载:运算符作为类的成员函数,左操作数为当前对象 (this),右操作数为参数。 class Complex {public:Complex operator+(const …

deep-share开源浏览器扩展,用于分享 DeepSeek 对话,使用户能够将对话内容保存为图片或文本以便轻松分享

一、软件介绍 文末提供程序和源码下载学习 deep-share开源浏览器扩展,用于分享 DeepSeek 对话,使用户能够将对话内容保存为图片或文本以便轻松分享。 二、软件功能 One-click capture of DeepSeek chat content一键捕获 DeepSeek 聊天内容Support sha…

Unity之如何实现RenderStreaming视频推流

文章目录 前言引入 UnityRenderStreaming 的好处教程步骤 1:设置环境步骤 2: 创建项目步骤 3:安装软件包步骤 5:下载示例步骤 6:检查配置环境步骤 7:打开推流场景步骤 8: 准备用于流式传输的WebServer应用程序步骤 9: 运行 示例场景步骤 10:检查视频是否在浏览器中显示…

30天开发操作系统 第26天 -- 为窗口移动提速

前言 昨天我们增加了可同时启动的应用程序的数量,窗口也跟着变多了,整个画面变得热闹起来。 话说,在对比color.hrb和color2.hrb的时候我们需要移动窗口,那个时候笔者感到窗口移动的速度很慢。在真机环境下的速度还算可以接受&…