从DataFrame自动化特征抽取的尝试

前言

虽然提供了很多Estimator/Transformer, 正如这篇文章所显示的,如何基于SDL+TensorFlow/SK-Learn开发NLP程序,处理的代码依然是很多的,能不能进一步简化呢?其实还是有办法的。我们先来看个示例。

示例代码

我Fork了 Spark-Deep-Learning,并且在他的基础上做了一些开发,具体参看release分支。编译和使用参考这篇文章如何基于SDL+TensorFlow/SK-Learn开发NLP程序

        documentDF = self.session.createDataFrame([
            ("Hi I heard about Spark", "Hi I heard about Spark", 2.0, 3.0, 1, 2),
            ("I wish Java could use case classes", "I wish Java could use case classes", 3.0, 4.0, 0, 4),
            ("Logistic regression models are neat", "Logistic regression models are neat", 4.0, 5.0, 2, 5)
        ], ["title", "body", "f1", "f2", "preds", "i1"])      
        ef = EasyFeature(numFeatures=10, outputCol="features", wordMode="tfidf",
                         discretizerFields={"f1": 2})
        df = ef.transform(documentDF)
        df.select("features").show(truncate=False)

运行结果是:

WX20171106-200458.png

我们看到,EasyFeature生成了一个20009维的向量,那么他是如何怎么产生的呢?EasyFeature是根据什么原理去生成这个向量的呢?

如果你把wordMode 设置为 embdding,这个时候,会额外有两个字段title_text_ EasyFeature, body_text__EasyFeature,他们是一串数字序列,主要是为了方便给CNN/LSTM等算法使用,其他字段会被拼接成features字段。

设计原理

为了实现自动特征化,核心是四点:类型,规则,统计,先验。

类型

所谓类型指的是Spark DataFrame 的数据是强类型的,常见类型有String,Int, Double, Float, Array, VectorUDF等,他们其实可以给我们提供一定的信息,比如String一般而言有两种可能性:

  1. 需要分词的字段,一般而言会转化tf/idf 或者word sequence(LSTM/CNN)形式。
  2. 不需要分词的字段,一般其实就是分类字段。

Int 我们可以求一个distinct值,如果很少,很可能是一个分类字段,比如性别,年龄等。Double,Float等则可能是连续的,比如可能是金额等。

规则

字段的名字也能给我们一定的启发,通常如果类型是String,并且名字还是title,body,sentence,summary之类的,一般是需要分词的字段。Int类型而且还是age,gender之类的名字,则必定是个分类字段。在类型的基础上,让我们更好的确认,该如何特征化某个字段。

统计

当规则无法给我们帮助时,我们仅仅知道某个字段是一个int,我们该怎么办,这个时候统计就起作用了,如果某个字段只有少数几个类型,比如性别,我恩统计只有两种可能性,这么少的可能性,那我们就可以对待为分类属性,可以进行one-hot化了。如果发现有几十万个种类,可能就是售价之类的,那么就自然当做连续值即可,当时我们可以做一些缺失值处理。

先验

当然,我们可以通过人工干预,比如明确告知系统哪些是需要分词的字段,哪些是字段需要离散化,这些作为系统的先验知识。系统自动识别这种规则,然后自动进行处理,你唯一需要做的就是告知哪些字段要做什么处理。

目前的规则集

EasyFeature 是主要是利用周末开始开发的,所以还有待完善,尤其是其中的规则,需要大量有经验的算法工程师参与进来,提供更好的规则,从而更好的自动化抽取特征。目前EasyFeature的处理方式为:

  1. 把所有字段分成 整数类型,浮点类型,字符类型
  2. 对浮点类型做缺失值处理
  3. 对整数做分类和连续值的区分,分类的会被做one-hot化处理
  4. 对字符类型区分为分词和不分词。不分词会转化为分类字段,分词根据配置,会转化为tf/idf vector或者word sequence & word embedding形态。如果是word sequence/word embedding,则不会拼接到最后的输出字段中。
  5. 用户可以指定哪些字段进行离散化处理
  6. 拼接所有字段,形成最后的feature

作用

可以毫不费劲的就把算法跑起来,从而看到基准线在哪,如果觉得不满意,你可以通过内置的先验系统告知系统应该对哪些字段做哪些处理,也就是进行tunning.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容