机器学习——对样本分类

本次学习从机器学习的典例数据:鸢尾花数据集出发。
Iris dataset可以从sklearn直接引入,也可以从http://archive.ics.uci.edu/ml/datasets/Iris获取。

实验环境

  • python3环境
  • 使用到的库
from sklearn import datasets
from matplotlib import pyplot as plt
import numpy as np

数据的可视化

  1. 从sklearn引入数据集
iris = datasets.load_iris()
features = iris['data']
feature_names = iris['feature_names']
target = iris['target']
  1. 画出每个类别的数据集,代码中以sepal length 和sepal width为例
for t, marker, c in zip(range(3), ">ox", "rgb"):
    #我们划出每个类别,各自采用不通颜色标识
    plt.scatter(features[target == t, 0],
                features[target == t, 1],
                marker=marker,
                c=c)
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.show()
Figure_1.png
  1. 画出每个类别的数据集
def scatter_plot(dim1,dim2):
    for t, marker, c in zip(range(3), ">ox", "rgb"):
        #我们划出每个类别,各自采用不通颜色标识
        plt.scatter(features[target == t, dim1],
                    features[target == t, dim2],
                    marker=marker,
                    c=c)
        dim_desc={0:'sepal length',1:'sepal width',2:'petal length',3:'petal width'}
    plt.xlabel(dim_desc.get(dim1))
    plt.ylabel(dim_desc.get(dim2))
    #plt.show()

#用subplot构建6个子图
count = 0
for j in range(3):
    for k in range(1, 4):
        if(k>j):
            plt.subplot(231+count)
            scatter_plot(j, k)
            count=count+1
plt.show()#注意plt.show()的位置
Figure_1.png

根据可视化的图形,显而易见,山鸢尾花可以由花瓣长度很明显的区分出来。

分类

  1. 山鸢尾花区分开来
plength = features[:, 2]
#用numpy操作,来获取setosa的特征,花瓣长度,是一维矩阵

is_setosa = (target == 0) #布尔型一维矩阵
#print(is_setosa)
#print((is_setosa.shape))
#print(plength.shape)

#布尔型索引
setosa_plength = plength[is_setosa]
other_plength = plength[~is_setosa]


max_setosa = setosa_plength.max()
min_non_setosa = other_plength.min()

print('Maximum of setosa:{0}. '.format(max_setosa))
print('Minmum of others:{0}.'.format(min_non_setosa))
  1. 筛出另外两个花种
# #筛出非setosa的花种
features = features[~is_setosa]
labels = target[~is_setosa]
# #rint(labels)
#
#
virginica = (labels == 2)
#print(virginica)
#
# #print(virginica)

print(features.shape)
best_acc = -1.0
for fi in range(features.shape[1]):
    thresh = features[:, fi].copy()
    #thresh.sort()
    #print(thresh)
    for t in thresh:
        #print('t is',t)
        pred = (features[:, fi] > t)
        #print(pred)
        #print(pred == virginica)
        acc = (pred == virginica).mean()
        #print('acc=', acc)
        if acc > best_acc:
            best_acc = acc
            best_fi = fi
            best_t = t

print('Best Accuracy:', best_acc)
print('Best Feature Index', fi)
print('Best Threshold', t)
#这里我们首先对每一维度进行排序,然后从该维度中取出任一值作为阈值的一个假设,再计算这个假设的Boolean序列和实际的标签Boolean序列的一致情况,求平均,即得到了准确率。经过所有的循环,最终得到的阈值和所对应的维度。
#最后,我们得到了最佳模型针对第四维花瓣的宽度petal width,我们就可以得到这个决策边界decision boundary。

这里得出的分界是以某个参数的界限值为标准的
得出准确率最高是0.96 但是这里我们的训练数据和测试数据并没有分开来。

  1. 交叉验证
    去一法,从训练集中拿出一个样本,并在缺少这个样本的数据上训练一个模型,然后看模型能否对这个样本正确分类:
def learn_model(features,labels):
    best_acc = -1.0
    for fi in range(features.shape[1]):
        thresh = features[:, fi].copy()
        # thresh.sort()
        #print(thresh)
        for t in thresh:
            # print('t is',t)
            pred = (features[:, fi] > t)
            # print(pred)
            # print(pred == virginica)
            acc = (pred == labels).mean()
            # print('acc=', acc)
            if acc > best_acc:
                best_acc = acc
                best_fi = fi
                best_t = t

    print('Best Accuracy:', best_acc)
    print('Best Feature Index', fi)
    print('Best Threshold', t)

    return {'accuracy':best_acc, 'Feature Index':best_fi, 'Threshold':best_t}

def apply_model(features,labels,model):
    t = model['Threshold']
    pred = (features[:, fi] > t)
    acc = (pred == labels).mean()
    return  pred


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

推荐阅读更多精彩内容