专栏首页相约机器人构建没有数据集的辣辣椒分类器,准确性达到96%

构建没有数据集的辣辣椒分类器,准确性达到96%

作者 | Michelangiolo Mazzeschi

来源 | Medium

编辑 | 代码医生团队

在没有数据集的情况下使用分类模型。Github存储库中提供了完整的代码。

https://github.com/arditoibryan/Projects/upload

在本文中,我将创建一个能够通过测量和颜色识别辣辣椒的AI。因为将无法在线找到任何关于辣胡椒测量的数据集,所以将使用统计方法自行生成该数据集。

处理:

  1. 查找可用数据
  2. 进行测量
  3. 从分布创建数据集
  4. 创建模型
  5. 绩效评估

1.查找可用数据

如前所述,不太可能找到要构建的所有内容的数据集。想构建一个辣味分类器,如果没有任何数据开始,这将是一项艰巨的任务。在互联网上唯一能找到的是一张不同麻辣胡椒的比较表(希望是相同的比例)。

将需要将此数据转换为数字数据。所能做的就是对这些图像进行测量,并将它们作为特征放置在数据集中。

2.进行测量

为了进行测量,可以使用像素。在了解了像素到厘米的转换率之后,可以测量每个香辛椒的大小(以像素为单位),并将其转换为现实世界的比例。

这是最终表,其中所有度量(名称,高度,宽度和颜色)均已转换为特征。

#   measurements
pepper_measurements_px = [
                          ['Anaheim', 262, 63, 'Green'],
                          ['Cubanelle', 222, 70, 'Green'],
                          ['Cayenne', 249, 22, 'Red'],
                          ['Shishito', 140, 21, 'Green'],
                          ['Hungarian Wax', 148, 63, 'Orange'],
['Jimmy Nardello', 190, 23, 'Red'],
                          ['Fresno', 120, 43, 'Red'],
                          ['Jalapeno', 106, 40, 'Dark Green'],
                          ['Aji Amarillo', 92, 13, 'Yellow'],
                          ['Aji Dulce', 81, 30, 'Red'],
['Serrano', 74, 14, 'Dark Green'],
                          ['Padron', 62, 38, 'Dark Green'],
                          ['Scotch Bonnet', 37, 42, 'Yellow'],
                          ['Habanero', 67, 21, 'Orange'],
                          ['Cumari', 18, 11, 'Yellow'],
]

现在,将生成一个100.000个辛辣辣椒样本的数据集。

3.从分布创建数据集

在开始创建分布之前,首先需要将像素转换为厘米。然后对于长度和宽度,将需要使用此数据作为均值的两个单独的正态分布。对于标准差,将使用平均值的10%(这样就不必在Google上搜索每个辛辣胡椒的详细信息)。

创建功能

正在创建一组函数,将允许创建n个数据集,并输入大小。将用100,000个样本制作辣胡椒。

#simulated probability distribution of one stock
from scipy.stats import skewnorm
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
def create_peppers(sd, mean, alfa, size):
  #invertire il segno di alfa
  x = skewnorm.rvs(-alfa, size=size)
  def calc(k, sd, mean):
    return (k*sd)+mean
  x = calc(x, sd, mean) #standard distribution
#graph the distribution
  #pd.DataFrame(x).hist(bins=100)
#pick one random number from the distribution
  #formally I would use cdf, but I just have to pick randomly from the 1000000 samples
  df = [np.random.choice(x) for k in range(size)]
  #return the DataFrame
  return pd.DataFrame(df)
def cm_converter(px_measurements):
  pc_cm = 0.05725
  for _ in range(len(px_measurements)):
    px_measurements[_][1] *= pc_cm
    px_measurements[_][2] *= pc_cm
  return px_measurements

创建数据集

现在准备创建数据集。可以指定使用平均值的10%作为标准偏差(可以很容易地从height_sd和widht_sd进行更改):

#   create converted list
pepper_measurements_cm = cm_converter(pepper_measurements_px)
#   create final datasets
heigh_sd = 0.1
width_sd = 0.1
df = pd.DataFrame()
for _ in pepper_measurements_cm:
  #   create height
  #SD is 10% of the height
  df_height = create_peppers(_[1]*heigh_sd, _[1], 0, 100000)
  #   create width
  #SD is 10% of the width
  df_width = create_peppers(_[2]*width_sd, _[2], 0, 100000)
  #create DataFrame
  df_single = pd.concat([df_height, df_width], axis=1)
  df_single.columns = ['height', 'width']
  #create name
  df_single['name'] = str(_[0])
  df_single['color'] = str(_[3])
df = pd.concat([df, df_single], axis=0)
df

单个生成特征的正态分布

这是最终结果:合并后,数据集计数了150万个样本:

最终数据集

如果在不同的直方图中绘制高度和宽度:

分开的直方图中的高度和宽度

4.创建模型

将使用的模型是朴素贝叶斯分类器。而不是许多其他模型,该模型专用于以下数据:

  • 是独立的
  • 服从正态分布

因为是按照这些前提建立数据集的,所以该分类器非常适合我要构建的内容。

预处理

唯一要做的预处理步骤是使用one_hot编码算法对颜色进行编码:

#backup
X = df.copy()
def one_hot(df, partitions):
  #togliamo le colonne da X
  for col in partitions:
    k = df.pop(col)
    k = pd.get_dummies(k, prefix=col)
    df = pd.concat([df, k] , axis=1)
  return df
X = one_hot(X, ['color'])
X

选择功能和标签

y = X.pop('name')
y

标签

X

one_hot编码后的功能

分割

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

现在将随机分割特征和标签,比率为80:20就足够了。

训练模型

from sklearn.naive_bayes import GaussianNB
clf = GaussianNB()
clf.fit(X_train, y_train)

该模型已经过训练:

GaussianNB(priors=None, var_smoothing=1e-09)

5.绩效评估

训练完模型后,将在AI在训练过程中从未见过的数据集部分进行测试:

clf.score(X_test, y_test, sample_weight=None)
0.9659133333333333

该模型达到了出色的96%精度!

本文分享自微信公众号 - 相约机器人(xiangyuejiqiren),作者:代码医生

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python和Plotly实用统计与可视化

    上周的一天,在谷歌上搜索“ Python的统计数据 ”,结果有些没有用。大多数文献,教程和文章都侧重于使用R进行统计,因为R是一种专门用于统计的语言,并且具有比...

    代码医生工作室
  • 从小白到大师,这里有一份Pandas入门指南

    在阅读本文时,我建议你阅读每个你不了解的函数的文档字符串(docstrings)。简单的 Google 搜索和几秒钟 Pandas 文档的阅读,都会使你的阅读体...

    代码医生工作室
  • 发展中地区的气候变化与粮食短缺:Python分析

    今天讨论的最重要的环境问题之一是全球变暖。这是由于气候变暖对农作物产量,天气模式,海平面,野火事件和生态系统的影响。自1850年代开始保存记录以来,全球温度的上...

    代码医生工作室
  • 美国确诊超100万!教你用Python画出全球疫情动态图

    【导语】:今天我们教你用Python绘制全球疫情动态图,技术部分请看第二部分。公众号后台,回复关键字“全球疫情”获取完整数据。

    CDA数据分析师
  • 数据分析索引总结(上)Pandas单级索引

    寄语:本文对单级索引中的loc、iloc、[]三种方法进行了详细的阐述。同时,对布尔索引,快速标量索引方式、区间索引方式做了详细介绍。

    Datawhale
  • 快乐学习Pandas入门篇:Pandas基础

    寄语:本文对Pandas基础内容进行了梳理,从文件读取与写入、Series及DataFrame基本数据结构、常用基本函数及排序四个模块快速入门。同时,文末给出了...

    Datawhale
  • 【技巧】11 个 Python Pandas 小技巧让你更高效

    Pandas是一个在Python中广泛应用的数据分析包。市面上有很多关于Pandas的经典教程,但本文介绍几个隐藏的炫酷小技巧,我相信这些会对你有所帮助。

    昱良
  • 10招!看骨灰级Pythoner如何玩转Python

    pandas是基于numpy构建的,使数据分析工作变得更快更简单的高级数据结构和操作工具。本文为大家带来10个玩转Python的小技巧,学会了分分钟通关变大神!

    昱良
  • 妈妈再也不用担心我忘记pandas操作了

    pandas的操作上千种,但对于数据分析的使用掌握常用的操作就可以应付了,更多的操作可以参考pandas官网。

    用户2769421
  • 10个高效的pandas技巧

    原题 | 10 Python Pandas tricks that make your work more efficient

    材ccc

扫码关注云+社区

领取腾讯云代金券