• 概述

这一节主要介绍一下TensorFlow在应用的过程中的几个小的知识点,第一个是关于features的处理的,例如Bucketized (Binned) Features 和 Feature scalling。第二个是简单的介绍一下常用的几个Optimizer之间的区别,例如SGD, Adagrad, Adam等等。这里主要是对前面一节的内容的一个小补充。其实关于feature的处理,我在前面已经用了很长一段时间在讲了,但是基本都是基于sklearn的框架来处理的,虽然前面咱们说了很多很多,但是总有漏网之鱼嘛,那就是Binned features,咱们这里就用TensorFlow来解释并且应用。还有一个部分就是optimizer,咱们前面说了一个SGD的应用,这一节我准备简单讲述一下另外两个常用的optimizer,他们分别是Adagrad, Adam,我会简单说一下它们之间的优缺点以及应用场景。

  • Bucketized (Binned) Features

  Features engineering咱们在前面讲述了很多很多,并且都用sklearn演示了他们的应用和实现过程。这里补充一下Binned features的知识点,具体什么是Binned features呢?它其实很简单就是将咱们的数据按大小顺序分成n 个bins, 或者这里可以理解成n个quantiles, 然后咱们将每一个bin的boundary记录下来放到一个list里面,最后将咱们的数据在应用到这个bin里面,看看咱们的每一个数据属于哪一个bin,咱的的结果是按照bin的大小从小到大一次是0,1,2,................这样。咱们可以看一个简单的实例

boundaries = [0, 10, 100]
input tensor = [[-5, 10000]
[150, 10]
[5, 100]]

output如下

output = [[0, 3]
[3, 2]
[1, 3]]

从上面的一个简单的实例咱们看出,咱们的原始数据的范围非常大,咱们可以根据boundaries这个list来将他们分成4个bins, 最后再来看咱们的原始数据属于哪一个bin。上面的是一个简单的例子,那么接下来咱们来看看具体的代码实现过程。如果咱们需要将一个seriesbucketized,那么整个bucketized的过程其实分成三个部分,即分别是创建boundary,将series转成numerical_column,和最后的bucketized三个部分;咱们看下面

def get_quantile_based_boundaries(series,num_bucket):
quantiles = np.arange(1.0,num_bucket)/num_bucket
boundaries = series.quantile(quantiles)#the index are the quantiles
return [boundaries[key] for key in boundaries.keys()]

上面的这个函数的目的就是根据quantile来找到每一个bin的boundary;然后咱们需要将咱们的series转成一个numerical_column,如下所示

house_median_age_numeric_column = tf.feature_column.numeric_column("housing_median_age")

其实这一个就是声明咱们的这一个column的类型,既然是按照大小来分配到不同的bin, 那么咱们这一列的数据肯定得是数字型的。既然咱们有了boundary, 也有了numeric_column, 那么接下来就是bucketized啦,如下所示

 bucketized_house_median_age = tf.feature_column.bucketized_column(source_column=house_median_age_numeric_column,
boundaries = get_quantile_based_boundaries(series=cali_housing_dataset_permutation["housing_median_age"],num_bucket=10)
                                        )

这里咱们就声明并且完成了一个column的bucketized的过程,然后咱们就是可以将这个bucketized_column传递给模型的feature_column参数。咱们就完成了一个column的bucketized的整个过程。

补充:在这里咱们在补充一个小知识点,那就是既然咱们实例化了一个bucketized feature_column对象,并且告诉了咱们的模型,那么咱们如何获取咱们的这个bucketized后的feature_column的值呢??简单点就是,咱们怎么知道bucketized_house_median_age这个转化后的值呢?其实很简单,我直接上代码,大家可以直接拿出来用哈

def demo(feature_column):
feature_layer = tf.keras.layers.DenseFeatures(feature_column)
print(feature_layer(dict(cali_housing_dataset_permutation)).numpy())

咱们直接调用上面的函数就能打印出咱们想要的值了,如下

[[0. 0. 0. ... 0. 1. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 1. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 1. ... 0. 0. 0.]
[0. 0. 0. ... 1. 0. 0.]]

这里咱们也可以看出来bucketized过后,咱们的feature会转成one-hot encoding的方式。

  • Cross_features

在咱们的sklearn中的feature generation中已经介绍了cross_features的相关信息,在sklearn中咱们可以直接将categorical data或者numerical data进行cross操作并且生成一个新的feature, 并且将它进行一个新的feature进行一些feature engineering中的相应的操作。其实在TensorFlow中咱们也有相应的方法进行操作,TensorFlow中有专门的cross_feature来进行操作,并且将返回的cross_feature告诉咱们的模型,这是一个cross feature;在这里咱们也可以看出来TensorFlow的牛逼之处,那就是他只需要告诉咱们的模型咱们的如何操作每一列的数据,而不像在sklearn中的那样,需要咱们自己去label encoding 等一些列复杂的feature engineering的操作。但是凡事都是有好有坏的,TensorFlow中隐藏了很多feature engineering中的很多细节部分也导致咱们不能理解一些操作的底层原理,不利于咱们优化咱们的feature engineering的过程。其实总结起来就是说TensorFlow在cross_feature方面只需要咱们声明一下某几个features需要cross并且告诉一下模型就可以了,而不需要咱们真的去一步步的cross咱们的数据生成一个新的feature从而改变了咱们的原始的dataframe。具体在咱们的TensorFlow中,feature cross有多简单呢,咱们看下面的就可以了

    lon_x_lat = tf.feature_column.crossed_column(keys=[bucketized_longitude, bucketized_latitude],
hash_bucket_size = 1000)

注意上面的keys是一个list,这个list里面的元素只可以是string或者是categorical feature type的feature_column, 这里的element如果是string的话,我们就会用这些string相对应的feature来cross(同样的,这些feature的data type也必须要是string);如果是categorical feature type的话,咱们就会直接用这些数据进行cross。这里有个小细节哈就是feature type和data type的区别,初学者经常会混淆,feature type只有2中categorical和numerical, 而data type则有可能是int float string等等,当data type是int 或者 float的时候,那么它的feature type则不一定是numerical,也有可能是categorical,例如咱们上面的bucketized columns虽然data type是int,但是它还是categorical data type。

  • Optimizer

在咱们训练模型的过程中,经常会碰到选择optimizer的情况,实际中这一块没有最好只有更好。一般情况下每一种optimizer都有自己的优缺点,适合不同的应用场景。我今天主要讲一下三个常用的optimizer,分别是SGD, Adagrad和Adam。首先SDG是咱们最传统的一种计算梯度下降的算法, 它除了消耗的资源有点大外,没啥大毛病,几乎适用于所有的convex 的场景;Adagrad是一种改进的算法,它的learning rate并不是固定的,它的learning rate能够根据咱们数据的大小来改变的,它在convex problem中的表现非常好,但是在non-convex的场景中,表现的不好;Adam常用于non-convex的场景,它在non-convex中的表现要好于SGD和Adagrad。

机器学习-TensorFlow应用之 binned features, Cross features和optimizer的更多相关文章

  1. 机器学习tensorflow框架初试

    本文来自网易云社区 作者:汪洋 前言 新手学习可以点击参考Google的教程.开始前,我们先在本地安装好 TensorFlow机器学习框架. 首先我们在本地window下安装好python环境,约定安 ...

  2. 机器学习-TensorFlow建模过程 Linear Regression线性拟合应用

    TensorFlow是咱们机器学习领域非常常用的一个组件,它在数据处理,模型建立,模型验证等等关于机器学习方面的领域都有很好的表现,前面的一节我已经简单介绍了一下TensorFlow里面基础的数据结构 ...

  3. 机器学习: TensorFlow 的数据读取与TFRecords 格式

    最近学习tensorflow,发现其读取数据的方式看起来有些不同,所以又重新系统地看了一下文档,总得来说,tensorflow 有三种主流的数据读取方式: 1) 传送 (feeding): Pytho ...

  4. 机器学习: TensorFlow with MLP 笑脸识别

    Tensor Flow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数 ...

  5. [OrangePi] Features (the features of Loboris's Images)

    boot0_sdcard.fex, u-boot.fex and kernel (uImage) created from sources kernel built with many feature ...

  6. iOS机器学习-TensorFlow

    人工智能.机器学习都已走进了我们的日常,尤其是愈演愈热的大数据更是跟我们的生活息息相关,做 人工智能.数据挖掘的人在其他人眼中感觉是很高大上的,总有一种遥不可及的感觉,在我司也经常会听到数据科学部的同 ...

  7. Python3机器学习—Tensorflow数字识别实践

    [本文出自天外归云的博客园] Windows下Anaconda+Tensorflow环境部署 1. 安装Anaconda. 2. 开始菜单 > 所有程序 > Anaconda 3 (64- ...

  8. 阿里云机器学习tensorflow实践

    1,前言 伴随人工智能和深度学习的应用越来越普及,越来越多的开发人员开始投入到智能算法的编程中.由于算法成熟且公开,软件编码这一块不存在难度:但模型训练和预测所需的时间与硬件设备的配置有极大关系,很多 ...

  9. 机器学习 TensorFlow 实现智能鉴黄

    前言 最近在做一款图床服务,关注公号的小伙伴一定记得小柒曾说过,会在周末放出的,不好意思放大家鸽子了.之所以一直没敢放出,是因为鉴黄接口一直没调试好,虽然我对公号的小伙伴百分之百信任,奈何互联网鱼龙混 ...

随机推荐

  1. LuoguP3521 [POI2011]ROT-Tree Rotations

    P3521 [POI2011]ROT-Tree Rotations 题目大意: 给一棵\((1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 我们发现 ...

  2. Oracle如何分组排序并产生序号

    SELECT C.ORG_SHORTNAME, B.USER_NAME, ROW_NUMBER () OVER ( PARTITION BY B.ORG_ID ORDER BY A.TOTAL_SCO ...

  3. 僵进程与SIGCHLD信号

    参考: https://www.cnblogs.com/webor2006/p/4014586.html wait()和waitpid()的参数解析:https://blog.csdn.net/csd ...

  4. 修改Samba密码后无法登录

    Samba修改用户名密码后,无法登陆 之后每次进去都是以这样的username和passwd进去的,如何才能使用其他的用户来重新登录samba server呢? 首先使用在开始菜单里面输入cmd: 进 ...

  5. 浅析 Nginx 网络事件

    Nginx 是一个事件驱动的框架,所谓事件主要指的是网络事件,Nginx 每个网络连接会对应两个网络事件,一个读事件一个写事件.在深入了解 Nginx 各种原理及在极端场景下的一些错误场景处理时,需要 ...

  6. 微信小程序map地图的一些使用注意事项

    1.小程序组件map,在微信7.0.4以上(不包括7.0.4)层级问题官方已作更新,可在map上随意添加任何标签使用z-index即可:微信7.0.4版本以下map组件层级默认是最高的,只能使用官方提 ...

  7. Python 多态与抽象类

    一.多态 1.1 什么是多态 多态也称"多态性",指的是同一种类型的事物,不同的形态. 在python中的多态指的是让多种类若具备类似的数据属性与方法属性,都统一好命名规范,这样可 ...

  8. 浅谈Redis的基本原理和数据类型结构的特性和应用开发场景

    一.Redis介绍 1,redis介绍(Redis安装在磁盘:Redis数据存储在内存) redis是一种基于键值对(key-value)数据库,其中value可以为string.hash.list. ...

  9. 【题解】P4091 [HEOI2016/TJOI2016]求和

    [题解]P4091 [HEOI2016/TJOI2016]求和 [P4091 HEOI2016/TJOI2016]求和 可以知道\(i,j\)从\(0\)开始是可以的,因为这个时候等于\(0\).这种 ...

  10. 「学习笔记」ST表

    问题引入 先让我们看一个简单的问题,有N个元素,Q次操作,每次操作需要求出一段区间内的最大/小值. 这就是著名的RMQ问题. RMQ问题的解法有很多,如线段树.单调队列(某些情况下).ST表等.这里主 ...