Hồi quy tuyến tính là gì?
Hồi quy tuyến tính 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 một 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à đối với nhiều hơn một biến giải thích, nó được gọi là hồi quy tuyến tính nhiều lần.
TensorFlow cung cấp các công cụ để có toàn quyền kiểm soát các tính toán. Điều này được thực hiện với API cấp thấp. Trên hết, TensorFlow được trang bị một loạt các API để thực hiện nhiều thuật toán học máy. Đâ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 cho người mới bắt đầu
- API cấp cao: Xác định thuật toán. Nó thân thiện với mùa đông. TensorFlow cung cấp công cụ ước lượng cuộc gọi hộp công cụ để 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ẽ chỉ sử dụng các công cụ ước tính . Các phép tính 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 gradient descent để đào tạo 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á của một ngôi nhà bằng cách sử dụng công cụ ước tính TensorFlow.
Tải xuống Boston DataSet
Trong hướng dẫn Hồi quy TensorFlow này, bạn sẽ học:
- Hồi quy tuyến tính là gì?
- Cách đào tạo mô hình hồi quy tuyến tính
- Cách huấn luyện hồi quy tuyến tính với TensorFlow
- Gấu trúc
- Giải pháp Numpy
- Giải pháp dòng chảy
Cách đào tạo 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 là x và y và nhiệm vụ của bạn là dự đoán giá trị khi 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ệ thuận giữa biến độc lập, x và biến phụ thuộc y.
Bạn có thể quan sát, nếu x = 1, y sẽ gần bằng 6 và nếu x = 2, y sẽ bằng 8,5.
Đây không phải là một phương pháp rất chính xác và dễ bị sai sót, đặc biệt là với một tập dữ liệu có hàng trăm nghìn điểm.
Một 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 biến. 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à:
Với:
là trọng lượng liên quan đến x
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à bạn tìm thấy giải pháp sau cho:
= 3,8
= 2,78
Bạn có thể thay thế các số đó trong phương trình và nó 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. Có 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 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ẽ biểu đồ kết quả.
Đường màu đỏ đại diện cho giá trị vừa vặn, đó 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 các 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 đến nhiều hiệp biến 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 thức y sẽ phản ứng với mỗi biến x được lấy một cách độ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 (mưa, nắng, mây), thông tin khách hàng (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 tính toán giá trị trung bình cho mỗi biến 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 đối với 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:
Thuật toán sẽ tìm ra giải pháp tốt nhất cho các trọng số; nó 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à các điểm dữ liệu).
Cách thức hoạt động của thuật toán
Các thuật toán sẽ chọn một số ngẫu nhiên cho mỗi và thay thế các giá trị của x để lấy 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 sai số, ghi nhậ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 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.
Mục tiêu của bạn là giảm thiểu bình phương của lỗi. Thuật toán tính toán 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, nó là:
Ở đâu:
đề cập đến giá trị dự đoán
- y là giá trị thực
- m là số lần quan sát
Lưu ý rằng điều đó là ký hiệu toán học của giá trị trung bình.
Mục tiêu là tìm ra thứ tốt nhất để giảm thiểu MSE
Nếu sai số trung bình lớn, có nghĩa là mô hình hoạt động kém và các trọng số không được chọn đúng cách. Để 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à Gradient Descent .
Sự giảm dần gradient lấy đạo hàm và giảm hoặc tăng trọng lượng. Nếu đạo hàm là dương, trọng lượng bị giảm. Nếu đạo hàm âm thì trọng 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 thay đổi nữa. Mỗi quá trình được gọi là một lần lặp . Bên cạnh đó, điểm tốt nghiệp được nhân với một tỷ lệ học tập. Nó cho biết tốc độ học.
Nếu tỷ lệ học quá nhỏ, thuật toán sẽ mất rất nhiều thời gian để hội tụ (tức là yêu cầu nhiều lần lặp lại). Nếu tỷ lệ học tập quá cao, thuật toán có thể không bao giờ hội tụ.
Bạn có thể thấy từ hình trên, mô hình lặp lại quá trình khoảng 20 lần trước đó để tìm giá trị ổn định cho các trọng số, do đó đạt sai số thấp nhất.
Lưu ý rằng , sai số không bằng 0 nhưng ổn định xung quanh 5. Có nghĩa là, mô hình mắc lỗi đ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 như nhiều biến hơn hoặc sử dụng các nhà ước lượng khác nhau.
Bạn nhớ phương trình đầu tiên
Trọng lượng cuối cùng là 3,8 và 2,78. Video dưới đây cho bạn thấy cách gradient descent tối ưu hóa chức năng mất đi để tìm ra 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 xảy ra đằng sau lớp phủ, bạn đã sẵn sàng sử dụng API ước tính do TensorFlow cung cấp để đào tạo hồi quy tuyến tính đầu tiên của bạn bằng cách sử dụng TensorFlow.
Bạn sẽ sử dụng Tập dữ liệu Boston, bao gồm các biến sau
crim | 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ô trên 25.000 sq.ft. |
indus | tỷ lệ diện tích kinh doanh không bán lẻ trên mỗi thị trấn. |
nox | nồng độ oxit nitric |
rm | số lượng phòng trung bình trên một ngôi nhà |
tuổi tác | tỷ lệ các căn hộ có chủ sở hữu được xây dựng trước năm 1940 |
dis | khoảng cách có trọng số đến năm trung tâm việc làm Boston |
Thuế | thuế suất tài sản toàn giá trị trên mỗi 10.000 đô la |
ptratio | tỷ lệ học sinh-giáo viên theo thị trấn |
medv | Giá trị trung bình của những ngôi nhà có chủ sở hữu tính bằng nghìn đô la |
Bạn sẽ tạo ba tập dữ liệu khác nhau:
tập dữ liệu | mục tiêu | hình dạng |
---|---|---|
Đào tạo | Huấn luyện mô hình và lấy các trọng lượng | 400, 10 |
Đánh giá | Đánh giá hiệu suất của mô hình trên dữ liệu không 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ẽ học 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ỉ TF
Lưu ý rằng, tất cả các tùy chọn đều cung cấp kết quả giống nhau.
Bạn sẽ học cách sử dụng API cấp cao để xây dựng, đào tạo đá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:
- Mất chức năng
- Tối ưu hóa: Gradient descent
- Phép nhân ma trận
- Đồ thị và tensor
Điều này là tẻ nhạt và phức tạp hơn cho 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 pdfrom sklearn import datasetsimport tensorflow as tfimport itertools
Bước 1) Nhập dữ liệu với gấu trúc.
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", jumpinitialspace = True, bỏ qua = 1, tên = COLUMNS)
test_set = pd.read_csv ("E: /boston_test.csv", jumpinitialspace = True, bỏ qua = 1, tên = COLUMNS)
dự đoán_set = pd.read_csv ("E: /boston_p Dự đoán.csv", jumpinitialspace = Đúng, bỏ qua = 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 chỉ chứa các tính năng và một chỉ có tên 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 nào
Nó được thực hiện với đoạn 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ố ở đị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 ().
Trong bước trước, bạn xác định danh sách một tính năng 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 trong danh sách FEATURES trước khi bạn tạo feature_cols
Lưu ý rằng bạn sẽ sử dụng khả năng hiểu danh sách Python với danh sách CÁC TÍNH NĂNG để tạo một danh sách mới có tên feature_cols. Nó giúp bạn tránh 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 được xây dựng trước, bao gồm 3 công cụ phân loại và 3 công cụ hồi quy TensorFlow:
- Bộ điều chỉnh
- DNNRegressor
- LinearRegressor
- DNNLineaCombinedRegressor
- Phân loại
- DNNClassifier
- LinearClassifier
- DNNLineaCombinedClassifier
Trong hướng dẫn này, bạn sẽ sử dụng Linear Regressor. Để 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 để đư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 tệp 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 Tensorboard như được hiển thị 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':, '_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 nguồn 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à tập dữ liệu rất lớn. Do sự hạn chế của tài nguyên máy, không thể cung cấp cho mô hình với tất cả dữ liệu cùng một lúc. Vì vậy, bạn cần phải 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 hàng loạt, bạn sẽ bị 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 tất cả dữ liệu, nó sẽ kết thúc một kỷ nguyên . Kỷ nguyên xác định số lần bạn muốn mô hình xem dữ liệu. Tốt hơn nên đặt bước này thành không và để mô hình thực hiện số lần lặp lại.
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 mẫu cụ thể của tập dữ liệu. Nếu mô hình tìm hiểu chi tiết về mô hình 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 không nhìn thấy. Điều này được gọi là trang phục 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 giúp bạn dễ dàng thực hiện hai bước này. Khi dữ liệu đi đến đường ống, nó biết nó cần bao nhiêu quan sát (hàng loạ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: hàng loạt. Theo mặc định 128
- num_epoch: Số kỷ nguyên, theo mặc định là 1
- xáo trộn: Xáo trộn hoặc không trộn dữ liệu. Theo mặc định, Không có
Bạn cần nạp mô hình nhiều lần để bạn xác định một hàm để lặp lại quá trình này. tất cả hàm get_input_fn này.
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) : Huấn luyện 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 đoàn tàu cần một input_fn và một số bước. Bạn có thể sử dụng chức năng bạn đã tạo ở trên để cấp nguồn 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
- 128 hàng
- 128 hàng
- 128 hàng
- 16 hàng
Do đó, dễ dàng hơn để đặt số lượng kỷ nguyên thành không và xác định số lần lặp lại như được hiển thị 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 = 1INFO:tensorflow:global_step/sec: 238.616INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec)INFO:tensorflow:global_step/sec: 314.293INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec)INFO:tensorflow:global_step/sec: 303.863INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec)INFO:tensorflow:global_step/sec: 308.782INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec)INFO:tensorflow:global_step/sec: 244.969INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec)INFO:tensorflow:global_step/sec: 155.966INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec)INFO:tensorflow:global_step/sec: 263.256INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec)INFO:tensorflow:global_step/sec: 254.112INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec)INFO:tensorflow:global_step/sec: 292.405INFO: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 sẽ lệnh sau:
activate hello-tf# For MacOStensorboard --logdir=./train# For Windowstensorboard --logdir=train
Bước 5) Đánh giá mô hình của bạn
Bạn có thể đánh giá sự phù hợp của mô hình của mình trên bộ thử nghiệm với 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:13INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896
Bạn có thể in 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 thống kê tóm tắt để biết mức độ lớn của lỗi.
training_set['medv'].describe()
Đầu ra
count 400.000000mean 22.625500std 9.572593min 5.00000025% 16.60000050% 21.40000075% 25.025000max 50.000000Name: medv, dtype: float64
Từ bảng thống kê tổng hợp ở trên, bạn biết rằng giá trung bình cho một căn nhà là 22 nghìn, 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 dự đoán để ướ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-1000INFO: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à ở |
Sự 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 của. Trong hướng dẫn 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 công cụ ước lượng phức tạp để cung cấp dữ liệu. Phương pháp này cũng giống như phương pháp mà bạn sẽ sử dụng ước lượng numpy_input_fn.
training_set_n = pd.read_csv ("E: /boston_train.csv"). giá trị
test_set_n = pd.read_csv ("E: /boston_test.csv"). giá trị
dự đoán_set_n = pd.read_csv ("E: /boston_p Dự đoán.csv"). giá trị
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 làm điều này để có dữ liệu đào tạo và đánh giá. Việc xác định một hàm để chia nhỏ 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 chức năng để tách nhãn khỏi các tính năng của tập dữ liệu huấn luyện / đá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, nó 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 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 định nghĩa như trước đây, bạn hướng dẫn các cột tính nă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':, '_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ông cụ ướ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 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 = 1INFO:tensorflow:global_step/sec: 490.057INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec)INFO:tensorflow:global_step/sec: 788.986INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec)INFO:tensorflow:global_step/sec: 736.339INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec)INFO:tensorflow:global_step/sec: 383.305INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec)INFO:tensorflow:global_step/sec: 859.832INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec)INFO:tensorflow:global_step/sec: 804.394INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec)INFO:tensorflow:global_step/sec: 753.059INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec)INFO:tensorflow:global_step/sec: 402.165INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec)INFO:tensorflow:global_step/sec: 344.022INFO: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]:
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:00INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945Out[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ó phải tương tự 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-1000INFO: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 phương pháp kia.
Lưu ý rằng nếu bạn sử dụng sổ ghi chép Jupyter, bạn cần Khởi động lại và dọn dẹp hạt nhân để chạy phiên này.
TensorFlow đã xây dựng một công cụ tuyệt vời để chuyển dữ liệu vào đường ống. 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 của tệp csv. Lưu ý rằng, bạn có hai tệp, một cho tập huấn luyện và một cho tập thử nghiệm.
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 kiểu của biến.
Biến số 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
Hàm có thể được chia thành ba phần:
- Nhập dữ liệu
- Tạo trình lặp
- Sử dụng dữ liệu
Dưới đây là mã tổng quát để xác định chức năng. Mã sẽ được giải thích sau
def input_fn(data_file, batch_size, num_epoch = None):# Step 1def 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 theDataset 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 3iterator = 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 đọ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 TextLineDataset. Tập dữ liệu của bạn có một tiêu đề, vì vậy bạn cần sử dụng bỏ qua (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ỳ chuyể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 chuyển dữ liệu vào đối tượng TextLineDataset, loại trừ tiêu đề và áp dụng một phép chuyển đổi được hướng dẫn bởi một hàm.
- tf.data.TextLineDataset (data_file): Dòng này đọc tệp csv
- .skip (1): bỏ qua tiêu đề
- .map (parse_csv)): phân tích cú pháp các bản ghi thành các tensor Bạ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 cú pháp tệp csv bằng phương thức 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 như một từ điển hoặc một bộ tuple. Bạn sử dụng phương pháp từ điển vì nó thuận tiện hơn.
- tf.decode_csv (value, record_defaults = RECORDS_ALL): phương thức decode_csv sử dụng đầu ra của TextLineDataset để đọc tệp csv. record_defaults hướng dẫn TensorFlow về loại cột.
- dict (zip (_CSV_COLUMNS, cột)): Điền vào từ điển với tất cả các cột được trích xuất trong quá trình xử lý dữ liệu này
- features.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
Dataset cần các phần tử khác để cấp dữ liệu cho Tensors một cách lặp đi lặp lại. 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, mô hình sẽ chỉ lặp lại một lần và sau đó xuất hiện lỗi vì không có thêm dữ liệu nào được cung cấp trong đường ống.
Sau đó, bạn có thể kiểm soát kích thước lô bằng phương pháp lô. Nó có nghĩa là bạn cho tập dữ liệu biết bạn muốn chuyển bao nhiêu dữ liệu trong đường dẫn 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 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à với 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 lặp.
Bước 4) Sử dụng 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 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ột 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ể đào tạo mô hình bằng công cụ ước lượng 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':, '_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 một hàm lambda để cho phép viết đối số trong hàm inpu_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 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 = 1INFO:tensorflow:global_step/sec: 72.5646INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec)INFO:tensorflow:global_step/sec: 101.355INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec)INFO:tensorflow:global_step/sec: 109.293INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec)INFO:tensorflow:global_step/sec: 102.235INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec)INFO:tensorflow:global_step/sec: 104.656INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec)INFO:tensorflow:global_step/sec: 106.697INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec)INFO:tensorflow:global_step/sec: 118.454INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec)INFO:tensorflow:global_step/sec: 114.947INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec)INFO:tensorflow:global_step/sec: 111.484INFO: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]:
Bạn có thể đánh giá sự phù hợp của mô hình của bạn trên bộ thử nghiệm với 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:02INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896average_loss, was: 32.158958435058594loss, was: 3215.89599609375global_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 đối tượng địa lý. Bạn có thể viế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ó 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ẽ cung cấp một dự đoán cho mỗi người trong số họ.
Trong đoạn mã dưới đây, bạn đã viết các giá trị của từng tính năng có trong tệp df_p Dự đoán csv.
Bạn cần viết một hàm input_fn mới vì không có nhãn nào trong tập dữ liệu. Bạn có thể sử dụng API from_tensor từ 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_inputpred_results = model.predict(input_fn=test_input_fn)
Cuối cùng, bạn in 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-1000INFO: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óm lược
Để đào tạo một người mẫu, bạn cần phải:
- Xác định các tính năng: Các biến độc lập: X
- Xác định nhãn: Biến phụ thuộc: y
- Xây dựng một đoàn tàu / bộ thử nghiệm
- Xác định trọng lượng ban đầu
- Xác định hàm mất mát: MSE
- Tối ưu hóa mô hình: Gradient descent
- Định nghĩa:
- Tỷ lệ học
- Số kỷ nguyên
- 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:
- Các cột tính năng. Nếu liên tục: tf.feature_column.numeric_column (). Bạn có thể điền vào một danh sách với khả năng hiểu danh sách python
- Công cụ ước tính: tf.estimator.LinearRegressor (feature_columns, model_dir)
- Một 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 đào tạo, đánh giá và đưa ra dự đoán với train (), Assess () và dự đoán ()