Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

从头开始:用Python实现基线机器学习算法

$
0
0

在预测建模时,确定基线性能(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)用于预测

回顾

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

你现在知道了:

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

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

相关链接:

从头开始:用Python实现带随机梯度下降的线性回归

从头开始:用Python实现随机森林算法


Viewing all articles
Browse latest Browse all 9596

Trending Articles