详细内容或原文请订阅后点击阅览
现实生活中的线性判别分析 (LDA):房地产数据集中的降维
在分类问题中使用 LDA 进行降维《现实生活中的线性判别分析 (LDA):房地产数据集中的降维》首先出现在《走向数据科学》上。
来源:走向数据科学线性判别分析 (LDA) 是一种监督学习技术,用于揭示数据中的核心成分或模式。
在本文中,我们将了解 LDA 如何与现实生活中的示例一起工作,如何使用它来降低数据集的维度并识别类分离边界。
···
线性判别分析是一种统计技术,通常应用于机器学习分类问题的数据准备阶段 [1]。它用于降低数据集的维度,并突出显示数据的特征,以最好地确保其不同类的可分离性。
例如,LDA 的一个主要应用是图像分类[2]。图像分类数据集往往具有数千个特征,LDA 用于减少可用于正确区分类别的特征数量,然后在更小的特征空间上运行分类机器学习算法。
线性判别分析:技术
在文献中,LDA 也可以称为正态判别分析或 Fisher 线性判别分析,后者参考了 Ronald A. Fisher,他是一位博学者,他开发了 LDA 旨在最大化的标准。
Fisher 准则:类间方差与类内方差之比 [2]
目标
LDA 背后的想法是采用高维数据集,例如具有数百或数千个特征的数据集,并用较少数量的特征表示相同的数据集。
应用LDA之后,你不一定有特征,你会有不同的线性判别式,它们仍然编码数据的原始特征。
后一点至关重要。这种技术将减少用于描述原始数据集的信息量,因为最初你有大量的特征,后来你可能有一些判别组件。然而,原始数据集的特征被保留,这意味着数据集只是在更小的特征空间中编码。
这几乎就像你有一个超级复杂的音乐作品,有大量不同乐器的音符,然后将其转换为 MIDI,以 8 位字节进行编码和传输。尽管如此,在 MIDI 版本中您仍然能够辨别旋律。骨头,即该音乐作品的核心特征仍然存在,它们只是被编码在较低维度的空间中。
此外,LDA 确保数据集中的不同类尽可能可区分,以便您能够尽可能分离每个类中的数据点。
假设
在进入数学定义之前,有必要提及 LDA 必须考虑一些假设:
数据是线性可分的
数据服从高斯(正态)分布
所有类共享协方差矩阵
这是该技术的一个非常有力的假设,它的名字就说明了这一点:线性判别分析。
如果您尝试将 LDA 应用于不可线性分离的数据集,即数据中类之间的边界是曲线而不是直线,您可能会得到判别式,但它们可能不是数据集核心特征的最佳编码。众所周知,LDA 无法正确捕获数据中的非线性关系和流形结构[3]。
该技术假设每个类的数据均来自高斯分布,即正态分布[4]。
数学定义
为了最大化类之间的可分离性,LDA 需要查看数据中的方差。然而,由于我们使用的是高维数据,即矩阵,而不是标量,因此我们不能使用方差作为散布或离散度的度量。我们需要使用协方差矩阵。
简而言之,协方差矩阵描述了每个特征沿其对角线的分布量,以及非对角线上每对特征之间的相关性。
特别是对于 LDA,假设所有类之间存在共享方差,这意味着每个类内协方差矩阵在所有类中都是相同的。这对于确保池内(即共享)类内协方差矩阵是每个类内协方差的准确表示是必要的[5]。
从数学上来说,线性判别分析可识别最能区分或区分数据中的类别的特征的线性组合[5]。
该方法近似贝叶斯分类器 [6],它将观测值分配给后验概率(即观测值属于 k 类的概率)最大的类。
回顾贝叶斯定理:
让我们来解压它。在上面的公式中我们有:
Y - 标签,即定性响应变量
K - 数据中类(即标签)的总数
k - 数据中类的单个实例
Pi_k- 随机选择的观测值来自 k 类的先验概率
fk(x) - 来自 k 类的观测值的 X 密度函数。这是给定 Y = k 时 X 的概率,只是因为我们正在使用定性随机变量 X
由于我们假设数据遵循高斯分布,因此我们可以更新上面的通用贝叶斯定理公式并替换密度函数占位符,将其作为高斯分布的密度函数。
看看上面的公式,你可以看出它有点冗长。因此,取整个公式的对数并进行一些代数计算,您可以得到观测值 X=x 属于第 k 类的后验概率的更简洁的定义。
贝叶斯分类器会将观察值分配给上述数量(后验概率)最大的类。
这听起来与线性判别分析非常相似!
这是正确的直觉,因为 LDA 采用贝叶斯分类器并通过显式使用估计来近似它:
先验概率
k 类的平均值
所有 k 类的共享协方差
最后,如果我们没有关于真实先验概率的信息,我们可以根据属于 k 类的训练观测值的比例来估计它。
如果您对自己处理的是真实数量还是估计量有疑问,请注意,在代数和统计中,估计量总是有一顶帽子 (^)。
总而言之,在考虑了所有必要的假设和贝叶斯近似之后,LDA 算法计算高斯变量 X (X=x) 的每个单独数据点 x 和每个类 k 的判别函数。它只会将 x 分配给判别函数最大的类:
所以,最终判别函数一定是x的线性函数。
但上面的公式适用于我们只有一个预测变量的特定情况,其中 x 是一个标量,即只是一个数字。
多元高斯变量 X 具有以下形状:
在应用 LDA 的问题类型中,通常有数百或数千个预测变量,即特征。我们不再使用标量,而是使用矩阵。有时是非常大的稀疏矩阵。
其中每个数据点 x 是一个行向量 1xN,遵循高斯分布,其中 N 是预测变量的数量并且大于 1。当您将所有数据训练数据点放在一起时,您就得到了训练数据集,即一个矩阵。
由于我们使用多元高斯分布,概率密度函数为
同样,这有点冗长。遵循与之前相同的代数,我们可以稍微简化这个函数并获得多元情况的线性判别函数。
同样,判别函数仍然需要是 X 的线性函数。
LDA 算法计算每个单独的行向量 x 和每个类 k 的判别函数。它只会将 x 分配给判别函数最大的类。
现在,让我们从所有这些复杂的数学中退后一步。
如果将单个预测变量的贝叶斯分类器近似公式与多元预测变量的贝叶斯分类器近似公式进行比较,就会发现一个主要区别在于分布的概率密度函数。
原因
尽管该技术基于 20 世纪 30 年代开发的统计方法,但其应用在今天仍然非常重要,有几个原因:
降低计算复杂性和工作量(也节省金钱)
删除冗余功能
减少过度拟合
促进可视化可解释性
降低计算复杂性和工作量
在具有数千个特征的数据集上运行机器学习算法可能会导致计算复杂,因此需要 GPU 或 TPU 等专用硬件,可能需要很长时间才能运行,因此可能会花费大量资金。
与微调或简化的算法一样,在 10x10 矩阵上运行标准矩阵运算(例如乘法、求逆或特征向量和特征值)往往比在 100x100、1000x1000 或 10000x10000 矩阵上运行相同运算的计算成本更低。
因此,在保留数据特征的情况下,减少计算矩阵的大小是一个巨大的优势。
由于该技术的目标是最小化类内方差,同时最大化类间方差 [3],因此它必然会为所有无助于分离类的特征赋予较低的权重,并会删除任何冗余的特征。
最后,算法将删除那些与区分不同类别更相关的其他特征编码相同信息的特征。
当我们拥有包含大量特征的数据集时,分类器可能会拾取错误的信号,例如数据中的噪声或不一定有助于区分不同类别的相关性。但由于这些信号非常强,分类器可能会过度拟合这些信号。
由于LDA降低了数据集的维度,保留了最能编码数据特征的组件,并且如上所述,还删除了冗余特征,因此它可以帮助减少过度拟合。
由于数据被投影到较低维度的空间中,因此还可以更好地可视化类之间的分离。
限制
与任何其他技术一样,该技术也有其局限性。
...
线性降维技术(例如 LDA)倾向于保留数据的可解释性,因为它们将数据投影到判别函数中,而判别函数是原始特征的线性组合。这意味着,线性判别式表示最好地将数据点分为不同类别的轴。这允许直接映射特征贡献并更好地理解结果[3]。
在应用LDA之前,由于特征数量较多,可能很难绘制数据。后 LDA,将数据编码到可以映射到特征组的组件中,而不是每个特征 1:1,您很可能可以以一种可以轻松可视化类之间分离的方式绘制数据。
LDA 的主要局限性与其假设有关。
由于强线性假设,它不是处理噪声或稀疏数据的最佳技术,并且可能无法为具有非线性决策边界或非高斯分布的分类问题提供最准确的结果[4]。
协方差矩阵的估计,特别是在高维数据中,也可能会带来限制。当特征数量相对较大时,与观测值数量相比,协方差矩阵可能具有较高的估计方差并导致性能问题,即使所有其他假设都成立 [4]。
线性判别分析 (LDA) 与主成分分析 (PCA)
在考虑降低数据集维度的统计技术时,可能会想到另一种非常流行的技术,即主成分分析。
尽管您可以发现它们之间的相似之处,但还是有一个显着的区别。 LDA 是一种监督方法,这意味着,它在计算判别式时使用有关每个数据点关联的特征和类/标签的信息,而 PCA 则不然 [7]。鉴于这种区别,线性判别分析往往是一种更稳健的降维方法 [2]。
两种技术都用于降低数据集的维度,并且最终都会生成用于将原始数据集投影到降维空间中的轴或方向向量。
两种技术之间的区别在于,PCA 计算特征向量并按具有最大方差的相关特征值对它们进行排序,而 LDA 计算最能区分类别的特征向量。
PCA 和 LDA 之间的另一个区别是可以计算的非零特征向量的数量。在 PCA 中,这些与主成分相关,在 LDA 中,与线性判别式相关。
LDA 中最多可以计算 K-1 个线性判别式,其中 K 是类别数[8]。实际上,LDA 算法计算所有不同的特征向量,但只有 K-1 个非零。
另一方面,PCA 没有这个限制。
简而言之,PCA 作为一种无监督方法,可以生成最能描述原始数据集的主成分,即方向向量。另一方面,LDA 作为一种监督方法,产生能够最好地区分或分离不同类别数据的线性判别式 [7]。
LDA 现实生活示例
如果您读过我有关主成分分析的文章,您就会熟悉这个示例。
与往常一样,第一步是使用以下 Python 代码查看手头的数据集。
回到玛吉的问题。
您的朋友 Maggie 是一名房地产经纪人,她想要一些关于她所售房产的真正区别的硬数据。所以她请求你,她的数据科学家朋友,帮助完成这项任务。
import pandas as pd##### 数据准备##### 导入数据集并将其加载到数据框中dataset_df = pd.read_csv("../datasets/dataset_labeled.csv")print(dataset_df.head())
输出是对数据的很好的了解。
此时您刚刚熟悉不同的功能,例如:
square_footage - 房产的平方英尺
卧室 - 该房产的卧室数量
浴室 - 房产内的浴室数量
以及数据集标签,property_type。数据集标签有三个可能的值:apartment、condo、single_family_house。
由于功能如此之多,很难精确定位甚至可视化数据如何分布在不同类型的属性中。
这时您会记得您可以使用线性判别分析来可视化有关不同房产的数据,也就是说,有关公寓的数据点是否都聚集在一起,并且与单户住宅或公寓的数据点相距甚远?
同时,您将能够获得有关数据集中不同类型属性的区别的更多信息。
您立即考虑使用 ScikitLearn 中的 LinearDiscriminantAnalysis 函数,然后开始将代码放在一起。
import pandas as pdfrom sklearn.discriminant_analysis import LinearDiscriminantAnalysisfrom sklearn.preprocessing import StandardScaler##### 数据准备##### 导入数据集并将其加载到数据帧中dataset_df = pd.read_csv("dataset.csv")# 设置 X(特征)和 y(标签)y = dataset_df["property_type"]X = dataset_df.drop(columns=["property_type"]).to_numpy()feature_names = dataset_df.drop(columns=["property_type"]).columnstarget_names = y.unique()# 标准化特征#,以便在拟合LDA之前它们都处于相同的尺度# 这将有助于协方差矩阵的可视化# 因此所有值都具有相同的尺度# 标准化不会影响LDA processX = StandardScaler().fit_transform(X)######应用LDA函数#####自定义以下参数#solver='eigen'::使用特征值分解#covariance_estimator::保留默认值None,因为我们将使用协方差矩阵#n_components = 2:将组件数量设置为2#组件数量最多必须等于标签数量减去1# 将收缩因子保留为默认值 = None,因为我们将使用协方差估计器clf = LinearDiscriminantAnalysis(solver='eigen', n_components=2)# 拟合LDA 模型并应用函数transform()# 帮助最大化类之间的分离X_lda = clf.fit(X, y).transform(X)###### 关于线性判别分析的统计##### 计算训练数据的准确性#在本例中,由于我们对预测类别不感兴趣,#此函数中使用整个数据集print("Training dataset precision %f" % clf.score(X, y))
您已将数据从 CSV 导入到 Pandas DataFrame 中进行操作。然后分离特征(X)和标签(y),这将在稍后的分类器拟合中使用。
将 LinearDiscriminantAnalysis 应用于数据集后,您检查的内容之一是训练准确度约为 98%。
这是我们在降低数据集维度后可以尝试可视化的东西。
卧室= 0.72
您还需要考虑的一件事是可视化数据集的协方差矩阵,以便您可以看到特征对之间的协方差。由于您预先知道要执行此操作,并且承认许多特征具有不同的尺度,因此您首先对特征矩阵 X 进行归一化。
请注意,在顶部,无需将数据拆分为训练和测试。玛吉的问题与预测以前从未见过的新数据点对应的属性类型无关。因此,您实际上不需要分割数据,您可以使用所有数据来拟合 LinearDiscriminantAnalysis 函数。
最后,当您拟合 LinearDiscriminantAnalysis 时,数据标准化不会产生任何影响。它只会让使用以下代码更容易可视化协方差矩阵。
#additionalimportsimportseabornassnsimportmatplotlib.pyplotaspltdefplot_covariance_matrix(clf,feature_names):"""将池化的类内协方差矩阵绘制为热图。Args:clf:拟合的线性判别分析分类器,用于其协方差_attribute.feature_names:原始特征的名称,用于标记热图轴。"""plt.figure(figsize=(20, 10))sns.heatmap(clf.covariance_, cmap="viridis_r", linewidths=.7, annot=True, fmt='.2f',xticklabels=feature_names, yticklabels=feature_names)plt.title("LDA: 类内池协方差矩阵")plt.tight_layout()plt.savefig("plot_covariance_matrix.pdf")plot_covariance_matrix(clf, feature_names)
输出是这个彩色矩阵,其中包含对角线上每个特征的方差或分布以及非对角线上特征之间的相关性。
这太棒了!不一定回答玛吉的问题,但从数据探索的角度检查一下是很好的。特别是抽查彼此高度相关的特征。
首先,她有兴趣了解公寓的数据点是否都聚集在一起并且与单户住宅或公寓的数据点相距甚远。
您已经拟合了线性判别式,因此现在您需要绘制两个线性判别式中的数据点,并根据其相应的标签为它们着色。
因此,您向代码库添加了一个新函数。
#每个 property_type 的颜色,在所有绘图中保持一致property_colors = {"apartment": "#4C72B0","condo": "#DD8452","single_family_house": "#55A868",}defplot_components(X_lda, y, target_names):"""在 LD1 和 LD1 上绘制 LDA 转换数据LD2,按属性类型着色。Args:X_lda:LDA 转换的特征矩阵,LD1 和 LD2 作为前两列。y:与 X_lda 的行对齐的一系列 property_type 标签。target_names:唯一的 property_type 标签数组,用于分别绘制每个类。"""plt.figure(figsize=(10, 7))for target_name in target_names:# 构建一个数组(掩码)与标签数组长度相同 ymask = y == target_name# mask用于分别绘制属于每个类的点 plt.scatter(X_lda[mask, 0], X_lda[mask, 1], label=target_name,color=property_colors[target_name], alpha=0.7)plt.xlabel("LD1")plt.ylabel("LD2")plt.title("LDA: LDA 组件的属性类型分离")plt.legend(loc="best")plt.savefig("plot_lda_components.pdf")plot_components(X_lda, y, target_names)
输出是这个图,您可以在其中看到公寓和单户住宅之间有更明显的分离,并且在分类方面,在此数据集中,公寓更接近于单户住宅而不是公寓。
因此,您创建一个新函数,与 LinearDiscriminant 图的函数类似,但您在其中绘制一个网格,在其中绘制构成每个决策边界的点。
这个图真的很棒,因为您从包含 17 个特征和 3 个类的数据集开始。正如您可以想象的那样,基于 17 个特征来可视化数据布局和类之间的分离是非常困难的。您可以将每对特征相互对比,但这永远不会是一幅完整的图画。
使用 LDA,您将维度减少到 2 个线性判别式,在本例中,这是您可以拥有的最大组件数。线性判别式的最大数量是特征数量与类数量减一之间的最小值。在本例中,类数减 1 获胜,并且您选择 n_components = 2。
这非常方便,因为大多数人都习惯于解释 2D 图,并且可以帮助 Maggie 更好地了解不同类型属性之间的分离。
但您是一名数据科学家,有时喜欢展示如何让您的可视化大放异彩。在这种情况下,您希望通过添加分隔每个类的决策边界来实现此目的。它将提升您的可视化能力,并向玛吉展示您确实能够胜任这项任务!
#additional importfrom matplotlib.colors import ListedColormapdefplot_components_with_approx_boundary(X_lda, y):"""用近似决策边界绘制 LD1 与 LD2,按属性类型着色。边界是“近似”的,因为它来自直接适合 2D LD1/LD2 投影的分类器,而不是原始特征空间。Args:X_lda: LDA 转换的特征矩阵,LD1 和 LD2 作为前两列。y:与 X_lda 的行对齐的一系列 property_type 标签。"""boundary_clf = LinearDiscriminantAnalysis()boundary_clf.fit(X_lda, y)# 设置我们将用来“绘制”近似决策边界的网格边界(x/y 坐标)网格 x_min, x_max = X_lda[:, 0].min() - 1, X_lda[:, 0].max() + 1y_min, y_max = X_lda[:, 1].min() - 1, X_lda[:, 1].max() + 1# 构建网格网格xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300), np.linspace(y_min, y_max, 300))# 重塑数据以预测决策边界网格中每个点的标签# 1. 函数 ravel 将 2D 数组展平为 1D# 2. 函数 np.c_ 将这些数组堆叠在 2D 数组的列中,# 3. 运行预测函数 Z = boundary_clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = pd.Categorical(Z,categories=target_names).codes.reshape(xx.shape)#创建颜色图,即为每个标签分配颜色boundary_cmap = ListedColormap([property_colors[name] for name in) target_names])plt.figure(figsize=(10, 7))# 绘制填充轮廓线 plt.contourf(xx, yy, Z, alpha=0.25, cmap=boundary_cmap)# 绘制每个组件的每个点,即 LDA 转换后的数据 for target_name in target_names:# 构建一个与标签数组长度相同的数组(掩码) ymask = y == target_name# mask 用于分别绘制属于每个类的点 plt.scatter(X_lda[mask, 0], X_lda[mask, 1], label=target_name,color=property_colors[target_name], alpha=0.7)plt.xlabel("LD1")plt.ylabel("LD2")plt.title("LDA:近似决策的属性类型分离边界")plt.legend(loc="best")plt.savefig("plot_lda_components_approx_boundary.pdf")plot_components_with_approx_boundary(X_lda, y)
这确实将之前的可视化推向了另一个层次!
现在,讨论 Maggie 的最后一个问题:数据集中不同类型的属性有何区别?
为了回答这个问题,您需要转向数据集特征,看看它们可以告诉您每个类的区别。
这样,输出就仅限于两个线性判别式。
您绘制的决策边界在技术上是近似的决策边界。真正的决策边界来自原始数据集,而这些决策边界是根据 LinearDiscriminant 中的数据绘制的。实际上,它们非常接近真实的决策边界,因为线性判别式仍然对数据的主要特征进行编码。然而,做出这种区分很重要。
因此,您开始寻找获取有关功能贡献的信息的方法。您很高兴地记得在 LinearDiscriminantAnalysis 函数中应用参数solver=’eigen’,这意味着该函数使用特征向量分解来查找指示类分离的线性判别式。
这意味着您可以访问 ScikitLearn 中 LinearDiscriminantAnalysis 函数的属性缩放,并检查每个特征对每个 LinearDiscriminant 的贡献程度
默认情况下,缩放将输出所有特征的所有可能的特征向量。在这种情况下,数据集中的 17 个特征中的每一个都会有一个特征向量。
但是,您在 LinearDiscriminantAnalysis 函数中设置 n_component = 2,这些是唯一将用于将数据投影到较低维度的线性判别式,即从 17 个特征到对这些特征的核心信息进行编码的 2 个线性判别式。
为了仅输出两个线性判别式,而不是所有可能的特征向量,您只需截断plot_class_separation_features中的缩放即可。
defplot_class_separation_features(clf, feature_names):"""绘制一个热图,根据原始特征对类分离的贡献对原始特征进行排名。使用 clf.scalings_,LDA 分配给每个组件的每个原始特征的特征向量,以显示哪些特征对 LD1、LD2 等具有最大权重。深蓝色表示对该组件的类分离贡献更大。Args:clf: 拟合LinearDiscriminantAnalysis分类器,用于其scalings_属性。feature_names:原始特征的名称,用于标记热图行。"""#scalings_保存完整的特征向量基础(n_features列),但transform()实际上仅使用前n_个组件进行类分离scalings = clf.scalings_[:, :clf.n_components]component_names = [f"LD{i + 1}" for i in range(scalings.shape[1])]weights = pd.DataFrame(np.abs(scalings), index=feature_names, columns=component_names)weights = Weights.sort_values(by="LD1", ascending=False)plt.figure(figsize=(7, 8))sns.heatmap(weights, cmap="Blues", linewidths=.7, annot=True, fmt='.2f')plt.title("LDA:特征对类分离的贡献")plt.tight_layout()plt.savefig("plot_class_separation_features.pdf")#根据原始特征对类分离的贡献程度对原始特征进行排名plot_class_separation_features(clf, feature_names)
立即跳跃的是比例。事实上,您可以看到卧室是对每个线性判别式贡献最大的特征。然而,它有点难以解释,因为这不是 0-100% 的范围。相反,这些值是彼此相关的,并且基于特征向量分解的原始值。
为了更好地理解每个特征如何对每个线性判别式做出贡献,您决定对每个线性判别式列中的值进行归一化。所有特征对每个单独线性判别式的总贡献总计为 100%。
为了使事情分开,您创建了一个新函数,与您刚刚创建的函数完全相似,但它标准化了缩放输出的值。
school_closest_miles= 0.61
感谢您的阅读!
defplot_class_separation_features(clf, feature_names):"""绘制一个热图,根据原始特征对类分离的贡献对原始特征进行排名。使用 clf.scalings_,LDA 分配给每个组件的每个原始特征的特征向量,以显示哪些特征对 LD1、LD2 等具有最大权重。深蓝色表示对该组件的类分离贡献更大。Args:clf: 拟合LinearDiscriminantAnalysis分类器,用于其scalings_属性。feature_names:原始特征的名称,用于标记热图行。"""#scalings_保存完整的特征向量基础(n_features列),但transform()实际上仅使用前n_个组件进行类分离scalings = clf.scalings_[:, :clf.n_components]component_names = [f"LD{i + 1}" for i in range(scalings.shape[1])]weights = pd.DataFrame(np.abs(scalings), index=feature_names, columns=component_names)weights = Weights.sort_values(by="LD1", ascending=False)plt.figure(figsize=(7, 8))sns.heatmap(weights, cmap="Blues", linewidths=.7, annot=True, fmt='.2f')plt.title("LDA:特征对类分离的贡献")plt.tight_layout()plt.savefig("plot_class_separation_features.pdf")# 根据原始特征对类分离的贡献程度对原始特征进行排名。标准化后,每个组件的权重总和为 1plot_class_separation_features_normalized(clf, feature_names)
最后,每个特征对每个线性判别式的贡献程度是相同的,但是,使每个线性判别式中所有贡献的总和达到 100% 是令人放心的,并且绝对更容易解释。
最初,对于第二个线性判别式,第一和第二高的特征贡献是:
这看起来它们之间有轻微的显着差异。
标准化后,您可以看到,对于第二个线性判别式,卧室的贡献为 0.15,而 school_closest_miles 的贡献为 0.12。看起来差距没有以前那么大了。
不幸的是,这种技术不允许您比较线性判别式之间的特征重要性,但仍然有一种方法可以将线性判别分析提供的不同信息拼凑在一起并回答 Maggie 的问题:数据集中不同类型属性的区别是什么?
为了回答这个问题,您可以检查解释方差,因为它提供了每个组件解释类之间分离程度的比率。您只需要从 LinearDiscriminantAnalysis 分类器输出解释_方差_比率_属性。
# 解释方差比输出一个列表,其中包含每个分量解释的方差百分比(类之间的分离)。该列表按组件顺序 print("每个组件 %f 的解释方差比率", clf.explained_variance_ratio_)
您已经预料到第一个线性判别式将是解释最大变化量的线性判别式,因为第一个线性判别式始终具有最高特征值。您可以看到从第一个线性判别式到第二个线性判别式所解释的变异性之间存在巨大的差异。
第一个线性判别式解释了大约 90% 的类之间的分离!
有了这些信息以及对第一个线性判别式的特征贡献的数据,它并不是 100% 可靠的,但您可以凭直觉知道哪些特征往往更倾向于类之间的分离。
有了决策边界图和有关特征贡献的信息,您可以回到 Maggie 并分享有关她出售的房产的见解!
你可以凭直觉看出卧室、车库和洗衣房是对类别之间的区分贡献最大的特征,因为它们是对第一个线性判别式最重要的特征,并且我们知道第一个线性判别式对类别之间的区分贡献了大约 90%。
希望您喜欢学习线性判别分析。这是一种非常有趣且强大的统计技术,用作机器学习中分类问题的数据准备步骤。
参考文献
https://sebastianraschka.com/Articles/2014_python_lda.html
C. Gambella、B. Ghaddar 和 J. Naoum-Sawaya,“机器学习的优化问题:一项调查”,《欧洲运筹学杂志》,卷。 290,没有。 3,第 807–828 页,2021 年 5 月。
瓦尼 AA。 “降维算法的全面回顾:挑战、局限性和创新解决方案”,PeerJ Comput。科学,卷。 11,p。 e3025,2025,doi:10.7717/peerj-cs.3025。
C. Shen 和 Y. Dong,“梯度优化的线性判别分析”,arXiv 预印本 arXiv:2506.06845,2026。
S. Gardner-Lubbe,“多功能数据分析的线性判别分析”,J. Appl。统计,卷。 48,没有。 11,第 1917–1933 页,2021 年,doi:10.1080/02664763.2020.1780569。
T. Hastie、R. Tibshirani 和 J. Friedman,统计学习的要素:数据挖掘、推理和预测,第二版。美国纽约州纽约市:Springer,2009
A. M. Martinez 和 A. C. Kak,“PCA 与 LDA”,IEEE 模式分析和机器智能汇刊,卷。 23、没有。 2,第 228-233 页,2001 年 2 月,doi:10.1109/34.908974
C. M. Bishop,模式识别和机器学习。美国纽约州纽约市:施普林格,2006 年
