零规则算法是比随机预测算法更好的基线预测算法。对于给定问题,它运用更多相关的信息来建立规则以进行预测。此规则根据问题类型而有所不同。 让我们从分类问题开始,预测每一类的标签。 分类 对于分类问题,一个规则是预测训练集中最常见类的取值。这意味着如果训练集有 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)用于预测 回顾 在本教程中,你了解了计算机器学习问题的基线性能的重要性。 你现在知道了: 如何实现分类和回归问题的随机预测算法 如何实现分类和回归问题的零规则算法 ©本文为机器之心编译,转载请联系本公众号获得授权。 ?------------------------------------------------ 加入机器之心(全职记者/实习生):[email protected] 投稿或寻求报道:[email protected] 广告&商务合作:[email protected] (责任编辑:本港台直播) |