From a9e8768274350cf5308c42a95e035addf1cfed2e Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Mon, 11 Jul 2016 08:15:39 -0800 Subject: [PATCH] Support weighted sparse column in sdca optimizer. Change: 127093435 --- .../python/learn/estimators/linear_test.py | 27 +++++++++++++++++++ .../python/learn/estimators/sdca_optimizer.py | 11 ++++++++ 2 files changed, 38 insertions(+) diff --git a/tensorflow/contrib/learn/python/learn/estimators/linear_test.py b/tensorflow/contrib/learn/python/learn/estimators/linear_test.py index b9e87fbacf9..1215ce37286 100644 --- a/tensorflow/contrib/learn/python/learn/estimators/linear_test.py +++ b/tensorflow/contrib/learn/python/learn/estimators/linear_test.py @@ -203,6 +203,33 @@ class LinearClassifierTest(tf.test.TestCase): scores = classifier.evaluate(input_fn=input_fn, steps=2) self.assertGreater(scores['accuracy'], 0.9) + def testSdcaOptimizerWeightedSparseFeatures(self): + """LinearClasssifier with SDCAOptimizer and weighted sparse features.""" + + def input_fn(): + return { + 'example_id': tf.constant(['1', '2', '3']), + 'price': tf.SparseTensor(values=[2., 3., 1.], + indices=[[0, 0], [1, 0], [2, 0]], + shape=[3, 5]), + 'country': tf.SparseTensor(values=['IT', 'US', 'GB'], + indices=[[0, 0], [1, 0], [2, 0]], + shape=[3, 5]) + }, tf.constant([[1], [0], [1]]) + + country = tf.contrib.layers.sparse_column_with_hash_bucket( + 'country', hash_bucket_size=5) + country_weighted_by_price = tf.contrib.layers.weighted_sparse_column( + country, 'price') + sdca_optimizer = tf.contrib.learn.SDCAOptimizer( + example_id_column='example_id') + classifier = tf.contrib.learn.LinearClassifier( + feature_columns=[country_weighted_by_price], + optimizer=sdca_optimizer) + classifier.fit(input_fn=input_fn, steps=50) + scores = classifier.evaluate(input_fn=input_fn, steps=2) + self.assertGreater(scores['accuracy'], 0.9) + def testSdcaOptimizerCrossedFeatures(self): """Tests LinearClasssifier with SDCAOptimizer and crossed features.""" diff --git a/tensorflow/contrib/learn/python/learn/estimators/sdca_optimizer.py b/tensorflow/contrib/learn/python/learn/estimators/sdca_optimizer.py index 093c5d9875c..948645d0e65 100644 --- a/tensorflow/contrib/learn/python/learn/estimators/sdca_optimizer.py +++ b/tensorflow/contrib/learn/python/learn/estimators/sdca_optimizer.py @@ -124,6 +124,17 @@ class SDCAOptimizer(object): column.length) sparse_features.append(math_ops.to_float(sparse_features_tensor)) sparse_features_weights.append(columns_to_variables[column][0]) + elif isinstance( + column, + layers.feature_column._WeightedSparseColumn): # pylint: disable=protected-access + id_tensor = column.id_tensor(transformed_tensor) + weight_tensor = column.weight_tensor(transformed_tensor) + sparse_features_tensor = sparse_ops.sparse_merge( + id_tensor, weight_tensor, column.length, + name="{}_sparse_merge".format(column.name)) + sparse_features.append(math_ops.to_float( + sparse_features_tensor, name="{}_to_float".format(column.name))) + sparse_features_weights.append(columns_to_variables[column][0]) else: raise ValueError("SDCAOptimizer does not support column type %s." % type(column).__name__) -- GitLab