Python之《机器学习系统设计》第二章
2015-04-26 11:52
218 查看
《机器学习系统设计》第二章:如何对真是样本分类
采用IRIS数据集。数据集可以在http://archive.ics.uci.edu/ml/下载第一步是,可视化,这里选取第0个和第一个特征进行可视化
import scipy as sp import numpy as np import sklearn as sl from matplotlib import pyplot as plt from sklearn.datasets import load_<span style="font-family: Arial, Helvetica, sans-serif;">iris</span> data = load_iris() features = data['data'] feature_names = data['feature_names'] target = data['target'] labels = data['target_names'][data['target']] for t,marker,c in zip(xrange(3),">ox","rgb"): plt.scatter(features[target==t,0],features[target==t,1],marker=marker,c=c) plt.show()
通过观察,发现通过花瓣长度就可以将Iris Setosa和其他两类区分开,寻找切分点
plength = features[:,2] is_setosa = (labels == 'setosa') max_setosa=plength[is_setosa].max() min_non_setosa=plength[~is_setosa].min() print('Maximum of setosa:{0}.'.format(max_setosa)) print('Minimum of others:{0}.'.format(min_non_setosa))
得到结果2是分界点
因此对一个新来的样本,可以如下方式进行分类
if features[:,2]<2: print 'Iris Setosa' else: print 'Iris Virginica or Iris Versicolour'
然后去掉Setosa,用剩下的数据区分virginica 和 Versicolor
features=features[~is_setosa] labels=labels[~is_setosa] virginica=(labels == 'virginica')
现在对所有可能的特征和阈值进行遍历,找到最好的特征和相对应的阈值
best_acc = -1.0 for fi in xrange(features.shape[1]): thresh = features[:,fi].copy() thresh.sort() for t in thresh: pred = (features[:,fi]>t) acc = (pred == virginica).mean() if acc > best_acc: best_acc = acc best_fi = fi best_t = t
然后就可以对一个新样本进行分类
if example[best_fi] > t: print 'virginica' else: print 'versicolor'
交叉验证(去一法)
error = 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(feature[testing],virginica[testing],model) error += np.sum(predictions != virginica[testing]) print error
代码中,learn_model和apply_model是自己定义的函数,需要自己实现
现在来看看一个复杂一些的数据集,Seeds数据集,他有七个特征
我们先把特征归一化到Z值,即减去平均值在除以标准差
#从特征值中减去平均值 features -= features.mean(axis=0) #将特征值除以标准差 features /= features.std(axis=0)
另一种归一化方法是利用最大最小值缩放到(0,1)之间
我们使用最近邻法进行分类
def distance(p0,p1): 'Computes squared Euclidean distance' return np.sum((p0-p1)**2) def nn_classify(training_set,training_labels,new_example): dists = np.array([distance(t, new_example)] for t in training_set) nearest = dists.argmin() return training_labels[nearest]
也可以使用K近邻,找到最近的K个点,投票决定他的标签
复制去Google翻译翻译结果
相关文章推荐
- Python 第二章 字符串及其相关处理
- Python基础教程 | 第一章 第二章 知识点
- 利用python进行数据分析 第二章错误
- SICP_Python版第二章:集合的表示
- 【原创】Python第二章——行与缩进
- 算法导论 python代码 第二章
- Python基础教程学习笔记 第二章 列表和元组
- Python Tutorial 第二章 使用Python解释器
- python-MySQL学习笔记-第二章-在特定数据库中创建表
- 第二章、Python如何运行程序
- 第二章(1.4)Python基础知识(流程控制)
- 第二章(1.6)Python基础知识(高阶函数)
- python学习(第二章)
- python核心编程学习(第二章)
- 【Python网络爬虫】python网络数据采集读书笔记(第二章)
- 算法导论题解-python语言实现-第二章
- 流程python学习笔记:第二章(1)
- python网络数据采集学习笔记:第二章
- 用python写网络爬虫读书笔记 第二章数据抓取
- python第二章练习题