机器学习之判别分析建模—基于python

      大家好,我是带我去滑雪!

      本期使用UCI Machine Learning Repository 的小麦种子数据 seeds_dataset.csv 进行判别分析。该数据集中,变量“Class”为响应变量,取值为1,2,3,表示三种不同类型的小麦种子,变量V1-V7 均为数值型特征变量,为根据X光技术得到的麦粒几何性质,比如面积、周长、宽度等。该数据需要提前下载并放置python工作路径,数据可去文末获取。

      期望完成如下问题:

(1)载入数据集seeds_dataset.csv,展示其形状与前五个观测值;

(2)计算该数据框的统计特征,以及响应变量的分布;

(3)计算各变量间的相关系数,并实现相关系数矩阵可视化;

(4)使用全样本进行线性判别分析,画出第1线性判元与第2线性判元的散点图,并根据种子类型进行上色;

(5)设定参数”random_state=0“,使用分层抽样,随机选取三分之二的样本作为训练集,进行线性判别分析;

(6)在测试集中预测,展示混淆矩阵,并计算准确率;

(7)使用训练集,进行二次判别分析;

(8)在测试集中,计算二次判别分析的混淆矩阵与准确率。

(1)载入数据集seeds_dataset.csv,展示其形状与前五个观测值;

     首先载入并查看数据数据:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as ans
import csv
data=pd.read_csv('seeds_dataset.csv')
data

输出结果:

V1V2V3V4V5V6V7Class
015.2614.840.87105.7633.3122.2215.2201
114.8814.570.88115.5543.3331.0184.9561
214.2914.090.90505.2913.3372.6994.8251
313.8413.940.89555.3243.3792.2594.8051
416.1414.990.90345.6583.5621.3555.1751
...........................
20512.1913.200.87835.1372.9813.6314.8703
20611.2312.880.85115.1402.7954.3255.0033
20713.2013.660.88835.2363.2328.3155.0563
20811.8413.210.85215.1752.8363.5985.0443
20912.3013.340.86845.2432.9745.6375.0633

      展示数据集前5个观测值:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as ans
import csv
data=pd.read_csv('seeds_dataset.csv')
data.head()

输出结果:

V1V2V3V4V5V6V7Class
015.2614.840.87105.7633.3122.2215.2201
114.8814.570.88115.5543.3331.0184.9561
214.2914.090.90505.2913.3372.6994.8251
313.8413.940.89555.3243.3792.2594.8051
416.1414.990.90345.6583.5621.3555.1751

     展示数据形状:

     其中plt.savefig函数为保存图像设置参数,squares1.png为图像名称,由于python默认的图像像素值仅72,所以图像看起来十分模糊,这里设置dpi=300,将图像像素提高到300。另外有时候画图时,发现图像显示不全,可以设置 bbox_inches ="tight",就可以解决。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as ans
import csv
data=pd.read_csv('seeds_dataset.csv')
data.head()
plt.plot(data)
plt.savefig("squares1.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

输出结果:

d1f1f89029554d1c9791bff794e446ac.png

(2)计算该数据框的统计特征,以及响应变量的分布;

      考察数据框data的统计特征可以使用describe()。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as ans
import csv
data=pd.read_csv('seeds_dataset.csv')
data.describe()

输出结果:

V1V2V3V4V5V6V7
count210.000000210.000000210.000000210.000000210.000000210.000000210.000000
mean14.84752414.5592860.8709995.6285333.2586053.7002015.408071
std2.9096991.3059590.0236290.4430630.3777141.5035570.491480
min10.59000012.4100000.8081004.8990002.6300000.7651004.519000
25%12.27000013.4500000.8569005.2622502.9440002.5615005.045000
50%14.35500014.3200000.8734505.5235003.2370003.5990005.223000
75%17.30500015.7150000.8877755.9797503.5617504.7687505.877000
max21.18000017.2500000.9183006.6750004.0330008.4560006.550000

      考察响应变量分布可以使用value_counts()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as ans
import csv
data=pd.read_csv('seeds_dataset.csv')
data.value_counts('Class')

输出结果:

Class
1    70
2    70
3    70
dtype: int64

(3)计算各变量间的相关系数,并实现相关系数矩阵可视化;

       使用corr.()方法计算变量间的相关系数矩阵,如果特征变量增多,直接看相关系数矩阵将会变得异常困难,可以使用seaborn模块的heatmap()函数将相关系数矩阵进行可视化,相关代码与结果如下:

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import csv
data=pd.read_csv('seeds_dataset.csv')
data.corr()

输出结果:

V1V2V3V4V5V6V7Class
V11.0000000.9943410.6082880.9499850.970771-0.2295720.863693-0.346058
V20.9943411.0000000.5292440.9724220.944829-0.2173400.890784-0.327900
V30.6082880.5292441.0000000.3679150.761635-0.3314710.226825-0.531007
V40.9499850.9724220.3679151.0000000.860415-0.1715620.932806-0.257269
V50.9707710.9448290.7616350.8604151.000000-0.2580370.749131-0.423463
V6-0.229572-0.217340-0.331471-0.171562-0.2580371.000000-0.0110790.577273
V70.8636930.8907840.2268250.9328060.749131-0.0110791.0000000.024301
Class-0.346058-0.327900-0.531007-0.257269-0.4234630.5772730.0243011.000000

fig=sns.heatmap(data.corr(),annot=True,fmt='.2g')#annot为热力图上显示数据;fmt='.2g'为数据保留两位有效数字
fig
plt.savefig("squares.png",
            bbox_inches ="tight",
            pad_inches = 1,
            transparent = True,
            facecolor ="w",
            edgecolor ='w',
            dpi=300,
            orientation ='landscape')

输出结果:

566db6dbebb8403da43e04b9ed8d36a7.png

(4)使用全样本进行线性判别分析,画出第1线性判元与第2线性判元的散点图,并根据种子类型进行上色;

     使用全样本(不分训练集和测试集)进行线性判别分析,可以通过sklearn模块的LinearDiscriminantAnalysis类来实现:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import csv
from sklearn.model_selection import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import cohen_kappa_score
data=pd.read_csv('seeds_dataset.csv')
y=data.Class#将响应变量记为y
model=LinearDiscriminantAnalysis()#创建一个实例model
model.fit(data,y)#使用fit方法进行估计
model.score(data,y)#计算预测准确率

输出结果:

0.9666666666666667

model.scalings_#考察线性判别元的系数估计值

输出结果:

array([[ 4.23778614e-01,  4.19531669e+00],
       [-3.79919995e+00, -8.50579585e+00],
       [-5.92772810e+00, -8.69823024e+01],
       [ 5.98819597e+00, -7.83067468e+00],
       [-3.70482197e-02,  7.14104253e-01],
       [ 4.50472160e-02,  3.21253808e-01],
       [-3.11807592e+00,  6.91384931e+00]])

       为了更好地展示线性判别系数,将其变为数据框,并加上适当的行名和列名:

lda_loadings=pd.DataFrame(model.scalings_,columns=['LD1','LD2'])
lda_loadings

输出结果:

LD1LD2
V10.4237794.195317
V2-3.799200-8.505796
V3-5.927728-86.982302
V45.988196-7.830675
V5-0.0370480.714104
V60.0450470.321254
V7-3.1180766.913849

lda_scores=model.fit(data,y).transform(data)
lda_scores.shape#考察线性判别得分形状
lda_scores[:5,:]#考察线性判别得分前5行观测值

输出结果:

array([[ 0.43132208, -3.44768583],
       [ 0.75286941, -4.1839799 ],
       [ 1.09393189, -2.95867452],
       [ 1.7680201 , -3.25241433],
       [-0.49441123, -3.43848523]])

      下面画出两个线性判别元(LD1,LD2)的散点图,以达到数据降维的目的。为此,先将lda_scores变为数据框,并在此数据框上加上响应变量”Class“:

LDA_scores=pd.DataFrame(lda_scores,columns=['LD1','LD2'])#将lda_scores变为数据框lda_scores

LDA_scores['Class']=data.Class
LDA_scores.head()#查看LDA_scores数据框前五行

输出结果:

LD1LD2Class
00.431322-3.4476861
10.752869-4.1839801
21.093932-2.9586751
31.768020-3.2524141
4-0.494411-3.4384851

fig=sns.scatterplot(x='LD1',y='LD2',data=LDA_scores,hue='Class',style='Class')#画出两个线性判别元的散点图,其中参数”hue=='Class'“表示根据小麦类别进行上色,style='Class'表示图标按小麦类别进行区分
plt.savefig("squares.png",dpi=300, bbox_inches ="tight")

输出结果:

04147c81aae0465f8023120ff0057f7d.png

        从上图可以发现,在降维之后的线性判别元(LD1,LD2)空间中,从LD1维度来看,第2种小麦能够与其他两种小麦区分开来,而从LD2维度来看,第1种小麦能够很好地与其他两种小麦区分。

(5)设定参数”random_state=0“,使用分层抽样,随机选取三分之二的样本作为训练集,进行线性判别分析;

data_train,data_test,y_train,y_test=train_test_split(data,y,test_size=0.3,stratify=y,random_state=0)
model=LinearDiscriminantAnalysis()#创建一个实例model
model.fit(data_train,y_train)
model.score(data_train,y_train)

输出结果:

0.9795918367346939

(6)在测试集中预测,展示混淆矩阵,并计算准确率;

prob=model.predict_proba(data_test)#使用训练的模型预测测试集的分类概率
prob[:5]#z展示前5行预测概率

输出结果:

array([[7.29717976e-03, 9.92655417e-01, 4.74033207e-05],
       [4.49893724e-05, 1.04163559e-06, 9.99953969e-01],
       [2.34958628e-09, 9.99999998e-01, 8.06413906e-13],
       [9.51231312e-03, 5.92638876e-08, 9.90487628e-01],
       [2.97531335e-07, 9.99999702e-01, 4.62306830e-11]])

pred=model.predict(data_test)#使用训练的模型预测测试集种每个样例小麦的种类
pred[:5]#z展示前5个预测结果

输出结果:

array([2, 3, 2, 3, 2], dtype=int64)

model.score(data_test,y_test)#计算测试集准确率

输出结果:

0.9365079365079365

confusion_matrix(y_test,pred)#计算混淆矩阵

输出结果:

array([[18,  0,  3],
       [ 0, 21,  0],
       [ 1,  0, 20]], dtype=int64)

print(classification_report(y_test,pred))#计算基于混淆矩阵的一系列模型预测效果的评价指标

输出结果:

 precision    recall  f1-score   support

           1       0.95      0.86      0.90        21
           2       1.00      1.00      1.00        21
           3       0.87      0.95      0.91        21

    accuracy                           0.94        63
   macro avg       0.94      0.94      0.94        63
weighted avg       0.94      0.94      0.94        63

cohen_kappa_score(y_test,pred)#计算科恩的kappa指标

输出结果:

0.9047619047619048

      结果显示,模型测试集的准确率达到93.65%,约等于94%,利用训练的模型对测试集进行预测时,只有1个观测值被错误分类。科恩kappa值达到90.48%,说明预测值与实际值之间较为一致,线性判别分析对数据集 seeds_dataset.csv中的小麦种类取得较好的分类效果。

(7)使用训练集,进行二次判别分析;

model=QuadraticDiscriminantAnalysis()#创建一个QuadraticDiscriminantAnalysis类的实例
model.fit(data_train,y_train)#使用训练集进行训练

(8)在测试集中,计算二次判别分析的混淆矩阵与准确率。

pred=model.predict(data_test)#使用训练的模型预测测试集种每个样例小麦的种类
pred[:5]#z展示前5个预测结果

输出结果:

array([1, 1, 1, 1, 1], dtype=int64)

confusion_matrix(y_test,pred)#计算混淆矩阵

输出结果:

array([[21,  0,  0],
       [21,  0,  0],
       [21,  0,  0]], dtype=int64)

model.score(data_test,y_test)#计算模型准确率

输出结果:

0.3333333333333333 

      二次判别分析结果显示,模型的准确率为33.33%,从混淆矩阵也可以看出,测试集中有42个观测值被错误分类,说明二次判别分析的分类效果很差,对于数据集seeds_dataset.csv中的小麦种类不能达到较好的分类效果。


需要数据集的家人们可以去百度网盘(永久有效)获取:

链接:https://pan.baidu.com/s/1FmXgepDVpv7c-eYdwPHDYg?pwd=2138 
提取码:2138


更多优质内容持续发布中,请移步主页查看。

若有问题可邮箱联系:1736732074@qq.com 

博主的WeChat:TCB1736732074

   点赞+关注,下次不迷路!

  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Python金融大数据风控实战:基于机器学习》是一本介绍如何使用Python进行金融大数据风险控制的实践指南。本书主要包括以下内容。 首先,本书详细介绍了使用Python进行金融大数据处理的基础知识。读者将了解如何使用Python进行数据清洗、特征工程以及数据可视化等操作。这些基础知识对于立可靠的金融风险型至关重要。 其次,本书介绍了机器学习在金融风控中的应用。读者将学习常用的机器学习算法,包括逻辑回归、决策树、随机森林等。同时,本书还介绍了如何使用交叉验证和网格搜索等技术来选择最佳的型参数。 另外,本书还提供了一些实际案例,介绍了如何使用Python进行金融大数据风控的实战经验。这些案例包括信用评级、欺诈检测等实际应用场景,读者可以通过实际案例来学习如何将机器学习算法应用于真实的金融风控问题。 最后,本书还介绍了一些工具和库,如pandas、numpy和scikit-learn等,这些工具和库能够帮助读者更高效地使用Python进行金融大数据风控。 总的来说,《Python金融大数据风控实战:基于机器学习》是一本非常实用的书籍,对于想要学习如何使用Python进行金融大数据风控的读者来说,具有很高的参考价值。通过阅读本书,读者可以了解到如何使用机器学习技术来解决金融风险问题,了解如何应用Python工具和库进行数据处理和立,并通过实际案例来提高实践能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(备考中,暂停更新)4.14 于武汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值