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 降维技术,在实际项目中发挥其优势。