In [2]:
import os
import tensorflow as tf
import numpy as np

# Check that we have correct TensorFlow version installed
tf_version = tf.__version__
print("TensorFlow version: {}".format(tf_version))
assert "1.5" <= tf_version, "TensorFlow r1.5 or later is needed"


TensorFlow version: 1.5.0

In [4]:
tf.logging.set_verbosity(tf.logging.INFO)

train_file = "classify-train.csv"
test_file = "classify-test.csv"

In [5]:
numerical_feature_names = [
    'PctUnder18',
    'PctOver65',
    'PctFemale',
    'PctWhite',
    'PctBachelors',
    'PctDem',
    'PctGop'
]

feature_columns = [tf.feature_column.numeric_column(k) for k in numerical_feature_names]

def my_input_fn(file_path, repeat_count=200):
    def decode_csv(line):
        parsed_line = tf.decode_csv(line, [[0.],[0.],[0.],[0.],[0.],[0.],[0.],[0.]])
        label = parsed_line[-1]  # Last element is the label
        features = parsed_line[:-1] # Everything but last elements are the features
        d = dict(zip(numerical_feature_names, features)), label
        return d

    dataset = (tf.data.TextLineDataset(file_path)  # Read text file
               .map(decode_csv))  # Transform each elem by applying decode_csv fn
    dataset = dataset.shuffle(buffer_size=256)
    dataset = dataset.repeat(repeat_count)  # Repeats dataset this # times
    dataset = dataset.batch(8)  # Batch size to use
    return dataset

In [6]:
classifier = tf.estimator.LinearClassifier(feature_columns=feature_columns)

# Run training for 20 epochs (20 times through our entire dataset)
# You can experiment with this value for your own dataset
classifier.train(
    input_fn=lambda: my_input_fn(train_file, 20))


INFO:tensorflow:Using default config.
WARNING:tensorflow:Using temporary folder as model directory: /var/folders/1h/g9jk9_kx67d6g0_gyfnvk1n4008m_k/T/tmpk44nbcf2
INFO:tensorflow:Using config: {'_model_dir': '/var/folders/1h/g9jk9_kx67d6g0_gyfnvk1n4008m_k/T/tmpk44nbcf2', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x120a0afd0>, '_task_type': 'worker', '_task_id': 0, '_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Saving checkpoints for 1 into /var/folders/1h/g9jk9_kx67d6g0_gyfnvk1n4008m_k/T/tmpk44nbcf2/model.ckpt.
INFO:tensorflow:loss = 5.5451775, step = 1
INFO:tensorflow:global_step/sec: 570.865
INFO:tensorflow:loss = 0.29437244, step = 101 (0.176 sec)
INFO:tensorflow:global_step/sec: 844.545
INFO:tensorflow:loss = 0.2726082, step = 201 (0.118 sec)
INFO:tensorflow:global_step/sec: 891.569
INFO:tensorflow:loss = 3.9231257, step = 301 (0.112 sec)
INFO:tensorflow:global_step/sec: 728.251
INFO:tensorflow:loss = 0.51435304, step = 401 (0.137 sec)
INFO:tensorflow:global_step/sec: 749.616
INFO:tensorflow:loss = 3.1930523, step = 501 (0.133 sec)
INFO:tensorflow:global_step/sec: 874.407
INFO:tensorflow:loss = 1.5969841, step = 601 (0.114 sec)
INFO:tensorflow:global_step/sec: 819.868
INFO:tensorflow:loss = 0.35173976, step = 701 (0.122 sec)
INFO:tensorflow:global_step/sec: 764.753
INFO:tensorflow:loss = 3.9147635, step = 801 (0.131 sec)
INFO:tensorflow:global_step/sec: 813.749
INFO:tensorflow:loss = 2.1076026, step = 901 (0.123 sec)
INFO:tensorflow:global_step/sec: 860.919
INFO:tensorflow:loss = 2.8540645, step = 1001 (0.116 sec)
INFO:tensorflow:global_step/sec: 840.817
INFO:tensorflow:loss = 0.58483046, step = 1101 (0.119 sec)
INFO:tensorflow:global_step/sec: 851.179
INFO:tensorflow:loss = 1.315016, step = 1201 (0.117 sec)
INFO:tensorflow:global_step/sec: 882.614
INFO:tensorflow:loss = 1.2451642, step = 1301 (0.113 sec)
INFO:tensorflow:global_step/sec: 827.021
INFO:tensorflow:loss = 2.5050027, step = 1401 (0.121 sec)
INFO:tensorflow:global_step/sec: 755.812
INFO:tensorflow:loss = 2.521564, step = 1501 (0.132 sec)
INFO:tensorflow:global_step/sec: 796.628
INFO:tensorflow:loss = 0.8701288, step = 1601 (0.125 sec)
INFO:tensorflow:global_step/sec: 849.192
INFO:tensorflow:loss = 0.68960416, step = 1701 (0.118 sec)
INFO:tensorflow:global_step/sec: 812.176
INFO:tensorflow:loss = 1.3478332, step = 1801 (0.123 sec)
INFO:tensorflow:global_step/sec: 832.119
INFO:tensorflow:loss = 2.1637692, step = 1901 (0.120 sec)
INFO:tensorflow:global_step/sec: 815.56
INFO:tensorflow:loss = 0.41932052, step = 2001 (0.123 sec)
INFO:tensorflow:global_step/sec: 799.355
INFO:tensorflow:loss = 2.4380984, step = 2101 (0.125 sec)
INFO:tensorflow:global_step/sec: 810.78
INFO:tensorflow:loss = 0.1496887, step = 2201 (0.123 sec)
INFO:tensorflow:global_step/sec: 852.31
INFO:tensorflow:loss = 1.1216372, step = 2301 (0.117 sec)
INFO:tensorflow:global_step/sec: 794.951
INFO:tensorflow:loss = 0.6908283, step = 2401 (0.126 sec)
INFO:tensorflow:global_step/sec: 835.584
INFO:tensorflow:loss = 1.3392761, step = 2501 (0.120 sec)
INFO:tensorflow:global_step/sec: 786.533
INFO:tensorflow:loss = 0.7310655, step = 2601 (0.127 sec)
INFO:tensorflow:global_step/sec: 848.776
INFO:tensorflow:loss = 0.8060344, step = 2701 (0.118 sec)
INFO:tensorflow:global_step/sec: 837.765
INFO:tensorflow:loss = 0.13385934, step = 2801 (0.119 sec)
INFO:tensorflow:global_step/sec: 782.093
INFO:tensorflow:loss = 0.22636321, step = 2901 (0.128 sec)
INFO:tensorflow:global_step/sec: 849.018
INFO:tensorflow:loss = 0.8238576, step = 3001 (0.118 sec)
INFO:tensorflow:global_step/sec: 796.554
INFO:tensorflow:loss = 2.2260704, step = 3101 (0.125 sec)
INFO:tensorflow:global_step/sec: 736.251
INFO:tensorflow:loss = 2.3282278, step = 3201 (0.136 sec)
INFO:tensorflow:global_step/sec: 776.194
INFO:tensorflow:loss = 0.28495857, step = 3301 (0.129 sec)
INFO:tensorflow:global_step/sec: 768.958
INFO:tensorflow:loss = 3.2070298, step = 3401 (0.130 sec)
INFO:tensorflow:global_step/sec: 832.881
INFO:tensorflow:loss = 1.5284773, step = 3501 (0.120 sec)
INFO:tensorflow:global_step/sec: 798.871
INFO:tensorflow:loss = 0.3559987, step = 3601 (0.125 sec)
INFO:tensorflow:global_step/sec: 829.696
INFO:tensorflow:loss = 1.2014079, step = 3701 (0.121 sec)
INFO:tensorflow:global_step/sec: 804.724
INFO:tensorflow:loss = 2.766306, step = 3801 (0.124 sec)
INFO:tensorflow:global_step/sec: 800.264
INFO:tensorflow:loss = 1.0233307, step = 3901 (0.125 sec)
INFO:tensorflow:global_step/sec: 828.555
INFO:tensorflow:loss = 1.0765572, step = 4001 (0.121 sec)
INFO:tensorflow:global_step/sec: 834.161
INFO:tensorflow:loss = 0.65881246, step = 4101 (0.120 sec)
INFO:tensorflow:global_step/sec: 810.123
INFO:tensorflow:loss = 1.2197807, step = 4201 (0.123 sec)
INFO:tensorflow:global_step/sec: 826.337
INFO:tensorflow:loss = 2.2669864, step = 4301 (0.121 sec)
INFO:tensorflow:global_step/sec: 715.687
INFO:tensorflow:loss = 1.821552, step = 4401 (0.140 sec)
INFO:tensorflow:global_step/sec: 769.864
INFO:tensorflow:loss = 2.4519372, step = 4501 (0.130 sec)
INFO:tensorflow:global_step/sec: 741.284
INFO:tensorflow:loss = 1.1228801, step = 4601 (0.135 sec)
INFO:tensorflow:global_step/sec: 785.533
INFO:tensorflow:loss = 1.2760054, step = 4701 (0.127 sec)
INFO:tensorflow:global_step/sec: 814.087
INFO:tensorflow:loss = 1.1107497, step = 4801 (0.123 sec)
INFO:tensorflow:global_step/sec: 830.842
INFO:tensorflow:loss = 0.5630184, step = 4901 (0.120 sec)
INFO:tensorflow:global_step/sec: 832.863
INFO:tensorflow:loss = 1.6846699, step = 5001 (0.120 sec)
INFO:tensorflow:global_step/sec: 836.812
INFO:tensorflow:loss = 0.897588, step = 5101 (0.119 sec)
INFO:tensorflow:global_step/sec: 807.005
INFO:tensorflow:loss = 1.0144025, step = 5201 (0.124 sec)
INFO:tensorflow:global_step/sec: 928.506
INFO:tensorflow:loss = 0.19305001, step = 5301 (0.108 sec)
INFO:tensorflow:global_step/sec: 763.539
INFO:tensorflow:loss = 0.6202412, step = 5401 (0.131 sec)
INFO:tensorflow:global_step/sec: 838.088
INFO:tensorflow:loss = 1.4105525, step = 5501 (0.119 sec)
INFO:tensorflow:global_step/sec: 860.675
INFO:tensorflow:loss = 0.6199516, step = 5601 (0.116 sec)
INFO:tensorflow:global_step/sec: 796.527
INFO:tensorflow:loss = 0.034956243, step = 5701 (0.126 sec)
INFO:tensorflow:global_step/sec: 796.019
INFO:tensorflow:loss = 0.9802186, step = 5801 (0.126 sec)
INFO:tensorflow:global_step/sec: 804.448
INFO:tensorflow:loss = 1.5616608, step = 5901 (0.124 sec)
INFO:tensorflow:global_step/sec: 811.477
INFO:tensorflow:loss = 0.26409894, step = 6001 (0.123 sec)
INFO:tensorflow:global_step/sec: 826.153
INFO:tensorflow:loss = 0.759922, step = 6101 (0.121 sec)
INFO:tensorflow:global_step/sec: 819.021
INFO:tensorflow:loss = 0.23053291, step = 6201 (0.122 sec)
INFO:tensorflow:Saving checkpoints for 6250 into /var/folders/1h/g9jk9_kx67d6g0_gyfnvk1n4008m_k/T/tmpk44nbcf2/model.ckpt.
INFO:tensorflow:Loss for final step: 0.61512256.
Out[6]:
<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x120a15eb8>

In [9]:
results = classifier.evaluate(input_fn=lambda: my_input_fn(test_file, 1))

for key in sorted(results):
  print('%s: %s' % (key, results[key]))


INFO:tensorflow:Starting evaluation at 2018-02-22-18:06:33
INFO:tensorflow:Restoring parameters from /var/folders/1h/g9jk9_kx67d6g0_gyfnvk1n4008m_k/T/tmpk44nbcf2/model.ckpt-6250
INFO:tensorflow:Finished evaluation at 2018-02-22-18:06:34
INFO:tensorflow:Saving dict for global step 6250: accuracy = 0.9705882, accuracy_baseline = 0.8888889, auc = 0.99298507, auc_precision_recall = 0.9434167, average_loss = 0.1134358, global_step = 6250, label/mean = 0.11111111, loss = 0.90159357, prediction/mean = 0.14078975
accuracy: 0.9705882
accuracy_baseline: 0.8888889
auc: 0.99298507
auc_precision_recall: 0.9434167
average_loss: 0.1134358
global_step: 6250
label/mean: 0.11111111
loss: 0.90159357
prediction/mean: 0.14078975

In [10]:
# Generate predictions on 3 counties
prediction_input = {
    'PctUnder18': [23.9, 25.7, 10.6],
    'PctOver65': [17.6,24.7,15.8],
    'PctFemale': [50.0,48.5,53.5],
    'PctWhite':[0.965, 0.97, 0.75],
    'PctBachelors':[12.7, 17.0, 49.8],
    'PctDem': [0.3227832512315271, 0.09475032010243278, 0.6346801346801347],
    'PctGop': [0.6545566502463054, 0.8911651728553138, 0.3468013468013468]
}

def test_input_fn():
   dataset = tf.data.Dataset.from_tensors(prediction_input)
   return dataset

# Predict all our prediction_input
pred_results = classifier.predict(input_fn=test_input_fn)

In [11]:
# Actual values for the raw prediction data:
# 1) 23% Clinton (class of 0 for Trump)
# 2) 5% Clinton (class of 0)
# 3) 69% Clinton (class of 1)

# Iterate over predictions on raw data
for pred in enumerate(pred_results):
    print(pred[1]['probabilities'])


INFO:tensorflow:Restoring parameters from /var/folders/1h/g9jk9_kx67d6g0_gyfnvk1n4008m_k/T/tmpk44nbcf2/model.ckpt-6250
[0.9905778  0.00942222]
[9.9971288e-01 2.8714165e-04]
[0.04889648 0.95110345]