TypeError: Expected binary or unicode string, got [
You should use a built-in function for train_input_fn instead of writing your own. For example: 

train_input_fn = tf.estimator.inputs.numpy_input_fn(
    x={"x": np.array(training_set.data)},
    y=np.array(training_set.target),
    num_epochs=None,
    shuffle=True)


There is a complete example in the TensorFlow documentation here.