• 概述

这一节主要介绍一下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. java 环境 笔记

    1. 下载idea https://blog.csdn.net/yl1712725180/article/details/80309862   破解方法:                   针对20 ...

  2. 查看虚拟机里的Centos7的IP(设置centos网卡)

    这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用 ...

  3. Channel 9视频整理【4】

    Eric ShangKuan 目前服務於台灣微軟,擔任技術傳教士 (Technical Evangelist) 一職,網路上常用的 ID 為 ericsk,對於各項開發技術如:Web.Mobile.A ...

  4. SQL SQL Index SEEK VS Lookup

    SEEK - find everything from index Lookup - find key from index, then visit table to find other row d ...

  5. SpringBoot-Swagger整合zuul智能列表

    SpringBoot-Swagger整合zuul智能列表 简介 可能大家都有用过swagger,可以通过ui页面显示接口信息,快速和前端进行联调. 现在基本都是多模块微服务化,每个服务都有这样的ui页 ...

  6. python类方法、类属性和静态方法

    class Game(object): #类属性 num = 0 #实例方法 def __init__(self): #实例属性 self.name = "laowang" #类方 ...

  7. Python网络编程笔记一

    AF_INET:IPV4 AF_INET6:IPV6 套接字类型: SOCK_STREAM:TCP SOCK_DGRAM:UDP 创建TCP套接字,也可以不传递参数,默认创建TCP套接字 tcpSoc ...

  8. requests爬取豆瓣top250电影信息

    ''' 1.爬取豆瓣top250电影信息 - 第一页: https://movie.douban.com/top250?start=0&filter= - 第二页: https://movie ...

  9. 在加权无向图上求出一条从1号结点到N号结点的路径,使路径上第K+1大的边权尽量小

    二分+最短路算法 #include<cstdio> #include<iostream> #include<cstring> #include<algorit ...

  10. 在springboot环境下tk-mybatis的使用记录

    1. 新建springboot工程 访问https://start.spring.io/,新建一个springboot工程. 自动生成的工程主要的注意点如下: 1)pom.xml <parent ...