找回密码
 会员注册
查看: 28|回复: 0

学习笔记及课后题练习陈强-机器学习-Python-Ch7判别分析

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-11 17:44:32 | 显示全部楼层 |阅读模式
系列文章目录【学习笔记】陈强-机器学习-Python-Ch4线性回归【学习笔记】陈强-机器学习-Python-Ch5逻辑回归【课后题练习】陈强-机器学习-Python-Ch5逻辑回归(SAheart.csv)【学习笔记】陈强-机器学习-Python-Ch6多项逻辑回归文章目录系列文章目录前言一、线性判别分析(LDA)&二次判别分析(QDA)1.线性判别分析(LinearDiscriminantAnalysis,LDA)LinearDiscriminantAnalysis()2.二次判别分析(QuadraticDiscriminantAnalysis,QDA)QuadraticDiscriminantAnalysis()二、判别分析案例:iris1.介绍数据load_iris2.处理数据1)Xs2)y3.全样本线性判别分析4.二次判别分析三、课后练习题:seeds_dataset.csv前言本学习笔记仅为以防自己忘记了,顺便分享给一起学习的网友们参考。如有不同意见/建议,可以友好讨论。本学习笔记所有的代码和数据都可以从陈强老师的个人主页上下载参考书目:陈强.机器学习及Python应用.北京:高等教育出版社,2021.数学原理等详见陈强老师的PPT参考了网友阡之尘埃的Python机器学习05——判别分析本次案例需安装mlxtend库pipinstallmlxtend一、线性判别分析(LDA)&二次判别分析(QDA)1.线性判别分析(LinearDiscriminantAnalysis,LDA)LDA是一种用于分类和降维的线性算法,旨在找到一个线性组合的特征,以最大化类别间的区分度。模型假设:假设各类别的数据具有相同的协方差矩阵,即数据在每个类别中的协方差相同。决策边界:由于协方差矩阵相同,LDA的决策边界是线性的。计算复杂度:相对较低,因为只需估计一个协方差矩阵。适用情况:当数据的类别协方差矩阵相似时,LDA效果较好。LinearDiscriminantAnalysis()LinearDiscriminantAnalysis是scikit-learn中实现线性判别分析(LDA)的函数。主要参数:solver:优化算法。可选值包括svd,lsqr,eigen。默认为svd。-svd:使用奇异值分解(SVD)进行计算。-lsqr:使用最小二乘法求解。-eigen:使用特征分解(Eigendecomposition)方法。-如果对计算效率有要求,通常‘svd’是最稳定和高效的选择。如果需要对模型进行正则化,可以尝试‘lsqr’或‘eigen’并调整。shrinkage:当solver是lsqr或eigen时,选择是否应用收缩(shrinkage)技术来改善模型的稳定性和性能。可选值:auto:自动选择最适合的收缩策略。None:不使用收缩。具体的收缩值(例如‘0.5’),以调整收缩强度。priors:类别的先验概率。n_components:降维后的目标维度。如果为None,则自动选择使得目标维度不超过类别数减一(即min(n_classes-1,n_features))。n_iter:用于模型训练的迭代次数(如果使用了迭代算法)。这个参数通常与solver=‘eigen’相关。#例子fromsklearn.discriminant_analysisimportLinearDiscriminantAnalysislda=LinearDiscriminantAnalysis(solver='svd',n_components=2,priors=[0.5,0.5,0.2])123456782.二次判别分析(QuadraticDiscriminantAnalysis,QDA)QDA是一种分类方法,用于在特征空间中找到一个二次边界,将不同类别的样本分开。QDA是判别分析的扩展,相比于线性判别分析(LDA),它允许每个类别有不同的协方差矩阵。模型假设:允许各类别的数据具有不同的协方差矩阵。决策边界:由于每个类别具有独立的协方差矩阵,QDA的决策边界是二次的(即二次曲线)。计算复杂度:相对较高,因为需要估计每个类别的协方差矩阵。适用情况:当类别之间的协方差矩阵差异较大时,QDA更有效。局限性:计算复杂度较高,尤其在数据维度很高时。对于小样本数据集,协方差矩阵的估计可能不稳定。对异常值敏感,可能需要正则化来改善稳定性。QuadraticDiscriminantAnalysis()QuadraticDiscriminantAnalysis是scikit-learn中实现二次判别分析(QDA)的函数。主要参数:solver:优化算法。可选值包括svd,lsqr,eigen。默认为svd。-svd:使用奇异值分解(SVD)进行计算。-lsqr:使用最小二乘法求解。-eigen:使用特征分解(Eigendecomposition)方法。priors:类别的先验概率。reg_param:正则化参数,控制对协方差矩阵的收缩。用于避免协方差矩阵的奇异性问题,通常在数据维度远大于样本数时使用。默认值:0.0fromsklearn.discriminant_analysisimportQuadraticDiscriminantAnalysis#初始化QDA模型qda=QuadraticDiscriminantAnalysis( priors=[0.5,0.5,0.2], reg_param=0.1)123456二、判别分析案例:iris1.介绍数据load_irisload_iris是scikit-learn库中一个常用的数据集加载函数,它用于加载鸢尾花(Iris)数据集。鸢尾花数据集是机器学习领域中经典的数据集之一,经常被用来测试和演示各种分类算法。数据集包含150个样本,每个样本都是鸢尾花的一个实例。每个样本有四个特征和一个标签。特征: 花萼长度(sepallength,cm):花萼的长度。 花萼宽度(sepalwidth,cm):花萼的宽度。 花瓣长度(petallength,cm):花瓣的长度。 花瓣宽度(petalwidth,cm):花瓣的宽度。标签(目标变量):数据集的每个样本都被标记为三种鸢尾花品种中的一种: Setosa:品种A。 Versicolor:品种B。 Virginica:品种C。importpandasaspdimportnumpyasnpfromsklearn.datasetsimportload_iris#导入load_iris函数#加载鸢尾花数据集iris=load_iris()dir(iris)#列出iris对象的所有属性和方法1234567结果输出:[‘DESCR’,‘data’,‘feature_names’,‘filename’,‘frame’,‘target’,‘target_names’,‘data’,‘target_names’]#打印数据集的形状和其他信息print(iris.data.shape)print(iris.feature_names)print(iris.target_names)1234结果输出:(150,4)[‘sepallength(cm)’,‘sepalwidth(cm)’,‘petallength(cm)’,‘petalwidth(cm)’][‘setosa’‘versicolor’‘virginica’]2.处理数据1)Xs#重命名iris.feature_names=['sepal_length','sepal_width','petal_length','petal_width']#矩阵变为数据框X=pd.DataFrame(iris.data,columns=iris.feature_names)print(X)12345#相关系数X.corr()12#热力图importmatplotlib.pyplotaspltimportseabornassnssns.heatmap(X.corr(),cmap='nipy_spectral',annot=True)123452)y#查看y的取值y=iris.targety1233.全样本线性判别分析#全样本线性判别分析fromsklearn.discriminant_analysisimportLinearDiscriminantAnalysismodel=LinearDiscriminantAnalysis()model.fit(X,y)#拟合model.score(X,y)#计算预测精度123456结果输出:0.98#先验概率print(model.priors_)#特征变量分组均值print(model.means_)#线性判元对于组间方差的贡献print(model.explained_variance_ratio_)#线性判元的估计系数print(model.scalings_)#变为数据框展示lda_loadings=pd.DataFrame(model.scalings_,index=iris.feature_names,columns=['LD1','LD2'])lda_loadings1234567891011结果输出:[0.333333330.333333330.33333333][[5.0063.4281.4620.246][5.9362.774.261.326][6.5882.9745.5522.026]][0.99121260.0087874][[0.82937764-0.02410215][1.53447307-2.16452123][-2.201211660.93192121][-2.81046031-2.83918785]]#线性判别得分lda_scores=model.fit(X,y).transform(X)print(lda_scores.shape)lda_scores[:5,:]1234结果输出:(150,2)array([[8.06179978,-0.30042062],[7.12868772,0.78666043],[7.48982797,0.26538449],[6.81320057,0.67063107],[8.13230933,-0.51446253]])#变为数据框展示LDA_scores=pd.DataFrame(lda_scores,columns=['LD1','LD2'])#加入响应变量SpeciesLDA_scores['Species']=iris.targetLDA_scores.head()12345#创建映射字典:将响应变量Species的取值映射到具体品种d={0:'setosa',1:'versicolor',2:'virginica'}#使用map()方法进行映射LDA_scores['Species']=LDA_scores['Species'].map(d)LDA_scores.head()12345#散点图sns.scatterplot(x='LD1',y='LD2',data=LDA_scores,hue='Species')12#取两个特征变量(petal_length、petal_width)X2=X.iloc[:,2:4]model=LinearDiscriminantAnalysis()model.fit(X2,y)model.score(X2,y)#预测准确率#组间方差model.explained_variance_ratio_1234567结果输出:0.96array([0.99470499,0.00529501])#画出线性判别的决策边界frommlxtend.plottingimportplot_decision_regionsplot_decision_regions(np.array(X2),y,model)plt.xlabel('petal_length')plt.ylabel('petal_width')plt.title('DecisionBoundaryforLDA')12345674.二次判别分析#二次判别分析(分训练集和测试集)fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,stratify=y,random_state=123)fromsklearn.discriminant_analysisimportQuadraticDiscriminantAnalysismodel=QuadraticDiscriminantAnalysis()model.fit(X_train,y_train)model.score(X_test,y_test)123456789101112131415结果输出:0.9777777777777777prob=model.predict_proba(X_test)print(prob[:3])pred=model.predict(X_test)pred[:5]12345结果输出:[[1.30728298e-1174.25364516e-0015.74635484e-001][4.80474602e-1851.17558005e-0039.98824420e-001][1.12275433e-0569.99994095e-0015.90465247e-006]]array([2,2,1,1,2])fromsklearn.metricsimportconfusion_matrixfromsklearn.metricsimportclassification_reportfromsklearn.metricsimportcohen_kappa_scoreprint(confusion_matrix(y_test,pred))print(classification_report(y_test,pred))print(cohen_kappa_score(y_test,pred))12345678910结果输出:[[1500][0141][0015]]0.9666666666666667#同样选取两个特征变量进画出其决策边界X2=X.iloc[:,2:4]model=QuadraticDiscriminantAnalysis()model.fit(X2,y)print(model.score(X2,y))plot_decision_regions(np.array(X2),y,model)plt.xlabel('petal_length')plt.ylabel('petal_width')plt.title('DecisionBoundaryforQDA')12345678910结果输出:0.98三、课后练习题:seeds_dataset.csvimportpandasaspdimportnumpyasnp#1.导入数据csv_path=r'D:\桌面文件\Python\【陈强-机器学习】MLPython-PPT-PDF\MLPython_Data\seeds_dataset.csv'seeds=pd.read_csv(csv_path)print(seeds.shape)#形状seeds[:5]#前512345678结果输出:(210,8)#统计特征seeds.describe()12#响应变量的分布seeds.Class.value_counts()12结果输出:Class170270370Name:count,dtype:int64#全样本线性判别分析X=seeds.iloc[:,:-1]y=seeds.iloc[:,-1]fromsklearn.discriminant_analysisimportLinearDiscriminantAnalysismodel=LinearDiscriminantAnalysis()model.fit(X,y)#拟合model.score(X,y)#计算预测精度123456789结果输出:0.9666666666666667#先验概率print(model.priors_)#特征变量分组均值print(model.means_)#线性判元对于组间方差的贡献print(model.explained_variance_ratio_)#线性判元的估计系数print(model.scalings_)#线性判别得分lda_scores=model.fit(X,y).transform(X)print(lda_scores.shape)lda_scores[:5,:]123456789101112结果输出:[0.333333330.333333330.33333333][[14.3344285714.294285710.880075.508057143.244628572.667402865.08721429][18.3342857116.135714290.883517146.148028573.677414293.64486.0206][11.8738571413.247857140.849408575.229514292.853771434.78845.1164]][0.681412410.31858759][[-4.23778614e-014.19531669e+00][3.79919995e+00-8.50579585e+00][5.92772810e+00-8.69823024e+01][-5.98819597e+00-7.83067468e+00][3.70482197e-027.14104253e-01][-4.50472160e-023.21253808e-01][3.11807592e+006.91384931e+00]](210,2)array([[-0.43132208,-3.44768583],[-0.75286941,-4.1839799],[-1.09393189,-2.95867452],[-1.7680201,-3.25241433],[0.49441123,-3.43848523]])#变为数据框展示LDA_scores=pd.DataFrame(lda_scores,columns=['LD1','LD2'])#加入响应变量yLDA_scores['Class']=y#散点图importmatplotlib.pyplotaspltimportseabornassnssns.scatterplot(x='LD1',y='LD2',data=LDA_scores,hue='Class')123456789#二次判别分析(分训练集和测试集)fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=1/3,stratify=y,random_state=0)#训练LDAlda=LinearDiscriminantAnalysis()lda.fit(X_train,y_train)y_pred_lda=lda.predict(X_test)#打印混淆矩阵fromsklearn.metricsimportconfusion_matrixprint(confusion_matrix(y_test,y_pred_lda))#打印准确率print("训练LDA准确率:",lda.score(X_train,y_train))#打印分类报告fromsklearn.metricsimportclassification_reportprint("LDAClassificationReport:\n",classification_report(y_test,y_pred_lda))12345678910111213141516171819202122232425结果输出:[[2013][0230][1022]]训练LDA准确率:0.9857142857142858#训练QDAqda=QuadraticDiscriminantAnalysis()qda.fit(X_train,y_train)y_pred_qda=qda.predict(X_test)#打印混淆矩阵print(confusion_matrix(y_test,y_pred_lda))#打印准确率print("训练LDA准确率:",lda.score(X_train,y_train))#打印分类报告print("QDAClassificationReport:\n",classification_report(y_test,y_pred_qda))12345678910111213结果输出:[[2013][0230][1022]]训练QDA准确率:0.9857142857142858
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 15:55 , Processed in 0.393451 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表