创建可逆数据转换的系统

wtrwrks的Python项目详细描述


wtrwrks

TLDR

安装:

pip install wtrwrks

建造水利工程:

fromwtrwrksimportWaterwork,add,mulimportpprintwithWaterwork()asww:add_tubes,add_slots=add([1.,2.,3.],[3.,4.,5.])mul_tubes,mul_slots=mul(add_tubes['target'],[2.,2.,2.])taps=ww.pour(key_type='str')pprint.pprint(taps)

生成数据集转换:

fromwtrwrksimportDatasetTransform,CatTransform,NumTransformimportnumpyasnpimportpprintimporttensorflowastf# Define the raw input arrayarray=np.array([['a',1,0],['b',4,np.nan],['c',8,np.nan],['a',11,np.nan],],dtype=np.object)# Define the full dataset transformdataset_transform=DatasetTransform(name='DT')# Add the categorical transform. Have it taken in column 0 from 'array'.# Normalize by (val - mean)/std.dataset_transform.add_transform(cols=[0],transform=CatTransform(name='CAT',norm_mode='mean_std',index_to_cat_val=['a','b','c','d'],input_dtype=np.dtype('U')))# Add the numerical transform. Have it take columsn, 1 and 2 from 'array'.# Normalize by (val - min)/(max - min). Replace nans with zeros.dataset_transform.add_transform(cols=[1,2],transform=NumTransform(name='NUM',norm_mode='min_max',input_dtype=np.float64,fill_nan_func=lambdaa:np.array(0),))# Calculate means, stds, mins, maxes, etc.dataset_transform.calc_global_values(array)outputs=dataset_transform.pour(array)# Either reconstruct the original array from thisdataset_transform.pump(outputs)# Or write directly to tfrecordsdataset_transform.write_examples(array,file_name='examples.tfrecord')# Then read them and use them in an ML pipelinedataset_iter=dataset_transform.get_dataset_iter('examples_*.tfrecord',batch_size=2)dataset_init=dataset_transform.get_dataset_iter_init(dataset_iter,'examples_*.tfrecord',num_epochs=1,shuffle_buffer_size=1,# i.e. don't shufflebatch_size=2,)features=dataset_iter.get_next()withtf.Session()assess:sess.run(dataset_init)example_dicts=[]for_inxrange(2):evaled_features=sess.run(features)# Do whatever you need to do with the outputs# ...# Reconstruct the orignal arrayexample_dict={}forkeyinevaled_features:example_dict[key]=evaled_features[key].flatten()example_dicts.append(example_dict)tap_dict=dataset_transform.examples_to_tap_dict(example_dicts)remade_array=dataset_transform.pump(tap_dict)printremade_array

水厂和改造

当开始一个新的项目时,一个数据科学家或机器学习工程师花费了很大一部分时间(如果不是大部分时间的话)准备将数据输入到一些ml算法中。这涉及到清理、转换和规范化各种不同的数据类型,以便它们都可以表示为一些表现良好的向量集(或者更一般地说是一些高维张量)。这些转换通常是相当有损失的,因为原始数据中包含的许多信息对预测没有帮助。然而,这有一个不幸的副作用,即无法从转换后的原始数据重建原始数据,这在许多情况下是一种有用的(如果不是必要的话)能力。

能够看到原始形式的数据,而不是大量的数字块,这使得调试过程更加平滑,模型诊断更加直观。这是创建这个包的最初动机,但是这个系统可以在ml管道之外的各种情况下使用,并且是以尽可能通用的方式设置的。也就是说,有一个子模块叫做"transforms",它构建在水厂系统之上,专门用于ml管道。这些转换将分类、数字、日期时间和字符串数据类型转换为ML管道的矢量化输入。下面将进一步讨论这个问题

自来水厂

自来水厂的"理论"

创建一个"水工"等于创建一个可逆函数,即一个函数f,对于任何a∈dom(f),你有一个f-1,这样f-1(f(a))=a。注意,这并不意味着这个函数f满足f(f-1(b))=b,因为f需要只是内射的不是同构的。自来水厂是由较小的可逆操作(称为水箱)建成的,并连接在一起以获得更复杂的操作。任何使用tensorflow构建过任何东西的人都会很快发现这种定义自来水厂的方法的思想是从何而来的。水利工程是描述一系列要执行的操作的有向无环图。此图的节点是储罐(即操作),边缘是管/槽。水箱本身是可逆的,因此整个供水系统是可逆的。

正如读者很快发现的,有相当数量的编造的行话,作者发现很难避免。但希望这个比喻能让人更容易理解。请参考此图表以更直观地了解正在发生的事情。 drawing

fromwtrwrksimportWaterwork,add,mulimportpprintwithWaterwork()asww:add_tubes,add_slots=add([1.,2.,3.],[3.,4.,5.])mul_tubes,mul_slots=mul(add_tubes['target'],[2.,2.,2.])taps=ww.pour(key_type='str')pprint.pprint(taps)
{'Add_0/tubes/a_is_smaller': False,
 'Add_0/tubes/smaller_size_array': array([3., 4., 5.]),
 'Mul_0/tubes/a_is_smaller': False,
 'Mul_0/tubes/missing_vals': array([], dtype=float64),
 'Mul_0/tubes/smaller_size_array': array([2., 2., 2.]),
 'Mul_0/tubes/target': array([ 8., 12., 16.])}

通常,当一个人想运行(a+b)*c时,你会得到一个输出。然而,为了使此可逆,返回6个不同的输出。然而,有了这些输出,一个人就可以完全撤消(a+b)*c操作,即使在零存在的情况下,也可以恢复原来的a、b和c。

水龙头,是所有没有连接到其他槽的水箱的管子。因此,"add_tubes["target"]"不会显示为抽头,因为它已连接到mul_插槽["a"]。

例2

在上一个示例中,所有漏斗在开始时都给出了值,因此不需要为浇注方法提供附加值。事实上,当所有值在开始时都被填充时,实际上是急切地执行水处理:

fromwtrwrksimportWaterwork,add,mulimportpprintwithWaterwork()asww:add_tubes,add_slots=add([1.0,2.0,3.0],[3.0,4.0,5.0])printadd_tubes['target'].get_val()
[4. 6. 8.]

然而,与tensorflow类似,这个系统并不是真正的主要设计用于运行eargerly,而是使用不同的输入反复运行同一组计算。因此,在定义水工时,实际上并不需要在定义时为所有槽提供所有值。可以将"empty"对象传递给容器,然后在运行实际浇注方法时传递漏斗的值:

fromwtrwrksimportWaterwork,add,mul,emptyimportpprintwithWaterwork()asww:add_tubes,add_slots=add([1.0,2.0,3.0],b=empty)div_tubes,div_slots=mul(add_tubes['target'],[2.0,2.0,2.0])taps=ww.pour({'Add_0/slots/b':[3.,4.,5.]},key_type='str')pprint.pprint(taps)taps=ww.pour({'Add_0/slots/b':[5.,6.,7.]},key_type='str')pprint.pprint(taps)
{'Add_0/tubes/a_is_smaller': False,
 'Add_0/tubes/smaller_size_array': array([3., 4., 5.]),
 'Mul_0/tubes/a_is_smaller': False,
 'Mul_0/tubes/missing_vals': array([], dtype=float64),
 'Mul_0/tubes/smaller_size_array': array([2., 2., 2.]),
 'Mul_0/tubes/target': array([ 8., 12., 16.])}

{'Add_0/tubes/a_is_smaller': False,
 'Add_0/tubes/smaller_size_array': array([5., 6., 7.]),
 'Mul_0/tubes/a_is_smaller': False,
 'Mul_0/tubes/missing_vals': array([], dtype=float64),
 'Mul_0/tubes/smaller_size_array': array([2., 2., 2.]),
 'Mul_0/tubes/target': array([12., 16., 20.])}

将此输入泵功能,可以从"添加"罐中获取漏斗值"b":

pip install wtrwrks

0
pip install wtrwrks

1

其他示例

在转换的定义中,也就是在"define-waterwork"方法中,可以找到其他更不平凡的示例。转换位于wtrkwrks/transforms/

ml可逆变换

构建转换以准备要输入到ml管道的数据是创建系统(如自来水厂)的原始动力。通常,每次建立将原始数据转换为某种向量或张量表示的管道时,都会采取几乎相同的步骤。控制需要对数据进行哪些转换以准备数据的主要因素与ml算法的关系不大,而更多地与输入的数据类型有关。目前有四种基本变换:

<表><广告>变换示例输入 说明 < /广告><正文>数字转换[1.0,2.0]将一个或多个数字输入转换为规范化向量卡特尔转换['a',1,无]将某些分类变量转换为规范化的一个热向量日期时间转换[日期时间(2000,1,1),日期时间(1900,5,6,12,30,5)]将日期时间输入转换为规范化向量字符串转换["他们最后睡在门口。"]将字符串转换为一组表示某些令牌集的索引

描述只提到转换的主要输出。为了使变换可逆,还需要其他一些方法。

基本变换

这些转换称为"基本"转换,因为它们不需要定义任何子转换。用户以一种非常相似的方式与它们进行交互。一般流程是:

  1. 定义转换-设置任何属性:规范化模式、规范化轴、任何处理nan的函数等。
  2. 计算任何全局值-查找依赖于整个数据集的值:例如平均值、性病、分钟、最大值、完整类别列表等。
  3. 将原始数据倒入规范化、矢量化数据字典。
  4. 将它们写入tfrecords。
  5. 做任何训练,干扰,你有什么。
  6. 将任何经过过滤、分析的数据重新抽回原始格式,以便人工解释。
  7. < > >

    numtransform

    数值变换是最简单的变换,因为它们通常只需要缩放/移动原始值。但是它确实以可逆的方式处理nans之类的事情:

    pip install wtrwrks
    
    
    2

    卡特尔转换

    分类转换总是一个热的输入。这意味着传递一个秩k的数组,结果得到秩k+1的一个热张量。可以使用有效的目录显式设置类别,也可以在调用Calc全局值时从整个数据集中推断类别。

    pip install wtrwrks
    
    
    3

    日期时间转换

    DateTimeTransforms与NumTransforms非常相似,只是DateTimes首先被更改为某种时间单位。零日期时间,即对应于零值的日期时间默认为日期时间(1970,1,1)。定义转换时,可以通过选择"时间单位"和"数值单位"来设置时间单位。例如,通过选择time_unit='d'和num_units=2,日期时间将以2天为增量显示。请注意,这样做实际上是在设置分辨率,因此如果使用"时间单位"=2,则无法获得一天中的小时数。

    pip install wtrwrks
    
    
    4

    字符串转换

    字符串转换将原始字符串数组分解为标记,并根据某个索引到单词映射将它们转换为索引。还可以选择各种字符串规范化转换,例如:小写、半宽(对于中文字符)或引理。用户必须提供一个令牌赋予器,并可选地提供一个detokenizer。detokenzer不一定要精确,但detokenzer越接近于tokenizer的倒数,必须携带的diff_字符串(存储原始输入和规范化输入之间差异的字符串)就越少。

    pip install wtrwrks
    
    
    5

    数据集转换

    通常,一个ml模型使用几种不同类型的输入。可以定义一个数据集转换来处理这种情况。它可以被认为是一个容器转换,其中包含其他子转换。然后,在为ml定义示例时,整个数据集可以通过数据集转换来获取训练示例。有关如何定义和使用数据集转换的示例,请参见tldr部分。

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


热门话题
使用C3P0和Postgresql的java Hibernate连接   java从hashmap中删除停止词   java如何通过RESTAPI向前端提供静态文件?   Java中有没有没有没有else部分的条件运算符?   java无法运行程序AUTOIT脚本名称CreateProcess error=216   java spring注释NullPointerException   运行之间组合框的java存储值   java我可以使用调用类中的泛型类型吗?   Java:具有弱引用的堆栈   如何在普通Java中使用PostConstruct   oop为什么要在java中使用此输出   java将单个jar(依赖项)添加到共享Eclipse项目   java如何使用暴力攻击解密已知密码文本?   如何在Java中操纵数据表单microservice响应,Spring Boot   java需要帮助理解CorvolveOp内核类中使用的矩阵   JAVA&MySQL不需要的额外列   spring框架下java将字符串转换为Sql日期   验证如何验证文本文件(Java)中的电子邮件地址   离线/在线数据同步的java策略   java从耳机中选择麦克风源,而不是手持麦克风