建立一个植物毒性分类器:数据准备和清理

article/2025/8/8 7:08:34

作者|Kenichi Nakanishi 编译|VK 来源|Towards Data Science

我有一个爱买植物的未婚妻,还有一只爱啃植物的猫——我想,有什么比把一个能告诉我植物是否安全的分类器更好呢!

需要注意的一点是,这里所做的所有工作都是在google colabs上完成的,使用的notebook可以在我的Github上找到:https://github.com/kenichinakanishi/houseplant_classifier


步骤1-获取数据

不幸的是,我找不到一个适合我在Kaggle上或使用Google的数据集搜索的预先制作的图像数据集。所以,我准备建立我自己的!

我决定使用ASPCA的《猫和狗的植物毒性清单》,我已经用了好几次了。这给了我们一个很好的核心工作。为了从网站上获取这些文本数据,我们可以求助于BeautifulSoup,这是一个Python库,用于从HTML和XML文件中提取数据。

from urllib.request import Request, urlopen
from bs4 import BeautifulSoupdef getHTMLContent(link):html = urlopen(link)soup = BeautifulSoup(html, 'html.parser')return soup

然而,当查看他们的网站时,该表并不是一个易于访问的html表,而是将数据存储为面板中的行。幸运的是,beauthulsoup为我们提供了一种简单的方法来搜索解析树,以找到我们想要的数据。例如:

req = Request('https://www.aspca.org/pet-care/animal-poison-control/cats-plant-list', headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req).read()# 爬取数据
soup = BeautifulSoup(webpage, 'lxml')    # 搜索解析树以从表中获得所有内容  
content_list = soup.find_all('span')[7:-4]       # 将其放入一个dataframe中进行进一步处理
df_cats = pd.DataFrame(content_list)  

在收集完原始数据后,我们需要将其分为多个列,并进行一些拆分:

# 清理字符串
df_cats[0] = df_cats[0].apply(lambda x: str(x).split('>')[1][:-3])
df_cats[4] = df_cats[4].apply(lambda x: str(x).split('>')[1][:-3])
df_cats[1] = df_cats[1].apply(lambda x: str(x).split('(')[1][0:-4])# 删除无用的列并重命名列
df_cats = df_cats.drop(columns=[2,3,5,6]).rename(columns = {0:'Name',1:'Alternative Names',4:'Scientific Name',7:'Family'})# 将有毒和无毒植物分开
df_cats['Toxic to Cats'] = True
first_nontoxic_cats = [index for index in df_cats[df_cats['Name'].str.startswith('A')].index if index>100][0]
df_cats.loc[first_nontoxic_cats:,'Toxic to Cats'] = False

然后,我们可以对特定于狗的列表重复此过程,然后合并数据帧并清理nan:

# 合并数据框架到一个,用于保留只存在于一边的值
df_catsdogs = df_dogs.merge(df_cats, how='outer', on=['Name','Alternative Names','Scientific Name','Family'])
df_catsdogs = df_catsdogs.fillna('Unknown')
aspca_df = df_catsdogs.copy()# 假设对猫和狗有相同的毒性
aspca_df['Toxic to Cats'] = aspca_df.apply(lambda x: x['Toxic to Dogs'] if (x['Toxic to Cats'] == 'Unknown') else x['Toxic to Cats'], axis=1)
aspca_df['Toxic to Dogs'] = aspca_df.apply(lambda x: x['Toxic to Cats'] if (x['Toxic to Dogs'] == 'Unknown') else x['Toxic to Dogs'], axis=1)

步骤2-浅度清理

接下来,我们可以开始进行浅度清理,包括查看数据集,决定要使用哪些关键特征,并标准化它们的格式。

我们目前有名字,替代名称,学名,家族以及毒性列,所有这些都是从用BeautifulSoup在ASPCA网站上爬来的。

由于我们将使用谷歌图像搜索收集图像,因此我们决定根据每种植物的确切学名进行搜索,以获得尽可能具体的图像。像“珍珠点”、“大象耳朵”、“蓬松褶边”和“粉红珍珠”这样的名字会很快返回我们所寻找的植物之外的结果。

我们编写了几个快速函数来应用于该系列,以尝试将数据标准化以便进一步清理。

# 确保每个学名的标点符号正确
def normalize_capitalization(x):first_word, rest = x.split()[0], x.split()[1:]first_word = [first_word.capitalize()]rest = [word.lower() for word in rest]return ' '.join(first_word+rest)# 清理那些名字不同的重复物种
def species_normalizer(word):if word.split()[-1] in ['sp','species','spp','sp.','spp.']:word = ''.join(word.split()[:-1])return word# 从名称中删除cv,因为这是一种过时的表示品种的方式
def cv_remover(word):if 'cv' in word:word = word.replace(' cv ',' ')return word# 从名称中删除var
def var_remover(word):if 'var' in word:word = word.replace(' var. ',' ')return word# 应用每个函数
aspca_df['Scientific Name'] = aspca_df['Scientific Name'].apply(normalize_capitalization)
aspca_df['Scientific Name'] = aspca_df['Scientific Name'].apply(species_normalizer)
aspca_df['Scientific Name'] = aspca_df['Scientific Name'].apply(cv_remover)
aspca_df['Scientific Name'] = aspca_df['Scientific Name'].apply(var_remover)# 删除特殊字符
aspca_df['Scientific Name'] =

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

相关文章

我在百度Python小白逆袭大神课程中“打怪”欢乐之旅

本文描述了作者在参加百度Python小白逆袭大神课程一些亲身经历,从开始的半信半疑,到最后坚定的革命信念,给没有参加过百度课程的同学一点参考,文中有高质量的数据分析、pyecharts动态图,深度学习相关代码分享&#xff…

彻底解决Chrome浏览器劫持后显示“由贵单位管理(Managed by your organization)” 的解决办法

声明: Declaration: 由于网络中的病毒virus/malware等存在随时变异或者对应多种感染方式等情况,本文所针对的处理方法仅针对本次样本负责,个人如有误操作,后果自负。如需帮助,可以关注我的公众号&#xff…

Python sklearn学习之数据预处理——非线性转换

Python sklearn学习之数据预处理——非线性转换 文章目录 Python sklearn学习之数据预处理——非线性转换1. 两种常见的非线性转换1.1 分位数转换1.2 幂变换 2. sklearn中非线性变换的实现2.1 映射到均匀分布2.1.1QuantileTransformer类 2.2 映射到高斯分布2.2.1 Yeo-Johnson t…

javaScript学习笔记【尚硅谷】

javaScript学习笔记【尚硅谷】 这是我在看尚硅谷的前端大神超哥视频时,所记录的笔记! 文章目录 javaScript学习笔记【尚硅谷】[TOC](文章目录)1、javaScript基本知识1.2、JS编写位置1.3、JS基本语法1.4、变量与字面量1.5、标识符1.6、数据类型1.6.1、Nu…

机器学习流程及详细内容(1)

一般流程:数据收集、整理→数据预处理与特征工程(数据清理、集成、规约、变换、特征提取、筛选)→模型的选择与建立→模型的评估与优化。 数据收集 既可以使用公开的数据集,也可通过爬虫、购买或者实时数据的方式自己收集。 UC…

机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总

《Brief History of Machine Learning》 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机、神经网络、决策树、SVM、Adaboost到随机森林、Deep Learning. 《Deep Learning in Neural Networks: An Overview》 介绍:这是瑞士人工智能实验室Jurg…

Flutter 学习

Flutter 学习 参照:https://book.flutterchina.club/ 参照:https://flutter.cn/docs/development/platform-integration/platform-channels?tabtype-mappings-java-tab 目前进度:https://book.flutterchina.club/chapter9/animated_widgets…

原生开发如何学习 Flutter | 谷歌社区说

Hello 大家好,我是《Flutter 开发实战详解》的作者,Github GSY 系列开源项目的负责人郭树煜,目前开源的 gsy_github_app_flutter 以 13k 的 star 在中文总榜的 dart 排行上暂处第一名。 数据来源: https://github.com/GrowingGit/…

【CVRP】基于matlab遗传算法求解带容量的车辆路径规划问题【含Matlab源码 162期】

⛄一、VRP简介 车辆路径问题(VRP)最早是由 Dantzig 和 Ramser 于1959年首次提出,它是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行…

matlab解决LRP类型的多配送中心路径优化问题

** 问题描述 ** 有关多配送中心的选址-路径优化问题,一般是通过基于区域内的客户需要求,对配送中心进行合理的选址以及配送中心的车辆调度以及路径优化。在给出的配送中心候选点位置已知,需要在给出的这些位置中,通过与顾客需求…

<代码分享> 一种无人机配合卡车配送的车辆路径规划模型

本文为本人博客《一种无人机配合卡车配送的车辆路径规划模型》的代码分享。 由于近期此文的关注者较多,代码分享较为不便,因此决定专门写一篇博客以提供源码。 感谢各位博友关注,本人能力有限,如有错误,还请及时批评指…

(附源码)springboot车辆管理系统 毕业设计031034

车辆管理系统的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中&…

QT+SQL Server实现车辆管理系统 -代码具体实现

QTSQL Server 实现车辆管理系统 -代码具体实现 1.摘要2.整体框架3.具体代码实现3.1 连接数据库3.2 登录操作3.3 申请账户3.4 添加车辆信息3.5 查询车辆信息3.6删除车辆信息3.7修改车辆信息3.8 添加司机信息 4.总结5.资源下载链接 1.摘要 前面一篇文章简要介绍了车辆管理系统的…

如何使用低代码进行车队管理?

处理任何业务都具有挑战性,但车队管理无疑是所有业务中的佼佼者。无论是司机短缺、环境问题、国际法规还是行业不稳定,车队经理都必须面对这一切。除此之外,还有数字化和路线优化的概念。数字化转型车队管理业务意味着消除挑战,拥…

车辆自然驾驶轨迹数据集/交通流数据介绍

文章目录 NGSIMNGSIM 概览快速路车道选择算法Interstate 80 Freeway 数据集Lankershim Boulevard 数据集US highway101数据集动态交通分配DTACORSIM Argoverse Motion Forecasting DatasetAIMSUNHighDITS DataHub 美国智能交通数据库Data.govPeMSPortland Oregon Region data英…

3D车辆检测AP评价指标代码的理解

课题研究的是单目3D车辆的识别,采用的目标检测网络是SMOKE,为了可以更好的定量评测训练模型的性能,需要使用到合理的评测指标,目前比较流行的评测指标是得到多组precision和recall值画出PR曲线,然后计算PR曲线下的面积…

根据车辆型号自动生成车辆编号

开发工具与关键技术:Visual Studio 2015 linq 正则 作者:孙水兵 撰写时间:2019年6月26一、 功能 根据不同的类型的车辆型号,生成以车辆型号开头的车辆编号。 二、 达到的效果 用户选择了车辆型号之后,将对应的车辆编…

【路径规划】基于遗传算法求解多车多类型车辆的车辆路径优化问题附matlab代码

1 内容介绍 多车辆多路线的交通路线优化涉及到排序问题,是一个N-P难题,高效精确的算法存在的可能性不大.提出了基于遗传算法的求解方法,给出了实例来证明如何利用遗传算法解决多车辆多路线的优化问题.结果证明,一般情况下利用遗传算法对于多车辆多路线的行车路线优化能得到一组…

机动车登记信息代码

原链接:机动车登记信息代 搜索结果本栏目用于收集和整理行业相关标准,如机械行业,化工行业等。http://www.gb99.cn/e/search/result/?searchid76243针对其中第七项车辆信息牌照代码如下:

利用低代码平台进行车辆管理,为交通行业添砖加瓦

概要:本文介绍了交通行业车辆管理的重要性,并详细阐述了基于低代码平台设计的车辆管理系统的优势。通过快速开发、易于维护、增加灵活性、提高数据可靠性、降低成本以及实时监控等多个方面,这种车辆管理系统可以帮助企业提高效率和降低成本&a…