1. 首页
  2. 技术文章

用Python实现基线机器学习算法

用Python实现基线机器学习算法

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

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

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

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

随机预测(random prediction)算法

零规则(zero rule prediction)算法

随机预测算法可预测训练数据中观察到的随机结果。

这也许是最简单的算法。

它要求您将所有不同的结果值存储在训练数据中,这对于包含许多不同值的回归问题可能很大。

由于使用随机数进行决策,因此在使用算法之前先修复随机数种子是一个好主意。这是为了确保我们获得相同的随机数集,并在每次运行算法时获得相同的决策。

以下是在名为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)

运行示例将计算测试数据集的随机预测,并打印这些预测。

  [0, 0, 1, 0]

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

2.零规则算法

零规则算法是比随机算法更好的基线。

它使用有关给定问题的更多信息来创建一个规则以进行预测。此规则因问题类型而异。

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

分类

对于分类问题,一条规则是预测训练数据集中最常见的类别值。这意味着,如果训练数据集具有“ 0”类的90个实例和“ 1”类的10个实例,则它将预测“ 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)

运行此示例将进行预测并将其打印到屏幕上。正如预期的那样,选择并预测了类别值“ 0”。

  [‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’]

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

回归

回归问题需要预测实际值。

对于实际值的一个很好的默认预测是预测中心趋势。这可以是平均值或中位数。

一个好的默认值是使用在训练数据中观察到的输出值的平均值(也称为平均值)。

与随机预测相比,它可能具有更低的误差,后者将返回任何观察到的输出值。

下面是一个名为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)

运行示例将计算输出的预测输出值。正如预期的那样,对于测试数据集中的每一行,平均值为15。

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

扩展

以下是基线算法的一些扩展,您可能希望研究一种工具,以此作为本教程的扩展。

  • 替代中央趋势,其中预测了中位数,众数或其他中央趋势计算,而不是平均值。
  • 预测最后n条记录的平均值的时间序列问题的移动平均值。

 

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code