python机器学习实现oneR算法(以鸢尾data为例)


Posted in Python onMarch 03, 2022

oneR即“一条规则”。oneR算法根据已有的数据中,具有相同特征值的个体最可能属于哪个类别来进行分类。
以鸢尾data为例,该算法实现过程可解读为以下六步:

一、 导包与获取数据

以均值为阈值,将大于或等于阈值的特征标记为1,低于阈值的特征标记为0。

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from collections import defaultdict
from operator import itemgetter
import warnings
from sklearn.metrics import classification_report

# 加载内置iris数据,并保存
dataset = load_iris()  
X = dataset.data
y = dataset.target

attribute_means = X.mean(axis=0)  # 得到一个列表,列表元素个数为特征值个数,列表值为每个特征的均值
X_d = np.array(X >= attribute_means, dtype='int')  # 转bool类型

数据到此已获取完毕,接下来将其划分为训练集和测试集。

二、划分为训练集和测试集

使用默认的0.25作为分割比例。即训练集:测试集=3:1。

X_train, X_test, y_train, y_test = train_test_split(X_d, y, random_state=random_state)

数据描述:
本例中共有四个特征,
原数据集有150个样本,分割后训练集有112个数据,测试集有38个数据。
标签一共分为三类,取值可以是0,1,2。

三、定义函数:获取某特征值出现次数最多的类别及错误率

首先遍历特征的每一个取值,对于每一个特征值,统计它在各个类别中出现的次数。
定义一个函数,有以下四个参数:

  • X, y_true即 训练集数据和标签
  • feature是特征的索引值,可以是0,1,2,3。
  • value是特征可以有的取值,这里为0,1。

该函数的意义在于,对于训练集数据,对于某个特征,依次遍历样本在该特征的真实取值,判断其是否等于特征的某个可以有的取值 (即value)(以0为例)。如果判定成功,则在字典class_counts中记录,以三个类别(0,1,2)中该样本对应的类别为键值,表示该类别出现的次数加一。

首先得到的字典(class_counts)形如:
{0: x1, 1.0: x2, 2.0:x3}
其中元素不一定是三个
x1:类别0中,某个特征feature的特征值为value(0或1)出现的次数
x2:类别0中,某个特征feature的特征值为value(0或1)出现的次数
x3:类别0中,某个特征feature的特征值为value(0或1)出现的次数

然后将class_counts按照值的大小排序,取出指定特征的特征值出现次数最多的类别:most_frequent_class。
该规则即为:该特征的该特征值出现在其出现次数最多的类别上是合理的,出现在其它类别上是错误的。

最后计算该规则的错误率:error
错误率具有该特征的个体在除出现次数最多的类别出现的次数,代表分类规则不适用的个体的数量

最后返回待预测的个体类别错误率

def train_feature_value(X, y_true, feature, value):
    class_counts = defaultdict(int)
    for sample, y_t in zip(X, y_true):
        if sample[feature] == value:
            class_counts[y_t] += 1
    sorted_class_counts = sorted(class_counts.items(), key=itemgetter(1), reverse=True) # 降序
    most_frequent_class = sorted_class_counts[0][0]
    error = sum([class_count for class_value, class_count in class_counts.items()
                 if class_value != most_frequent_class])
    return most_frequent_class, error

返回值most_frequent_class是一个字典, error是一个数字

四、定义函数:获取每个特征值下出现次数最多的类别、错误率

def train(X, y_true, feature):
    n_samples, n_features = X.shape
    assert 0 <= feature < n_features
    # 获取样本中某特征所有可能的取值
    values = set(X[:, feature])
    predictors = dict()
    errors = []
    for current_value in values:
        most_frequent_class, error = train_feature_value(X, y_true, feature, current_value)
        predictors[current_value] = most_frequent_class
        errors.append(error)
    total_error = sum(errors)
    return predictors, total_error

因为most_frequent_class是一个字典,所以predictors是一个键为特征可以的取值(0和1),值为字典most_frequent_class的 字典。
total_error是一个数字,为每个特征值下的错误率的和。

五、调用函数,获取最佳特征值

all_predictors = {variable: train(X_train, y_train, variable) for variable in range(X_train.shape[1])}
Errors = {variable: error for variable, (mapping, error) in all_predictors.items()}
# 找到错误率最低的特征
best_variable, best_error = sorted(Errors.items(), key=itemgetter(1))[0]  # 升序
print("The best model is based on feature {0} and has error {1:.2f}".format(best_variable, best_error))
# 找到最佳特征值,创建model模型
model = {'variable': best_variable,
         'predictor': all_predictors[best_variable][0]}
print(model)

python机器学习实现oneR算法(以鸢尾data为例)

根据代码运行结果,最佳特征值是特征2(索引值为2的feature,即第三个特征)。

对于初学者这里的代码逻辑比较复杂,可以对变量进行逐个打印查看,阅读blog学习时要盯准字眼,细品其逻辑。

print(all_predictors)
print(all_predictors[best_variable])
print(all_predictors[best_variable][0])

python机器学习实现oneR算法(以鸢尾data为例)

六、测试算法

定义预测函数,对测试集数据进行预测

def predict(X_test, model):
    variable = model['variable']
    predictor = model['predictor']
    y_predicted = np.array([predictor[int(sample[variable])] for sample in X_test])
    return y_predicted

# 对测试集数据进行预测
y_predicted = predict(X_test, model)
print(y_predicted)

预测结果:

python机器学习实现oneR算法(以鸢尾data为例)

# 统计预测准确率
accuracy = np.mean(y_predicted == y_test) * 100
print("The test accuracy is {:.1f}%".format(accuracy))

python机器学习实现oneR算法(以鸢尾data为例)

根据打印结果,该模型预测的准确率可达65.8%,对于只有一条规则的oneR算法而言,结果是比较良好的。到此便实现了oneR算法的一次完整应用。

最后,还可以使用classification_report()方法,传入测试集的真实值和预测值,打印出模型评估报告。

# 屏蔽警告
warnings.filterwarnings("ignore") 
# 打印模型评估报告
print(classification_report(y_test, y_predicted))  # 参数为测试集的真实数据和预测数据

python机器学习实现oneR算法(以鸢尾data为例)

 到此这篇关于python机器学习实现oneR算法(以鸢尾data为例)的文章就介绍到这了,更多相关python oneR算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python解析xml文件操作实例
Oct 05 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python之list对应元素求和的方法
Jun 28 Python
Python logging模块用法示例
Aug 28 Python
Python wxPython库Core组件BoxSizer用法示例
Sep 03 Python
python生成器与迭代器详解
Jan 01 Python
Python常用特殊方法实例总结
Mar 22 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
idea2020手动安装python插件的实现方法
Jul 17 Python
Python 解决空列表.append() 输出为None的问题
May 23 Python
详解python的异常捕获
Mar 03 #Python
分享提高 Python 代码的可读性的技巧
Mar 03 #Python
使用python创建股票的时间序列可视化分析
Python Pandas读取Excel日期数据的异常处理方法
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 #Python
python3中apply函数和lambda函数的使用详解
Feb 28 #Python
你需要掌握的20个Python常用技巧
Feb 28 #Python
You might like
攻克CakePHP系列二 表单数据显示
2008/10/22 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
浅析如何利用angular结合translate为项目实现国际化
2016/12/08 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
浅谈Node.js之异步流控制
2017/10/25 Javascript
js断点调试心得分享(必看篇)
2017/12/08 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
zbar解码二维码和条形码示例
2014/02/07 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python中的变量和作用域详解
2016/07/13 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
荷兰优雅女装网上商店:Heine
2016/11/14 全球购物
台湾屈臣氏网路商店:Watsons台湾
2020/12/29 全球购物
社区活动邀请函范文
2014/01/29 职场文书
银行开业庆典方案
2014/02/06 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
班级活动总结格式
2014/08/30 职场文书
作风建设剖析材料
2014/10/06 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS