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使用htpasswd实现基本认证授权的例子
Jun 10 Python
python对字典进行排序实例
Sep 25 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
Python通过2种方法输出带颜色字体
Mar 02 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
May 22 Python
Pyecharts 中Geo函数常用参数的用法说明
Feb 01 Python
python标准库ElementTree处理xml
May 20 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
Yii框架登录流程分析
2014/12/03 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
PHP中ajax无刷新上传图片与图片下载功能
2017/02/21 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
jQuery 渐变下拉菜单
2009/12/15 Javascript
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
HTML DOM的nodeType值介绍
2011/03/31 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
Java/JS获取flash高宽的具体方法
2013/12/27 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
Python端口扫描简单程序
2016/11/10 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
2020/03/03 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
中医药大学市场营销专业自荐信
2013/09/29 职场文书
采购员岗位职责
2013/11/15 职场文书
授权收款委托书
2014/09/23 职场文书
女生抽烟检讨书
2014/10/05 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python
React Fragment介绍与使用详解
2021/11/11 Javascript