机器学习判别分析算法——线性判别分析和二次判别分析实操代码详解(3)

 数据准备

以“数据7.1”文件中的数据为例进行讲解。​“数据7.1”文件记录的是某商业银行在山东地区的部分支行的经营数据(虚拟数据,不涉及商业秘密)​,案例背景是该商业银行正在推动支行开展转型,实现所有支行的做大做强。

数据文件中的变量包括这些商业银行全部支行的V1(转型情况)​、V2(存款规模)​、V3(EVA)​、V4(中间业务收入)​、V5(员工人数)​。V1(转型情况)又分为3个类别:​“0”表示“未转型网点”​,​“1”表示“一般网点”​,​“2”表示“精品网点”​。​“数据7.1”文件中的数据内容如图所示。

1 使用分割样本开展线性判别分析

#7.5  使用分割样本开展线性判别分析
X_train, X_test, y_train, y_test =  train_test_split(X,y,test_size=0.3, stratify=y, random_state=123)
model = LinearDiscriminantAnalysis()#使用LDA算法
model.fit(X_train, y_train)#基于训练样本使用fit方法进行拟合
model.score(X_test, y_test)#基于测试样本计算模型预测的准确率

prob = model.predict_proba(X_test)
prob[:5]

pred = model.predict(X_test)
pred[:5]

confusion_matrix(y_test, pred)#输出测试样本的混淆矩阵

print(classification_report(y_test, pred))

cohen_kappa_score(y_test, pred)
  1. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=123)

    • 使用train_test_split函数将数据集X(特征)和y(目标变量)分割为训练集和测试集。
    • test_size=0.3表示将 30% 的数据分配到测试集,70% 的数据分配到训练集。
    • stratify=y确保训练集和测试集中的类分布与原始数据集相同。
    • random_state=123设置随机种子,以确保每次运行代码时分割结果一致。
  2. model = LinearDiscriminantAnalysis():创建一个线性判别分析(LDA)模型对象。

  3. model.fit(X_train, y_train):使用训练集数据X_train和对应的目标变量y_train来拟合 LDA 模型。

  4. model.score(X_test, y_test):使用测试集数据X_test和对应的目标变量y_test来计算模型的准确率。

  5. prob = model.predict_proba(X_test):计算测试集X_test中每个样本属于不同类别的概率。prob[:5]显示前五个样本的概率预测结果。

  6. pred = model.predict(X_test):对测试集X_test进行预测,得到每个样本的预测类别。pred[:5]显示前五个样本的预测类别。

  7. confusion_matrix(y_test, pred):计算并输出测试集的混淆矩阵。混淆矩阵用于展示实际类别和预测类别的对应关系,帮助评估模型的分类性能。

  8. print(classification_report(y_test, pred)):打印分类报告,其中包括准确率、召回率、F1 值等指标,用于更详细地评估模型在不同类别上的性能。

  9. cohen_kappa_score(y_test, pred):计算并返回 Cohen's kappa 系数,这是一种衡量分类结果一致性的指标,考虑了随机一致性的情况。

以第1个样本为例,分类为未转型网点的概率为0.93624692,分类为一般网点的概率为0.06375294,分类为精品网点的概率为0.00000014,也就是说有93.62%的概率为未转型网点。以此类推,第2~5个样本的最大分组概率分别是精品网点0.99999934、精品网点0.65271455、未转型网点0.99267953、未转型网点0.99244972。

针对该结果解释如下:实际为未转型网点且预测为未转型网点的样本共有7个,实际为未转型网点但预测为一般网点的样本共有1个,实际为未转型网点但预测为精品网点的样本共有0个;实际为一般网点且预测为一般网点的样本共有3个,实际为一般网点但预测为未转型网点的样本共有2个,实际为一般网点但预测为精品网点的样本共有1个;实际为精品网点且预测为精品网点的样本共有1个,实际为精品网点但预测为未转型网点的样本共有0个,实际为精品网点但预测为一般网点的样本共有0个。

说明:

● precision:精度。针对未转型网点的分类正确率为0.78,针对一般网点的分类正确率为0.75,针对精品网点的分类正确率为0.50。

● recall:召回率,即查全率。针对未转型网点的查全率为0.88,针对一般网点的查全率为0.50,针对精品网点的查全率为1.00。

● f1-score:f1得分。针对未转型网点的f1得分为0.82,针对一般网点的f1得分为0.60,针对精品网点的f1得分为0.67。

● support:支持样本数。未转型网点支持样本数为8个,一般网点支持样本数为6个,精品网点支持样本数为1个。

● accuracy:正确率,即分类正确样本数/总样本数。模型整体的预测正确率为0.73。

● macro avg:用每一个类别对应的precision、recall、f1-score直接平均。比如针对recall(召回率)​,即为(0.88+0.50+1.00)/3=0.79。

● weighted avg:用每一类别支持样本数的权重乘对应类别指标。比如针对recall(召回率)​,即为(0.88×8+0.50×6+1.00×1)/15=0.73。

科恩kappa得分与效果对应表

线性判别分析kappa得分为0.5275590551181102,根据“科恩kappa得分与效果对应表”可知,模型的一致性一般。根据前面的分析结果可知,模型的拟合效果或者说性能表现还是可以的。

2 使用分割样本开展 二次判别分析

model = QuadraticDiscriminantAnalysis()#使用QDA算法
model.fit(X_train, y_train)#基于训练样本使用fit方法进行拟合
model.score(X_test, y_test)#计算模型预测的准确率

prob = model.predict_proba(X_test)
prob[:5]

pred = model.predict(X_test)
pred[:5]

confusion_matrix(y_test, pred)

print(classification_report(y_test, pred))

cohen_kappa_score(y_test, pred)#计算cohen_kappa得分
  1. model = QuadraticDiscriminantAnalysis()

    • 创建一个二次判别分析(Quadratic Discriminant Analysis,QDA)模型对象。QDA 是一种分类方法,与线性判别分析(LDA)不同,它允许每个类有不同的协方差矩阵,并且决策边界可以是二次的。
  2. model.fit(X_train, y_train)

    • 使用训练集数据 X_train 和对应的目标变量 y_train 来拟合 QDA 模型。在这个过程中,模型会估计每个类的均值向量和协方差矩阵,并根据这些参数来确定分类决策边界。
  3. model.score(X_test, y_test)

    • 使用测试集数据 X_test 和对应的目标变量 y_test 来计算模型的准确率。准确率是正确预测的样本数与总样本数的比例。
  4. prob = model.predict_proba(X_test)

    • 计算测试集 X_test 中每个样本属于不同类别的概率。返回的是一个数组,其中每一行表示一个样本,每一列表示一个类别,数组中的元素表示相应样本属于对应类别的概率。prob[:5]显示前五个样本的概率预测结果。
  5. pred = model.predict(X_test)

    • 对测试集 X_test 进行预测,得到每个样本的预测类别。返回的是一个数组,其中每个元素是相应样本的预测类别。pred[:5]显示前五个样本的预测类别。
  6. confusion_matrix(y_test, pred)

    • 计算并输出测试集的混淆矩阵。混淆矩阵是一个二维矩阵,用于展示实际类别和预测类别的对应关系。矩阵的行表示实际类别,列表示预测类别,矩阵中的元素表示相应实际类别和预测类别的样本数。
  7. print(classification_report(y_test, pred))

    • 打印分类报告,其中包括准确率、召回率、F1 值等指标,用于更详细地评估模型在不同类别上的性能。分类报告提供了每个类别的精确率、召回率、F1 值和支持度(样本数)。
  8. cohen_kappa_score(y_test, pred)

    • 计算并返回 Cohen's kappa 系数。Cohen's kappa 系数是一种衡量分类结果一致性的指标,它考虑了随机一致性的情况。kappa 系数的取值范围在 -1 到 1 之间,值越接近 1 表示一致性越好,值为 0 表示一致性仅由随机因素产生,值为负数表示一致性比随机情况更差。

基于测试样本计算模型预测的准确率,运行结果为:0.8666666666666667,也就是说基于测试样本计算模型预测的准确率为86.67%。二次判别分析的准确率要显著高于线性判别分析结果的73.33%

第1~5个样本最大分类概率分别为未转型网点0.98717497、一般网点1、一般网点1、未转型网点0.99947675、未转型网点0.99908953。

关于该结果的解读与前面类似,这里不再赘述。

综合对比二次判别分析和线性判别分析的结果,可以发现不论是模型预测的准确率,还是一致性检验等指标,二次判别分析的预测效果都要更好一些。

3 运用两个特征变量绘制QDA决策边界图

X2 = X.iloc[:, 0:2]
model = QuadraticDiscriminantAnalysis()
model.fit(X2, y)
model.score(X2, y)

plot_decision_regions(np.array(X2), np.array(y), model)
plt.xlabel('存款规模')#将x轴设置为'存款规模'
plt.ylabel('EVA')#将y轴设置为'EVA'
plt.title('QDA决策边界')#将标题设置为'QDA决策边界'
#绘图
plt.show()

  1. X2 = X.iloc[:, 0:2]

    • 从原始数据集 X 中选取前两列特征,即V1(转型情况)​、V2(存款规模)作为特征,创建一个新的数据集 X2。这里使用了 iloc 方法,通过索引选取特定的列。
  2. model = QuadraticDiscriminantAnalysis()

    • 创建一个二次判别分析(Quadratic Discriminant Analysis,QDA)模型对象。
  3. model.fit(X2, y)

    • 使用新的数据集 X2 和目标变量 y 来拟合 QDA 模型。
  4. model.score(X2, y)

    • 计算模型在数据集 X2 和目标变量 y 上的准确率。
  5. plot_decision_regions(np.array(X2), np.array(y), model)

    • 调用一个名为 plot_decision_regions 的函数,该函数可能是自定义的或者来自某个特定的库。这个函数的作用是绘制决策区域,它接受数据集 X2、目标变量 y 和已经拟合的 QDA 模型作为参数。决策区域显示了模型在特征空间中如何划分不同的类别。
  6. plt.xlabel('存款规模')

    • 设置图形的 x 轴标签为 ' 存款规模 '。
  7. plt.ylabel('EVA')

    • 设置图形的 y 轴标签为 'EVA'。
  8. plt.title('QDA决策边界')

    • 设置图形的标题为 'QDA 决策边界 '。
  9. plt.show()

    • 显示绘制的图形。

 

从图中可以发现,使用QDA方法的决策边界是二次函数(抛物线)​,两条抛物线将所有参与分析的样本分为三个类别,与前面的线性判别分析结论类似,最右侧区域为精品网点区域,中间区域是一般网点区域,左下方区域是未转型网点区域,但是使用QDA方法分类要更准确一些。

4 线性判别分析和二次判别分析优缺点对比

1、线性判别分析(LDA)

优点:

  1. 计算效率高:LDA 的计算相对简单,特别是在特征数量较大但样本数量相对较少的情况下,计算速度通常比 QDA 快。
  2. 可解释性强:LDA 寻找的是线性决策边界,其模型参数具有明确的物理意义,容易解释。例如,系数可以表示每个特征对分类的重要性。
  3. 对于近似线性可分的数据表现良好:如果数据在本质上是线性可分的或者接近线性可分,LDA 能够有效地进行分类。

缺点:

  1. 假设限制:LDA 假设不同类别的数据具有相同的协方差矩阵,这在实际应用中可能不总是成立。如果不同类别的数据分布具有不同的形状和方向,LDA 的性能可能会受到影响。
  2. 对非线性数据的处理能力有限:当数据的决策边界不是线性的时候,LDA 可能无法准确地进行分类。

2、二次判别分析(QDA)

优点:

  1. 更灵活的决策边界:QDA 允许不同类别的数据具有不同的协方差矩阵,因此可以适应更复杂的数据分布,能够处理非线性的决策边界。
  2. 对不同类别数据分布差异较大的情况更有效:当不同类别的数据具有不同的形状、大小和方向时,QDA 能够更好地捕捉这些差异,从而提高分类的准确性。

缺点:

  1. 计算复杂度高:由于需要估计每个类别的协方差矩阵,QDA 的计算复杂度通常比 LDA 高,特别是在特征数量较多的情况下,计算时间和内存需求可能会很大。
  2. 过拟合风险:在样本数量较少的情况下,QDA 可能会过度拟合数据,导致在新数据上的性能下降。
  3. 可解释性较差:与 LDA 相比,QDA 的决策边界更加复杂,模型参数的物理意义不那么直观,因此可解释性较差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值