伦敦数据科学与Scikit-learn:一次探索与实践的旅程

news2024/11/19 18:40:35

1.题目

Data Science London正在举办一场关于Scikit-learn的聚会。 这个比赛是尝试、分享和创建 sklearn 分类能力示例的练习场(如果这变成了有用的东西,我们可以跟进回归或更复杂的分类问题)。Scikit-learn(sklearn)是一个成熟的开源机器学习库,在NumPy,SciPy和Cython的帮助下用Python编写。

数据集描述

这是一个包含 40 个特征的合成数据集,表示来自两个类(标记为 0 或 1)的对象。训练集有 1000 个样本,测试集有 9000 个样本。

这是一个二元分类任务,将根据分类准确性(正确预测的标签百分比)评估您。 训练集有 1000 个样本,测试集有 9000 个样本。 您的预测应该是 9000 x 1 的 1 或 0 向量。您还需要一个 Id 列(1 到 9000),并且应该包含一个标题。

320BCC30.gif

2.数据处理

2.1观察

首先新打印一些数据的前五行,看看数据长什么样子:

print(df_train.head())

特征列的标题实在太长,显示列很少,没有观察到什么有用的信息,继续观察。

image-20231025090917946

再打印一下数据的简明摘要,显示数据的索引类型、列名、列数据类型、非空值数量,以了解数据的基本情况。

print(df_train.info())

image-20231025091056954

打印一下数据的基本统计信息,如百分比、均值、标准差等方法,如下图:

print(df_train.describe())

image-20231025102219882

我还想再看一下数据中存在哪些缺失值:

print(df_train.isnull().sum())

出乎意料🤪,我还是第一次遇到给出不存在缺失值的数据!这个题变得有意思起来了😜

image-20231025091724239

再看一下数据中是否有重复值。

print(df_train.nunique())

第一列表示每一列标题,第二列表示每一列中不一样的值,好家伙,每一列的值都不一样。

image-20231025092232472

print(df_train.nunique(axis=1))

第一列表示特征列标题,第二列表示每一行中不一样的值,好家伙,每一列的值都不一样。

image-20231025092507622

好好好,这写数据每一行,每一列都是不同的,真是越来越有意思了。😎继续玩下去。

320D1E72.jpg

似乎还给一个标签的表,也去看看这个表长什么样:

print(df_train_label.describe())

似乎这张表就是一张标签表,对train表格中的每一行打标签,0或1.

image-20231025175120214

现在对train、trainLabels、test(和train一样的操作就没有贴出来啦)数据都很清楚了,下面就开始数据化分析吧!

3.探索和可视化EDA

3.1制直方图以查看特征分布

我想通过直方图的去查看特征分布,目的是了解数据的形状、中心、范围和异常值。

fig = px.histogram(df_train)
fig.show()

40个特征还是有点东西的,颜色四十彩斑斓花里胡哨,但是仔细一点还是可以看出所有特征基本都是符合正态分布的。

Snipaste_2023-10-25_17-56-52

3.2制作箱线图查看数据的分布和异常值

plt.figure(figsize = (20,20))
for i in range (len(df_train.columns)):
    plt.subplot(5, 10, i+1)
    sns.boxplot(df_train.iloc[:,i])
    plt.xlabel(df_train.columns[i], size = 10)
plt.show()

画出所有特征列的箱线图,在画布上创建一个5*10的子图网格,使用sns.boxplot函数绘制当前列的箱线图。

Figure_1

箱线图是一种用于显示数据分布的图形,它可以显示数据的最小值、最大值、中位数、四分位数和异常值。

箱子在中位数两边对称,数据都是对称分布的,而且还可以观察到,箱子很长,即数据比较散。

3.3制作热力图查看特征之间的相关性

plt.figure(figsize = (20,20))
sns.heatmap(df_train.corr(), annot = True,cmap="YlOrRd",annot_kws={"size": 3})
plt.show()

热力图.png

观察上图,似乎数据间的相关性并不是很高,更多的是不呈相关性。

4 模型预测

这次的数据如此不同,异常数据没有,连缺省数据都没有,数据也不需要处理,那就多用几个模型预测吧,看看什么样的模型更适合这个数据。这次共选取6种模型进行预测📈。

先将train数据分割成训练集和测试集,按照7-3分。

x_train, x_test, y_train, y_test = train_test_split(train, trainLabels, test_size=0.30, random_state=101)
print(x_train.shape, x_test.shape, y_train.shape, y_test.shape)

分好的训练集和测试集如下所示:

image-20231026201254788

开始测试吧🤗

4.1 📉Logistic Regression 逻辑回归

逻辑回归是一种用来预测二元变量(如0或1)的概率的模型。

logistic_model = LogisticRegression()
logistic_model.fit(x_train, y_train.values.ravel())
l_predicted = logistic_model.predict(x_test)
print('Logistic Regression准确率:', accuracy_score(y_test, l_predicted))

image-20231026202555761

4.2 K-Nearest Neighbors KNN K-最邻近

K-最邻近是一种基于实例的模型,可以用来分类或回归。

K-最邻近的思想是根据一个新的数据点与已知的数据点的距离,找出最近的k个邻居,然后根据这些邻居的类别或数值进行投票或平均,得到新数据点的预测结果。

knn_model = KNeighborsClassifier()
knn_model.fit(x_train, y_train.values.ravel())
knn_predicted = knn_model.predict(x_test)
print('KNN model准确率:', accuracy_score(y_test, knn_predicted))

image-20231026203334616

4.3 Support Vector Machine SVM 支持向量机

支持向量机是一种非线性模型,可以用来分类或回归。

支持向量机的核心思想是通过一个核函数(如高斯核),将数据映射到一个高维空间,然后在这个空间中寻找一个超平面,使得不同类别的数据点之间的距离最大化。

svc_model = SVC(gamma='auto')
svc_model.fit(x_train, y_train.values.ravel())
svc_predicted = svc_model.predict(x_test)
print('SVM准确率:', accuracy_score(y_test, svc_predicted))

image-20231026203245864

4.4 🌲Random Forest RF 随机森林

随机森林是一种集成学习模型,可以用来分类或回归。

它的核心思想是通过构建多棵决策树,并让这些决策树对同一个数据点进行预测,然后根据这些决策树的预测结果进行投票或平均,得到最后的预测结果。

rforest_model = RandomForestClassifier()
rforest_model.fit(x_train, y_train.values.ravel())
rf_predicted = rforest_model.predict(x_test)
print('Random Forest准确率:', accuracy_score(y_test, rf_predicted))

image-20231026203303848

4.5 📐Extreme Gradient Boosting XGBoost 极致梯度提升

XGBoost就太熟悉了吧,上一篇文章还详细介绍过。

还是简单介绍一下吧。

XGBoost是一种集成学习模型,也是基于决策树的模型,但与随机森林不同的是,它是通过迭代地构建决策树,并让每一棵树对前面所有决策树预测结果的误差进行拟合,从而不断的提高预测精度。

xgb = XGBClassifier()
xgb.fit(x_train, y_train.values.ravel())
xgb_predicted = xgb.predict(x_test)
print('XGBoost准确率:', accuracy_score(y_test, xgb_predicted))

image-20231026203354345

4.6 😸Categorical Boosting CatBoost 分类梯度提升

CatBoost是一种集成学习模型,也可以用来分类或回归。与极致梯度提升类似,也是基于决策树的模型,但它的特点是能够很好的处理分类特征,而不需要对分类特征进行编码或转换。

cat = CatBoostClassifier()
cat.fit(x_train, y_train.values.ravel())
cat_predicted = cat.predict(x_test)
print('CatBoost准确率:', accuracy_score(y_test, cat_predicted))

image-20231026203413344

通过上面实验可以观察到,支持向量机模型对这组数据的预测准确率最高,达到了92.3%,其次是KNN和XGBoost均有87%的准确率。(题外话,XGBoost终于赢了CatBoost🥇)

320E4DEA.gif

4.7交叉验证

使用sklearn库中的cross_val_score函数来进行交叉验证,此函数可以对给定的模型和数据,使用指定的折数(cv参数)进行k折交叉验证,并返回准确率。

我在代码中对每个模型进行10折交叉验证,并打印出每个模型的平均交叉分数,目的是比较不同模型在同一数据集上的性能,并选择最优的模型。

norm = Normalizer()
norm_train = norm.fit_transform(train)

knn_model = KNeighborsClassifier(n_neighbors=5)
print('KNN', cross_val_score(knn_model, norm_train, trainLabels.values.ravel(), cv=10).mean())

rfc_model = RandomForestClassifier(n_estimators=100, random_state=100)
print('Random Forest', cross_val_score(rfc_model, norm_train, trainLabels.values.ravel(), cv=10).mean())

lr_model = LogisticRegression(solver='saga')
print('Logistic Regression', cross_val_score(lr_model, norm_train, trainLabels.values.ravel(), cv=10).mean())

svc_model = SVC(gamma='auto')
print('SVM', cross_val_score(svc_model, norm_train, trainLabels.values.ravel(), cv=10).mean())

xgb = XGBClassifier()
print('XGBoost', cross_val_score(xgb, norm_train, trainLabels.values.ravel(), cv=10).mean())

cat = CatBoostClassifier()
print('CatBoost', cross_val_score(cat, norm_train, trainLabels.values.ravel(), cv=10).mean())

image-20231026210517857

image-20231026210950213

观察到打印出的结果,CatBoost模型和KNN模型均以0.90的平均验证分数位居前列,CatBoost以微弱的优势暂居第一。其他模型的表现也很不错,均有0.80以上得分。✌

5 数据预测

通过上面的可视化探索,得到支持向量机和CatBoost模型两个模型的评分不错,接下来就用这两个模型都分别预测一下吧。

5.1支持向量机进行预测

print(train.shape, test.shape)
svc_model.fit(train, trainLabels.values.ravel())
svc_predicted = svc_model.predict(test)
svc_predicted = pd.DataFrame(svc_predicted)
svc_predicted.columns = ['Solution']
svc_predicted['Id'] = np.arange(1, len(svc_predicted) + 1)
svc_predicted = svc_predicted[['Id', 'Solution']]
svc_predicted.to_csv(r'C:\Users\19313\Desktop\其他\kaggle竞赛\伦敦数据科学+Scikit-learn\output_data\svc_predict.csv', index=False)

将用SVM模型预测得到的数据输出为csv文件,然后提交到kaggle上,得分是0.913,分数应该还不错,但是我不知道排名,因为这个比赛已经结束了。

image-20231026221550181

5.2CatBoost进行预测

cat.fit(train, trainLabels.values.ravel())
cat_predicted = cat.predict(test)
cat_predicted = pd.DataFrame(cat_predicted)
cat_predicted.columns = ['Solution']
cat_predicted['Id'] = np.arange(1, cat_predicted.shape[0] + 1)
cat_predicted = cat_predicted[['Id', 'Solution']]
cat_predicted.to_csv(r'C:\Users\19313\Desktop\其他\kaggle竞赛\伦敦数据科学+Scikit-learn\output_data\cat_predict.csv', index=False)

同上,将CatBoost模型预测得到的数据也提交,得分为0.895,比向量机的得分要低一些。这两个还是SVM更胜一筹呀😎

image-20231026221843303

这个比赛也完成了,总的来说,这次的数据是非常神奇的。比如说,没有缺失数据,没有异常数据,没有表头(我在这个点上栽了好大一个跟头😩),不过总体还是很有意思的。

320E9FE2.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django项目不显示图片,路径找不到

1.问题 创建Django项目简单写一个网页,文字能显示,图片却无法加载,路径错误,找不到图片。 2.背景 我的项目结构 C:. ├─.idea │ └─inspectionProfiles ├─app01 │ ├─migrations │ ├─templates │ │ ├─app0…

postgres让别人连接自己本地的库

本地安装了postgres,一般只能自己连接,如果别人想要连接我们自己的库,需要修改postgres的配置。 找到pg.gba.conf,路径是:postgres安装路径/PostgreSQL/data 使用记事本打开这个文件,将别人的ip填入其中即…

Python数学建模-2.5Pandas库介绍

2.5.1Pandas基本操作 Pandas是一个强大的Python数据分析库,它提供了快速、灵活且富有表现力的数据结构,设计初衷是为了处理关系型或标记型数据。Pandas的基本操作涵盖了数据的读取、处理、筛选、排序、分组、合并以及可视化等多个方面。 以下是一些Pan…

CentOS7环境——yum安装nginx

目录 1.修改yum源为阿里云 2.下载wget 3.下载阿里云的 CentOS-Base.repo 到/etc/yum.repos.d/ 4.清空原本yum缓存 5.生成新的阿里云的yum缓存,加速下载预热数据 6.下载epel-release 7.下载nginx 8.启动并检查nginx状态 1.修改yum源为阿里云 cp /etc/yum.re…

QQ 截图工具独立版安装使用

前言 之前截图一直使用的QQ截图,相比于微信截图,QQ截图还支持长截图,总体来说,QQ截图是我使用过的最好的截图工具 。但是现在公司不让用微信、QQ、钉钉等通讯软件,要求使用公司自研的通讯软件,这样就不能使…

EMQX 实践

MQTT 核心概念 发布订阅 MQTT 基于发布订阅模式,它解耦了消息的发送方(发布者)和接收方(订阅者),引入了一个中间代理的角色来完成消息的路由和分发。发布者和订阅者不需要知道彼此的存在,他们…

IIS上部署.netcore WebApi项目及swagger

.netcore项目一般是直接双击exe文件,运行服务,今天有个需求,需要把.netcore项目运行在IIS上,遇到了一个小坑,在这里记录一下。 安装IIS,怎么部署站点,这些过于简单就不细说了,不知道…

java学习之路-方法讲解

目录 1.方法概念及使用 1.1什么是方法 1.2方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系(重要) 1.5 没有返回值的方法 2.方法重载 3.方法递归 3.1递归概念 3.2递归执行过程分析 3.3递归练习 代码示例1 代码示例2 1.方法概念及使用 1.1什么是方法 方法就是…

ipad电容笔有必要买吗?怎么选?四大缺陷弊端要严防!

电容笔有没有必要买还是得看我们个人的使用需求,如果平时做笔记、画画比较多的话,还是值得入手的,原装笔是好,但对于一些预算不多的朋友来说,价格还是过于高了,不是很划算。而且我们国内市场的平替电容笔也…

【Linux】基础 IO(文件系统 inode 软硬链接)-- 详解

一、理解文件系统 1、前言 我们一直都在说打开的文件,磁盘中包含了上百万个文件,肯定不可能都是以打开的方式存在。其实文件包含打开的文件和普通的未打开的文件,下面重点谈谈未打开的文件。 我们知道打开的文件是通过操作系统被进程打开&am…

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

【Oracle篇】一文搞清exp/imp逻辑迁移工具的用法(第一篇,总共四篇)

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…

{“message“:“Expecting value (near 1:1)“,“status“:400}

按照网页请求数据的方式无法获取数据 {“message”:“Expecting value (near 1:1)”,“status”:400} 将content-type改为以下请求数据方式 content-type: application-json,参考:https://stackoverflow.com/questions/72333040/why-400-response-status-code-when-send-post…

组建对等网

一、概念 对等网络(Peer-to-Peer, P2P)是一种分布式网络架构,其中每个参与节点(称为"对等体"或"节点")既可以作为客户端也可以作为服务器,直接与网络中的其他节点分享资源&#xff08…

【Ubuntu20.04】Clion 配置 Libtorch + OpenCV

首先根据自己的CUDA版本安装正确对应的cuda和cudnn并进行配置。 这里安装的是cuda-11.3版本,以下基于这个版本进行安装。 1. 安装 Clion 因为Clion更容易直接编写CMakelists.txt,所以使用Clion作为IDE。 需要在File -> Setting -> CMake的CMake…

汽车电子零部件(6):DMS/OMS、CMS

前言: 有一个部件过去不曾有,而如今有可能要标准化标配化,那就是Driver Monitoring System (DMS)驾驶员监控系统、Occupant Monitoring System (OMS)乘客监控系统和Camera Monitor System(CMS)摄像头监控系统。 汽车视觉技术的创新推动先进驾驶辅助系统的变革(ADAS),并…

ssh 下连接Mysql 查看数据库数据表的内容的方法及步骤

要通过SSH连接到MySQL数据库,可以按照以下步骤进行操作: 在本地计算机上打开终端或命令提示符。 使用SSH命令连接到远程服务器。命令的格式如下: ssh usernameserver_ip其中,username是指在远程服务器上的用户名,serv…

Testng框架集成新业务

1. 向公司开发人员要setting.xml 修改 <localRepository>/Users/qa/.m2/repository</localRepository> 为自己的仓库地址 2. 如果有开发人员给的下载好的Maven仓库 可以直接解压缩用

FPGA 学习需要哪些东西?

FPGA 学习需要哪些东西&#xff1f; 三样东西&#xff1a;第一就是完整的理论&#xff0c;第二一套开发板&#xff0c;第三可练手的项目 第一&#xff0c;一套完整的课程&#xff0c; 这个课程必须是紧跟技术发展的&#xff0c;适应市场的&#xff0c;这样不至于学完后发现太…

Python从0到100(六):Python分支和循环结构的应用

分支和循环结构的重要性不言而喻&#xff0c;它是构造程序逻辑的基础。 一、程序的结构控制 单分支结构&#xff1a; 单分支结构是分支结构中最简单的一种方式&#xff0c;单分支结构只需要判断一个条件&#xff0c;根据这个条件是否成立来决定是否执行一段语句。 二分支结…