机器学习-TensorFlow应用之 binned features, Cross features和optimizer
- 概述
这一节主要介绍一下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的更多相关文章
- 机器学习tensorflow框架初试
本文来自网易云社区 作者:汪洋 前言 新手学习可以点击参考Google的教程.开始前,我们先在本地安装好 TensorFlow机器学习框架. 首先我们在本地window下安装好python环境,约定安 ...
- 机器学习-TensorFlow建模过程 Linear Regression线性拟合应用
TensorFlow是咱们机器学习领域非常常用的一个组件,它在数据处理,模型建立,模型验证等等关于机器学习方面的领域都有很好的表现,前面的一节我已经简单介绍了一下TensorFlow里面基础的数据结构 ...
- 机器学习: TensorFlow 的数据读取与TFRecords 格式
最近学习tensorflow,发现其读取数据的方式看起来有些不同,所以又重新系统地看了一下文档,总得来说,tensorflow 有三种主流的数据读取方式: 1) 传送 (feeding): Pytho ...
- 机器学习: TensorFlow with MLP 笑脸识别
Tensor Flow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数 ...
- [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 ...
- iOS机器学习-TensorFlow
人工智能.机器学习都已走进了我们的日常,尤其是愈演愈热的大数据更是跟我们的生活息息相关,做 人工智能.数据挖掘的人在其他人眼中感觉是很高大上的,总有一种遥不可及的感觉,在我司也经常会听到数据科学部的同 ...
- Python3机器学习—Tensorflow数字识别实践
[本文出自天外归云的博客园] Windows下Anaconda+Tensorflow环境部署 1. 安装Anaconda. 2. 开始菜单 > 所有程序 > Anaconda 3 (64- ...
- 阿里云机器学习tensorflow实践
1,前言 伴随人工智能和深度学习的应用越来越普及,越来越多的开发人员开始投入到智能算法的编程中.由于算法成熟且公开,软件编码这一块不存在难度:但模型训练和预测所需的时间与硬件设备的配置有极大关系,很多 ...
- 机器学习 TensorFlow 实现智能鉴黄
前言 最近在做一款图床服务,关注公号的小伙伴一定记得小柒曾说过,会在周末放出的,不好意思放大家鸽子了.之所以一直没敢放出,是因为鉴黄接口一直没调试好,虽然我对公号的小伙伴百分之百信任,奈何互联网鱼龙混 ...
随机推荐
- CF1151div2(Round 553)
CF1151div2(Round 553) 思路题大赛 A 少考虑了一种情况,到死没想到 B 貌似我随机化50000次,没找到就无解貌似也过了 感觉随随便便乱搞+分类讨论都可以过的样子 #includ ...
- 驳“C语言已经死了”
http://blog.csdn.net/xushiweizh/article/details/1476422
- 泛圈科技Yottachain区块链云存储打破传统云迎来价值数据存储
随着物联网时代的发展,更多的数据随之产生.从智能设备到电脑再到视频游戏机,各种各样的信息从不同的电子产品源源不断地涌入.通常,人们将数据存储在本地驱动器中.但是,由于产生的数据量是无限的,超过了本地存 ...
- mysql中information_schema.schemata字段说明
1. 获取所有数据库信息(SCHEMATA) show databases; 查看用户下所有数据库信息:SCHEMATA表:提供了关于数据库中的库的信息.详细表述了某个库的名称,默认编码,排序规则.各 ...
- 异常 A component named TableViewForm already exists 解决方法
用navicate连接mysql,打开数据库表格,出现 A component named TableViewForm already exists 异常信息,如下图: 1.异常原因: 打开的表格数 ...
- Python 类的常用内置方法
类的内置方法(魔法方法): 凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,类的内置方法,会在满足某种条件下自动触发. 1.1__new__ __new__:在___init__触发前, ...
- $CH5105\ Cookies$ 线性$DP+$贪心
CH 是很有趣的一道题 : ) Sol 第一反应就是f[i][j]表示前i个小朋友分j块饼干的最小怨气值 但是一个孩子所产生的怨气值并不固定,它与其他孩子获得饼干的情况有关 这里可以用到一个贪心,就是 ...
- j接近50道经典SQL练习题,附建表SQL解题SQL
说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...
- 用ES5实现ES6的数组方法map
先举个常见的栗子: var arr = [1,2,3,4,6,7,8,9,12,3,25,63,100] var arr2 = arr.map(item => item += 1) consol ...
- 彻底掌握CORS跨源资源共享
本文来自于公众号链接: 彻底掌握CORS跨源资源共享 ) 本文接上篇公众号文章:彻底理解浏览器同源策略SOP 一.概述 在云时代,各种SAAS应用层出不穷,各种互联网API接口越来越丰富,H5技术在微 ...