一个企业级数据挖掘实战项目|教育数据挖掘

article/2025/9/26 22:45:44

数据集描述

本案例数据集来自Balochistan的6000名学生。其基本情况:一共13个字段,其中RESULT为结果标签;

语言字段是经过独热编码后的四个字段,分别为Lang1, Lang2, Lang3, Lang4

另外性别、学校、是否残疾、宗教信仰四个字段为二分类离散字段;

其余如兄弟姐妹、在校兄弟姐妹数量为连续性变量。

本次数据为清洗过后"干净"数据,可以直接输入到机器学习模型中直接建模使用。

字段说明如下表所示

字段解释
GenderCode性别编码
IntBrothers兄弟数量
IntSisters姐妹数量
IntSchoolBrothers在校兄弟数量
IntSchoolSisters在校姐妹数量
ClassSchoolStatus学校
Disability01是否残疾
Lang1语言1
Lang2语言2
Lang3语言3
Lang4语言4
Religion宗教信仰
RESULT结果标签

数据样例

探索性数据分析

探索性数据分析有多种方法,这里直接通过绘制柱状图查看每个字段的分布状况。

了解更多:Python数据分析之数据探索分析(EDA)

从数据集特点来看,13个字段可以分为四大类。

  • 结果标签

  • 离散型变量

  • 连续型变量

  • 哑变量

结果标签

考试结果为PASS的共有4562名学生,而结果为FAIL 的共有1047名学生,从下图中也可以明显看出,该样本为不平衡数据集,因此本次案例重点在于不平衡数据分类方法。

离散型变量

性别有男女,学校有学校1和学校2,身体健康状况有是否残疾,宗教信仰分是否是穆斯林。

连续型变量

本次数据集中兄弟姐妹数量及在校兄弟姐妹数量分布情况可以由下面四张分布图很好地展示出来。

  • 大部分学生家中的兄弟姐妹有2-4个

  • 大部分学生家中的姐妹都不是在校生

  • 大部分学生家中的兄弟中也只有1-2个是在校生

哑变量

本次数据集共有四种语言,其数量分布由下图所示。接近一半的学生都是说的一种语言(Lang1)。

不平衡数据集处理方法

从上一步的探索性数据分析结果,本次学生成绩数据集为不平衡数据集,那么处理不平衡数据集处理方法都有哪些呢。这里可以参考云朵君之前的一篇机器学习中样本不平衡,怎么办?

在本文云朵君从三个方面总结了多种处理方法,见下面思维导图。

数据重采样

这里主要介绍下数据预处理层面的数据重采样方法。数据重采样主要分为上采样和下采样。

下采样,也称为欠采样(Under-Sampling),是一个为平衡数据类分布的移除大类数据的非启发式的方法。此方法的底层逻辑是平衡数据集进而克服算法的特异性。

常用的方法有随机欠采样(Random Under-Sampling, RUS),即随机排除大类的观察值,和聚焦欠采样(Focused Under-Sampling, FUS), 即移除两类边界处的大类数据。

上采样,也称为过采样(Over-Samplig),是通过复制小类观察值,从而增加小类比例的一个方法。类似的,过采样也有随机过采样和聚焦过采样两种方法。

来源:kaggle

上采样

过采样代表SMOTE方法,其主要概念也就是在少数样本位置近的地方,人工合成一些样本,整个算法的流程如下:

设定一个采样倍率N,也就是对每个样本需要生成几个合成样本

设定一个近邻值K ,针对该样本找出K 个最近邻样本并从中随机选一个

根据以下公式来创造 N 个样本

下采样

相对于过采样,欠采样是将多数样本按比例减少,使得模型的加权权重改变,少考虑一些多数样本,上图很好地展示了两种方法的差异 。

Tomek Link 算法

会针对所有样本去遍历一次,如有两个样本点x, y分属不同的class,即一个为多数样本而另一个为少数样本,则可以去计算它们之间的距离d(x , y) 。

此时如果找不到第三个样本点z,使得任一样本点到z 的距离比样本点之间的距离还小,则称为Tomek Link,一张图帮助理解 :

来源:Kaggle

Tomek Link 的关键思路在于,找出边界那些鉴别度不高的样本,认为这些样本点属于杂讯,应该剔除,因此可以见上图最右边,剔除以后两种类别的样本点可以更好地区分开来。

ENN算法(Edited Nearest Neighbor)

与上面Tomek Links的观念相同,ENN算法也是透过某种方式来剔除鉴别度低的样本,只是这边的方式改成了对多数类的样本寻找K个近邻点,如果有一半以上(当然,门槛可以自己设定)都不属于多数样本,就将该样本剔除,通常这些样本也会出现在少数样本之中。

混合采样

SMOTE + ENN、SMOTE + Tomek Links算法都是结合过采样与欠采样算法

SMOTEENN
使用 SMOTE 进行过采样,然后使用 Edited Nearest Neighbours 进行欠采样。

SMOTETomek
使用 SMOTE 进行过采样,然后使用 Tomek Links 进行欠采样。

不平衡数据集处理方法选择

控制变量法选择合适的处理方法。选用决策树为基分类器,并分别选择不使用数据重采样,使用SMOTE、SMOTEENN和SMOTETomek共三种数据重采样方法,比较这四种情况下的模型评价指标AUC得分情况。

最后分别选用五种不同分类器,且分别采用不同的数据重采样方法,绘制ROC曲线及得到的AUC得分情况。

ROC和AUC

ROC曲线绘制采用不同分类阈值的TPR和FPR,降低分类阈值会将更多的样本判为正类别,从而增加FP和TP的个数。为了绘制ROC曲线,需要使用不同的分类阈值多次评估回归模型,很麻烦。有一种基于排序的高效算法可以为我们提供此类信息,这种算法称为曲线下的面积(AUV,area under roc curve)。

ROC曲线的横轴为FPR,越低越好,纵轴为TPR,越高越好,故如果有两个不同的模型,曲线位于左上方的模型优于曲线位于右下方的模型,这一点可以拿曲线的面积(AUV)来量化。

完美的分类为TPR=1,FPR=0;ROC曲线过(0,0)和(1,1)点

  • AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。

  • 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。

  • AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。

  • AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

AUC计算的物理意义为:任取一对(正、负)样本,正样本的score大于负样本的score的概率,也即是随机正类别样本位于随机负类别样本右侧的概率。

核心代码

将所有主要方法定义为函数,包括数据重采样、划分测试集和训练集、模型训练、模型评价和结果可视化。

此外,由于是比较不平衡数据集处理方法选择的优劣,这里所有的机器学习模型都采用默认参数。

def reSampler(X, y, samp):"""不同的数据重采样策略"""if(samp == 'None'):return splitter(X, y, 0.1)    if(samp == 'SMOTE'):sm = SMOTE('auto', 42)X_resampled , y_resampled = sm.fit_resample(X, Y)return splitter(X_resampled , y_resampled, 0.1)   if(samp == 'SMOTEENN'):sm = SMOTEENN()X_resampled , y_resampled = sm.fit_resample(X, Y)return splitter(X_resampled , y_resampled, 0.1)   if(samp == 'SMOTETomek'):sm = SMOTEENN()X_resampled , y_resampled = sm.fit_resample(X, Y)return splitter(X_resampled , y_resampled, 0.1)def splitter(X, y, test_Size):"""划分测试集和训练集"""xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size = test_Size, random_state=12)return xtrain, xtest, ytrain, ytestdef rocPlotter(actu, pred, clf, samp):"""AUC曲线绘图函数"""false_positive_rate, true_positive_rate, thresholds = roc_curve(actu, pred)roc_auc = auc(false_positive_rate, true_positive_rate)Title = str('ROC: ' + str(clf) + ' using ' + str(samp))plt.title(Title)plt.plot(false_positive_rate, true_positive_rate, 'b', label='AUC = %0.2f'% roc_auc)plt.legend(loc='lower right')plt.plot([0,1],[0,1],'r--')plt.xlim([-0.1,1.2])plt.ylim([-0.1,1.2])plt.ylabel('True Positive Rate')plt.xlabel('False Positive Rate')plt.show()return roc_aucdef applyModel(clfr, X_, y_, xt, yt):"""使用模型"""a = globals()[clfr]()a.fit(X_, y_)scor = a.score(xt, yt)*100pred = a.predict(xt)actu = ytreturn pred, actu, scordef tryAll(clfList, sampList, Inputs, Outputs):"""主函数"""rep = np.zeros( (len(clfList), len(sampList)), dtype=float)for clf, clfIndex in zip(clfList, range(len(clfList))):# 不同的分类器for samp, sampIndex in zip(sampList, range(len(sampList))):# 不同的重采样策略X_train, X_test, Y_train, Y_test = reSampler(Inputs, Outputs, samp)prediction , actual, score =applyModel(clf, X_train, Y_train, X_test, Y_test)currentAUC = rocPlotter(prediction, actual, clf, samp)print(clf, ' with ', samp, ' scored =  ', score, ' on test set with AUC = ', currentAUC)rep[clfIndex, sampIndex] = currentAUCreturn rep

函数执行

Classifiers = ['DecisionTreeClassifier', 'KNeighborsClassifier', 'LogisticRegression', 'MLPClassifier', 'RandomForestClassifier']
Samplers = ['None', 'SMOTE', 'SMOTETomek', 'SMOTEENN']report = tryAll(Classifiers, Samplers, X, Y)

结果可视化

下面以单个模型四种不同重采样策略,和五种模型单个重采样策略为例展示可视化结果。大家可以运行上述代码以得到完整的结果展示。

决策树模型在四种不同重采样策略下,得到的四种不同的结果。很明显地看到没有使用数据重采样的模型得分最差只有0.54,而使用混合采样算法的两个结果的得分都比较理想,分别是0.9732750.979196分。

接下来以上述结果中得分最高的混合采样算法SMOTETomek为例,将不平衡数据集经过SMOTETomek算法处理后,分别用
DecisionTreeClassifier决策树分类器,
KNeighborsClassifierK近邻分类器,
LogisticRegression逻辑回归,
MLPClassifier多层感知机,
RandomForestClassifier随机森林分类器   
五种机器学习模型训练和测试数据,并得到如下结果。

从结果可知道,并不是所有模型在使用混合采样算法SMOTETomek后都能达到令人满意的效果。

结果汇总

为方便查看所有结果,将所模型、所有重采样方法汇总到如下图所示的DataFrame中。从AUC结果看,使用混合采样算法SMOTEENN对数据集处理,并使用决策树模型对结果进行预测,将会得到最佳预测效果。其AUC=0.979

pd.DataFrame(report, columns = Samplers, index = Classifiers)

交叉验证

上节中选用五种不同分类器,三种不同的数据重采样方法,结合ROC曲线及AUC得分情况来确定重采样方法对选择。

本节可以理解为是上节的拓展。

核心代码

# 实例化五种分类器模型
dTree  = DecisionTreeClassifier()  
logReg = LogisticRegression()
knn    = KNeighborsClassifier(n_neighbors=5)
rF     = RandomForestClassifier()
MLP    = MLPClassifier()# 实例化十种数据重采样模型
rmun = RandomUnderSampler()
cnn = CondensedNearestNeighbour()
nm = NearMiss()
enn = EditedNearestNeighbours()
renn = RepeatedEditedNearestNeighbours()
tkLink = TomekLinks()
rmov = RandomOverSampler()
sm = SMOTE()
sm_en = SMOTEENN()
sm_tk = SMOTETomek()
# 以SMOTEENN采样方法为例
sm_en = SMOTEENN()
X_resampled, Y_resampled = sm_en.fit_resample(X, Y)
# 分别使用10折交叉验证的方法得到平均得分
scores_dTree = cross_val_score(dTree, X_resampled, Y_resampled, cv = 10, scoring='roc_auc')
scores_dTree = scores_dTree.mean()
# 打印出每次的结果
print('After appling SMOTENN: ')
print('   dTree,       logReg   ,         KNN    ,       rF   ,           MLP')
print(scores_dTree, scores_logReg, scores_knn, scores_rF, scores_MLP)

将所有结果存储在一个DataFrame里

Classifiers = ['DecisionTreeClassifier', 'LogisticRegression', 'KNeighborsClassifier', 'RandomForestClassifier',  'MLPClassifier']
Samplers = ['None','Random Undersampling', 'CNN', 'NearMiss', 'ENN', 'RENN','Tomek Links','SMOTE', 'Random Oversampling', 'SMOTEENN','SMOTETomek']pd.DataFrame(report, columns = Samplers, index = Classifiers)

并用热图可视化更加直观地展示出结果来

import seaborn as sns
plt.figure()
ax = sns.heatmap(report,xticklabels=Samplers, yticklabels=Classifiers, annot = True, vmin=0, vmax=1, linewidth=0.1, cmap="YlGnBu",)

从热图的特性可以看出,蓝色越深,模型效果越好。本案例中可以得到如下几个结论

  1. 随机森林分类器在使用RENN及SMOTEENN重采样处理后的数据时,模型效果均比较理想,AUC得分分别为0.940.98

  2. 采用SMOTEENN重采样处理后的数据,在所有模型中均表现良好,其次是RENN重采样策略

  3. 随机下采样,CNN及NearMiss等采样策略效果并不明显

  4. 逻辑回归模型对于所有的采样策略均不敏感

写在最后

本例采用的来自Balochistan的6000名学生不平衡数据集。本项目旨在探讨影响学生学业表现的人口统计学和家庭特征。

本例使用清洗后的数据集,以探索数据变量的分布特征开篇,重点介绍了数据不平衡处理的各种方法,以及演示如何通过交叉验证方法选择合适的数据不平衡处理以及选择合适的机器学习分类模型。

本文后续工作可以是通过正文中得到的结果,选择几个合适的模型,通过适当的模型调参方法选择恰当的参数,以确定本次数据挖掘的最终模型。

当然,机器学习模型等的选择并不仅限于本文中所提到的这几种方法,欢迎大家踊跃尝试,与云朵君一起学习成长。

推荐阅读:入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|年度爆款文案1).卧槽!Pdf转Word用Python轻松搞定!2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密 4).80行代码!用Python做一个哆来A梦分身 5).你必须掌握的20个python代码,短小精悍,用处无穷 6).30个Python奇淫技巧集 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货 8).再见Python!我要学Go了!2500字深度分析!9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片点阅读原文,领廖雪峰视频资料!

http://chatgpt.dhexx.cn/article/XdTWw5EV.shtml

相关文章

二、大数据实践项目——数据分析与处理

一、数据处理主要任务 二、数据集处理 1、查看数据集基本情况 调用 info() 函数来查看数据data的基本情况&#xff0c;包括数据维度&#xff0c;字段名称和类型以及有无缺失值&#xff0c;数据占用内存等。&#xff08;以下为部分字段信息&#xff09; 可见总的数据47447行&a…

数据挖掘项目总结文档

数据挖掘项目总结文档 1、文档概述 1.1 编写目的 记录本次实验思路及流程&#xff0c;备忘用。 1.2 适用对象 个人学习总结&#xff0c;描述有偏差之处陆续更进。 2、业务理解与分析定义 2.1 需求概述 针对传统网络入侵检测系统存在的误判以及漏检情况&#xff0c;采用数据挖掘…

数据挖掘开源项目立项

项目背景 因为最近一直都在搞数据挖掘类的项目&#xff0c;且现在国内的大数据潮火热。在前几天与群里的几位兄弟聊天所以有了做一个开源项目的想法&#xff0c;以前也搞过一个开源的项目&#xff0c;当时只是想把权限集中化做一下&#xff0c;项目的名称和地址是&#xff1a; …

数据挖掘项目(1)对数据进行探索和分析

1.数据类型的分析&#xff08;假设数据为data.csv&#xff09; 首先读入数据&#xff0c;这个数据是csv格式&#xff0c;可以用pandas来读&#xff0c;如果读不进来的时候&#xff0c;可以用记事本打开data.csv然后另存为data_2.csv并且保存为utf-8的编码格式。然后读取数据。…

python数据挖掘项目——航空公司客户价值分析(详解)

一、选题背景 信息时代的来临使得企业营销的焦点从产品中心转变为客户中心&#xff0c;客户关系管理成为企业的核心问题&#xff0c;客户关系管理的关键问题是客户分类&#xff0c;通过客户分类&#xff0c;区分不同客户的价值&#xff0c;企业针对不同价值的客户制定个性化的服…

网络通信协议分类

协议分类 通信的协议还是比较复杂的&#xff0c;java.net 包中包含的类和接口&#xff0c;它们提供低层次的通信细节。我们可以直接使用这些类和接口&#xff0c;来专注于网络程序开发&#xff0c;而不用考虑通信的细节。 java.net 包中提供了两种常见的网络协议的支持&#…

各种基础协议

了解几个概念&#xff1a; 1. HTTP 协议&#xff1a;基于TCP协议&#xff0c;超文本传输协议&#xff0c;对应于应用层&#xff0c;用于如何封装数据.。也就是在底层是基于socket&#xff0c; http只不过是在收发数据的时候定义了很多规则&#xff0c;http头信息之类。 TCP/I…

TCP协议格式

1、16位源端口号&#xff1a;16位的源端口中包含初始化通信的端口。源端口和源IP地址的作用是标识报文的返回地址。 2、16位目的端口号&#xff1a;16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。 3、32位序号&#xff1a;32位的序列号由…

以太网各种协议详解

板子处于复位状态时&#xff0c;先做好一系列的准备工作。 1、从EEROM中读取板子的MAC 地址&#xff08;事先已经写在地址0xFA to 0xFF 中了&#xff09;。 2、配置PHY 寄存器&#xff0c;并读取该寄存器的值&#xff0c;检查一下&#xff0c;此时的寄存器配置时候是合理的&am…

汽车通信协议系列1_通信协议类型

当前比较通用的五种协议&#xff0c;任何一款标准OBD2的车辆都会采用以下五种协议中的一种。以下几种按照物理层编码相关性来划分 ISO9141&#xff0c;ISO 14230.这类是以UART为基础的。 CAN ISO 11898&#xff08;车载网络&#xff09;&#xff0c;ISO15768&#xff0c;SAE J…

网络协议分类

Http协议&#xff1a;应用层。 tcp/udp协议&#xff1a;传输层。udp提供不可靠通信&#xff1a;无流控等。 ip协议&#xff1a;网络层。 TCP/IP是是一套协议族&#xff0c;是一种说法&#xff0c;由早期的某标准化组织制定&#xff0c;规定了使用tcp和ip等一系列协议的规范。…

IP协议及分类

文章目录 TCP/IP协议IP地址分类默认子网掩码网关公有IP地址和私有IP地址 基本环境设置连网介质及设备重点 TCP/IP协议 TCP/IP通信协议是目前最完整、最被广泛支持的通信协议&#xff0c;它可以让不同网络架构、不同操作系统的计算机之间通信&#xff0c;是Internet的标准通信协…

常见的协议汇总(小白个人理解,大佬勿喷)

背景 接触了一些芯片&#xff0c;发现所有的芯片而言&#xff0c;库和API接口随着芯片&#xff0c;开发环境甚至开发情况&#xff0c;公司都有着明显的区别。基于这种情况的话&#xff0c;了解协议的底层个人觉得是十分必要的&#xff0c;同时也是找工作的必备选项。所以对常见…

常用协议类型值

Ethertype ( 十六进制 ) 协议 0x0000 - 0x05DC IEEE 802.3 长度 0x0101 – 0x01FF 实验 0x0600 XEROX NS IDP 0x0660 0x0661 DLOG 0x0800 网际协议&#xff08;IP&#xff09; 0x0801 X.75 Internet 0x0802 NBS Internet 0x0803 ECMA Internet 0x0804 Chao…

TCP协议格式和特点

文章目录 1.协议格式&#xff1a;2.协议特性&#xff1a;2.1 面向链接2.1.1三次握手建立连接2.1.1四次挥手断开连接相关问题和知识点&#xff1a;1. 握手为啥三次&#xff0c;挥手是四次&#xff1f;2. 三次握手失败两端是如何处理的&#xff1f;3. SYN泛洪攻击是怎么回事?4. …

典型几种协议(协议以及作用)

一 .典型协议&#xff1a; 传输层&#xff1a; 常见的协议有 TCP/UDP 协议 应用层&#xff1a; 常见的协议有 HTTP&#xff0c;FTP 协议 网络层&#xff1a; 常见的协议有 IP 协议&#xff0c;ICMP 协议&#xff0c;IG…

ICMP协议 详解,ICMP协议的功能及实现原理,ICMP协议报文类型。

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」&#xff1a;此文章已录入专栏《计算机网络零基础快速入门》 ICMP协议 一、工作原理二、数据报格式三、报文类型 ICMP协议是IP的…

几个的常见基础协议类型数据格式以及协议内容简介

给大家简单梳理一下几种学习中常会出现的协议格式&#xff0c;咋们数通就像交通&#xff0c;各种各样的协议规则来规范大家&#xff0c;制定科学的管理手段来帮助大家快速&#xff0c;安全的到家。 一、 HDLC协议 HDLC叫高级链路控制协议&#xff08;High Level Data Link Cont…

几种常用协议介绍

几种常见协议介绍 TCP/IP协议&#xff0c;其实是一个协议集合&#xff0c;这个集合里面包含了网络通讯所需的所有协议&#xff0c;里面不仅有TCP(传输控制协议)、IP(网际协议)&#xff0c;还有UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等许多协议&#xff0c;还有物联网中…

个人如何申请注册公司邮箱?企业邮箱注册申请流程详解

大部分人可能知道邮箱&#xff0c;但是公司邮箱是什么&#xff1f;企业邮箱注册申请流程&#xff1f;个人如何申请注册公司企业邮箱&#xff1f; 在一家公司实习时人事告诉我使用公司邮箱&#xff0c;用我名字拼音命名的&#xff0c;还是无限容量、单次群发500封、邮件误删可以…