Hướng dẫn hồi quy tuyến tính với TensorFlow [Ví dụ]

Hồi quy tuyến tính là gì?

linear Regression là một cách tiếp cận trong thống kê để mô hình hóa mối quan hệ giữa hai biến. Mô hình này được thực hiện giữa phản ứng vô hướng và một hoặc nhiều biến giải thích. Mối quan hệ với một biến giải thích được gọi là hồi quy tuyến tính đơn giản và đối với nhiều biến giải thích, nó được gọi là hồi quy tuyến tính bội.

TensorFlow cung cấp các công cụ để có toàn quyền kiểm soát việc tính toán. Việc này được thực hiện bằng API cấp thấp. Trên hết, TensorFlow được trang bị rất nhiều API để thực hiện nhiều học máy thuật toán. Đây là API cấp cao. TensorFlow gọi chúng là công cụ ước tính

  • API cấp thấp: Xây dựng kiến ​​trúc, tối ưu hóa mô hình từ đầu. Nó phức tạp đối với người mới bắt đầu
  • API cấp cao: Xác định thuật toán. Nó dễ sử dụng hơn. TensorFlow cung cấp một hộp công cụ được gọi là người ước tính để xây dựng, đào tạo, đánh giá và đưa ra dự đoán.

Trong hướng dẫn này, bạn sẽ sử dụng chỉ công cụ ước tính. Việc tính toán nhanh hơn và dễ thực hiện hơn. Phần đầu tiên của hướng dẫn giải thích cách sử dụng trình tối ưu hóa giảm độ dốc để huấn luyện hồi quy tuyến tính trong TensorFlow. Trong phần thứ hai, bạn sẽ sử dụng tập dữ liệu Boston để dự đoán giá một ngôi nhà bằng công cụ ước tính TensorFlow.

Tải xuống Bộ dữ liệu Boston

Cách huấn luyện mô hình hồi quy tuyến tính

Trước khi bắt đầu đào tạo mô hình, chúng ta hãy xem hồi quy tuyến tính là gì.

Hãy tưởng tượng bạn có hai biến x và y và nhiệm vụ của bạn là dự đoán giá trị của biết giá trị của . Nếu bạn vẽ biểu đồ dữ liệu, bạn có thể thấy mối quan hệ tích cực giữa biến độc lập x và biến phụ thuộc y.

Huấn luyện mô hình hồi quy tuyến tính

Bạn có thể quan sát thấy, nếu x=1,y sẽ gần bằng 6 và nếu x=2,y sẽ ở khoảng 8.5.

Đây không phải là phương pháp có độ chính xác cao và dễ xảy ra lỗi, đặc biệt với tập dữ liệu có hàng trăm nghìn điểm.

Hồi quy tuyến tính được đánh giá bằng một phương trình. Biến y được giải thích bởi một hoặc nhiều hiệp phương sai. Trong ví dụ của bạn, chỉ có một biến phụ thuộc. Nếu bạn phải viết phương trình này, nó sẽ là:

Huấn luyện mô hình hồi quy tuyến tính

Với:

  • Hồi quy tuyến tính với TensorFlow là sự thiên vị. tức là nếu x=0, y=Huấn luyện mô hình hồi quy tuyến tính
  • Huấn luyện mô hình hồi quy tuyến tính là trọng lượng liên quan đến x
  • Huấn luyện mô hình hồi quy tuyến tính là phần dư hoặc sai số của mô hình. Nó bao gồm những gì mô hình không thể học được từ dữ liệu

Hãy tưởng tượng bạn phù hợp với mô hình và tìm ra giải pháp sau cho:

  • Huấn luyện mô hình hồi quy tuyến tính = 3.8
  • Huấn luyện mô hình hồi quy tuyến tính = 2.78

Bạn có thể thay thế những số đó vào phương trình và nó sẽ trở thành:

y= 3.8 + 2.78x

Bây giờ bạn có một cách tốt hơn để tìm các giá trị cho y. Nghĩa là, bạn có thể thay thế x bằng bất kỳ giá trị nào bạn muốn dự đoán y. Trong hình ảnh bên dưới, chúng ta đã thay thế x trong phương trình bằng tất cả các giá trị trong tập dữ liệu và vẽ kết quả.

Huấn luyện mô hình hồi quy tuyến tính

Đường màu đỏ biểu thị giá trị phù hợp, đó là các giá trị của y cho mỗi giá trị của x. Bạn không cần phải xem giá trị của x để dự đoán y, với mỗi x sẽ có bất kỳ giá trị nào thuộc đường màu đỏ. Bạn cũng có thể dự đoán giá trị của x cao hơn 2!

Nếu bạn muốn mở rộng hồi quy tuyến tính cho nhiều biến đồng thời hơn, bạn có thể bằng cách thêm nhiều biến hơn vào mô hình. Sự khác biệt giữa phân tích truyền thống và hồi quy tuyến tính là hồi quy tuyến tính xem xét cách y sẽ phản ứng với từng biến x được lấy độc lập.

Hãy xem một ví dụ. Hãy tưởng tượng bạn muốn dự đoán doanh thu của một cửa hàng kem. Tập dữ liệu chứa các thông tin khác nhau như thời tiết (tức mưa, nắng, mây), thông tin khách hàng (tức là mức lương, giới tính, tình trạng hôn nhân).

Phân tích truyền thống sẽ cố gắng dự đoán doanh số bán hàng bằng cách giả sử tính toán mức trung bình cho từng biến số và cố gắng ước tính doanh số bán hàng cho các tình huống khác nhau. Nó sẽ dẫn đến những dự đoán kém và hạn chế việc phân tích trong kịch bản đã chọn.

Nếu bạn sử dụng hồi quy tuyến tính, bạn có thể viết phương trình này:

Huấn luyện mô hình hồi quy tuyến tính

Thuật toán sẽ tìm ra giải pháp tốt nhất cho các trọng số; điều đó có nghĩa là nó sẽ cố gắng giảm thiểu chi phí (sự khác biệt giữa đường được trang bị và điểm dữ liệu).

Cách thức hoạt động của thuật toán

Hoạt động của thuật toán

Thuật toán sẽ chọn một số ngẫu nhiên cho mỗi Hồi quy tuyến tính với TensorFlowHoạt động của thuật toán và thay thế giá trị của x để có được giá trị dự đoán của y. Nếu tập dữ liệu có 100 quan sát, thuật toán sẽ tính 100 giá trị dự đoán.

Chúng tôi có thể tính toán lỗi, lưu ý Hoạt động của thuật toán của mô hình, đó là sự khác biệt giữa giá trị dự đoán và giá trị thực. Sai số dương có nghĩa là mô hình đánh giá thấp dự đoán của y và sai số âm có nghĩa là mô hình đánh giá quá cao dự đoán của y.

Hoạt động của thuật toán

Mục tiêu của bạn là giảm thiểu bình phương sai số. Thuật toán tính giá trị trung bình của sai số bình phương. Bước này được gọi là giảm thiểu lỗi. Đối với hồi quy tuyến tính là Lỗi bình phương trung bình, còn được gọi là MSE. Về mặt toán học, đó là:

Hoạt động của thuật toán

Địa điểm:

  • Hoạt động của thuật toán trọng lượng là vậy Hoạt động của thuật toán đề cập đến giá trị dự đoán
  • y là giá trị thực
  • m là số lượng quan sát

Lưu ý rằng Hoạt động của thuật toán có nghĩa là nó sử dụng phép chuyển vị của ma trận. Các Hoạt động của thuật toán là ký hiệu toán học của giá trị trung bình.

Mục tiêu là tìm ra điều tốt nhất Hoạt động của thuật toán giảm thiểu MSE

Nếu sai số trung bình lớn, điều đó có nghĩa là mô hình hoạt động kém và trọng số không được chọn đúng. Để sửa trọng số, bạn cần sử dụng trình tối ưu hóa. Trình tối ưu hóa truyền thống được gọi là Xuống dốc.

Độ dốc giảm dần lấy đạo hàm và giảm hoặc tăng trọng số. Nếu đạo hàm dương thì trọng số sẽ giảm. Nếu đạo hàm âm thì trọng số sẽ tăng. Mô hình sẽ cập nhật trọng số và tính toán lại lỗi. Quá trình này được lặp lại cho đến khi lỗi không còn thay đổi nữa. Mỗi tiến trình được gọi là một sự lặp lại. Ngoài ra, độ dốc được nhân với tốc độ học tập. Nó cho thấy tốc độ của việc học.

Nếu tốc độ học quá nhỏ thì thuật toán sẽ mất rất nhiều thời gian để hội tụ (tức là phải lặp lại nhiều lần). Nếu tốc độ học quá cao, thuật toán có thể không bao giờ hội tụ.

Hoạt động của thuật toán

Bạn có thể thấy từ hình trên, mô hình lặp lại quá trình này khoảng 20 lần trước đó để tìm giá trị ổn định cho các trọng số, do đó đạt được sai số thấp nhất.

Lưu ý rằng, sai số không bằng 5 nhưng ổn định ở khoảng 5. Điều đó có nghĩa là mô hình có sai số điển hình là XNUMX. Nếu muốn giảm sai số, bạn cần thêm nhiều thông tin hơn vào mô hình như nhiều biến hơn hoặc sử dụng các công cụ ước tính khác nhau .

Bạn nhớ phương trình đầu tiên

Hoạt động của thuật toán

Trọng số cuối cùng là 3.8 và 2.78. Video bên dưới cho bạn thấy cách giảm độ dốc tối ưu hóa hàm mất để tìm trọng số này

Cách huấn luyện hồi quy tuyến tính với TensorFlow

Bây giờ bạn đã hiểu rõ hơn về những gì đang diễn ra phía sau, bạn đã sẵn sàng sử dụng API công cụ ước tính do TensorFlow cung cấp để huấn luyện hồi quy tuyến tính đầu tiên bằng TensorFlow.

Bạn sẽ sử dụng Bộ dữ liệu Boston, bao gồm các biến sau

tội phạm tỷ lệ tội phạm bình quân đầu người theo thị trấn
zn tỷ lệ đất ở được quy hoạch cho các lô có diện tích trên 25,000 mXNUMX.
indus tỷ lệ diện tích kinh doanh phi bán lẻ trên mỗi thị trấn.
nox nồng độ oxit nitric
rm số phòng trung bình mỗi nhà
tuổi tỷ lệ các căn hộ do chủ sở hữu sử dụng được xây dựng trước năm 1940
dis khoảng cách có trọng số tới năm trung tâm việc làm ở Boston
thuế thuế suất tài sản có giá trị đầy đủ trên mỗi đô la 10,000
tỷ lệ phần trăm Tỷ lệ học sinh-giáo viên theo thị trấn
y tế Giá trị trung bình của những ngôi nhà do chủ sở hữu sử dụng tính bằng nghìn đô la

Bạn sẽ tạo ba bộ dữ liệu khác nhau:

tập dữ liệu Mục tiêu định hình
Hội thảo Huấn luyện mô hình và lấy trọng số 400, 10
Đánh giá Đánh giá hiệu suất của mô hình trên dữ liệu chưa nhìn thấy 100, 10
Dự đoán Sử dụng mô hình để dự đoán giá trị ngôi nhà trên dữ liệu mới 6, 10

Mục tiêu là sử dụng các tính năng của tập dữ liệu để dự đoán giá trị của ngôi nhà.

Trong phần thứ hai của hướng dẫn, bạn sẽ tìm hiểu cách sử dụng TensorFlow với ba cách khác nhau để nhập dữ liệu:

  • Với gấu trúc
  • Với numpy
  • Chỉ có TF

Lưu ý rằng, tất cả các tùy chọn mang lại kết quả tương tự.

Bạn sẽ tìm hiểu cách sử dụng API cấp cao để xây dựng, huấn luyện đánh giá mô hình hồi quy tuyến tính TensorFlow. Nếu bạn đang sử dụng API cấp thấp, bạn phải xác định bằng tay:

  • Thiếu chức năng
  • Tối ưu hóa: Giảm dần độ dốc
  • Phép nhân ma trận
  • Đồ thị và tensor

Điều này tẻ nhạt và phức tạp hơn đối với người mới bắt đầu.

Gấu trúc

Bạn cần nhập các thư viện cần thiết để huấn luyện mô hình.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
import itertools

Bước 1) Nhập dữ liệu với panda.

Bạn xác định tên cột và lưu trữ nó trong COLUMNS. Bạn có thể sử dụng pd.read_csv() để nhập dữ liệu.

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",
           "dis", "tax", "ptratio", "medv"]

Training_set = pd.read_csv(“E:/boston_train.csv”, Skipinitialspace=True,skiprows=1, tên=COLUMNS)

test_set = pd.read_csv(“E:/boston_test.csv”, Skipinitialspace=True,skiprows=1, tên=COLUMNS)

dự đoán_set = pd.read_csv(“E:/boston_predict.csv”, Skipinitialspace=True,skiprows=1, tên=COLUMNS)

Bạn có thể in hình dạng của dữ liệu.

print(training_set.shape, test_set.shape, prediction_set.shape)

Đầu ra

(400, 10) (100, 10) (6, 10)

Lưu ý rằng nhãn, tức là y của bạn, được bao gồm trong tập dữ liệu. Vì vậy, bạn cần xác định hai danh sách khác. Một cái chỉ chứa các tính năng và một cái chỉ có tên của nhãn. Hai danh sách này sẽ cho công cụ ước tính của bạn biết các tính năng trong tập dữ liệu là gì và tên cột là nhãn gì

Nó được thực hiện với mã dưới đây.

FEATURES = ["crim", "zn", "indus", "nox", "rm",				
                 "age", "dis", "tax", "ptratio"]
LABEL = "medv"

Bước 2) Chuyển đổi dữ liệu

Bạn cần chuyển đổi các biến số theo định dạng thích hợp. Tensorflow cung cấp một phương thức để chuyển đổi biến liên tục: tf.feature_column.numeric_column().

Ở bước trước, bạn xác định danh sách một tính năng mà bạn muốn đưa vào mô hình. Bây giờ bạn có thể sử dụng danh sách này để chuyển đổi chúng thành dữ liệu số. Nếu bạn muốn loại trừ các tính năng trong mô hình của mình, vui lòng bỏ một hoặc nhiều biến vào danh sách TÍNH NĂNG trước khi bạn tạo feature_cols

Lưu ý rằng bạn sẽ sử dụng Python hiểu danh sách bằng danh sách TÍNH NĂNG để tạo danh sách mới có tên feature_cols. Nó giúp bạn tránh phải viết chín lần tf.feature_column.numeric_column(). Hiểu danh sách là cách nhanh hơn và rõ ràng hơn để tạo danh sách mới

feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]

Bước 3) Xác định công cụ ước tính

Trong bước này, bạn cần xác định công cụ ước tính. Tensorflow hiện cung cấp 6 công cụ ước tính dựng sẵn, trong đó có 3 công cụ cho nhiệm vụ phân loại và 3 cho tác vụ hồi quy TensorFlow:

  • hồi quy
    • DNNBộ hồi quy
    • Bộ hồi quy tuyến tính
    • DNNLineaKết hợpBộ hồi quy
  • phân loại
    • Bộ phân loại DNN
    • Bộ phân loại tuyến tính
    • DNNLineaBộ phân loại kết hợp

Trong hướng dẫn này, bạn sẽ sử dụng Bộ hồi quy tuyến tính. Để truy cập chức năng này, bạn cần sử dụng tf.estimator.

Hàm cần hai đối số:

  • feature_columns: Chứa các biến cần đưa vào mô hình
  • model_dir: đường dẫn lưu đồ thị, lưu các tham số của mô hình, v.v.

Tensorflow sẽ tự động tạo một tệp có tên train trong thư mục làm việc của bạn. Bạn cần sử dụng đường dẫn này để truy cập Tensorboard như trong ví dụ hồi quy TensorFlow bên dưới.

estimator = tf.estimator.LinearRegressor(    
        feature_columns=feature_cols,   
        model_dir="train")

Đầu ra

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train', '_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, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a215dc550>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

Phần khó khăn với TensorFlow là cách cung cấp mô hình. Tensorflow được thiết kế để hoạt động với tính toán song song và tập dữ liệu rất lớn. Do hạn chế về tài nguyên máy nên không thể cung cấp tất cả dữ liệu cho mô hình cùng một lúc. Để làm được điều đó, bạn cần cung cấp một loạt dữ liệu mỗi lần. Lưu ý rằng, chúng ta đang nói về tập dữ liệu khổng lồ với hàng triệu bản ghi trở lên. Nếu bạn không thêm lô, bạn sẽ gặp lỗi bộ nhớ.

Ví dụ: nếu dữ liệu của bạn chứa 100 quan sát và bạn xác định kích thước lô là 10, điều đó có nghĩa là mô hình sẽ thấy 10 quan sát cho mỗi lần lặp (10*10).

Khi mô hình đã xem hết dữ liệu, nó sẽ hoàn thành một kỷ nguyên. Một kỷ nguyên xác định số lần bạn muốn mô hình xem dữ liệu. Tốt hơn là đặt bước này thành không và để mô hình thực hiện số lần lặp.

Thông tin thứ hai cần thêm là nếu bạn muốn xáo trộn dữ liệu trước mỗi lần lặp. Trong quá trình đào tạo, điều quan trọng là phải xáo trộn dữ liệu để mô hình không học được mẫu cụ thể của tập dữ liệu. Nếu mô hình học được các chi tiết của mẫu cơ bản của dữ liệu, nó sẽ gặp khó khăn trong việc khái quát hóa dự đoán cho dữ liệu chưa biết. Điều này được gọi là quá mức. Mô hình hoạt động tốt trên dữ liệu huấn luyện nhưng không thể dự đoán chính xác đối với dữ liệu không nhìn thấy.

TensorFlow làm cho hai bước này trở nên dễ dàng thực hiện. Khi dữ liệu đi vào quy trình, nó sẽ biết cần bao nhiêu quan sát (đợt) và liệu nó có phải xáo trộn dữ liệu hay không.

Để hướng dẫn Tensorflow cách cung cấp mô hình, bạn có thể sử dụng pandas_input_fn. Đối tượng này cần 5 tham số:

  • x: dữ liệu tính năng
  • y: dữ liệu nhãn
  • batch_size: lô. Theo mặc định 128
  • num_epoch: Số epoch, mặc định là 1
  • shuffle: Xáo trộn hoặc không xáo trộn dữ liệu. Theo mặc định, Không có

Bạn cần cung cấp mô hình nhiều lần để xác định hàm lặp lại quá trình này. tất cả chức năng này get_input_fn.

def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):    
         return tf.estimator.inputs.pandas_input_fn(       
         x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),       
         y = pd.Series(data_set[LABEL].values),       
         batch_size=n_batch,          
         num_epochs=num_epochs,       
         shuffle=shuffle)

Phương pháp thông thường để đánh giá hiệu suất của một mô hình là:

  • Đào tạo mô hình
  • Đánh giá mô hình trong một tập dữ liệu khác
  • Đưa ra dự đoán

Công cụ ước tính Tensorflow cung cấp ba chức năng khác nhau để thực hiện ba bước này một cách dễ dàng.

Bước 4): Đào tạo mô hình

Bạn có thể sử dụng công cụ ước tính để đánh giá mô hình. Công cụ ước tính tàu cần có input_fn và một số bước. Bạn có thể sử dụng hàm bạn đã tạo ở trên để cung cấp cho mô hình. Sau đó, bạn hướng dẫn mô hình lặp lại 1000 lần. Lưu ý rằng, bạn không chỉ định số kỷ nguyên, bạn để mô hình lặp lại 1000 lần. Nếu bạn đặt số kỷ nguyên thành 1 thì mô hình sẽ lặp lại 4 lần: Có 400 bản ghi trong tập huấn luyện và kích thước lô là 128

  1. 128 hàng
  2. 128 hàng
  3. 128 hàng
  4. 16 hàng

Do đó, việc đặt số kỷ nguyên thành không và xác định số lần lặp sẽ dễ dàng hơn như trong ví dụ phân loại TensorFlow bên dưới.

estimator.train(input_fn=get_input_fn(training_set,                                       
                                           num_epochs=None,                                      
                                           n_batch = 128,                                      
                                           shuffle=False),                                      
                                           steps=1000)

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 238.616
INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec)
INFO:tensorflow:global_step/sec: 314.293
INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec)
INFO:tensorflow:global_step/sec: 303.863
INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec)
INFO:tensorflow:global_step/sec: 308.782
INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec)
INFO:tensorflow:global_step/sec: 244.969
INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec)
INFO:tensorflow:global_step/sec: 155.966
INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec)
INFO:tensorflow:global_step/sec: 263.256
INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec)
INFO:tensorflow:global_step/sec: 254.112
INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec)
INFO:tensorflow:global_step/sec: 292.405
INFO:tensorflow:loss = 10845.855, step = 901 (0.341 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.9873.

Bạn có thể kiểm tra Tensorboard bằng lệnh sau:

activate hello-tf
# For MacOS
tensorboard --logdir=./train
# For Windows
tensorboard --logdir=train

Bước 5) Đánh giá mô hình của bạn

Bạn có thể đánh giá mức độ phù hợp của mô hình của mình trên tập kiểm tra bằng mã bên dưới:

ev = estimator.evaluate(    
          input_fn=get_input_fn(test_set,                          
          num_epochs=1,                          
          n_batch = 128,                          
          shuffle=False))

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-01:43:13
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896

Bạn có thể in phần lỗ bằng mã bên dưới:

loss_score = ev["loss"]
print("Loss: {0:f}".format(loss_score))

Đầu ra

Loss: 3215.895996

Mô hình có mức lỗ là 3215. Bạn có thể kiểm tra số liệu thống kê tóm tắt để biết lỗi lớn đến mức nào.

training_set['medv'].describe()

Đầu ra

count    400.000000
mean      22.625500
std        9.572593
min        5.000000
25%       16.600000
50%       21.400000
75%       25.025000
max       50.000000
Name: medv, dtype: float64

Từ số liệu thống kê tóm tắt ở trên, bạn biết rằng giá trung bình cho một căn nhà là 22 nghìn, với mức giá tối thiểu là 9 nghìn và tối đa là 50 nghìn. Mô hình mắc lỗi điển hình là 3 nghìn đô la.

Bước 6) Đưa ra dự đoán

Cuối cùng, bạn có thể sử dụng công cụ ước tính TensorFlow Predict để ước tính giá trị của 6 ngôi nhà ở Boston.

y = estimator.predict(    
         input_fn=get_input_fn(prediction_set,                          
         num_epochs=1,                          
         n_batch = 128,                          
         shuffle=False))

Để in các giá trị ước tính của , bạn có thể sử dụng mã này:

predictions = list(p["predictions"] for p in itertools.islice(y, 6))print("Predictions: {}".format(str(predictions)))

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.96125], dtype=float32), array([27.270979], dtype=float32), array([29.299236], dtype=float32), array([16.436684], dtype=float32), array([21.460876], dtype=float32)]

Mô hình dự báo các giá trị sau:

Nhà Dự đoán
1 32.29
2 18.96
3 27.27
4 29.29
5 16.43
7 21.46

Lưu ý rằng chúng tôi không biết giá trị thực sự của . Trong hướng dẫn học sâu, bạn sẽ cố gắng vượt qua mô hình tuyến tính

Giải pháp Numpy

Phần này giải thích cách huấn luyện mô hình bằng cách sử dụng công cụ ước tính gọn gàng để cung cấp dữ liệu. Phương pháp này giống nhau ngoại trừ việc bạn sẽ sử dụng công cụ ước tính numpy_input_fn.

Training_set_n = pd.read_csv(“E:/boston_train.csv”).values

test_set_n = pd.read_csv(“E:/boston_test.csv”).values

dự đoán_set_n = pd.read_csv(“E:/boston_predict.csv”).values

Bước 1) Nhập dữ liệu

Trước hết, bạn cần phân biệt các biến tính năng với nhãn. Bạn cần phải làm điều này cho dữ liệu đào tạo và đánh giá. Sẽ nhanh hơn nếu xác định hàm để phân chia dữ liệu.

def prepare_data(df):     
        X_train = df[:, :-3]    
        y_train = df[:,-3]    
        return X_train, y_train

Bạn có thể sử dụng chức năng để tách nhãn khỏi các tính năng của tập dữ liệu đào tạo/đánh giá

X_train, y_train = prepare_data(training_set_n)
X_test, y_test = prepare_data(test_set_n)

Bạn cần loại trừ cột cuối cùng của tập dữ liệu dự đoán vì nó chỉ chứa NaN

x_predict = prediction_set_n[:, :-2]

Xác nhận hình dạng của mảng. Lưu ý rằng nhãn không được có thứ nguyên, nghĩa là (400,).

print(X_train.shape, y_train.shape, x_predict.shape)

Đầu ra

(400, 9) (400,) (6, 9)

Bạn có thể xây dựng các cột tính năng như sau:

feature_columns = [      tf.feature_column.numeric_column('x', shape=X_train.shape[1:])]

Công cụ ước tính được xác định như trước, bạn hướng dẫn các cột đặc trưng và nơi lưu biểu đồ.

estimator = tf.estimator.LinearRegressor(    
         feature_columns=feature_columns,    
         model_dir="train1")

Đầu ra

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train1', '_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, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a218d8f28>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

Bạn có thể sử dụng ước tính gọn gàng để cung cấp dữ liệu cho mô hình và sau đó huấn luyện mô hình. Lưu ý rằng, chúng tôi xác định hàm input_fn trước để dễ đọc.

# Train the estimatortrain_input = tf.estimator.inputs.numpy_input_fn(   
           x={"x": X_train},    
           y=y_train,    
           batch_size=128,    
           shuffle=False,    
           num_epochs=None)
           estimator.train(input_fn = train_input,steps=5000)

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train1/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 490.057
INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec)
INFO:tensorflow:global_step/sec: 788.986
INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec)
INFO:tensorflow:global_step/sec: 736.339
INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec)
INFO:tensorflow:global_step/sec: 383.305
INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec)
INFO:tensorflow:global_step/sec: 859.832
INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec)
INFO:tensorflow:global_step/sec: 804.394
INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec)
INFO:tensorflow:global_step/sec: 753.059
INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec)
INFO:tensorflow:global_step/sec: 402.165
INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec)
INFO:tensorflow:global_step/sec: 344.022
INFO:tensorflow:loss = 10845.854, step = 901 (0.288 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train1/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.985.
Out[23]:
<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1b6ea860>

Bạn lặp lại bước tương tự với một công cụ ước tính khác để đánh giá mô hình của mình

eval_input = tf.estimator.inputs.numpy_input_fn(    
       x={"x": X_test},    
       y=y_test, 
       shuffle=False,    
       batch_size=128,    
       num_epochs=1)
   estimator.evaluate(eval_input,steps=None)

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-01:44:00
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945
Out[24]:
{'average_loss': 32.158947, 'global_step': 1000, 'loss': 3215.8945}

Cuối cùng, bạn có thể tính toán dự đoán. Nó sẽ giống như gấu trúc.

test_input = tf.estimator.inputs.numpy_input_fn(    
        x={"x": x_predict},    
        batch_size=128,    
        num_epochs=1,   
        shuffle=False)
        y = estimator.predict(test_input) 			
predictions = list(p["predictions"] for p in itertools.islice(y, 6))
print("Predictions: {}".format(str(predictions)))

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.961248], dtype=float32), array([27.270979], dtype=float32), array([29.299242], dtype=float32), array([16.43668], dtype=float32), array([21.460878], dtype=float32)]

Giải pháp dòng chảy

Phần cuối cùng dành riêng cho giải pháp TensorFlow. Phương pháp này phức tạp hơn một chút so với phương pháp kia.

Lưu ý rằng nếu bạn sử dụng Jupyter máy tính xách tay, bạn cần Khởi động lại và dọn dẹp kernel để chạy phiên này.

TensorFlow đã xây dựng một công cụ tuyệt vời để truyền dữ liệu vào đường dẫn. Trong phần này, bạn sẽ tự xây dựng hàm input_fn.

Bước 1) Xác định đường dẫn và định dạng của dữ liệu

Trước hết các bạn khai báo 2 biến bằng đường dẫn của file csv. Lưu ý rằng bạn có hai tệp, một tệp dành cho tập huấn luyện và một tệp dành cho tập kiểm tra.

import tensorflow as tf
df_train = "E:/boston_train.csv"
df_eval = "E:/boston_test.csv"

Sau đó, bạn cần xác định các cột bạn muốn sử dụng từ tệp csv. Chúng tôi sẽ sử dụng tất cả. Sau đó, bạn cần khai báo loại biến.

Biến float được xác định bởi [0.]

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",				
                "dis", "tax", "ptratio", "medv"]RECORDS_ALL = [[0.0], [0.0], [0.0], [0.0],[0.0],[0.0],[0.0],[0.0],[0.0],[0.0]]

Bước 2) Xác định hàm input_fn

Chức năng có thể được chia thành ba phần:

  1. Nhập dữ liệu
  2. Tạo trình vòng lặp
  3. Tiêu thụ dữ liệu

Dưới đây là mã tổng thể để xác định hàm. Code sẽ được giải thích sau

def input_fn(data_file, batch_size, num_epoch = None):				
       # Step 1				
          def parse_csv(value):        
          columns = tf.decode_csv(value, record_defaults= RECORDS_ALL)        
          features = dict(zip(COLUMNS, columns))				
          #labels = features.pop('median_house_value')        
          labels =  features.pop('medv')        
          return features, labels							
          
          # Extract lines from input files using the 
          Dataset API.    dataset = (tf.data.TextLineDataset(data_file) # Read text file       
          .skip(1) # Skip header row       
          .map(parse_csv))			   
          
          dataset = dataset.repeat(num_epoch)    
          dataset = dataset.batch(batch_size) 				
          # Step 3    
          iterator = dataset.make_one_shot_iterator()    
          features, labels = iterator.get_next()    
          return features, labels

** Nhập dữ liệu**

Đối với tệp csv, phương thức tập dữ liệu sẽ đọc từng dòng một. Để xây dựng tập dữ liệu, bạn cần sử dụng đối tượng TextLineTập dữ liệu. Tập dữ liệu của bạn có tiêu đề nên bạn cần sử dụng Skip(1) để bỏ qua dòng đầu tiên. Tại thời điểm này, bạn chỉ đọc dữ liệu và loại trừ tiêu đề trong đường dẫn. Để cung cấp mô hình, bạn cần tách các tính năng khỏi nhãn. Phương pháp được sử dụng để áp dụng bất kỳ phép biến đổi nào đối với dữ liệu là bản đồ.

Phương thức này gọi một hàm mà bạn sẽ tạo để hướng dẫn cách chuyển đổi dữ liệu. Tóm lại, bạn cần truyền dữ liệu trong TextLineĐối tượng tập dữ liệu, loại trừ tiêu đề và áp dụng một phép chuyển đổi được hướng dẫn bởi hàm. Giải thích mã

  • tf.data.TextLineBộ dữ liệu(data_file): Dòng này đọc tệp csv
  • .skip(1) : bỏ qua tiêu đề
  • .map(parse_csv)): phân tích các bản ghi thành các tensorBạn cần xác định một hàm để hướng dẫn đối tượng bản đồ. Bạn có thể gọi hàm này là Parse_csv.

Hàm này phân tích tệp csv bằng phương pháp tf.decode_csv và khai báo các tính năng và nhãn. Các tính năng có thể được khai báo là một từ điển hoặc một bộ. Bạn sử dụng phương pháp từ điển vì nó thuận tiện hơn. Giải thích mã

  • tf.decode_csv(value, record_defaults= RECORDS_ALL): phương thức giải mã_csv sử dụng đầu ra của TextLineBộ dữ liệu để đọc tệp csv. record_defaults hướng dẫn TensorFlow về loại cột.
  • dict(zip(_CSV_COLUMNS, columns)): Điền vào từ điển tất cả các cột được trích xuất trong quá trình xử lý dữ liệu này
  • feature.pop('median_house_value'): Loại trừ biến mục tiêu khỏi biến tính năng và tạo biến nhãn

Bộ dữ liệu cần có thêm các phần tử để cung cấp lặp lại cho các Tensors. Thật vậy, bạn cần thêm phương thức lặp lại để cho phép tập dữ liệu tiếp tục vô thời hạn để cung cấp cho mô hình. Nếu bạn không thêm phương thức này, mô hình sẽ chỉ lặp lại một lần rồi đưa ra lỗi vì không có thêm dữ liệu nào được cung cấp trong quy trình.

Sau đó, bạn có thể kiểm soát kích thước lô bằng phương pháp lô. Điều đó có nghĩa là bạn cho tập dữ liệu biết số lượng dữ liệu bạn muốn chuyển trong quy trình cho mỗi lần lặp. Nếu bạn đặt kích thước lô lớn, mô hình sẽ chậm.

Bước 3) Tạo trình vòng lặp

Bây giờ bạn đã sẵn sàng cho bước thứ hai: tạo một trình vòng lặp để trả về các phần tử trong tập dữ liệu.

Cách đơn giản nhất để tạo toán tử là sử dụng phương thức make_one_shot_iterator.

Sau đó, bạn có thể tạo các tính năng và nhãn từ trình vòng lặp.

Bước 4) Sử dụng dữ liệu

Bạn có thể kiểm tra xem điều gì xảy ra với hàm input_fn. Bạn cần gọi hàm trong một phiên để sử dụng dữ liệu. Bạn thử với kích thước lô bằng 1.

Lưu ý rằng, nó in các tính năng trong từ điển và nhãn dưới dạng mảng.

Nó sẽ hiển thị dòng đầu tiên của tệp csv. Bạn có thể thử chạy mã này nhiều lần với kích thước lô khác nhau.

next_batch = input_fn(df_train, batch_size = 1, num_epoch = None)
with tf.Session() as sess:    
     first_batch  = sess.run(next_batch)    
     print(first_batch)

Đầu ra

({'crim': array([2.3004], dtype=float32), 'zn': array([0.], dtype=float32), 'indus': array([19.58], dtype=float32), 'nox': array([0.605], dtype=float32), 'rm': array([6.319], dtype=float32), 'age': array([96.1], dtype=float32), 'dis': array([2.1], dtype=float32), 'tax': array([403.], dtype=float32), 'ptratio': array([14.7], dtype=float32)}, array([23.8], dtype=float32))

Bước 4) Xác định cột tính năng

Bạn cần xác định các cột số như sau:

X1= tf.feature_column.numeric_column('crim')
X2= tf.feature_column.numeric_column('zn')
X3= tf.feature_column.numeric_column('indus')
X4= tf.feature_column.numeric_column('nox')
X5= tf.feature_column.numeric_column('rm')
X6= tf.feature_column.numeric_column('age')
X7= tf.feature_column.numeric_column('dis')
X8= tf.feature_column.numeric_column('tax')
X9= tf.feature_column.numeric_column('ptratio')

Lưu ý rằng bạn cần kết hợp tất cả các biến trong một nhóm

base_columns = [X1, X2, X3,X4, X5, X6,X7, X8, X9]

Bước 5) Xây dựng mô hình

Bạn có thể huấn luyện mô hình bằng công cụ ước tính LinearRegressor.

model = tf.estimator.LinearRegressor(feature_columns=base_columns, model_dir='train3')

Đầu ra

INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'train3', '_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, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820a010f0>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

Bạn cần sử dụng hàm lambda để cho phép viết đối số trong hàm inpu_fn. Nếu bạn không sử dụng một hàm lambda, bạn không thể huấn luyện mô hình.

# Train the estimatormodel.train(steps =1000,    
          input_fn= lambda : input_fn(df_train,batch_size=128, num_epoch = None))

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train3/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 72.5646
INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec)
INFO:tensorflow:global_step/sec: 101.355
INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec)
INFO:tensorflow:global_step/sec: 109.293
INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec)
INFO:tensorflow:global_step/sec: 102.235
INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec)
INFO:tensorflow:global_step/sec: 104.656
INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec)
INFO:tensorflow:global_step/sec: 106.697
INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec)
INFO:tensorflow:global_step/sec: 118.454
INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec)
INFO:tensorflow:global_step/sec: 114.947
INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec)
INFO:tensorflow:global_step/sec: 111.484
INFO:tensorflow:loss = 10845.855, step = 901 (0.897 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train3/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.9873.
Out[8]:
<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x18225eb8d0>

Bạn có thể đánh giá mức độ phù hợp của mô hình của mình trên tập kiểm tra bằng mã bên dưới:

results = model.evaluate(steps =None,input_fn=lambda: input_fn(df_eval, batch_size =128, num_epoch = 1))
for key in results:   
print("   {}, was: {}".format(key, results[key]))

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-02:06:02
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896
   average_loss, was: 32.158958435058594
   loss, was: 3215.89599609375
   global_step, was: 1000

Bước cuối cùng là dự đoán giá trị của dựa trên giá trị của ma trận của các đặc tính. Bạn có thể viết một từ điển với các giá trị bạn muốn dự đoán. Mô hình của bạn có 9 tính năng nên bạn cần cung cấp giá trị cho mỗi tính năng. Mô hình sẽ đưa ra dự đoán cho từng người trong số họ.

Trong mã bên dưới, bạn đã viết các giá trị của từng tính năng có trong tệp csv df_predict.

Bạn cần viết hàm input_fn mới vì không có nhãn trong tập dữ liệu. Bạn có thể sử dụng API from_tensor từ Bộ dữ liệu.

prediction_input = {				
          'crim': [0.03359,5.09017,0.12650,0.05515,8.15174,0.24522],				
          'zn': [75.0,0.0,25.0,33.0,0.0,0.0],				
          'indus': [2.95,18.10,5.13,2.18,18.10,9.90],				
          'nox': [0.428,0.713,0.453,0.472,0.700,0.544],				
          'rm': [7.024,6.297,6.762,7.236,5.390,5.782],				
          'age': [15.8,91.8,43.4,41.1,98.9,71.7],				
          'dis': [5.4011,2.3682,7.9809,4.0220,1.7281,4.0317],				
          'tax': [252,666,284,222,666,304],				
          'ptratio': [18.3,20.2,19.7,18.4,20.2,18.4]
     }
     def test_input_fn():    
     dataset = tf.data.Dataset.from_tensors(prediction_input)    
     return dataset
     
     # Predict all our prediction_inputpred_results = model.predict(input_fn=test_input_fn)

Cuối cùng, bạn in dự đoán.

for pred in enumerate(pred_results):    
print(pred)

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
(0, {'predictions': array([32.297546], dtype=float32)})
(1, {'predictions': array([18.96125], dtype=float32)})
(2, {'predictions': array([27.270979], dtype=float32)})
(3, {'predictions': array([29.299236], dtype=float32)})
(4, {'predictions': array([16.436684], dtype=float32)})
(5, {'predictions': array([21.460876], dtype=float32)})

INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. (0, {'predictions': array([35.60663], dtype=float32)}) (1, {'predictions': array([22.298521], dtype=float32)}) (2, {'predictions': array([25.74533], dtype=float32)}) (3, {'predictions': array([35.126694], dtype=float32)}) (4, {'predictions': array([17.94416], dtype=float32)}) (5, {'predictions': array([22.606628], dtype=float32)})

Tổng kết

Để huấn luyện một mô hình, bạn cần:

  • Xác định các đặc điểm: Biến độc lập: X
  • Xác định nhãn: Biến phụ thuộc: y
  • Xây dựng tập huấn luyện/kiểm tra
  • Xác định trọng lượng ban đầu
  • Xác định hàm mất: MSE
  • Tối ưu hóa mô hình: Giảm dần độ dốc
  • Định nghĩa:
    • Tỷ lệ học
    • Số thời đại
    • Kích thước lô

Trong hướng dẫn này, bạn đã học cách sử dụng API cấp cao cho công cụ ước tính TensorFlow hồi quy tuyến tính. Bạn cần xác định:

  1. Cột tính năng. Nếu liên tục: tf.feature_column.numeric_column(). Bạn có thể điền một danh sách với khả năng hiểu danh sách python
  2. Công cụ ước tính: tf.estimator.LinearRegressor(feature_columns, model_dir)
  3. Hàm nhập dữ liệu, kích thước lô và kỷ nguyên: input_fn()

Sau đó, bạn đã sẵn sàng huấn luyện, đánh giá và đưa ra dự đoán với train(), đánh giá() và dự đoán()