解决几乎任何机器学习问题 -- 学习笔记(组织机器学习项目)

书籍名:Approaching (Almost) Any Machine Learning Problem-解决几乎任何机器学习问题
此专栏记录学习过程,内容包含对这本书的翻译和理解过程

我们首先来看看文件的结构。对于你正在做的任何项目,都要创建一个新文件夹。在本例中,我
将项目命名为 “project” 。

项目文件夹内部应该如下所示。

  • input
    • train.csv
    • test.csv
  • src
    • create_folds.py
    • train.py
    • inference.py
    • models.py
    • config.py
    • model_dispatcher.py
  • models
    • model_rf.bin
    • model_et.bin
  • notebooks
    • exploration.ipynb
    • check_data.ipynb
  • README.md
  • LICENSE

让我们来看看这些文件夹和文件的内容。

**input/ **该文件夹包含机器学习项目的所有输入文件和数据。如果您正在开发 NLP 项目,您可以将 embeddings 放在这里。如果是图像项目,所有图像都放在该文件夹下的子文件夹中。
**scr/**我们将在这里保存与项目相关的所有 python 脚本。如果我说的是一个 python 脚本,即任何 *.py 文件,它都存储在 src 文件夹中。
** models/ **该文件夹保存所有训练过的模型。
**notebook/ **所有 jupyter notebook (即任何 *.ipynb 文件)都存储在笔记本 文件夹中。
**README.md **这是一个标记符文件,您可以在其中描述您的项目,并写明如何训练模型或在生产环境中使用。
**LICENSE **这是一个简单的文本文件,包含项目的许可证,如 MIT 、 Apache 等。关于许可证的详细介绍超出了本书的范围。

假设你正在建立一个模型来对 MNIST 数据集(几乎每本机器学习书籍都会用到的数据集)进行分类。如果你还记得,我们在交叉检验一章中也提到过 MNIST 数据集。网上有许多不同格式的 MNIST 数据集,但我们将使用 CSV 格式的数据集。

在这种格式的数据集中, CSV 的每一行都包含图像的标签和 784 个像素值,像素值范围从 0 到255 。数据集包含 60000 张这种格式的图像。

我们可以使用 pandas 轻松读取这种数据格式。

请注意,尽管图 1 显示所有像素值均为零,但事实并非如此。

在这里插入图片描述
图 1 : CSV 格式的 MNIST 数据集
在这里插入图片描述
我们不需要对这个数据集进行更多的探索。我们已经知道了我们所拥有的数据,没有必要再对不同的像素值进行绘图。从图 2 中可以清楚地看出,标签的分布相当均匀。因此,我们可以使用准确率 /F1 作为衡量标准。这就是处理机器学习问题的第一步:确定衡量标准!

现在,我们可以编写一些代码了。我们需要创建 src/ 文件夹和一些 python 脚本。

请注意,训练 CSV 文件位于 input/ 文件夹中,名为 mnist_train.csv 。

首先要创建的脚本是 create_folds.py 。

这将在 input/ 文件夹中创建一个名为 mnist_train_folds.csv 的新文件,与 mnist_train.csv 相同。唯一不同的是,这个 CSV 文件经过了随机排序,并新增了一列名为 kfold 的内容。一旦我们决定了要使用哪种评估指标并创建了折叠,就可以开始创建基本模型了。这可以在train.py 中完成。

import joblib
import pandas as pd
from sklearn import metrics
from sklearn import tree
def run(fold):# 读取数据文件df = pd.read_csv("../input/mnist_train_folds.csv")# 选取df中kfold列不等于folddf_train = df[df.kfold != fold].reset_index(drop=True)# 选取df中kfold列等于folddf_valid = df[df.kfold == fold].reset_index(drop=True)# 训练集输入,删除label列x_train = df_train.drop("label", axis=1).values# 训练集输出,取label列y_train = df_train.label.values# 验证集输入,删除label列x_valid = df_valid.drop("label", axis=1).values# 验证集输出,取label列y_valid = df_valid.label.values# 实例化决策树模型clf = tree.DecisionTreeClassifier()# 使用训练集训练模型clf.fit(x_train, y_train)# 使用验证集输入得到预测结果preds = clf.predict(x_valid)# 计算验证集准确率accuracy = metrics.accuracy_score(y_valid, preds)# 打印fold信息和准确率print(f"Fold={fold}, Accuracy={accuracy}")# 保存模型joblib.dump(clf, f"../models/dt_{fold}.bin")
if __name__ == "__main__":# 运行每个折叠run(fold=0)run(fold=1)run(fold=2)run(fold=3)run(fold=4)

您可以在控制台调用 python train.py 运行该脚本。

❯ python train.pyFold=0, Accuracy=0.8680833333333333Fold=1, Accuracy=0.8685Fold=2, Accuracy=0.8674166666666666Fold=3, Accuracy=0.8703333333333333Fold=4, Accuracy=0.8699166666666667

查看训练脚本时,您会发现还有一些内容是硬编码的,例如折叠数、训练文件和输出文件夹。

因此,我们可以创建一个包含所有这些信息的配置文件: config.py 。

TRAINING_FILE = "../input/mnist_train_folds.csv"
MODEL_OUTPUT = "../models/"

我们还对训练脚本进行了一些修改。训练文件现在使用配置文件。这样,更改数据或模型输出就更容易了。

import os
import config
import joblib
import pandas as pd
from sklearn import metrics
from sklearn import tree
def run(fold):# 使用config中的路径读取数据df = pd.read_csv(config.TRAINING_FILE)df_train = df[df.kfold != fold].reset_index(drop=True)df_valid = df[df.kfold == fold].reset_index(drop=True)x_train = df_train.drop("label", axis=1).valuesy_train = df_train.label.valuesx_valid = df_valid.drop("label", axis=1).valuesy_valid = df_valid.label.valuesclf = tree.DecisionTreeClassifier()clf.fit(x_train, y_train)preds = clf.predict(x_valid)accuracy = metrics.accuracy_score(y_valid, preds)print(f"Fold={fold}, Accuracy={accuracy}")joblib.dump(clf,os.path.join(config.MODEL_OUTPUT, f"dt_{fold}.bin") )
if __name__ == "__main__":# 运行每个折叠run(fold=0)run(fold=1)run(fold=2)run(fold=3)run(fold=4)

请注意,我并没有展示这个培训脚本与之前脚本的区别。请仔细阅读这两个脚本,自己找出不同之处。区别并不多。

与训练脚本相关的还有一点可以改进。正如你所看到的,我们为每个折叠多次调用运行函数。有时,在同一个脚本中运行多个折叠并不可取,因为内存消耗可能会不断增加,程序可能会崩溃。为了解决这个问题,我们可以向训练脚本传递参数。我喜欢使用 argparse 。

import argparse
if __name__ == "__main__":# 实例化参数环境parser = argparse.ArgumentParser()# fold参数parser.add_argument( "--fold", type=int)# 读取参数args = parser.parse_args()run(fold=args.fold)

现在,我们可以再次运行 python 脚本,但仅限于给定的折叠。

❯ python train.py --fold 0Fold=0, Accuracy=0.8656666666666667

仔细观察,我们的第 0 折得分与之前有些不同。这是因为模型中存在随机性。我们将在后面的章节中讨论如何处理随机性。

现在,如果你愿意,可以创建一个 shell 脚本,针对不同的折叠使用不同的命令,然后一起运行,如下图所示。

python train.py --fold 0
python train.py --fold 1
python train.py --fold 2
python train.py --fold 3
python train.py --fold 4

您可以通过以下命令运行它。

❯ sh run.sh
Fold=0, Accuracy=0.8675
Fold=1, Accuracy=0.8693333333333333
Fold=2, Accuracy=0.8683333333333333
Fold=3, Accuracy=0.8704166666666666
Fold=4, Accuracy=0.8685

我们现在已经取得了一些进展,但如果我们看一下我们的训练脚本,我们仍然受到一些东西的限制,例如模型。模型是硬编码在训练脚本中的,只有修改脚本才能改变它。因此,我们将创建一个新的 python 脚本,名为 model_dispatcher.py 。model_dispatcher.py ,顾名思义,将调度我们的模型到训练脚本中。

from sklearn import tree
models = {# 以gini系数度量的决策树"decision_tree_gini": tree.DecisionTreeClassifier(criterion="gini"),# 以entropy系数度量的决策树"decision_tree_entropy": tree.DecisionTreeClassifier(criterion="entropy"),
}

model_dispatcher.py从 scikit-learn 中导入了 tree ,并定义了一个字典,其中键是模型的名称,值是模型本身。在这里,我们定义了两种不同的决策树,一种使用基尼标准,另一种使用熵标准。要使用 py ,我们需要对训练脚本做一些修改。

import argparse
import os
import joblib
import pandas as pd
from sklearn import metrics
import config
import model_dispatcher
def run(fold, model):df = pd.read_csv(config.TRAINING_FILE)df_train = df[df.kfold != fold].reset_index(drop=True)df_valid = df[df.kfold == fold].reset_index(drop=True)x_train = df_train.drop("label", axis=1).valuesy_train = df_train.label.valuesx_valid = df_valid.drop("label", axis=1).valuesy_valid = df_valid.label.values# 根据model参数选择模型clf = model_dispatcher.models[model]clf.fit(x_train, y_train)preds = clf.predict(x_valid)accuracy = metrics.accuracy_score(y_valid, preds)print(f"Fold={fold}, Accuracy={accuracy}")joblib.dump( clf,os.path.join(config.MODEL_OUTPUT, f"dt_{fold}.bin"))if __name__ == "__main__":parser = argparse.ArgumentParser()# fold参数parser.add_argument("--fold", type=int)# model参数parser.add_argument("--model", type=str)args = parser.parse_args()run(fold=args.fold, model=args.model)

train.py有几处重大改动:

  • 导入 model_dispatcher
  • 为 ArgumentParser 添加 --model 参数
  • 为 run() 函数添加 model 参数
  • 使用调度程序获取指定名称的模型

现在,我们可以使用以下命令运行脚本:

❯ python train.py --fold 0 --model decision_tree_gini
Fold=0, Accuracy=0.8665833333333334

或执行以下命令

❯ python train.py --fold 0 --model decision_tree_entropy
Fold=0, Accuracy=0.8705833333333334

现在,如果要添加新模型,只需修改 model_dispatcher.py 。让我们尝试添加随机森林,看看准
确率会有什么变化。

from sklearn import ensemble
from sklearn import tree
models = {"decision_tree_gini": tree.DecisionTreeClassifier(criterion="gini"),"decision_tree_entropy": tree.DecisionTreeClassifier(criterion="entropy"),# 随机森林模型"rf": ensemble.RandomForestClassifier(),
}

让我们运行这段代码。

❯ python train.py --fold 0 --model rf
Fold=0, Accuracy=0.9670833333333333

一个简单的改动就能让分数有如此大的提升!现在,让我们使用 run.sh 脚本运行 5 个折叠!

python train.py --fold 0 --model rf
python train.py --fold 1 --model rf
python train.py --fold 2 --model rf
python train.py --fold 3 --model rf
python train.py --fold 4 --model rf

得分情况如下

❯ sh run.sh
Fold=0, Accuracy=0.9674166666666667
Fold=1, Accuracy=0.9698333333333333
Fold=2, Accuracy=0.96575
Fold=3, Accuracy=0.9684166666666667
Fold=4, Accuracy=0.9666666666666667

示如何为你正在做的或计划在不久的将来做的几乎所有机器学习项目编写一个基本框架。有许多不同的方法可以改进这个 MNIST 模型和这个框架,我们将在以后的章节中看到。

我使用了一些脚本,如 model_dispatcher.py 和 config.py ,并将它们导入到我的训练脚本中。请注意,我没有导入 * ,你也不应该导入。如果我导入了 * ,你就永远不会知道模型字典是从哪里来的。编写优秀、易懂的代码是一个人必须具备的基本素质,但许多数据科学家却忽视了这一点。如果你所做的项目能让其他人理解并使用,而无需咨询你的意见,那么你就节省了他们的时间和自己的时间,可以将这些时间投入到改进你的项目或开发新项目中去。

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

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

相关文章

笔记:内网渗透流程之信息收集

信息收集 首先,收集目标内网的信息,包括子网结构、域名信息、IP地址范围、开放的端口和服务等。这包括通过主动扫描和渗透测试工具收集信息,以及利用公开的信息源进行信息搜集。 本机信息收集 查看系统配置信息 查看系统详细信息&#xf…

电子桌牌如何赋能数字化会务?以深圳程序员节为例。

10月24日,由深圳市人民政府指导,深圳市工业和信息化局、龙华区人民政府、国家工业信息安全发展研究中心、中国软件行业协会联合主办的2023深圳中国1024程序员节开幕式暨主论坛活动在深圳龙华区启幕。以“领航鹏城发展,码动程序世界”为主题&a…

模拟退火算法应用——求解函数的最小值

仅作自己学习使用 一、问题 需求: 计算函数 的极小值,其中个体x的维数n10,即x(x1,x2,…,x10),其中每一个分量xi均需在[-20,20]内。因此可以知道,这个函数只有一个极小值点x (0,0,…,0),且其极小值是0&…

医保线上购药系统:引领医疗新潮流

在科技的驱动下,医疗健康服务正经历一场数字化的革新。医保线上购药系统,不仅是一种医疗服务的新选择,更是技术代码为我们的健康管理带来的全新可能。本文将通过一些简单的技术代码示例,深入解析医保线上购药系统的工作原理和优势…

MySQL数据库主从集群搭建

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解(如有不正确的地方欢迎各位小伙伴在评论区提意见,博主会及时修改) MySQL数据库主从集群搭建 主从复制,是用来建立一个和主数据库完全一样的数据库环境&#xff0c…

短视频获客系统成功分享,与其开发流程与涉及到的技术

先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 一、短视频获客系统的开发流程 1. 需求分析:首先需要对目标用户进行深入了解,明确系统的功能和目标,制定详细的需求文档。 2. 系统设计&#…

关于vs code Debug调试时候出现“找不到任务C/C++: g++.exe build active file” 解决方法

vs code Debug调试时候出现“找不到任务C/C: g.exe build active file” ,出现报错,Debug失败 后来经过摸索和上网查找资料解决问题 方法如下 在Vs code的操作页面左侧有几个配置文件 红框里的是需要将要修改的文件 查看tasks.json和launch.json框选&…

Android Frameworks 开发总结之七

1.修改android 系统/system/下面文件时权限不够问题 下面提到的方式目前在Bobcat的userdebug image上测试可行,还没有在user上测试过. 修改前: leifleif:~$ adb root restarting adbd as root leifleif:~$ adb disable-verity verity is already disabled using …

Find My鼠标|苹果Find My技术与鼠标结合,智能防丢,全球定位

随着折叠屏、多屏幕、OLED 等新兴技术在个人计算机上的应用,产品更新换代大大加速,进一步推动了个人计算机需求的增长。根据 IDC 统计,2021 年全球 PC 市场出货量达到 3.49 亿台,同比增长 14.80%,随着个人计算机市场发…

亚马逊云科技re:Invent大会:云计算与生成式AI共筑科技新局面,携手构建未来

随着科技的飞速发展,云计算和生成式 AI 已经成为了推动科技进步的重要力量。这两者相互结合,正在为我们创造一个全新的科技局面。 亚马逊云科技的re:Invent大会再次证明了云计算和生成式AI的强大结合正在塑造科技的新未来。这次大会聚焦了云计算的前沿技…

为什么要隐藏id地址?使用IP代理技术可以实现吗?

随着网络技术的不断发展,越来越多的人开始意识到保护个人隐私的重要性。其中,隐藏自己的IP地址已经成为了一种常见的保护措施。那么,为什么要隐藏IP地址?使用IP代理技术可以实现吗?下面就一起来探讨这些问题。 首先&am…

Qt 软件调试(二)使用dump捕获崩溃信息

Qt应用程序异常崩溃该怎么办&#xff0c;生成dump文件再回溯分析&#xff0c;可以快速且准确的帮助我们定位到崩溃的点。那么&#xff0c;本章我们分享下如何在Qt中生成dump文件。 一、使用minudump捕获崩溃信息 #include <QCoreApplication> #include <QDir> #i…

【洛谷 P1636】Einstein学画画 题解(图论+欧拉通路)

Einstein学画画 题目描述 Einstein 学起了画画。 此人比较懒~~&#xff0c;他希望用最少的笔画画出一张画…… 给定一个无向图&#xff0c;包含 n n n 个顶点&#xff08;编号 1 ∼ n 1 \sim n 1∼n&#xff09;&#xff0c; m m m 条边&#xff0c;求最少用多少笔可以画…

nodejs微信小程序+python+PHP-书吧租阅管理系统的设计与实现-安卓-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

深度学习+不良身体姿势检测+警报系统+代码+部署(姿态识别矫正系统)

正确的身体姿势是一个人整体健康的关键。然而&#xff0c;保持正确的身体姿势可能很困难&#xff0c;因为我们经常忘记这一点。这篇博文将引导您完成为此构建解决方案所需的步骤。最近&#xff0c;我们在使用 POSE 进行身体姿势检测方面玩得很开心。它就像一个魅力&#xff01;…

Ubuntu20安装ssh服务

Ubuntu20上执行如下命令查看是否存在ssh服务 #ps -e | grep ssh 只有ssh-agent&#xff0c;没有sshd; 因此要安装openssh-server. 搜索openssh-server,得到下载链接&#xff1a; openssh-server 复制这个Binary Package链接即可下载&#xff0c;然后使用如下命令安装 sudo…

PyQt6库和工具库QTDesigner安装与配置

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计12条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

【knife4j-spring-boot】Springboot + knife4j-spring-boot 整合swagger脚手架

swagger-boostrap-ui从1.x版本到如今2.x&#xff0c;同时也更改名字Knife4j 在此记录下 knife4j-spring-boot-starter 的整合。 只需要引入knife4j-spring-boot-starter&#xff0c;无需引入其他的swagger包&#xff0c;knife4j-spring-boot-starter已经包含。 官方版本说明…

详细解答T-SNE程序中from sklearn.manifold import TSNE的数据设置,包括输入数据,绘制颜色的参数设置,代码复制可用!!

文章目录 前言——TSNE是t-Distributed Stochastic Neighbor Embedding的缩写1、可运行的T-SNE程序2. 实验结果3、针对上述程序我们详细分析T-SNE的使用方法3.1 加载数据3.2 TSNE降维3.3 绘制点3.4 关于颜色设置&#xff0c;颜色使用的标签数据的说明cy 总结 前言——TSNE是t-D…

Centos Download

前言 CentOS Linux 是一个社区支持的发行版&#xff0c;源自 CentOS git for Red Hat Enterprise Linux &#xff08;RHEL&#xff09; 上免费提供给公众的源代码。因此&#xff0c;CentOS Linux 的目标是在功能上与 RHEL 兼容。CentOS 计划主要更改组件以删除上游供应商的品牌…