python基线计算法_教程 | 从头开始:用Python实现基线机器学习算法

news/2024/7/24 5:06:48 标签: python基线计算法

选自MachineLearningMastery

机器之心编译

参与:Jane W、吴攀

在预测建模时,确定基线性能(baseline performance)是很重要的。

基线为评估更高级的方法提供了比较的标准。

在本教程中,你将了解如何在 Python 中实现基线机器学习算法(Baseline Machine Learning Algorithms)。学完本教程后,你将了解:

如何实现随机预测(random prediction)算法

如何实现零规则(zero rule prediction)算法

让我们开始吧!

描述

可供选择的机器学习算法有很多。事实上,有上百种。那么在选择算法之前,你需要评价它的预测结果。可是,你如何判断结果的好坏?

答案是使用基线预测算法。如其它预测一样,基线预测算法提供了一组可以评估的预测结果,例如分类准确率(Accuracy)或 RMSE。

这些评价指标的数值为评估所有其它机器学习算法提供了所需的比较标准。

一旦计算出基线预测算法的评价指标,就可以知道一个给定算法比朴素基线算法到底好多少,为评价算法提供了依据。

两种最常用的基线算法是:

随机预测(random prediction)算法

零规则(zero rule prediction)算法

当遇到比传统分类或回归问题更棘手的新问题时,一个好的想法是首先设计一个基于该预测问题特征的随机预测算法。之后你可以在此基础上改进,并设计一个零规则算法。

让我们执行这些算法代码,并看看它们是如何工作的吧。

教程

本教程分为两部分:

随机预测算法

零规则算法

对于实施和计算给定机器学习算法的基线性能,下面的步骤将为你提供必要的基础。

1. 随机预测算法

正如在训练数据中观察到的那样,随机预测算法给出随机的预测结果。这可能是机器学习中最简单的算法。

它要求训练集包含所有可能的因变量结果值,对于自变量取值很多的回归问题,这个集合可能非常大。

因为随机数用于预测,所以最佳的方法是在使用算法之前固定随机数种子。这是为了确保我们获得相同的一组随机数,并且每次运行算法时都得到相同的决策。

下面是随机预测算法在名为 random_algorithm() 的函数中的实现。

该函数的输入参数为两部分:含有因变量数值的训练集和需要预测因变量数值的测试集。

该函数将用于分类和回归问题。它假定训练集的预测输出值是每行观测值的最后一列。

首先,从训练集得到所有因变量取值的集合。然后,从集合中随机选择一个值作为测试集每一行观测值的输出值。

# Generate random predictions

def random_algorithm(train, test):

output_values = [row[-1] for row in train]

unique = list(set(output_values))

predicted = list()

for row in test:

index = randrange(len(unique))

predicted.append(unique[index])

return predicted

我们可以用一个小数据集测试这个函数,为了简单起见,它只包含输出列。

训练集的输出值为 0 或 1,意味着算法的预测集合为 {0,1},并从中选择预测值。在预测之前,测试集的输出列为空。

from random import seed

from random import randrange

# Generate random predictions

def random_algorithm(train, test):

output_values = [row[-1] for row in train]

unique = list(set(output_values))

predicted = list()

for row in test:

index = randrange(len(unique))

predicted.append(unique[index])

return predicted

seed(1)

train = [[0], [1], [0], [1], [0], [1]]

test = [[None], [None], [None], [None]]

predictions = random_algorithm(train, test)

print(predictions)

运行示例代码,计算测试集的随机预测,并 print 预测结果。

[0, 1, 1, 0]

随机预测算法易于实现且运行速度快,但作为基线算法,我们可以做得更好。

2. 零规则算法

零规则算法是比随机预测算法更好的基线预测算法。对于给定问题,它运用更多相关的信息来建立规则以进行预测。此规则根据问题类型而有所不同。

让我们从分类问题开始,预测每一类的标签。

分类

对于分类问题,一个规则是预测训练集中最常见类的取值。这意味着如果训练集有 90 个类为 0 的实例和 10 个类为 1 的实例,那么输出值将都预测为 0,此时的基线精度为 90/100 或 90%。

这比平均只能达到 82% 准确率的随机预测算法要好得多。如何计算随机预测算法准确率估计值的细节如下:

= ((0.9 * 0.9) + (0.1 * 0.1)) * 100

= 82%

下面是一个基于分类问题的名为 zero_rule_algorithm_classification() 的零规则算法函数。

# zero rule algorithm for classification

def zero_rule_algorithm_classification(train, test):

output_values = [row[-1] for row in train]

prediction = max(set(output_values), key=output_values.count)

predicted = [prediction for i in range(len(test))]

return predicted

该函数使用带有 key 属性的 max() 函数,这是一个聪明的做法。给定训练集中观察到的所有类的取值,max() 函数将通过调用计数函数统计每一类数值的数量,采用数量最多的一组类值。

结果是它返回训练集中观察到的具有最高计数类值的数值。

如果所有类值具有相同的计数,则选择在数据集中观察到的第一个类值。

一旦我们选择好计数最大的类值,它将用于每一行测试集数据的预测。

下面是一个例子,这个构造的数据集包含 4 个类为 0 的实例和 2 个类为 1 的实例。算法将选择类值 0 作为测试集中每一行的预测。

from random import seed

from random import randrange

# zero rule algorithm for classification

def zero_rule_algorithm_classification(train, test):

output_values = [row[-1] for row in train]

prediction = max(set(output_values), key=output_values.count)

predicted = [prediction for i in range(len(train))]

return predicted

seed(1)

train = [['0'], ['0'], ['0'], ['0'], ['1'], ['1']]

test = [[None], [None], [None], [None]]

predictions = zero_rule_algorithm_classification(train, test)

print(predictions)

运行此代码将进行预测并将其 print 到屏幕。如预期,类值 0 被选择并用来预测。

['0', '0', '0', '0', '0', '0']

现在,让我们看看回归问题的零规则算法。

回归

回归问题需要预测非离散型值。一个默认的好的预测方法是预测数据的集中趋势(central tendency)。这可以是平均值或中值。使用训练集观察到的因变量的平均值是一个很不错的默认方法。它的误差可能比随机预测低,因为后者将返回任何观察到的因变量值。

下面是一个名为 zero_rule_algorithm_regression()的函数。它的原理是计算观察到的因变量的平均值。

mean = sum(value) / total values

一旦计算出平均值,它将用于每一行训练数据的预测。

from random import randrange

# zero rule algorithm for regression

def zero_rule_algorithm_regression(train, test):

output_values = [row[-1] for row in train]

prediction = sum(output_values) / float(len(output_values))

predicted = [prediction for i in range(len(test))]

return predicted

这个函数可以用一个简单的例子来测试。

我们可以构造一个小数据集,其中平均值已知为 15。

10

15

12

15

18

20

mean = (10 + 15 + 12 + 15 + 18 + 20) / 6

mean = 90 / 6

mean = 15

下面是完整的例子。我们期望 4 行测试集的预测值为平均值 15。

from random import seed

from random import randrange

# zero rule algorithm for regression

def zero_rule_algorithm_regression(train, test):

output_values = [row[-1] for row in train]

prediction = sum(output_values) / float(len(output_values))

predicted = [prediction for i in range(len(test))]

return predicted

seed(1)

train = [[10], [15], [12], [15], [18], [20]]

test = [[None], [None], [None], [None]]

predictions = zero_rule_algorithm_regression(train, test)

print(predictions)

运行示例代码,计算测试集的预测值,并 print 预测结果。如预期,每一行测试集的预测值为平均值 15。

[15.0, 15.0, 15.0, 15.0, 15.0, 15.0]

扩展

以下是基线预测算法的一些扩展,你可以自己来实现这些算法。

用中位数值、众数等其它中心趋势统计量预测,而不是平均值

对于时间序列问题,当最后 n 条记录的平均值已经预测出来时,使用滑动平均值(Moving Average)用于预测

回顾

在本教程中,你了解了计算机器学习问题的基线性能的重要性。

你现在知道了:

如何实现分类和回归问题的随机预测算法

如何实现分类和回归问题的零规则算法

©本文为机器之心编译,转载请联系本公众号获得授权。

✄------------------------------------------------

加入机器之心(全职记者/实习生):hr@jiqizhixin.com

投稿或寻求报道:editor@jiqizhixin.com

广告&商务合作:bd@jiqizhixin.com


http://www.niftyadmin.cn/n/874552.html

相关文章

合并两个数组的方法

JS合并两个数组的方法 我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况。比如: var a [1,2,3];var b [4,5,6]; 有两个数组a、b,需求是将两个数组合并成一个。方法如下: 1、concat js的Array对象提供了一个叫c…

python 数据库操作 yeild from_python中的yield和yield from

学到了一点,就写一点吧:本文不区分生成器和协程,且把生成器直接当做协程,对于from inspect import iscoroutine中的async协程类型一无所知,开始:yield: 流程控制工具: 可以把控制器让步给中心调度程序,从而激活其他协程.(简单说就是实现线程中任务切换)协程四个状态:1.GEN_CREA…

html 类似雷达扫描效果 及 闪屏效果

//雷达扫描效果 1 <em id"Radar" class"RadarFast"></em>css:.RadarFast{position: absolute;z-index: 10;bottom: 140px;left: 50%;margin-left: -3px;}.RadarFast:after{content: ; position: absolute; width: 280px; height: 280px; borde…

监听audio标签播放

<audio id"audio" controls"controls" loop"loop" style"display: none;"><source src"image/3.mp3" type"audio/mpeg" /> </audio>audio.play();//播放 audio.pause();//暫停//监听播放完毕a…

文字转换语音播报

1.网页版&#xff1a; <script type"text/javascript">var msg new SpeechSynthesisUtterance("你是谁");window.speechSynthesis.speak(msg);</script> 2.webAPP&#xff1a; <div id"Box"></div>var src "号请…

python标准算术操作符_Python脚本编程:标准类型运算符和内建函数

1.标准类型运算符:(1)对象值的比较(2)对象身份的比较:例1.如:foo1 foo2 4.3 表示foo1和foo2指向相同的对象.(这条语句等同于 foo1 4.3 foo2 foo1) 因为Python是通过传递引用来处理对象的.例2.foo1 4.3 第一个数值对象被创建,然后赋值给foo1,foo2 1 3.…

radminpass.php utf 8,dedecms打点员密码重置工具radminpass.php

3.在“用户密码”里输入新的网站打点员密码&#xff0c;点击“确定改削”即可注重&#xff1a;密码重置后&#xff0c;实时删除radminpass.php文件防止被恶意使用。工具使用教程1.下载织梦CMS密码重置工具压缩包radminpass.zip&#xff0c;解压后获得UTF-8、GBK两个文件夹&…

windows笔记本 显示器 分屏_MacBook屏幕太小?CFORCE便携屏分屏工作流简单介绍

前言我的屏幕从24寸的戴尔U2417到AOC的4kU2790PQU&#xff0c;双屏之后变成单屏&#xff0c;因为两个尺寸不一致&#xff0c;还有就是分辨率差距太大&#xff0c;所以把戴尔的出掉留下AOC&#xff0c;所以也使用了一段时间的双屏&#xff0c;后来买了明基的EX2710&#xff0c;把…