TensorFlow特徴工事:feature_column

16312 ワード


TensorFlow 特征工程: feature_column_第1张图片
                                                          ウィーチャットを開いてスキャンして、ウィーチャットの公衆番号に関心を持ちます.  転載は出典を明記してください.http://blog.csdn.net/gamer_gyt  ブログ主ミニブログ:http://weibo.com/234654758  Github:https://github.com/thinkgamer
 
特徴工事:フィーチャーcolumn
多くのモデルを使う時、入力したデータを必要とする特徴工程処理が必要です.最も典型的なのは、one-hot処理、そしてhashドラム缶などの処理です.これらの特徴を簡単に処理するために、テナントflowはいくつかの列の特徴的な工事方法を提供して、使いやすいです.
共通のimport
import tensorflow as tf
from tensorflow.python.estimator.inputs import numpy_io
import numpy as np
import collections
from tensorflow.python.framework import errors
from tensorflow.python.platform import test
from tensorflow.python.training import coordinator
from tensorflow import feature_column

from tensorflow.python.feature_column.feature_column import _LazyBuilder
 
numeric_column
numeric_column(
    key,
    shape=(1,),
    default_value=None,
    dtype=tf.float32,
    normalizer_fn=None
)
  • key:特徴的な名前.つまり対応する列名
  • です.
  • shop:このkeyに対応する特徴のshop.デフォルトは1ですが、例えばone-hotタイプのshopは1ではなく、実際の次元です.つまり、ここはkeyの対応する次元であり、必ずしも1
  • ではない.
  • default_value:使用するデフォルトが存在しないなら
  • normalizer_fn:この特徴における全てのデータを変換する.normalizeを行う必要があるならば、normalizeの関数を使用します.ここではnormalizeに限らず、対数を取るとか、指数を取るとか、どんな変換方法でもいいです.これは単なる変換方法です.
  • 次はnumericにしますcolumnテストのデモは以下の通りです.
    def test_numeric():
        price = {'price': [[1.], [2.], [3.], [4.]]}  # 4   
        builder = _LazyBuilder(price)
    
        def transform_fn(x):
            return x + 2
    
       price_column = feature_column.numeric_column('price', normalizer_fn=transform_fn)
    
        price_transformed_tensor = price_column._get_dense_tensor(builder)
    
        with tf.Session() as session:
            print(session.run([price_transformed_tensor]))
    
        #   input_layer
    
        price_transformed_tensor = feature_column.input_layer(price, [price_column])
    
        with tf.Session() as session:
            print('use input_layer' + '_' * 40)
            print(session.run([price_transformed_tensor]))
    test_numeric()
    [array([[ 3.],
           [ 4.],
           [ 5.],
           [ 6.]], dtype=float32)]
    use input_layer________________________________________
    [array([[ 3.],
           [ 4.],
           [ 5.],
           [ 6.]], dtype=float32)]
    上記の結果から、tranform_fnはすべての数値+2を処理した._を使うLazyBuiderとinpu_layerはそれぞれテストを行いました.効果は同じです.
     
    bucketized_column
    bucketized_column(
        source_column,
        boundaries
    )
    ソレックスcolumn:numericでなければなりません.column
    boundaries:違うバケツです.boundaries=[0.,1.,2.]で発生したbucketは、(-inf,0.),[0.,1.),[1.,2.),and[2.+inf]で、各区間はそれぞれ0,1,2,3を表しています.
    def test_bucketized_column():
        price = {'price': [[5.], [15.], [25.], [35.]]}  # 4   
    
        price_column = feature_column.numeric_column('price')
        bucket_price = feature_column.bucketized_column(price_column, [0, 10, 20, 30, 40])
    
        price_bucket_tensor = feature_column.input_layer(price, [bucket_price])
    
        with tf.Session() as session:
            print(session.run([price_bucket_tensor]))
    test_bucketized_column()
    
    [array([[ 0.,  1.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  1.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  1.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  1.,  0.]], dtype=float32)]
    私たちはドラム缶を見たら、直接にone-hot形式に変換します.
     
    categoricacacal ucolumn-with vocabulary ulist
    categorical_column_with_vocabulary_list(
        key,
        vocabulary_list,
        dtype=None,
        default_value=-1,
        num_oov_buckets=0
    )
  • key:feature名前
  • vocabulary ulist:categoryに対して変換するlist.つまりcategoryリストです.
  • dtype:stringとintだけがサポートされていますが、他のタイプはこの操作ができません.
  • defaultgavalue:vocabulary ulistにないデフォルト値は、num uoovbaucketsは0
  • でなければなりません.
  • num_muoovbauckets:vocabulary_ulistにない値を処理します.0ならdefault_valueを使って充填します.0より大きいなら、len(vocabulary_ulist)、len(vocabulary_ulist)+num_ubroubleの特徴を計算します.
     
    前のnumericと違って、ここで戻ってくるのはまばらなtenssorです.
    def test_categorical_column_with_vocabulary_list():
    
        color_data = {'color': [['R', 'R'], ['G', 'R'], ['B', 'G'], ['A', 'A']]}  # 4   
    
        builder = _LazyBuilder(color_data)
    
        color_column = feature_column.categorical_column_with_vocabulary_list(
            'color', ['R', 'G', 'B'], dtype=tf.string, default_value=-1
        )
    
        color_column_tensor = color_column._get_sparse_tensors(builder)
    
        with tf.Session() as session:
            session.run(tf.global_variables_initializer())
            session.run(tf.tables_initializer())
            print(session.run([color_column_tensor.id_tensor]))
            #        dense,   one-hot  ,  multi-hot
          color_column_identy = feature_column.indicator_column(color_column)
    
        color_dense_tensor = feature_column.input_layer(color_data, [color_column_identy])
    
        with tf.Session() as session:
            session.run(tf.global_variables_initializer())
    
            session.run(tf.tables_initializer())
    
            print('use input_layer' + '_' * 40)
            print(session.run([color_dense_tensor]))
    test_categorical_column_with_vocabulary_list()
    [SparseTensorValue(indices=array([[0, 0],
           [0, 1],
           [1, 0],
           [1, 1],
           [2, 0],
           [2, 1],
           [3, 0],
           [3, 1]]), values=array([ 0,  0,  1,  0,  2,  1, -1, -1]), dense_shape=array([4, 2]))]
    use input_layer________________________________________
    [array([[ 2.,  0.,  0.],
           [ 1.,  1.,  0.],
           [ 0.,  1.,  1.],
           [ 0.,  0.,  0.]], dtype=float32)]
    categoricalCaucolumnuwithwary cuulistにとって返ってきたのは、sparserchutensorです.idu-utensorはこれが有効で、もう一つはNoneです.線形モデルにとってはsparsercuntensorを直接使用することができます.しかし、深さモデルにとってはsparserをdenstroleに変換する必要があります.の役割は、categoryから生まれたsparser tenserをdense tensに変換することです.
     
    注意: 
  •  input_layer:dense tenssorだけを受け入れます. 
  • テーブルス・アイェイェイ:sparserの時に使うもので、初期化を行わないとTable not initializedが現れます.
    categoricacal ucolumn withuhash baucket
    categorical_column_with_hash_bucket(
        key,
        hash_bucket_size,
        dtype=tf.string
    )
    categoryの数が多いと、指定されたcategoryを使って処理することができなくなります.このようなハッシュバケットを使って処理することができます.たとえば、単語を切った後の文は、このような方法で処理することができます.categoricalunwathuvocabury fileを使うのもいい選択です.hashubucketにとって、bucketusizeの選択は問題です.
    def test_categorical_column_with_hash_bucket():
    
        color_data = {'color': [['R'], ['G'], ['B'], ['A']]}  # 4   
    
        builder = _LazyBuilder(color_data)
    
        color_column = feature_column.categorical_column_with_hash_bucket('color', 7)
    
        color_column_tensor = color_column._get_sparse_tensors(builder)
    
        with tf.Session() as session:
            session.run(tf.global_variables_initializer())
    
            session.run(tf.tables_initializer())
    
            print(session.run([color_column_tensor.id_tensor]))
    
        #        dense,   one-hot  ,  multi-hot
        color_column_identy = feature_column.indicator_column(color_column)
    
        color_dense_tensor = feature_column.input_layer(color_data, [color_column_identy])
    
        with tf.Session() as session:
            session.run(tf.global_variables_initializer())
    
            session.run(tf.tables_initializer())
    
            print('use input_layer' + '_' * 40)
            print(session.run([color_dense_tensor]))
    test_categorical_column_with_hash_bucket()
    [SparseTensorValue(indices=array([[0, 0],
           [1, 0],
           [2, 0],
           [3, 0]]), values=array([5, 2, 6, 3]), dense_shape=array([4, 1]))]
    use input_layer________________________________________
    [array([[ 0.,  0.,  0.,  0.,  0.,  1.,  0.],
           [ 0.,  0.,  1.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  1.],
           [ 0.,  0.,  0.,  1.,  0.,  0.,  0.]], dtype=float32)]
    
    上から見ると、このhash分け樽の選び方はとても重要です.今は3を選んで、RとBにとっては強烈な面に分けます.GとAは1つの中に入れます.hashausize=7をテストすると、R G B Aはそれぞれの桶に分けられています.値が大きいほど正確な分け桶になります.
    [SparseTensorValue(indices=array([[0, 0],
           [1, 0],
           [2, 0],
           [3, 0]]), values=array([5, 2, 6, 3]), dense_shape=array([4, 1]))]
    use input_layer________________________________________
    [array([[ 0.,  0.,  0.,  0.,  0.,  1.,  0.],
           [ 0.,  0.,  1.,  0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  1.],
           [ 0.,  0.,  0.,  1.,  0.,  0.,  0.]], dtype=float32)
    categoricacacal ucolumn_withuidentity
    categorical_column_with_identity(
        key,
        num_buckets,
        default_value=None
    )
    これは連続する数字類の処理関数です.例えば、idは全部で10000個あるので、このような方式が使えます.しかし、多く使われていないなら、categorical ucolumnuwith baucketを使って再処理したほうがいいです.
     
    embeddinggghucolumn
    embedding_column(
        categorical_column,
        dimension,
        combiner='mean',
        initializer=None,
        ckpt_to_load_from=None,
        tensor_name_in_ckpt=None,
        max_norm=None,
        trainable=True
    )
  • categoricalcoolumn:categoryicalucolumnを使用して生成されたsparsor column
  • dimension:embeddingを定義する次元
  • cobiner:複数のentriesについての導出.デフォルトはmeamですが、sqrtnはワードバックモデルの中で、より良い精度があります.
  • initializer:初期化方法で、デフォルトではガウス分布を使用して
  • を初期化する.
  • tenssorcuunameuin uckpt:check pointから
  • を回復することができます.
  • ckpt-check point fileは、tenssor-unameuin uckptが空でない場合に設定された
  • です.
  • max norm:デフォルトはl 2
  • です.
  • trinable:訓練できるかどうかは、デフォルトはtrue
  • です.
     
    sparsor tense tenssorをdense tensに変換します.DNNの入力にdense tens.embeddingを使う必要があります.共用するなら、必要なのはnameです.
    def test_embedding():
        color_data = {'color': [['R'], ['G'], ['B'], ['A']]}  # 4   
    
        color_column = feature_column.categorical_column_with_vocabulary_list(
            'color', ['R', 'G', 'B'], dtype=tf.string, default_value=-1
        )
    
        color_embeding = feature_column.embedding_column(color_column, 8)
        color_embeding_dense_tensor = feature_column.input_layer(color_data, [color_embeding])
    
        with tf.Session() as session:
            session.run(tf.global_variables_initializer())
    
            session.run(tf.tables_initializer())
    
            print('embeding' + '_' * 40)
            print(session.run([color_embeding_dense_tensor]))
    test_embedding()
    embeding________________________________________
    [array([[-0.38754427,  0.00133941,  0.22987399,  0.10634357,  0.60504574,
             0.09730898, -0.26186299,  0.37433708],
           [-0.11320268,  0.0495495 ,  0.45014769,  0.18113135,  0.07382802,
            -0.18399857, -0.42906326, -0.4881283 ],
           [ 0.45096871, -0.22977889, -0.28710714, -0.10303244, -0.34233567,
             0.06112694,  0.11003948,  0.08152663],
           [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
             0.        ,  0.        ,  0.        ]], dtype=float32)]
    いずれも8次元のデータに変換され、ガウス分布を使用して初期化されます.Aはcatergoricalcoolumnに現れていないので、0を使って初期化されました.
     
    weighttedit gorical ucolum
    weighted_categorical_column(
        categorical_column,
        weight_feature_key,
        dtype=tf.float32
    )
    categoricalcoolumnのために重みを与えます.デフォルトのcategoricacacalcoucolumnでは、すべての重みは同じですが、時には同じ組のcategory ucolumnに対して異なるcategoryの重みが異なります.例えば、「テキスト」を使うと、(の重みは)違います.
    def test_weighted_categorical_column():
        color_data = {'color': [['R'], ['G'], ['B'], ['A']],
                      'weight': [[1.0], [2.0], [4.0], [8.0]]}  # 4   
    
        color_column = feature_column.categorical_column_with_vocabulary_list(
            'color', ['R', 'G', 'B'], dtype=tf.string, default_value=-1
        )
    
        color_weight_categorical_column = feature_column.weighted_categorical_column(color_column, 'weight')
    
        builder = _LazyBuilder(color_data)
    
        with tf.Session() as session:
            id_tensor, weight = color_weight_categorical_column._get_sparse_tensors(builder)
    
            session.run(tf.global_variables_initializer())
    
            session.run(tf.tables_initializer())
    
            print('weighted categorical' + '-' * 40)
    
            print(session.run([id_tensor]))
            print('-' * 40)
            print(session.run([weight]))
    test_weighted_categorical_column()
    weighted categorical----------------------------------------
    [SparseTensorValue(indices=array([[0, 0],
           [1, 0],
           [2, 0],
           [3, 0]]), values=array([ 0,  1,  2, -1]), dense_shape=array([4, 1]))]
    ----------------------------------------
    [SparseTensorValue(indices=array([[0, 0],
           [1, 0],
           [2, 0],
           [3, 0]]), values=array([ 1.,  2.,  4.,  8.], dtype=float32), dense_shape=array([4, 1]))]
    ウェットというテナントも存在しています.前の他のcategoricalucolumにはweightは存在しません.
    ラインナップ
    linear_model(
        features,
        feature_columns,
        units=1,
        sparse_combiner='sum',
        weight_collections=None,
        trainable=True
    )
    すべての特徴に対して線形重み付け動作を行う.
    def get_linear_model_bias():
        with tf.variable_scope('linear_model', reuse=True):
            return tf.get_variable('bias_weights')
    
    
    def get_linear_model_column_var(column):
        return tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,
                                 'linear_model/' + column.name)[0]
    
    
    def test_linear_model():
        """
              
        :return:
        """
    
        featrues = {
            'price': [[1.0], [5.0], [10.0]],
            'color': [['R'], ['G'], ['B']]
        }
    
        price_column = feature_column.numeric_column('price')
        color_column = feature_column.categorical_column_with_vocabulary_list('color',
                                                                              ['R', 'G', 'B'])
        prediction = feature_column.linear_model(featrues, [price_column, color_column])
    
        bias = get_linear_model_bias()
        price_var = get_linear_model_column_var(price_column)
        color_var = get_linear_model_column_var(color_column)
    
        with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())
            sess.run(tf.local_variables_initializer())
            sess.run(tf.tables_initializer())
    
            sess.run(bias.assign([7.0]))
            sess.run(price_var.assign([[10.0]]))
            sess.run(color_var.assign([[2.0], [2.0], [2.0]]))
    
            predication_result = sess.run([prediction])
    
            print(predication_result)
    test_linear_model()
    [array([[  19.],
           [  59.],
           [ 109.]], dtype=float32)]
    crosseducolumn
    組み合わせの特徴は、これはsparserの特徴にのみ適用されます.生成されたのは依然としてsparsorの特徴です.
    def test_crossed_column():
        """
        crossed column  
        :return:
        """
        featrues = {
            'price': [['A', 'A'], ['B', 'D'], ['C', 'A']],
            'color': [['R', 'R'], ['G', 'G'], ['B', 'B']]
        }
    
        price = feature_column.categorical_column_with_vocabulary_list('price',
                                                                       ['A', 'B', 'C', 'D'])
        color = feature_column.categorical_column_with_vocabulary_list('color',
                                                                       ['R', 'G', 'B'])
        p_x_c = feature_column.crossed_column([price, color], 16)
    
        p_x_c_identy = feature_column.indicator_column(p_x_c)
    
        p_x_c_identy_dense_tensor = feature_column.input_layer(featrues, [p_x_c_identy])
    
        with tf.Session() as session:
            session.run(tf.global_variables_initializer())
    
            session.run(tf.tables_initializer())
    
            print('use input_layer' + '_' * 40)
            print(session.run([p_x_c_identy_dense_tensor]))
    test_crossed_column()
    use input_layer________________________________________
    [array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  4.,  0.,  0.,  0.,  0.,
             0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  2.,  0.,  0.,  0.,  0.,  2.,  0.,  0.,  0.,
             0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  2.,  0.,
             0.,  2.,  0.]], dtype=float32)]