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

发布时间 - 2026-01-11 01:08:08    点击率:

这样某一个特征只有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  # one  # rule  # Python算法的时间复杂度和空间复杂度(实例解析)  # Python算法中的时间复杂度问题  # python算法题 链表反转详解  # python算法与数据结构之单链表的实现代码  # python算法与数据结构之冒泡排序实例详解  # 详解python算法之冒泡排序  # Python算法之图的遍历  # Python算法输出1-9数组形成的结果为100的所有运算式  # python算法表示概念扫盲教程  # Python算法应用实战之栈详解  # Python算法之栈(stack)的实现  # python算法学习之计数排序实例  # Python集成学习之Blending算法详解  # 特征值  # 的是  # 最优  # 这就是  # 给大家  # 加载  # 我在  # 在这个  # 是有  # 又是  # 最多  # 两种  # 它是  # 希望能  # 最有  # 在上面  # 这篇  # 它会  # 就如  # 来实现 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 音响网站制作视频教程,隆霸音响官方网站?  Laravel如何使用Eloquent进行子查询  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  如何用好域名打造高点击率的自主建站?  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何利用DOS批处理实现定时关机操作详解  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  PHP正则匹配日期和时间(时间戳转换)的实例代码  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  如何用虚拟主机快速搭建网站?详细步骤解析  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  如何用腾讯建站主机快速创建免费网站?  Mybatis 中的insertOrUpdate操作  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Laravel如何配置和使用缓存?(Redis代码示例)  奇安信“盘古石”团队突破 iOS 26.1 提权  如何用花生壳三步快速搭建专属网站?  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  深入理解Android中的xmlns:tools属性  高端云建站费用究竟需要多少预算?  如何为不同团队 ID 动态生成多个独立按钮  Laravel如何实现事件和监听器?(Event & Listener实战)  重庆市网站制作公司,重庆招聘网站哪个好?  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  如何在宝塔面板创建新站点?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  php json中文编码为null的解决办法  php结合redis实现高并发下的抢购、秒杀功能的实例  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  网站图片在线制作软件,怎么在图片上做链接?  JavaScript常见的五种数组去重的方式  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  在线制作视频网站免费,都有哪些好的动漫网站?