树叶分类

通过叶子认出植物名称

Link:https://www.kaggle.com/c/leaf-classification/

题目描述

据估计,地球上存在近五十万种植物。物种分类作为存留已久的挑战,依旧面临着重复标识等问题。

而这其中,植物自动识别又具有广泛的应用场景,比如:

  • 物种种群的探寻和保护
  • 基于植物的医药研究
  • 作物供应管理

本项目希望利用植物叶片的黑白图像,对99种植物进行分类。相关特征包括形状,边缘和纹理等。植物的叶片,由于其丰富性、普遍性等,可以有效地判别出物种。这个项目也很适合作为图像识别处理的入门项目。

小提示

术语解释

  • K临近算法(KNN):K临近算法是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
  • 支持向量机(SVM):SVM是Support Vector Machines(支持向量机)的缩写,是一种判别方法。在机器学习领域,支持向量机是一个监督学习模型,通常用来进行模式识别和分类
  • 决策树(Decision Tree):是一种十分常用的机器学习方法。在机器学习领域,决策树是一个监督学习模型,他代表的是对象属性与对象值之间的一种映射关系,通常用来进行分类以及回归分析
  • 随机森林(Random Forest):指的是利用多棵树对样本进行训练并预测的一种分类器。在机器学习领域,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定
  • Adaboost:是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。

输入格式

图片集当中包含990张叶片图片,其中共99个物种,每个物种有10个样本。图片被转化为jpg格式的黑白二值图片,叶片区域用白色表示,背景则为黑色。

图片集分为训练图片集和测试图片集,训练图片集中包含850张图片,测试图片集中包含140张图片。

此外我们还提供了三类特征:连续形状描述符(shape),叶片纹理直方图(texture),叶片边缘直方图(margin)。每类特征由一个长度为64的矢量表示。

特征数据分别保存在train.csv及test.csv当中,其中train.csv共有850条记录,包含以下字段:

  • 叶片id(id):叶片id与相应图片名称对应。
  • 叶片物种(species):即我们需要预测的值。
  • 叶片边缘直方图1至64(margin1~margin64)
  • 叶片纹理直方图1至64(texture1~texture64)
  • 连续形状描述符1至64(shape1~shape64)

测试数据集test.csv包含140条记录,其中不包括叶片物种(species)这一字段。

输出格式

提交的csv文件应采用以下格式:每行数据id代表对应的测试图片名称,每列代表一个物种,每个数据单元里的值表示预测得到该图片成为这一物种的概率,概率的取值范围为0~1,值越大代表是这一物种的可能性越大。具体如下所示:

id,Acer_Capillipes,Acer_Circinatum,Acer_Mono,...
851,0.1,0.5,0,0.2,...
852,0,0.3,0,0.4,...
853,0,0,0,0.7,...
etc.

评价

使用multi-class logarithmic loss作为最后评判标准,公式如下:

$$ logloss=-\frac{1}{N}\sum{i=1}^{N}\sum{j=1}^{M}y{ij}log(p{ij})

$$ 其中N是测试集中的图片数量,M是物种的个数,当i图片在j物种当中,则$$y{ij}$$为1,否则为0,$$p{ij}$$则为预测到的图片i属于物种j的概率值

代码与数据

测评配置环境

python

pip install -U scikit-learn
pip install -U numpy
pip install -U pandas

测评代码

import numpy as np
import pandas as pd
from sklearn.metrics import log_loss

test = pd.read_csv("./correct_submission.csv").sort_values('id')
pred = pd.read_csv("./prediction.csv").sort_values('id')

test.drop('id', axis=1, inplace=True)
pred.drop('id', axis=1, inplace=True)

pred = pred.div(pred.sum(axis = 1), axis = 0) # 保证每行概率和为1
loss = log_loss(test, pred)
# loss越小越好,最小为0,一般不会超过40,几乎不会超过100,除非故意调戏log_loss。

results matching ""

    No results matching ""