任何机器学习系统的主要部分之一是数据处理流水线. 在将数据馈送到机器学习算法进行训练之前, 我们需要以不同的方式对其进行预处理, 使其适合该算法. 拥有强大的数据处理流程在构建准确可扩展的机器学习系统方面有很长的路要走. 有很多基本功能可用, 数据处理管道通常由这些组合组成. 而不是以嵌套或循环方式调用这些函数, 最好使用函数式编程范例来构建组合. 我们来看看如何组合这些函数来形成一个可重复使用的函数组合. 在这个食谱中, 我们将创建三个基本功能, 并查看如何组成管道.
怎么做...?
- 创建一个文件, 并导入需要的包:
import numpy as np
from functools import reduce
- 我们定义一个函数, 将数组中的每个元素加3:
def add3(input_array):
return map(lambda x: x + 3, input_array)
- 再定义一个函数, 将数组中的每个元素乘以2:
def mul2(input_array):
return map(lambda x: x * 2, input_array)
- 再定义一个函数, 将数组中的每个元素减5:
def function_composer(*args):
'''这里类似函数嵌套, 从里到外顺序执行'''
return reduce(lambda f, g: lambda x: f(g(x)), args)
- 让我们定义一个组合函数, 它将函数作为输入参数并返回一个组合函数. 这个组合函数基本上是按顺序应用所有输入函数的函数:
def function_composer(*args):
'''这里类似函数嵌套, 从里到外顺序执行'''
return reduce(lambda f, g: lambda x: f(g(x)), args)
我们使用reduce函数通过依次顺序应用函数来组合所有的输入函数.
- 我们现在准备玩这个组合函数了. 我们定义一些数据和一系列操作:
if __name__ == '__main__':
arr = np.array([2, 5, 4, 7])
print ("Operation: add3(mul2(sub5(arr)))")
- 如果我们使用常规方法, 我们连续应用如下:
arr1 = add3(arr)
arr2 = mul2(arr1)
arr3 = sub5(arr2)
print ("Output using the lengthy way:", list(arr3))
- 让我们使用函数编写器在一行中实现相同的事情:
func_composed = function_composer(sub5, mul2, add3)
print ("Output using function composition:", list(func_composed(arr)))
- 我们也可以使用以前的方法在单行中做同样的事情, 但代码可读性很差. 此外, 这是不可重复使用的! 如果要重复使用这个操作顺序, 你必须再次写出整个事情:
print (
"Operation: sub5(add3(mul2(sub5(mul2(arr)))))\nOutput:",
list(function_composer(mul2, sub5, mul2, add3, sub5)(arr))
)