我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这样某一个特征只有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 算法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这样某一个特征只有0和1两种取值,数据集有三个类别。当取0的时候,假如类别A有20个这样的个体,类别B有60个这样的个体,类别C有20个这样的个体。所以,这个特征为0时,最有可能的是类别B,但是,还是有40个个体不在B类别中,所以,将这个特
2022-06-04

LeetCode算法题python解法:

英文题目:The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to di
2023-01-30

Crypto算法库详解

安装与使用Crypto 算法库在 python 中最初叫 pycrypto,这个作者有点懒,好几年没有更新,后来就有大佬写了个替代库 pycryptodome。这个库目前只支持 python3,安装也很简单pip install pycry
2023-01-31

TF-IDF算法解析与Python实现方法详解

TF-IDF(term frequency?inverse document frequency)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。比较容易理解的一个应用场景
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录