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机器学习之决策树算法
Dec 22 Python
Python基于FTP模块实现ftp文件上传操作示例
Apr 23 Python
Python装饰器用法实例总结
May 26 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
python实现银行管理系统
Oct 25 Python
详解Python3 中的字符串格式化语法
Jan 15 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
python异常处理、自定义异常、断言原理与用法分析
Mar 23 Python
Eclipse配置python默认头过程图解
Apr 26 Python
通俗易懂了解Python装饰器原理
Sep 17 Python
Python基础之tkinter图形化界面学习
Apr 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 和 XML: 使用expat函数(二)
2006/10/09 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
2013/06/06 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
浅析Vue中method与computed的区别
2018/03/06 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
Python Json数据文件操作原理解析
2020/05/09 Python
python 实现逻辑回归
2020/12/30 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
教师自我评价范例
2013/09/24 职场文书
预备党员思想汇报
2014/01/08 职场文书
法制宣传实施方案
2014/03/13 职场文书
yy婚礼主持词
2014/03/14 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
教学反思怎么写
2016/02/24 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python