01 手工就近原则实现一个简单的鸢尾花分类器

基础知识
问题描述

任务描述
数据集
思路

人工智能数据源下载地址,下载压缩包后解压即可.
小脚本下载地址

原理

数据集分开,一部分用来训练集合,一部分作为测试集合,测试集合里面每一条用来与训练集合中的元素比对,就近标类。

代码

import pandas as pd
import ai_utils
from sklearn.model_selection import train_test_split
from scipy.spatial.distance import euclidean
import numpy as np

#读取文件
data_file = '/Users/miraco/PycharmProjects/ai/data_ai/Iris.csv'

#种类
species = ['Iris-setosa',
           'Iris-versicolor',
           'Iris-virginica'
           ]
#特征
feat_cols = ['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm']

def get_pred_label(test_sample_feat, train_data):
    #近朱者赤,,找最近距离的样本,取其标签作为预测样本的标签
    dis_list = []
    for idx, row in train_data.iterrows():
        #训练样本特征
        train_sample_feat = row[feat_cols].values
        #计算当前条目和样本集合之间的距离
        dis = euclidean(test_sample_feat, train_sample_feat)
        dis_list.append(dis)

    #最小距离对应的位置
    pos = np.argmin(dis_list)
    #离谁最近就算成谁
    pred_label = train_data.iloc[pos]['Species']
    return pred_label


#读取数据

iris_data = pd.read_csv(data_file, index_col = 'Id')

#eda

ai_utils.do_eda_plot_for_iris(iris_data)

# 划分数据集
#三分之一作为训练集
train_data, test_data = train_test_split(iris_data, test_size= 1/3 , random_state= 10)

# 预测对的个数
acc_count = 0

# 分类器

for idx,row in test_data.iterrows():
    # 测试样本特征
    test_sample_feat = row[feat_cols].values

    # 预测值
    pred_label = get_pred_label(test_sample_feat, train_data)

    # 真实值
    true_label = row['Species']
    print(f'样本{idx}的真实标签是{true_label},预测标签是{pred_label}')
    if true_label == pred_label:
        acc_count += 1


# 准确率
accuracy  = acc_count / test_data.shape[0]
print('预测准确率{:2f}%'.format(accuracy*100))

运行结果

样本88的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本112的真实标签是Iris-virginica,预测标签是Iris-virginica
样本11的真实标签是Iris-setosa,预测标签是Iris-setosa
样本92的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本50的真实标签是Iris-setosa,预测标签是Iris-setosa
样本61的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本73的真实标签是Iris-versicolor,预测标签是Iris-virginica
样本68的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本40的真实标签是Iris-setosa,预测标签是Iris-setosa
样本56的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本67的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本143的真实标签是Iris-virginica,预测标签是Iris-virginica
样本54的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本2的真实标签是Iris-setosa,预测标签是Iris-setosa
样本20的真实标签是Iris-setosa,预测标签是Iris-setosa
样本113的真实标签是Iris-virginica,预测标签是Iris-virginica
样本86的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本39的真实标签是Iris-setosa,预测标签是Iris-setosa
样本22的真实标签是Iris-setosa,预测标签是Iris-setosa
样本36的真实标签是Iris-setosa,预测标签是Iris-setosa
样本103的真实标签是Iris-virginica,预测标签是Iris-virginica
样本133的真实标签是Iris-virginica,预测标签是Iris-virginica
样本127的真实标签是Iris-virginica,预测标签是Iris-virginica
样本25的真实标签是Iris-setosa,预测标签是Iris-setosa
样本62的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本3的真实标签是Iris-setosa,预测标签是Iris-setosa
样本96的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本91的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本77的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本118的真实标签是Iris-virginica,预测标签是Iris-virginica
样本59的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本98的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本130的真实标签是Iris-virginica,预测标签是Iris-virginica
样本115的真实标签是Iris-virginica,预测标签是Iris-virginica
样本147的真实标签是Iris-virginica,预测标签是Iris-virginica
样本48的真实标签是Iris-setosa,预测标签是Iris-setosa
样本125的真实标签是Iris-virginica,预测标签是Iris-virginica
样本121的真实标签是Iris-virginica,预测标签是Iris-virginica
样本119的真实标签是Iris-virginica,预测标签是Iris-virginica
样本142的真实标签是Iris-virginica,预测标签是Iris-virginica
样本27的真实标签是Iris-setosa,预测标签是Iris-setosa
样本44的真实标签是Iris-setosa,预测标签是Iris-setosa
样本60的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本42的真实标签是Iris-setosa,预测标签是Iris-setosa
样本57的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本33的真实标签是Iris-setosa,预测标签是Iris-setosa
样本53的真实标签是Iris-versicolor,预测标签是Iris-versicolor
样本71的真实标签是Iris-versicolor,预测标签是Iris-virginica
样本122的真实标签是Iris-virginica,预测标签是Iris-virginica
样本145的真实标签是Iris-virginica,预测标签是Iris-virginica
预测准确率96.000000%
运行的图

复习需要注意的地方:

  • 知识点:


  • sklearntrain_test_split
from sklearn.model_selection import train_test_split
train_test_split(train_data,train_target,test_size=0.3, random_state=0)

参数解释:
train_data:被划分的样本特征集
train_target:被划分的样本标签
test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数,就是样本的数量
random_state:是随机数的种子。随机数种子其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:

  1. 种子不同,产生不同的随机数;
  2. 种子相同,即使实例不同也产生相同的随机数。
  • 按行遍历
for idx,row in test_data.iterrows():
    # 测试样本特征
    test_sample_feat = row[feat_cols].values
  • 欧式空间距离
from scipy.spatial.distance import euclidean
dis = euclidean(test_sample_feat, train_sample_feat) 

练习:手工实现一个简单的水果识别器

  • 题目描述:创建一个水果识别器,根据水果的属性,判断该水果的种类。

  • 题目要求:

  • 根据“近朱者赤”的原则,手工实现一个简单的分类器

  • 选取1/5的数据作为测试集

  • 数据文件:

  • 数据源下载地址:https://video.mugglecode.com/fruit_data.csv

  • fruit_data.csv,包含了59个水果的的数据样本。

  • 共5列数据

  • fruit_name:水果类别

  • mass: 水果质量

  • width: 水果的宽度

  • height: 水果的高度

  • color_score: 水果的颜色数值,范围0-1。

  • 0.85 - 1.00:红色

  • 0.75 - 0.85: 橙色

  • 0.65 - 0.75: 黄色

  • 0.45 - 0.65: 绿色


    image

参考答案

import pandas as pd
from sklearn.model_selection import train_test_split
from scipy.spatial.distance import euclidean
import numpy as np


#特征文字

feat_cols =['mass','width','height','color_score']

#读取数据

data = pd.read_csv('/Users/miraco/PycharmProjects/ai/data_ai/fruit_data.csv')

#划分数据

train_set, test_set = train_test_split(data, random_state = 10, test_size= 0.4)

#计算结果

acc_count = 0  # 预测对的个数

for idx, row in test_set.iterrows():
    #提取每一行的各特征的值
    test_sample_feat = row[feat_cols].values  #多维的一定写value

    #预测值

    pos = np.argmin([euclidean(test_sample_feat,train_row[feat_cols].values) for idx2, train_row in train_set.iterrows()])
    pred_label = train_set.iloc[pos]['fruit_name']

    #实际值
    real_label = row['fruit_name']

    print(f'样本{idx}的真实标签是{real_label},预测标签是{pred_label}')

    if real_label == pred_label:
        acc_count += 1

# 准确率
accuracy  = acc_count / test_set.shape[0]
print('预测准确率{:2f}%'.format(accuracy*100))

运行结果

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 96, got 88
  return f(*args, **kwds)
样本31的真实标签是orange,预测标签是lemon
样本3的真实标签是mandarin,预测标签是mandarin
样本38的真实标签是orange,预测标签是orange
样本27的真实标签是orange,预测标签是lemon
样本21的真实标签是apple,预测标签是apple
样本17的真实标签是apple,预测标签是apple
样本46的真实标签是lemon,预测标签是lemon
样本2的真实标签是apple,预测标签是apple
样本23的真实标签是apple,预测标签是apple
样本26的真实标签是orange,预测标签是orange
样本35的真实标签是orange,预测标签是apple
样本39的真实标签是orange,预测标签是orange
样本20的真实标签是apple,预测标签是orange
样本37的真实标签是orange,预测标签是orange
样本7的真实标签是mandarin,预测标签是mandarin
样本6的真实标签是mandarin,预测标签是mandarin
样本45的真实标签是lemon,预测标签是orange
样本56的真实标签是lemon,预测标签是lemon
样本47的真实标签是lemon,预测标签是lemon
样本10的真实标签是apple,预测标签是orange
样本44的真实标签是lemon,预测标签是lemon
样本54的真实标签是lemon,预测标签是lemon
样本18的真实标签是apple,预测标签是apple
样本4的真实标签是mandarin,预测标签是mandarin
预测准确率75.000000%

Process finished with exit code 0

这个警告的原因是是各种库之间的版本不匹配,只需要把numpy的版本降到1.14.5就可以了。

sudo pip uninstall numpy
sudo pip install numpy==1.14.5

我懒得理他,就这样吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容