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 算法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 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.da

  • 数据结构与算法中二叉树子结构的详解

    数据结构与算法中二叉树子结构的详解 需求 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 树的描述: class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } 解决思路 使用了栈将元素入栈,并不断的弹出元素,弹出一个元素的时候,拼接成字符串,并用特殊符号进行区分,该方法

  • Python做简单的字符串匹配详解

    Python做简单的字符串匹配详解 由于需要在半结构化的文本数据中提取一些特定格式的字段.数据辅助挖掘分析工作,以往都是使用Matlab工具进行结构化数据处理的建模,matlab擅长矩阵处理.结构化数据的计算,Python具有与matlab共同的特点:语法简洁.库丰富,对算法仿真来说都是一门简洁易用的语言. Python做字符串匹配相对来说上手比较容易,且具有成熟的字符串处理库re供我们使用: 在re库的帮助下,只需简单的两步就可完成匹配工作,对做数据分析/算法的工作者来说,轻松了许多: ste

  • python实现图片处理和特征提取详解

    这是一张灵异事件图...开个玩笑,这就是一张普通的图片. 毫无疑问,上面的那副图画看起来像一幅电脑背景图片.这些都归功于我的妹妹,她能够将一些看上去奇怪的东西变得十分吸引眼球.然而,我们生活在数字图片的年代,我们也很少去想这些图片是在怎么存储在存储器上的或者去想这些图片是如何通过各种变化生成的. 在这篇文章中,我将带着你了解一些基本的图片特征处理.data massaging 依然是一样的:特征提取,但是这里我们还需要对跟多的密集数据进行处理,但同时数据清理是在数据库.表.文本等中进行.这是如何

  • Python面向对象编程之继承与多态详解

    本文实例讲述了Python面向对象编程之继承与多态.分享给大家供大家参考,具体如下: Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个现有的class 继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base class.Super class). 我们先来定义一个class Person,表示人,定义属性变量 name 及 sex (姓名和性别): 定义一

  • python中的decimal类型转换实例详解

    [Python标准库]decimal--定点数和浮点数的数学运算 作用:使用定点数和浮点数的小数运算.         Python 版本:2.4 及以后版本 decimal 模块实现了定点和浮点算术运算符,使用的是大多数人所熟悉的模型,而不是程序员熟悉的模型,即大多数计算机硬件实现的 IEEE 浮点数运算.Decimal 实例可以准确地表示任何数,对其上取整或下取整,还可以对有效数字个数加以限制. Decimal 小数值表示为 Decimal 类的实例.构造函数取一个整数或字符串作为参数.使用

  • python编程通过蒙特卡洛法计算定积分详解

    想当初,考研的时候要是知道有这么个好东西,计算定积分...开玩笑,那时候计算定积分根本没有这么简单的.但这确实给我打开了一种思路,用编程语言去解决更多更复杂的数学问题.下面进入正题. 如上图所示,计算区间[a b]上f(x)的积分即求曲线与X轴围成红色区域的面积.下面使用蒙特卡洛法计算区间[2 3]上的定积分:∫(x2+4*x*sin(x))dx # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt

  • 对python中Librosa的mfcc步骤详解

    1.对语音数据归一化 如16000hz的数据,会将每个点/32768 2.计算窗函数:(*注意librosa中不进行预处理) 3.进行数据扩展填充,他进行的是镜像填充("reflect") 如原数据为 12345 -> 填充为4的,左右各填充4 即:5432123454321 即:5432-12345-4321 4.分帧 5.加窗:对每一帧进行加窗, 6.进行fft傅里叶变换 librosa中fft计算,可以使用.net中的System.Numerics MathNet.Nume

  • python实现PCA降维的示例详解

    概述 本文主要介绍一种降维方法,PCA(Principal Component Analysis,主成分分析).降维致力于解决三类问题. 1. 降维可以缓解维度灾难问题: 2. 降维可以在压缩数据的同时让信息损失最小化: 3. 理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解. PCA简介 在理解特征提取与处理时,涉及高维特征向量的问题往往容易陷入维度灾难.随着数据集维度的增加,算法学习需要的样本数量呈指数级增加.有些应用中,遇到这样的大数据是非常不利的,而且从大数据集中学习

  • Python常用库Numpy进行矩阵运算详解

    Numpy支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库! Numpy比Python列表更具优势,其中一个优势便是速度.在对大型数组执行操作时,Numpy的速度比Python列表的速度快了好几百.因为Numpy数组本身能节省内存,并且Numpy在执行算术.统计和线性代数运算时采用了优化算法. Numpy的另一个强大功能是具有可以表示向量和矩阵的多维数组数据结构.Numpy对矩阵运算进行了优化,使我们能够高效地执行线性代数运算,使其非常适合解决机器学习问题. 与Python列表相比

随机推荐

其他