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

⚡ Tóm tắt thông minh

Mô hình hồi quy tuyến tính trong TensorFlow mô phỏng mối quan hệ giữa các đặc trưng số và một giá trị mục tiêu liên tục. Hướng dẫn này huấn luyện một mô hình dự đoán giá nhà ở Boston theo ba cách khác nhau, sử dụng Pandas, NumPy và các pipeline đầu vào gốc của TensorFlow với bộ ước lượng LinearRegressor.

  • 🔘 Mẫu đơn: Hồi quy tuyến tính phù hợp với công thức y = độ lệch + trọng số × x, được mở rộng với nhiều biến độc lập hơn cho các bài toán đa biến.
  • ☑️ Vòng lặp huấn luyện: Thuật toán gradient descent điều chỉnh trọng số trong mỗi lần lặp cho đến khi sai số bình phương trung bình (Mean Square Error) ngừng giảm.
  • API ước tính: LinearRegressor chỉ cần các cột đặc trưng, ​​thư mục mô hình và một hàm đầu vào.
  • 🧪 Ba đường ống dẫn: Các tập dữ liệu Pandas, NumPy và TensorFlow gốc đều được sử dụng để cung cấp dữ liệu cho cùng một mô hình và cho ra kết quả dự đoán giống hệt nhau.
  • 🛠️ Ví dụ thực tế: Chín đặc điểm của Boston dự đoán giá trị nhà ở trung bình và đạt mức tổn thất thử nghiệm là 3215.
  • ⚠️ Phiên bản thực tế: Estimators đã bị loại bỏ trong TensorFlow 2.12 và bị xóa hoàn toàn trong phiên bản 2.16, vì vậy hãy chuyển các công việc mới sang Keras.

Hồi quy tuyến tính với TensorFlow

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

linear Regression Hồi quy tuyến tính là một phương pháp trong thống kê dùng để mô hình hóa mối quan hệ giữa hai biến số. Việc mô hình hóa này được thực hiện giữa một biến phản hồi 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à với nhiều hơn một biến giải thích thì được gọi là hồi quy tuyến tính đa biến.

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 các thuật toán. Đây là API cấp cao, và TensorFlow gọi chúng là các bộ ước lượng.

  • API cấp thấpXây dựng kiến ​​trúc và tối ưu hóa mô hình từ đầu. Điều này khá phức tạp đối với người mới bắt đầu.
  • API cấp cao: Hãy định nghĩa thuật toán. Nó rất thân thiện với người dùng. TensorFlow cung cấp một bộ công cụ có tên 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ínhCác phép tính nhanh hơn và dễ thực hiện hơn. Phần đầu tiên giải thích cách sử dụng trình tối ưu hóa gradient descent để huấn luyện mô hình 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á nhà bằng cách sử dụng bộ ước lượng 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 huấn luyện mô hình, chúng ta hãy cùng xem hồi quy tuyến tính thực chất là gì.

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

Biểu đồ phân tán của x theo y cho thấy mối quan hệ tuyến tính dương.

Bạn có thể nhận thấy rằng nếu x=1, y sẽ xấp xỉ bằng 6, và nếu x=2, y sẽ vào khoảng 8.5.

Đây không phải là phương pháp chính xác lắm và dễ xảy ra sai sót, đặc biệt là với tập dữ liệu chứa 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à:

Phương trình hồi quy tuyến tính đơn giản với hệ số thiên lệch, trọng số và số hạng sai số.

Với:

  • Ký hiệu hệ số sai lệch là độ lệch. Tức là, nếu x=0, y=Giá trị hệ số sai lệch khi x bằng không
  • Ký hiệu hệ số trọng số liên quan đến x là trọng lượng liên quan đến x
  • Ký hiệu sai số dư Đây là phần dư, hay 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:

  • Hệ số sai lệch ước tính bằng 3.8 = 3.8
  • Hệ số trọng số phù hợp bằng 2.78 = 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

Giờ đây bạn đã có một cách tốt hơn để tìm 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 bên dưới, chúng tôi đã 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ẽ đồ thị kết quả.

Đường hồi quy phù hợp được vẽ bằng màu đỏ đi qua các điểm dữ liệu đã được vẽ trên biểu đồ.

Đường màu đỏ biểu thị giá trị phù hợp, tức là giá trị của y cho mỗi giá trị của x. Bạn không cần phải nhìn thấy giá trị của x để dự đoán y; với mỗi x đều có một giá trị nằm trên đường màu đỏ. Bạn cũng có thể dự đoán cho các giá trị của x lớn hơn 2.

Nếu bạn muốn mở rộng hồi quy tuyến tính cho nhiều biến độc lập hơn, bạn có thể làm như vậy 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 phản ứng của y đối với từng biến x được xem xét một cách độc lập.

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

Phương pháp phân tích truyền thống sẽ cố gắng dự đoán doanh số bằng cách, chẳng hạn, tính trung bình cho từng biến số và cố gắng ước tính doanh số cho các kịch bản khác nhau. Điều này sẽ dẫn đến những dự đoán kém chính xác và hạn chế phân tích 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:

Phương trình hồi quy tuyến tính đa biến kết hợp nhiều biến độc lập có trọng số.

Thuật toán sẽ tìm ra giải pháp tối ưu 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í, tức là sự khác biệt giữa đường hồi quy và các điểm dữ liệu.

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

Sơ đồ dưới đây tóm tắt vòng lặp mà thuật toán thực hiện: chọn trọng số, dự đoán y, đo lỗi và hiệu chỉnh trọng số.

Sơ đồ luồng của vòng lặp huấn luyện hồi quy tuyến tính từ trọng số ngẫu nhiên đến lỗi tối thiểu.

Thuật toán sẽ chọn một số ngẫu nhiên cho mỗi Hệ số sai lệch được khởi tạo ngẫu nhiênHệ số trọng số được khởi tạo ngẫu nhiê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 ý Sai số mô hình được sử dụng trong tính toán tổn thấtSai số của mô hình là sự khác biệt giữa giá trị dự đoán và giá trị thực tế. Sai số dương có nghĩa là mô hình đánh giá thấp hơn giá trị dự đoán của y, và sai số âm có nghĩa là mô hình đánh giá cao hơn giá trị dự đoán của y.

Mục tiêu tối thiểu hóa sai số bình phương được viết bằng ký hiệu toán học.

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 toán giá trị trung bình của bình phương sai số. Bước này được gọi là giảm thiểu sai số. Đối với hồi quy tuyến tính, đây là bước... Lỗi bình phương trung bình, còn được gọi là MSE. Về mặt toán học, đó là:

Công thức sai số bình phương trung bình được viết dưới dạng ma trận.

Trong đó:

  • Ký hiệu vectơ trọng số được sử dụng trong công thức MSE là trọng lượng, vậy nên Ký hiệu giá trị dự đoán được sử dụng trong công thức MSE. đề 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 Ký hiệu ma trận trọng số chuyển vị có nghĩa là nó sử dụng phép chuyển vị của ma trận. Các Ký hiệu tổng và trung bình được sử dụng trong công thức MSE. 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 Ký hiệu trọng lượng tối ưu giúp giảm thiểu MSE nhằm 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.

Thuật toán gradient descent lấy đạo hàm và giảm hoặc tăng trọng số. Nếu đạo hàm dương, trọng số giảm. Nếu đạo hàm âm, trọng số tăng. Mô hình sẽ cập nhật trọng số và tính toán lại sai số. Quá trình này được lặp lại cho đến khi sai số không thay đổi nữa. Mỗi lần lặp được gọi là một chu kỳ. sự lặp lạiNgoài ra, độ dốc được nhân với tốc độ học, cho biết tốc độ của quá trình học.

Nếu tốc độ học quá nhỏ, thuật toán sẽ mất rất nhiều thời gian để hội tụ, vì nó yêu cầu nhiều lần lặp hơn. Nếu tốc độ học quá cao, thuật toán có thể không bao giờ hội tụ. Đường cong hàm mất mát bên dưới biểu diễn lỗi theo số lần lặp cho tập dữ liệu này.

Đường cong tổn thất cho thấy lỗi giảm dần và ổn định sau khoảng hai mươi lần lặp.

Như bạn có thể thấy từ hình ảnh trên, mô hình lặp lại quá trình khoảng 20 lần trước khi tìm ra 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 0 mà ổn định ở mức khoảng 5. Điều này có nghĩa là mô hình có sai số điển hình là 5. Nếu bạn muốn giảm sai số, bạn cần bổ sung thêm thông tin vào mô hình, chẳng hạn như thêm biến số, hoặc sử dụng các phương pháp ước lượng khác.

Bạn còn nhớ phương trình đầu tiên chứ:

Phương trình hồi quy tuyến tính cuối cùng được hiệu chỉnh với các trọng số đã giải.

Các trọng số cuối cùng là 3.8 và 2.78. Video bên dưới cho thấy cách thuật toán gradient descent tối ưu hóa hàm mất mát để tìm ra các 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.

Ghi chú phiên bản: Quy trình ước lượng được hiển thị bên dưới được viết dựa trên TensorFlow 1.x và các phiên bản 2.x đầu tiên. TensorFlow đã đánh dấu tf.estimatortf.feature_column Các API đã bị loại bỏ hoàn toàn trong phiên bản 2.12 và Estimators đã bị loại bỏ trong phiên bản 2.16. Trên bản cài đặt hiện tại, hãy chạy đoạn mã này bên trong TensorFlow 1.15 hoặc 2.x-with-tf.compat.v1 môi trường, hoặc chuyển nó sang Keras, trong đó tf.keras.layers.Dense(1) Các lớp tiền xử lý bổ sung thay thế cho LinearRegressor và các cột đặc trưng. Các khái niệm — đặc trưng, ​​nhãn, lô, epoch, MSE và thuật toán gradient descent — vẫn được giữ nguyên.

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

Biến Mô tả Chi tiết
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 đặc điểm 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ẽ học cách sử dụng TensorFlow với ba phương pháp khác nhau để nhập dữ liệu:

  • Với gấu trúc
  • Với numpy
  • Chỉ dành cho TensorFlow

Lưu ý rằng cả ba phương án đều cho kết quả như nhau.

Bạn sẽ học cách sử dụng API cấp cao để xây dựng, huấn luyện và đánh giá mô hình hồi quy tuyến tính TensorFlow. Nếu bạn sử dụng API cấp thấp, bạn sẽ phải tự định nghĩa thủ công các tham số sau:

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

Việc này tốn thời gian và phức tạp hơn đối với người mới bắt đầu.

Giải pháp Pandas

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 Gấu trúc.

Bạn định nghĩa tên các cột và lưu trữ chúng trong biến 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"]

Hãy trỏ mỗi lệnh gọi đến các tệp CSV mà bạn đã tải xuống trước đó.

training_set = pd.read_csv("E:/boston_train.csv", skipinitialspace=True,skiprows=1, names=COLUMNS)
test_set = pd.read_csv("E:/boston_test.csv", skipinitialspace=True,skiprows=1, names=COLUMNS)
prediction_set = pd.read_csv("E:/boston_predict.csv", skipinitialspace=True,skiprows=1, names=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à biến y của bạn, đã được bao gồm trong tập dữ liệu. Vì vậy, bạn cần định nghĩa hai danh sách khác: một danh sách chỉ chứa các đặc trưng và một danh sách chỉ chứa tên của nhãn. Hai danh sách này sẽ cho trình ước lượng biết các đặc trưng trong tập dữ liệu là gì và tên cột nào là nhãn.

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ố sang định dạng phù 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 đã định nghĩa một danh sách các đặc trưng mà bạn muốn đưa vào mô hình. Giờ đây, 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 đặc trưng khỏi mô hình của mình, hãy thoải mái xóa một hoặc nhiều biến khỏi danh sách FEATURES trước khi xây dựng feature_cols.

Lưu ý rằng bạn sẽ sử dụng một Python Sử dụng list comprehension với danh sách FEATURES để tạo một danh sách mới có tên là feature_cols. Điều này giúp bạn tránh phải viết tf.feature_column.numeric_column() đến chín lần. List comprehension là một cách nhanh hơn và gọn gàng hơn để tạo các 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

Ở bước này, bạn cần định nghĩa bộ ước lượng. TensorFlow cung cấp sáu bộ ước lượng được xây dựng sẵn, ba bộ dành cho các tác vụ phân loại và ba bộ dành cho các tác vụ hồi quy TensorFlow:

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

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 trữ đồ thị, lưu các tham số mô hình, v.v.

TensorFlow sẽ tự động tạo một thư mục có tên là 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. TenorBoardnhư được minh họa 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}

Điểm khó khăn khi sử dụng TensorFlow là cách cung cấp dữ liệu cho mô hình. TensorFlow được thiết kế để hoạt động với tính toán song song và các tập dữ liệu rất lớn. Do hạn chế về tài nguyên máy, không thể cung cấp toàn bộ dữ liệu cho mô hình cùng một lúc. Vì vậy, bạn cần cung cấp từng lô dữ liệu một. Lưu ý rằng chúng ta đang nói về các 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 từng lô dữ liệu, 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 xét tất cả dữ liệu, nó sẽ hoàn thành một epoch. Một epoch xác định số lần bạn muốn mô hình xem dữ liệu. Tốt hơn hết là nên đặt bước này thành "none" và để mô hình thực hiện một số lần lặp nhất định.

Thông tin thứ hai cần bổ sung là liệu bạn có muốn xáo trộn dữ liệu trước mỗi lần lặp hay không. Trong quá trình huấn luyện, việc xáo trộn dữ liệu rất quan trọng để mô hình không học được một mẫu cụ thể nào của tập dữ liệu. Nếu mô hình họ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 được thấy. Điều này được gọi là hiện tượng quá khớp (overfitting). 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 cho dữ liệu chưa được thấy.

TensorFlow giúp thực hiện hai bước này một cách dễ dàng. Khi dữ liệu được đưa vào pipeline, nó biết cần bao nhiêu quan sát (batch) và liệu có cần xáo trộn dữ liệu hay không.

Để hướng dẫn TensorFlow cách cung cấp dữ liệu cho mô hình, bạn có thể sử dụng pandas_input_fn. Đối tượng này cần năm 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ố lượng epoch, mặc định là 1
  • shuffle: có xáo trộn dữ liệu hay không. Mặc định là None.

Bạn cần cung cấp dữ liệu cho mô hình nhiều lần, vì vậy bạn định nghĩa một hàm để lặp lại quá trình này. Hãy gọi hàm này là 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 trên một tập dữ liệu khác.
  • Đưa ra dự đoán

Công cụ ước lượng TensorFlow cung cấp ba hàm 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 phương thức huấn luyện estimator để huấn luyện mô hình. Phương thức huấn luyện estimator cần một hàm đầu vào (input_fn) và số bước (steps). Bạn có thể sử dụng hàm đã tạo ở trên để cung cấp dữ liệu 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 cần chỉ định số lượng epoch; bạn cho phép mô hình lặp lại 1000 lần. Nếu bạn đặt số lượng epoch là 1, thì mô hình sẽ lặp lại bốn lần, vì có 400 bản ghi trong tập huấn luyện và kích thước batch là 128:

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

Do đó, sẽ dễ dàng hơn nếu đặt số lượng epoch bằng 0 và xác định số lần lặp, như được minh họa 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 để hình dung mức độ sai số 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á nhà trung bình là 22 nghìn đô la, với giá thấp nhất là 5 nghìn đô la và giá cao nhất là 50 nghìn đô la. Vì mức lỗ được báo cáo là sai số bình phương trung bình, nên sai số điển hình trong đơn vị gốc xấp xỉ căn bậc hai của 32.16, tức là khoảng 5.7 nghìn đô la.

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

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

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

Để in ra các giá trị ước tính, bạn có thể sử dụng đoạn 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
6 21.46

Lưu ý rằng chúng ta không biết giá trị thực sự của sáu ngôi nhà này. Trong bài hướng dẫn về học sâu, bạn sẽ cố gắng đánh bại 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 trình ước lượng NumPy để cung cấp dữ liệu. Phương pháp này tương tự, ngoại trừ việc bạn sẽ sử dụng trình ước lượng numpy_input_fn.

Đọc ba tệp CSV tương tự, nhưng chỉ giữ lại các mảng NumPy thô có đuôi .values.

training_set_n = pd.read_csv("E:/boston_train.csv").values
test_set_n = pd.read_csv("E:/boston_test.csv").values
prediction_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 đặc trưng với nhãn. Bạn cần thực hiện điều này cho cả dữ liệu huấn luyện và dữ liệu đánh giá. Việc định nghĩa một hàm để chia dữ liệu sẽ nhanh hơn.

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

Bạn có thể sử dụng hàm này để tách nhãn khỏi các đặc trưng của tập dữ liệu huấn luyện và đá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 bỏ cột cuối cùng của tập dữ liệu dự đoán vì nó chỉ chứa toàn giá trị 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ó chiều thứ hai, có 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 đặc trưng như sau:

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

Công cụ ước lượng được định nghĩa như trước: bạn chỉ định các cột đặc trưng và nơi lưu đồ thị.

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 trình ước lượng NumPy để 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 ta đã định nghĩa hàm input_fn trước đó để dễ đọc hơn.

# Train the estimator
train_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 hàm đầu vào 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. Kết quả sẽ tương tự như kết quả của Pandas.

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 TensorFlow

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

Lưu ý rằng nếu bạn sử dụng Jupyter máy tính xách tayBạn cần khởi động lại và xóa sạch nhân hệ thống để 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 quy trình xử lý. 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, bạn khai báo hai biến với đường dẫn đến các tệp CSV. Lưu ý rằng bạn có hai tệp, một tệp dành cho tập dữ liệu huấn luyện và một tệp dành cho tập dữ liệu kiểm tra.

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

Tiếp theo, bạn cần xác định các cột muốn sử dụng từ tệp CSV. Chúng ta sẽ sử dụng tất cả các cột. Sau đó, bạn cần khai báo kiểu dữ liệu cho từng biến.

Biến float được định nghĩa 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 này 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à đoạn mã tổng quát để định nghĩa hàm. Đoạn mã sẽ được giải thích chi tiết hơn ở phần 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 dataset đọc từng dòng một. Để xây dựng dataset, 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 đề, vì vậy 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 quy trình. Để đưa vào mô hình, bạn cần tách các đặc trưng khỏi nhãn. Phương thức được sử dụng để áp dụng bất kỳ phép biến đổi nào cho dữ liệu là map.

Phương pháp này gọi một hàm mà bạn sẽ tạo ra để hướng dẫn cách chuyển đổi dữ liệu. Nói tóm lại, bạn cần truyền dữ liệu vào hàm đó. TextLineĐối tượng tập dữ liệu, loại bỏ phần tiêu đề và áp dụng phép biến đổi được hướng dẫn bởi một hàm.

Code giải thích

  • tf.data.TextLineTập dữ liệu (data_file): dòng này đọc tệp CSV
  • .skip(1): bỏ qua phần tiêu đề
  • .map(parse_csv)): phân tích các bản ghi thành các tensor

Bạn cần định nghĩa 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 thức tf.decode_csv và khai báo các đặc trưng và nhãn. Các đặc trưng có thể được khai báo dưới dạng từ điển hoặc bộ dữ liệu. Bạn sử dụng phương thức từ điển vì nó thuận tiện hơn.

Code giải thích

  • tf.decode_csv(value, record_defaults= RECORDS_ALL): phương thức giải mã_csv sử dụng đầu ra của TextLineTập dữ liệu để đọc tệp CSV. Tham số `record_defaults` hướng dẫn TensorFlow về các kiểu dữ liệu của cột. Trong TensorFlow 2.x, ký hiệu này nằm ở `tf.io.decode_csv`.
  • dict(zip(COLUMNS, columns)): điền vào từ điển tất cả các cột ví dụtracted trong quá trình xử lý dữ liệu này
  • features.pop('medv'): loại trừ biến mục tiêu khỏi các biến đặc trưng và tạo biến nhãn.

Tập dữ liệu cần thêm các phần tử để liên tục cung cấp dữ liệu cho các tensor. Cụ thể, bạn cần thêm phương thức `repeat` để cho phép tập dữ liệu tiếp tục cung cấp dữ liệu cho mô hình vô thời hạn. 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 và sau đó báo lỗi vì không còn dữ liệu nào được cung cấp vào quy trình.

Sau đó, bạn có thể kiểm soát kích thước lô bằng phương pháp batch. Điều này có nghĩa là bạn cho tập dữ liệu biết bạn muốn truyền bao nhiêu dữ liệu vào quy trình xử lý trong mỗi lần lặp. Nếu bạn đặt kích thước lô lớn, mô hình sẽ chạy 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) Tiêu thụ dữ liệu

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

Lưu ý rằng nó in các tính năng dưới dạng 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 đoạn mã này nhiều lần với các 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 5) Xác định cột tính năng

Bạn cần định nghĩa 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 6) 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 phải sử dụng một hàm lambda Để cho phép bạn viết các đối số cho hàm input_fn. Nếu bạn không sử dụng hàm lambda, bạn không thể huấn luyện mô hình.

# Train the estimator
model.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ị mục tiêu dựa trên giá trị của ma trận đặc trưng. Bạn có thể viết một từ điển với các giá trị mà bạn muốn dự đoán. Mô hình của bạn có chín đặc trưng, ​​vì vậy bạn cần cung cấp giá trị cho mỗi đặc trưng. Mô hình sẽ đưa ra dự đoán cho từng đặc trưng đó.

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

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

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_input
     pred_results = model.predict(input_fn=test_input_fn)

Cuối cùng, bạn in ra các 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)})

Cả ba pipeline đều trả về sáu dự đoán giống nhau, điều này khẳng định rằng việc lựa chọn giữa Pandas, NumPy và bộ dữ liệu TensorFlow gốc chỉ là vấn đề tiện lợi chứ không phải độ chính xác.

Câu Hỏi Thường Gặp

Không. TensorFlow đã đánh dấu Estimators và feature columns là hoàn toàn lỗi thời trong phiên bản 2.12 và loại bỏ chúng trong phiên bản 2.16. Hãy cố định TensorFlow ở phiên bản 1.15 hoặc 2.15 để chạy đoạn mã này mà không cần thay đổi, hoặc viết lại mô hình bằng các lớp Keras, điều mà nhóm TensorFlow hiện đang khuyến nghị.

Tải các tệp CSV bằng Gấu trúc, mở rộng chín đặc trưng bằng lớp Chuẩn hóa, sau đó xếp chồng một đơn vị Dense(1) duy nhất. Biên dịch với trình tối ưu hóa và tổn thất sai số bình phương trung bình, sau đó gọi fit. Một đơn vị Dense không có kích hoạt là một hồi quy tuyến tính.

Hãy bắt đầu với giá trị khoảng 0.01 và điều chỉnh theo bội số của mười. Tỷ lệ quá nhỏ cần nhiều lần lặp hơn để hội tụ, trong khi tỷ lệ quá lớn làm cho tổn thất dao động. Vẽ đồ thị đường cong tổn thất và giữ lại tỷ lệ lớn nhất mà vẫn giảm đều đặn.

scikit-learn đã loại bỏ hàm load_boston trong phiên bản 1.2 do lo ngại về mặt đạo đức liên quan đến một biến chủng tộc được tạo ra một cách có chủ đích. Hướng dẫn này đọc các tệp CSV thông thường, vì vậy liên kết tải xuống vẫn hoạt động, nhưng các dự án mới nên sử dụng bộ dữ liệu nhà ở California hoặc bộ dữ liệu nhà ở Ames thay thế.

Sai số bình phương trung bình (RMSE) khôi phục lại đơn vị ban đầu, sai số tuyệt đối trung bình (MAE) loại bỏ các giá trị ngoại lệ, và hệ số R-squared cho biết tỷ lệ phương sai được giải thích. Nên báo cáo chỉ số sai số tuyệt đối cùng với R-squared, vì R-squared cao vẫn có thể che giấu các sai số dự đoán riêng lẻ lớn.

Hồi quy tuyến tính dự đoán một số liên tục, chẳng hạn như giá nhà. phân loại tuyến tính Dự đoán nhãn lớp riêng biệt. Cả hai đều phù hợp với tổng trọng số của các đặc trưng, ​​nhưng bộ phân loại sẽ truyền tổng đó qua ngưỡng quyết định.

Các quy trình tự động chấm điểm các đặc trưng bằng phương pháp điều chỉnh Lasso, thông tin tương hỗ hoặc tầm quan trọng hoán vị, sau đó loại bỏ những đặc trưng yếu nhất. Các công cụ AutoML tìm kiếm các tùy chọn tiền xử lý và mô hình cùng nhau, giúp bạn tiết kiệm thời gian chọn lọc thủ công các cột cần đưa vào feature_cols.

Copilot soạn thảo nhanh chóng các đoạn mã mẫu, bao gồm các hàm đầu vào, danh sách cột tính năng và vòng lặp đánh giá. Hãy coi mọi đề xuất như một bản nháp, vì nó thường tạo ra các lệnh gọi Estimator đã lỗi thời. Kiểm tra từng ký hiệu được tạo ra so với API TensorFlow hiện tại trước khi chạy.

Tóm tắt bài viết này với: