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


相关推荐: php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何在万网开始建站?分步指南解析  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  如何撰写建站申请书?关键要点有哪些?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Firefox Developer Edition开发者版本入口  如何用花生壳三步快速搭建专属网站?  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  手机软键盘弹出时影响布局的解决方法  Laravel PHP版本要求一览_Laravel各版本环境要求对照  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  JavaScript如何实现错误处理_try...catch如何捕获异常?  如何在建站宝盒中设置产品搜索功能?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  网站制作报价单模板图片,小松挖机官方网站报价?  如何确保西部建站助手FTP传输的安全性?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  微信h5制作网站有哪些,免费微信H5页面制作工具?  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Mybatis 中的insertOrUpdate操作  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel怎么调用外部API_Laravel Http Client客户端使用  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  微信小程序 input输入框控件详解及实例(多种示例)  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  如何快速生成专业多端适配建站电话?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  用v-html解决Vue.js渲染中html标签不被解析的问题  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  微信推文制作网站有哪些,怎么做微信推文,急?  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel如何配置任务调度?(Cron Job示例)  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  网易LOFTER官网链接 老福特网页版登录地址  EditPlus中的正则表达式 实战(2)