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中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
玩转python爬虫之URLError异常处理
Feb 17 Python
详解python中list的使用
Mar 15 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
python retrying模块的使用方法详解
Sep 25 Python
分享8点超级有用的Python编程建议(推荐)
Oct 13 Python
python利用JMeter测试Tornado的多线程
Jan 12 Python
pytorch模型预测结果与ndarray互转方式
Jan 15 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
Python中过滤字符串列表的方法
Dec 22 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实现图形显示Ip地址的代码及注释
2014/01/20 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
php中strtotime函数性能分析
2016/11/20 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
javascript 页面划词搜索JS
2009/09/28 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
JS如何生成随机验证码
2020/03/02 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python切片操作实例分析
2018/03/16 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
2018/07/31 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
python实现得到当前登录用户信息的方法
2019/06/21 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
python处理excel绘制雷达图
2019/10/18 Python
基于Python批量生成指定尺寸缩略图代码实例
2019/11/20 Python
HTML5仿手机微信聊天界面
2016/03/18 HTML / CSS
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
新书吧创业计划书
2014/01/31 职场文书
养成教育经验材料
2014/05/26 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
绿色环保倡议书
2015/04/28 职场文书
二十年同学聚会感言
2015/07/30 职场文书
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis