python算法演练_One Rule 算法(详解)


Posted in Python onMay 17, 2017

这样某一个特征只有0和1两种取值,数据集有三个类别。当取0的时候,假如类别A有20个这样的个体,类别B有60个这样的个体,类别C有20个这样的个体。所以,这个特征为0时,最有可能的是类别B,但是,还是有40个个体不在B类别中,所以,将这个特征为0分到类别B中的错误率是40%。然后,将所有的特征统计完,计算所有的特征错误率,再选择错误率最低的特征作为唯一的分类准则——这就是OneR。

现在用代码来实现算法。

# OneR算法实现
import numpy as np
from sklearn.datasets import load_iris
# 加载iris数据集
dataset = load_iris()
# 加载iris数据集中的data数组(数据集的特征)
X = dataset.data
# 加载iris数据集中的target数组(数据集的类别)
y_true = dataset.target
# 计算每一项特征的平均值
attribute_means = X.mean(axis=0)
# 与平均值比较,大于等于的为“1”,小于的为“0”.将连续性的特征值变为离散性的类别型。
x = np.array(X >= attribute_means, dtype="int")


from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y_true, random_state=14)
from operator import itemgetter
from collections import defaultdict
# 找到一个特征下的不同值的所属的类别。
def train_feature_class(x, y_true, feature_index, feature_values):
  num_class = defaultdict(int)
  for sample, y in zip(x, y_true):
    if sample[feature_index] == feature_values:
      num_class[y] += 1
  # 进行排序,找出最多的类别。按从大到小排列
  sorted_num_class = sorted(num_class.items(), key=itemgetter(1), reverse=True)
  most_frequent_class = sorted_num_class[0][0]
  error = sum(value_num for class_num , value_num in sorted_num_class if class_num != most_frequent_class)
  return most_frequent_class, error
# print train_feature_class(x_train, y_train, 0, 1)
# 接着定义一个以特征为自变量的函数,找出错误率最低的最佳的特征,以及该特征下的各特征值所属的类别。
def train_feature(x, y_true, feature_index):
  n_sample, n_feature = x.shape
  assert 0 <= feature_index < n_feature
  value = set(x[:, feature_index])
  predictors = {}
  errors = []
  for current_value in value:
    most_frequent_class, error = train_feature_class(x, y_true, feature_index, current_value)
    predictors[current_value] = most_frequent_class
    errors.append(error)
  total_error = sum(errors)
  return predictors, total_error
# 找到所有特征下的各特征值的类别,格式就如:{0:({0: 0, 1: 2}, 41)}首先为一个字典,字典的键是某个特征,字典的值由一个集合构成,这个集合又是由一个字典和一个值组成,字典的键是特征值,字典的值为类别,最后一个单独的值是错误率。
all_predictors = {feature: train_feature(x_train, y_train, feature) for feature in xrange(x_train.shape[1])}
# print all_predictors
# 筛选出每个特征下的错误率出来
errors = {feature: error for feature, (mapping, error) in all_predictors.items()}
# 对错误率排序,得到最优的特征和最低的错误率,以此为模型和规则。这就是one Rule(OneR)算法。
best_feature, best_error = sorted(errors.items(), key=itemgetter(1), reverse=False)[0]
# print "The best model is based on feature {0} and has error {1:.2f}".format(best_feature, best_error)
# print all_predictors[best_feature][0]
# 建立模型
model = {"feature": best_feature, "predictor": all_predictors[best_feature][0]}
# print model
# 开始测试——对最优特征下的特征值所属类别进行分类。
def predict(x_test, model):
  feature = model["feature"]
  predictor = model["predictor"]
  y_predictor = np.array([predictor[int(sample[feature])] for sample in x_test])
  return y_predictor

y_predictor = predict(x_test, model)
# print y_predictor
# 在这个最优特征下,各特征值的所属类别与测试数据集相对比,得到准确率。
accuracy = np.mean(y_predictor == y_test) * 100
print "The test accuracy is {0:.2f}%".format(accuracy)

from sklearn.metrics import classification_report

# print(classification_report(y_test, y_predictor))

总结:OneR算法,我在最开始的以为它是找到一个错误率最低的特征之后可以判断所有特征的分类,其实,现在明白它只能判断这个特征下的各特征值的分类,所以,明显它会有一些局限性。只是说它比较快捷也比较简单明了。但是,还是得是情况而判断是否使用它。

class      precision recall f1-score support

0              0.94     1.00    0.97       17
1              0.00     0.00    0.00       13
2              0.40     1.00    0.57        8

avg / total 0.51     0.66    0.55       38

注:

# 在上面代码中。
for sample in x_test:
print sample[0]
# 得到的是x_test的第一列数据。而用下面的代码得到的是x_test的第一行数据。
print x_test[0]
# 注意两者区别

以上这篇python算法演练_One Rule 算法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python的三目运算符和not in运算符使用示例
Mar 03 Python
python私有属性和方法实例分析
Jan 15 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
Jan 16 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
Python之批量创建文件的实例讲解
May 10 Python
python发送邮件脚本
May 22 Python
flask session组件的使用示例
Dec 25 Python
python实现维吉尼亚算法
Mar 20 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 Python
Python3.9.1中使用split()的处理方法(推荐)
Feb 07 Python
总结python多进程multiprocessing的相关知识
Jun 29 Python
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 #Python
Python入门_学会创建并调用函数的方法
May 16 #Python
Python入门_浅谈逻辑判断与运算符
May 16 #Python
Python入门_条件控制(详解)
May 16 #Python
Python入门_浅谈for循环、while循环
May 16 #Python
Python入门_浅谈数据结构的4种基本类型
May 16 #Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 #Python
You might like
PHP中一个控制字符串输出的函数
2006/10/09 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php文件缓存类汇总
2014/11/21 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
DHTML Slide Show script图片轮换
2008/03/03 Javascript
基于jquery的网站幻灯片切换效果焦点图代码
2013/09/15 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
在Angular项目使用socket.io实现通信的方法
2021/01/05 Javascript
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
php使用递归与迭代实现快速排序示例
2014/01/23 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
python如何变换环境
2020/07/21 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
python 基于opencv 实现一个鼠标绘图小程序
2020/12/11 Python
Python 可视化神器Plotly详解
2020/12/26 Python
移动web模拟客户端实现多方框输入密码效果【附代码】
2016/03/25 HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
结婚喜宴迎宾词
2015/08/10 职场文书
社会实践心得体会范文
2016/01/14 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python