• 概述

这一节主要介绍一下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. 【土旦】vue 解决ios H5底部输入框 获取焦点时弹出虚拟键盘挡住输入框 以及监听键盘收起事件

    问题描述 im聊天H5页面,在iOS系统下,inpu获取焦点弹出系统虚拟键盘时,会出现挡住input的情况,十分影响用户体验. bug图 解决方法: html: <input type=&quo ...

  2. CodeForces 906D (欧拉降幂)

    Power Tower •题意 求$w_{l}^{w_{l+1}^{w_{l+2}^{w_{l+3}^{w_{l+4}^{w_{l+5}^{...^{w_{r}}}}}}}}$ 对m取模的值 •思路 ...

  3. docker安装,和虚拟机区别

    docker安装 1 在 CentOS 6.4 上安装 docker docker当前官方只支持Ubuntu,所以在 CentOS 安装Docker比较麻烦(Issue #172). docker官方 ...

  4. Java 学习笔记(3)——函数

    之前的几篇文章中,总结了java中的基本语句和基本数据类型等等一系列的最基本的东西,下面就来说说java中的函数部分 函数基础 在C/C++中有普通的全局函数.类成员函数和类的静态函数,而java中所 ...

  5. Team Foundation Server 2015使用教程【5】:默认团队checkin权限修改

  6. C++虚继承初识

    struct Employee { ... }; struct Manager : Employee { ... }; struct Worker : Employee { ... }; struct ...

  7. 记一次线上 OOM 和性能优化

    大家好,我是鸭血粉丝(大家会亲切的喊我 「阿粉」),是一位喜欢吃鸭血粉丝的程序员,回想起之前线上出现 OOM 的场景,毕竟当时是第一次遇到这么 紧脏 的大事,要好好记录下来. 1 事情回顾 在某次周五 ...

  8. vue-awesome-swiper手动滑动后不再自动轮播的问题

    <swiper :options="swiperOption" ref="mySwiper" > <!--轮播图内容--> </s ...

  9. Win10系统服务器搭建--服务器管理

    Win10系统中的Web服务器是什么? 在局域网中进行资源共享,以便Win10使用者时刻都能将个人数据传达服务器端中,快速执行数据的同步. 如何搭建Web服务器呢? 我分享的第二种解决Web服务器怎样 ...

  10. InnoDB索引实现原理以及注意点和建议

    一.InnoDB实现原理 虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同.因为InnoDB支持聚簇索引(主键索引),聚簇索引就是表,所以InnoDB不用像MyI ...