在机器学习领域,数据预处理和模型选择是影响模型性能的关键因素。主成分分析(Principal Component Analysis,PCA)作为一种常用的降维技术,能够在保留数据主要信息的前提下,降低数据维度,减少计算复杂度,同时还能有效解决数据特征之间的相关性问题。本文将结合鸢尾花(Iris)数据集,详细介绍如何使用 PCA 进行数据降维,并对比降维前后逻辑回归模型的性能表现。
一、数据读取与基本信息查看
首先,我们使用pandas
库读取鸢尾花数据集。鸢尾花数据集是机器学习领域中非常经典的数据集,包含 150 条记录,每条记录描述了鸢尾花的四个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度),以及对应的鸢尾花类别(山鸢尾、变色鸢尾、维吉尼亚鸢尾)。
import pandas as pd
# 读取数据
data = pd.read_csv('iris.csv')
通过上述代码,我们将数据集读取到data
变量中,后续将基于该数据集进行一系列操作。
二、数据划分
接下来,我们将数据集划分为特征矩阵X
和标签向量y
。特征矩阵X
包含数据集的前四个列,即花的四个特征;标签向量y
包含数据集的最后一列,即鸢尾花的类别信息。
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
三、主成分分析(PCA)降维
3.1 PCA 模型实例化与训练
我们使用sklearn.decomposition
模块中的PCA
类进行主成分分析。这里设置n_components=0.90
,表示我们希望保留足够的主成分,使得累计解释方差比例达到 90%。
from sklearn.decomposition import PCA
pca = PCA(n_components=0.90) # 实例化PCA对象
pca.fit(X) # 进行训练,不需要传入y
在上述代码中,pca.fit(X)
方法会对原始特征矩阵X
进行计算,确定主成分的方向和解释方差比例。
3.2 查看主成分分析结果
我们可以通过explained_variance_ratio_
属性查看每个主成分的解释方差比例,以及累计解释方差比例。
print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))
print(pca.explained_variance_ratio_)
运行上述代码后,我们能够直观地了解到每个主成分对原始数据信息的解释程度,以及最终保留的主成分累计能够解释多少原始数据的信息。
3.3 数据转换
完成 PCA 模型的训练后,我们使用transform
方法将原始数据转换到主成分空间,得到降维后的数据new_x
。
print('PCA降维后数据:')
new_x = pca.transform(X)
print(new_x) # 数据X在主成分空间中的表示,具体来说,这个方法将数据X从原始特征空间转换到主成分空间
此时的new_x
就是经过 PCA 降维后的数据,其维度相较于原始数据X
已经降低,但是保留了原始数据 90% 以上的信息。
四、数据集划分与模型训练
4.1 数据集划分
我们将原始数据和降维后的数据分别划分为训练集和测试集,用于后续的模型训练和评估。这里设置测试集大小为原始数据集的 20%,并通过random_state=0
设置随机种子,确保每次运行代码时数据集划分的结果一致。
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)
4.2 逻辑回归模型训练
我们使用sklearn.linear_model
模块中的LogisticRegression
类构建逻辑回归模型,并分别使用降维后的数据和原始数据进行训练。
from sklearn.linear_model import LogisticRegression
# 导入逻辑回归分类器
classifier = LogisticRegression()
classifier1 = LogisticRegression()
classifier.fit(xtrain, ytrain)
classifier1.fit(xtrain1, ytrain1)
上述代码中,classifier
是基于降维后数据训练的逻辑回归模型,classifier1
是基于原始数据训练的逻辑回归模型。
五、模型评估
我们使用classification_report
和score
方法对两个模型在训练集和测试集上的性能进行评估。classification_report
可以输出精确率、召回率、F1 值等详细的分类指标,score
方法则直接返回模型在测试集上的准确率。
from sklearn import metrics
from sklearn.metrics import classification_report
# 训练测试集
train_pred = classifier.predict(xtrain)
print(classification_report(ytrain, train_pred))
test_pred = classifier.predict(xtest)
print(classification_report(ytest, test_pred))
print(classifier.score(xtest, ytest))
train1_pred = classifier1.predict(xtrain1)
print(classification_report(ytrain1, train1_pred))
test1_pred = classifier1.predict(xtest1)
print(classification_report(ytest1, test1_pred))
print(classifier1.score(xtest1, ytest1))
通过对比两个模型的评估结果,我们可以直观地看到 PCA 降维对逻辑回归模型性能的影响。在某些情况下,降维后的模型可能会因为去除了冗余信息和噪声,在测试集上表现出更好的泛化能力;而在另一些情况下,原始数据可能包含足够的有效信息,使得基于原始数据训练的模型性能更优。
六、总结
本文通过对鸢尾花数据集的处理,详细展示了主成分分析(PCA)降维的过程,并对比了降维前后逻辑回归模型的性能。PCA 作为一种强大的数据预处理技术,能够帮助我们在不损失过多信息的前提下降低数据维度,提高模型的训练效率和泛化能力。然而,并非在所有情况下降维都能提升模型性能,具体是否需要使用 PCA 以及如何选择合适的主成分数量,还需要根据数据集的特点和具体的任务需求进行综合考虑。在实际的机器学习项目中,不断尝试不同的数据预处理方法和模型,进行性能对比和调优,是提高模型效果的关键所在。希望本文的实践案例能够为大家在数据降维和模型选择方面提供一些有益的参考和启发。