# Copyright 2016 The TensorFlow Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # ============================================================================== """Linear regression using the LinearRegressor Estimator.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import argparse import numpy as np import tensorflow as tf import automobile_data parser = argparse.ArgumentParser() parser.add_argument('--batch_size', default=100, type=int, help='batch size') parser.add_argument('--train_steps', default=1000, type=int, help='number of training steps') parser.add_argument('--price_norm_factor', default=1000., type=float, help='price normalization factor') def from_dataset(ds): return lambda: ds.make_one_shot_iterator().get_next() def main(argv): """Builds, trains, and evaluates the model.""" args = parser.parse_args(argv[1:]) (train_x,train_y), (test_x, test_y) = automobile_data.load_data() train_y /= args.price_norm_factor test_y /= args.price_norm_factor # Build the training dataset. train = ( automobile_data.make_dataset(train_x, train_y) # Shuffling with a buffer larger than the data set ensures # that the examples are well mixed. .shuffle(1000).batch(args.batch_size) # Repeat forever .repeat()) # Build the validation dataset. test = automobile_data.make_dataset(test_x, test_y).batch(args.batch_size) feature_columns = [ # "curb-weight" and "highway-mpg" are numeric columns. tf.feature_column.numeric_column(key="curb-weight"), tf.feature_column.numeric_column(key="highway-mpg"), ] # Build the Estimator. model = tf.estimator.LinearRegressor(feature_columns=feature_columns) # Train the model. # By default, the Estimators log output every 100 steps. model.train(input_fn=from_dataset(train), steps=args.train_steps) # Evaluate how the model performs on data it has not yet seen. eval_result = model.evaluate(input_fn=from_dataset(test)) # The evaluation returns a Python dictionary. The "average_loss" key holds the # Mean Squared Error (MSE). average_loss = eval_result["average_loss"] # Convert MSE to Root Mean Square Error (RMSE). print("\n" + 80 * "*") print("\nRMS error for the test set: ${:.0f}" .format(args.price_norm_factor * average_loss**0.5)) # Run the model in prediction mode. input_dict = { "curb-weight": np.array([2000, 3000]), "highway-mpg": np.array([30, 40]) } predict = automobile_data.make_dataset(input_dict).batch(1) predict_results = model.predict(input_fn=from_dataset(predict)) # Print the prediction results. print("\nPrediction results:") for i, prediction in enumerate(predict_results): msg = ("Curb weight: {: 4d}lbs, " "Highway: {: 0d}mpg, " "Prediction: ${: 9.2f}") msg = msg.format(input_dict["curb-weight"][i], input_dict["highway-mpg"][i], args.price_norm_factor * prediction["predictions"][0]) print(" " + msg) print() if __name__ == "__main__": # The Estimator periodically generates "INFO" logs; make these logs visible. tf.logging.set_verbosity(tf.logging.INFO) tf.app.run(main=main)