在数据科学领域,理解和掌握不同的降维和分类技术是非常重要的。今天的更新我们将介绍一种结合了降维和分类的技术:偏最小二乘判别分析(PLS-DA)。很多时候,人们特别喜欢用线性判别分析(LDA),但问题是人们很少考虑使用线性的前置条件,那很多数据根本不适合线性分析,那么就应该用PLSDA这种万金油类型的判别分析方法。这篇更新还包括特别完整的Python代码,演示如何应用PLS-DA对自带数据集进行判别分类,展示PLS-DA分类的可视化图。值得关注分享收藏!
什么是PLS-DA?
PLS-DA(Partial Least Squares Discriminant Analysis)是偏最小二乘回归(PLS)的分类版本。PLS是一种常用于处理多变量数据的统计方法,通过寻找变量之间的最大协方差来简化数据集。PLS-DA将PLS的能力扩展到分类问题中,通过最大化类别之间的差异来进行分类。
PLS-DA的目标是通过提取对类别区分最有贡献的信息,将数据投影到一个新的低维空间中,从而提高分类的准确性。这使得PLS-DA特别适合于处理具有高维度且高度共线的数据集,例如在化学、基因组学和代谢组学中常见的数据集。
PLS-DA与PCA和LDA的区别
PLS-DA vs. PCA:
PCA(主成分分析):PCA是一种无监督的降维技术,其目标是找到解释数据方差的主成分。PCA仅关注数据的结构和方差,而不考虑类别标签,因此它是一种无监督方法。
PLS-DA:PLS-DA是一种有监督的降维和分类技术,它在考虑类别标签的基础上进行投影,目的是找到能区分不同类别的潜在变量。因此,与PCA相比,PLS-DA更适合用于分类任务。
PLS-DA vs. LDA:
LDA(线性判别分析):LDA是一种线性分类技术,它通过寻找可以最大化类别之间距离同时最小化类内方差的投影方向来区分类别。LDA通常适用于维度低于样本数的数据集。
PLS-DA:PLS-DA通过提取与类别差异最相关的成分来进行分类,并且不受维度限制,因此可以处理高维数据集。PLS-DA不仅可以用于降维,还可以进行分类,因此它在高维数据处理方面比LDA更具灵活性。
PLS-DA的Python实现
接下来,我们使用Python和scikit-learn库来演示如何应用PLS-DA进行数据分类。
1. 导入所需的库
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.cross_decomposition import PLSRegression
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
2. 数据加载和预处理
我们将使用scikit-learn自带的葡萄酒数据集,这是一个经典的多变量分类问题。
# 加载葡萄酒数据集
data = datasets.load_wine()
X = data.data
y = data.target
feature_names = data.feature_names
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
3. PLS-DA建模
我们使用PLSRegression来实现PLS-DA。在这里,我们将类别标签转换为二进制格式以适应PLS回归的要求。
# 使用PLSRegression进行PLS-DA建模
plsda = PLSRegression(n_components=2)
plsda.fit(X_train, pd.get_dummies(y_train))
# 预测测试集
y_pred = plsda.predict(X_test)
y_pred_class = np.argmax(y_pred, axis=1)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred_class)
print(f"模型准确率: {accuracy:.2f}")
## 模型准确率: 0.98
# 混淆矩阵
cm = confusion_matrix(y_test, y_pred_class)
print("混淆矩阵:\n", cm)
## 混淆矩阵:
## [[19 0 0]
## [ 0 20 1]
## [ 0 0 14]]
4. PLS-DA结果的可视化
我们通过绘制二维图来可视化PLS-DA的分类结果。
# 将训练数据投影到PLS成分上
X_train_pls = plsda.transform(X_train)
X_test_pls = plsda.transform(X_test)
plt.figure(figsize=(8, 6))
# 可视化训练集
for i, target_name in enumerate(data.target_names):
plt.scatter(X_train_pls[y_train == i, 0], X_train_pls[y_train == i, 1], label=f'训练 {target_name}', alpha=0.7)
# 可视化测试集
for i, target_name in enumerate(data.target_names):
plt.scatter(X_test_pls[y_test == i, 0], X_test_pls[y_test == i, 1], label=f'测试 {target_name}', alpha=0.7, marker='x')
plt.xlabel('PLS Component 1')
plt.ylabel('PLS Component 2')
plt.title('PLS-DA 分类结果')
plt.legend()
plt.show()
结论
PLS-DA通过结合PLS的降维能力和线性判别的分类能力,提供了一种处理高维数据的有效方法。通过最大化类别之间的差异,PLS-DA能够在保留有用信息的同时提高分类的准确性。希望这篇文章能帮助你更好地理解PLS-DA的概念和应用。
感谢关注!