Hồi quy tuyến tính TensorFlow với thuật ngữ khía cạnh và tương tác

Trong hướng dẫn này, bạn sẽ tìm hiểu cách kiểm tra dữ liệu và chuẩn bị dữ liệu để tạo một tác vụ hồi quy tuyến tính đơn giản.

Hướng dẫn này được chia thành hai phần:

  • Tìm kiếm sự tương tác
  • Kiểm tra mô hình

Trong tạp chí hướng dẫn trước, bạn đã sử dụng tập dữ liệu Boston để ước tính giá trung bình của một ngôi nhà. Tập dữ liệu Boston có kích thước nhỏ, chỉ có 506 quan sát. Tập dữ liệu này được coi là điểm chuẩn để thử các thuật toán hồi quy tuyến tính mới.

Bộ dữ liệu bao gồm:

Biến Mô tả
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ệ mẫu đất 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
tội phạm tỷ lệ tội phạm bình quân đầu người theo thị trấn
chas Biến giả Charles River (1 nếu giới hạn sông; 0 nếu không)
B tỷ lệ người da đen ở thị trấn

Trong hướng dẫn này, chúng tôi sẽ ước tính giá trung bình bằng cách sử dụng một biến hồi quy tuyến tính, nhưng trọng tâm là một quy trình cụ thể học máy: “chuẩn bị dữ liệu.”

Một mô hình khái quát hóa mẫu trong dữ liệu. Để chụp được một mẫu như vậy, trước tiên bạn cần tìm nó. Một cách tốt là thực hiện phân tích dữ liệu trước khi chạy bất kỳ thuật toán học máy nào.

Việc lựa chọn các tính năng phù hợp sẽ tạo nên sự khác biệt cho sự thành công của mô hình của bạn. Hãy tưởng tượng bạn cố gắng ước tính mức lương của một người, nếu bạn không bao gồm giới tính làm đồng biến, bạn sẽ có một ước tính kém.

Một cách khác để cải thiện mô hình là xem xét mối tương quan giữa biến độc lập. Quay lại ví dụ, bạn có thể coi giáo dục như một ứng cử viên xuất sắc để dự đoán mức lương cũng như nghề nghiệp. Công bằng mà nói, nghề nghiệp phụ thuộc vào trình độ học vấn, cụ thể là trình độ học vấn cao hơn thường dẫn đến nghề nghiệp tốt hơn. Nếu chúng ta khái quát hóa ý tưởng này, chúng ta có thể nói rằng mối tương quan giữa biến phụ thuộc và biến giải thích có thể được phóng đại lên một biến giải thích khác.

Để nắm bắt được tác động hạn chế của giáo dục đối với nghề nghiệp, chúng ta có thể sử dụng thuật ngữ tương tác.

Thuật ngữ tương tác

Nếu bạn nhìn vào phương trình tiền lương, nó sẽ trở thành:

Thuật ngữ tương tác

If Thuật ngữ tương tác là dương, thì nó ngụ ý rằng trình độ học vấn bổ sung mang lại mức tăng cao hơn về giá trị trung bình của một ngôi nhà đối với trình độ nghề nghiệp cao. Nói cách khác, có sự tác động qua lại giữa trình độ học vấn và nghề nghiệp.

Trong hướng dẫn này, chúng ta sẽ cố gắng xem biến nào có thể là ứng cử viên sáng giá cho các thuật ngữ tương tác. Chúng tôi sẽ kiểm tra xem việc thêm loại thông tin này có dẫn đến dự đoán giá tốt hơn hay không.

Tóm tắt thống kê

Có một số bước bạn có thể làm theo trước khi tiếp tục với mô hình. Như đã đề cập trước đó, mô hình là sự tổng quát hóa của dữ liệu. Cách thực hành phù hợp nhất là hiểu dữ liệu và đưa ra dự đoán. Nếu bạn không biết dữ liệu của mình, bạn có rất ít cơ hội để cải thiện mô hình của mình.

Bước đầu tiên, hãy tải dữ liệu dưới dạng khung dữ liệu gấu trúc và tạo tập huấn luyện và tập kiểm tra.

Lời khuyên: Đối với hướng dẫn này, bạn cần cài đặt matplotlit và seaborn trong Python. Bạn có thể cài đặt Python gói hàng nhanh chóng với Jupyter. Bạn Không nên làm cái này

!conda install -- yes matplotlib

nhưng

import sys
!{sys.executable} -m pip install matplotlib # Already installed
!{sys.executable} -m pip install seaborn 

Lưu ý rằng bước này không cần thiết nếu bạn đã cài đặt matplotlib và seaborn.

Matplotlib là thư viện để tạo biểu đồ trong Python. Seaborn là một thư viện trực quan hóa thống kê được xây dựng dựa trên matplotlib. Nó cung cấp những mảnh đất hấp dẫn và đẹp mắt.

Mã bên dưới nhập các thư viện cần thiết.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
from sklearn.datasets import load_boston
import numpy as np

Thư viện sklearn bao gồm bộ dữ liệu Boston. Bạn có thể gọi API của nó để nhập dữ liệu.

boston = load_boston()
df = pd.DataFrame(boston.data)

Tên của đối tượng được lưu trữ trong đối tượng feature_names trong một mảng.

boston.feature_names

Đầu ra

array(['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT'], dtype='<U7')

Bạn có thể đổi tên các cột.

df.columns = boston.feature_names
df['PRICE'] = boston.target
df.head(2)

Hồi quy tuyến tính với khía cạnh và thuật ngữ tương tác

Bạn chuyển đổi biến CHAS thành biến chuỗi và gắn nhãn có nếu CHAS = 1 và không nếu CHAS = 0

df['CHAS'] = df['CHAS'].map({1:'yes', 0:'no'})
df['CHAS'].head(5)
0    no
1    no
2    no
3    no
4    no
Name: CHAS, dtype: object

Với gấu trúc, việc phân chia tập dữ liệu rất đơn giản. Bạn chia ngẫu nhiên tập dữ liệu với tập huấn luyện 80 phần trăm và tập kiểm tra 20 phần trăm. Gấu trúc có hàm chi phí tích hợp để phân chia mẫu khung dữ liệu.

Frac tham số đầu tiên có giá trị từ 0 đến 1. Bạn đặt nó thành 0.8 để chọn ngẫu nhiên 80 phần trăm khung dữ liệu.

Random_state cho phép trả về cùng một khung dữ liệu cho mọi người.

### Create train/test set
df_train=df.sample(frac=0.8,random_state=200)
df_test=df.drop(df_train.index)

Bạn có thể có được hình dạng của dữ liệu. Nó phải là:

  • Tập tàu: 506*0.8 = 405
  • Bộ kiểm tra: 506*0.2 = 101
print(df_train.shape, df_test.shape)

Đầu ra

(405, 14) (101, 14)
df_test.head(5)

Đầu ra

TỘI LỖI ZN ẤN ĐỘ CHAS NOX RM TUỔI TÁC DIS RAD THUẾ PTRATIO B LSTAT BẢNG GIÁ
0 0.00632 18.0 2.31 Không 0.538 6.575 65.2 4.0900 1.0 296.0 15.3 396.90 4.98 24.0
1 0.02731 0.0 7.07 Không 0.469 6.421 78.9 4.9671 2.0 242.0 17.8 396.90 9.14 21.6
3 0.03237 0.0 2.18 Không 0.458 6.998 45.8 6.0622 3.0 222.0 18.7 394.63 2.94 33.4
6 0.08829 12.5 7.87 Không 0.524 6.012 66.6 5.5605 5.0 311.0 15.2 395.60 12.43 22.9
7 0.14455 12.5 7.87 Không 0.524 6.172 96.1 5.9505 5.0 311.0 15.2 396.90 19.15 27.1

Dữ liệu lộn xộn; nó thường bị mất cân bằng và có nhiều giá trị ngoại lệ làm ảnh hưởng đến quá trình đào tạo về phân tích và học máy.

Bước đầu tiên để làm sạch tập dữ liệu là hiểu nó cần làm sạch ở đâu. Việc dọn dẹp một tập dữ liệu có thể khó thực hiện, đặc biệt là theo bất kỳ cách khái quát nào

Nhóm nghiên cứu của Google đã phát triển một công cụ cho công việc này có tên là Các khía cạnh giúp trực quan hóa dữ liệu và cắt nó theo mọi cách. Đây là điểm khởi đầu tốt để hiểu cách trình bày tập dữ liệu.

Các khía cạnh cho phép bạn tìm ra nơi dữ liệu không hoàn toàn giống như cách bạn đang nghĩ.

Ngoại trừ ứng dụng web của họ, Google giúp dễ dàng nhúng bộ công cụ này vào một Jupyter sổ tay.

Có hai phần của Facet:

  • Tổng quan về các khía cạnh
  • Tìm hiểu sâu về các khía cạnh

Tổng quan về các khía cạnh

Tổng quan về khía cạnh cung cấp tổng quan về tập dữ liệu. Tổng quan về khía cạnh chia các cột dữ liệu thành các hàng thông tin nổi bật hiển thị

  1. tỷ lệ quan sát bị thiếu
  2. giá trị tối thiểu và tối đa
  3. số liệu thống kê như giá trị trung bình, trung vị và độ lệch chuẩn.
  4. Nó cũng thêm một cột hiển thị phần trăm các giá trị là số 0, điều này rất hữu ích khi hầu hết các giá trị đều là số 0.
  5. Có thể thấy các phân phối này trên tập dữ liệu thử nghiệm cũng như tập huấn luyện cho từng tính năng. Điều này có nghĩa là bạn có thể kiểm tra lại xem thử nghiệm có phân phối tương tự như dữ liệu huấn luyện hay không.

Đây ít nhất là điều tối thiểu phải làm trước bất kỳ nhiệm vụ học máy nào. Với công cụ này, bạn không bỏ lỡ bước quan trọng này và nó sẽ nêu bật một số điểm bất thường.

Tìm hiểu sâu về các khía cạnh

Facets Deep Dive là một công cụ tuyệt vời. Nó cho phép làm rõ một số dữ liệu của bạn và phóng to hết cỡ để xem từng phần dữ liệu riêng lẻ. Điều đó có nghĩa là bạn có thể phân tích dữ liệu theo hàng và cột trên bất kỳ tính năng nào của dữ liệu.

Chúng tôi sẽ sử dụng hai công cụ này với bộ dữ liệu Boston.

Chú thích: Bạn không thể sử dụng Tổng quan về khía cạnh và Tìm hiểu sâu về khía cạnh cùng một lúc. Bạn cần xóa sổ ghi chép trước để thay đổi công cụ.

Cài đặt khía cạnh

Bạn có thể sử dụng ứng dụng web Facet cho hầu hết các phân tích. Trong hướng dẫn này, bạn sẽ biết cách sử dụng nó trong một Jupyter Máy tính xách tay.

Trước hết, bạn cần cài đặt nbextensions. Việc này được thực hiện bằng mã này. Bạn sao chép và dán mã sau vào terminal của máy.

pip install jupyter_contrib_nbextensions

Ngay sau đó, bạn cần sao chép các kho lưu trữ trong máy tính của mình. Bạn có hai lựa chọn:

Tùy chọn 1) Sao chép và dán mã này vào thiết bị đầu cuối (Đề xuất)

Nếu bạn chưa cài đặt Git trên máy của mình, vui lòng truy cập URL này https://git-scm.com/download/win và làm theo hướng dẫn. Sau khi hoàn tất, bạn có thể sử dụng lệnh git trong terminal dành cho người dùng Mac hoặc lời nhắc Anaconda cho Windows người sử dụng

git clone https://github.com/PAIR-code/facets

Tùy chọn 2) Truy cập https://github.com/PAIR-code/facets và tải xuống các kho lưu trữ.

Cài đặt khía cạnh

Nếu bạn chọn tùy chọn đầu tiên, tệp sẽ nằm trong tệp tải xuống của bạn. Bạn có thể cho phép tải xuống tệp hoặc kéo tệp đó sang đường dẫn khác.

Bạn có thể kiểm tra nơi Facet được lưu trữ bằng dòng lệnh này:

echo `pwd`/`ls facets`

Bây giờ bạn đã định vị được Facet, bạn cần cài đặt nó vào Jupyter Sổ tay. Bạn cần đặt thư mục làm việc theo đường dẫn chứa các khía cạnh.

Thư mục làm việc hiện tại của bạn và vị trí của Facet zip phải giống nhau.

Cài đặt khía cạnh

Bạn cần trỏ thư mục làm việc tới Facet:

cd facets

Để cài đặt Facet trong Jupyter, bạn có hai lựa chọn. Nếu bạn đã cài đặt Jupyter với Conda cho tất cả người dùng, hãy sao chép mã này:

có thể sử dụng jupyter nbextension install facets-dist/

jupyter nbextension install facets-dist/

Nếu không, hãy sử dụng:

jupyter nbextension install facets-dist/ --user

Được rồi, bạn đã sẵn sàng. Hãy mở Tổng quan về khía cạnh.

Giới thiệu chung

Tổng quan sử dụng một Python tập lệnh để tính toán số liệu thống kê. Bạn cần nhập tập lệnh có tên generic_feature_statistics_generator để Jupyter. Đừng lo lắng; tập lệnh nằm trong các tập tin khía cạnh.

Bạn cần xác định vị trí đường dẫn của nó. Nó được thực hiện dễ dàng. Bạn mở facets, mở file facets_overview rồi đến python. Sao chép đường dẫn

Khía cạnh tổng quan

Sau đó, quay trở lại Jupytervà viết mã sau. Đổi đường dẫn '/Users/Thomas/facets/facets_overview/python' thành đường dẫn của bạn.

# Add the facets overview python code to the python path# Add t 
import sys
sys.path.append('/Users/Thomas/facets/facets_overview/python')

Bạn có thể nhập tập lệnh với mã bên dưới.

from generic_feature_statistics_generator import 
GenericFeatureStatisticsGenerator

Trong windows, cùng một mã trở thành

import sys
sys.path.append(r"C:\Users\Admin\Anaconda3\facets-master\facets_overview\python")

from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator

Để tính toán thống kê tính năng, bạn cần sử dụng hàm GenericFeatureStatisticsGenerator(), và bạn sử dụng đối tượng ProtoFromDataFrames. Bạn có thể truyền khung dữ liệu vào từ điển. Ví dụ: nếu chúng ta muốn tạo một thống kê tóm tắt cho tập hợp tàu, chúng ta có thể lưu trữ thông tin trong từ điển và sử dụng nó trong đối tượng `ProtoFromDataFrames“

  • 'name': 'train', 'table': df_train

Name là tên của bảng hiển thị, các bạn dùng tên bảng muốn tính tổng. Trong ví dụ của bạn, bảng chứa dữ liệu là df_train

# Calculate the feature statistics proto from the datasets and stringify it for use in facets overview
import base64

gfsg = GenericFeatureStatisticsGenerator()

proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train},
                                  {'name': 'test', 'table': df_test}])

#proto = gfsg.ProtoFromDataFrames([{'name': 'train', 'table': df_train}])
protostr = base64.b64encode(proto.SerializeToString()).decode("utf-8")

Cuối cùng, bạn chỉ cần sao chép và dán đoạn mã bên dưới. Mã đến trực tiếp từ GitHub. Bạn sẽ có thể thấy điều này:

Khía cạnh tổng quan

# Display the facets overview visualization for this data# Displ 
from IPython.core.display import display, HTML

HTML_TEMPLATE = """<link rel="import" href="/vi/nbextensions/facets-dist/facets-jupyter.html" >
        <facets-overview id="elem"></facets-overview>
        <script>
          document.querySelector("#elem").protoInput = "{protostr}";
        </script>"""
html = HTML_TEMPLATE.format(protostr=protostr)
display(HTML(html))

Đồ thị

Sau khi kiểm tra dữ liệu và phân phối của chúng, bạn có thể vẽ ma trận tương quan. Ma trận tương quan tính toán hệ số Pearson. Hệ số này được liên kết giữa -1 và 1, với giá trị dương biểu thị mối tương quan dương và giá trị âm biểu thị mối tương quan âm.

Bạn muốn biết biến nào có thể là ứng cử viên sáng giá cho các điều khoản tương tác.

## Choose important feature and further check with Dive
%matplotlib inline  
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="ticks")
# Compute the correlation matrix
corr = df.corr('pearson')
# Generate a mask for the upper triangle
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# Set up the matplotlib figure
f, ax = plt.subplots(figsize=(11, 9))

# Generate a custom diverging colormap
cmap = sns.diverging_palette(220, 10, as_cmap=True)

# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})

Đầu ra

<matplotlib.axes._subplots.AxesSubplot at 0x1a184d6518>

png

Biểu đồ khía cạnh

Từ ma trận, bạn có thể thấy:

  • LSTAT
  • RM

Có mối tương quan chặt chẽ với PRICE. Một đặc điểm thú vị khác là mối tương quan tích cực mạnh mẽ giữa NOX và INDUS, có nghĩa là hai biến này di chuyển theo cùng một hướng. Ngoài ra còn có mối tương quan với GIÁ. DIS cũng có mối tương quan cao với IND và NOX.

Bạn có một số gợi ý đầu tiên rằng IND và NOX có thể là ứng cử viên sáng giá cho thuật ngữ chặn và DIS cũng có thể thú vị để tập trung vào.

Bạn có thể đi sâu hơn một chút bằng cách vẽ một lưới cặp. Nó sẽ minh họa chi tiết hơn bản đồ tương quan mà bạn đã vẽ trước đó.

Lưới cặp chúng ta được cấu tạo như sau:

  • Phần trên: Biểu đồ phân tán với đường thẳng được trang bị
  • Đường chéo: Biểu đồ mật độ hạt nhân
  • Phần dưới: Biểu đồ mật độ hạt nhân đa biến

Bạn chọn tập trung vào bốn biến độc lập. Lựa chọn tương ứng với các biến có mối tương quan chặt chẽ với PRICE

  • ẤN ĐỘ
  • NOX
  • RM
  • LSTAT

hơn nữa, GIÁ.

Chú thích rằng lỗi tiêu chuẩn được thêm vào biểu đồ phân tán theo mặc định.

attributes = ["PRICE", "INDUS", "NOX", "RM", "LSTAT"]

g = sns.PairGrid(df[attributes])
g = g.map_upper(sns.regplot, color="g")
g = g.map_lower(sns.kdeplot,cmap="Reds", shade=True, shade_lowest=False)
g = g.map_diag(sns.kdeplot)

Đầu ra

Biểu đồ khía cạnh

Hãy bắt đầu với phần trên:

  • Giá có tương quan nghịch với INDUS, NOX và LSTAT; tương quan dương với RM.
  • Có một chút phi tuyến tính với LSTAT và PRICE
  • Giống như một đường thẳng khi giá bằng 50. Từ mô tả của tập dữ liệu, PRICE đã bị cắt bớt ở giá trị 50

Diagonal

  • NOX dường như có hai cụm, một cụm khoảng 0.5 và một cụm khoảng 0.85.

Để kiểm tra thêm về nó, bạn có thể nhìn vào phần dưới. Mật độ hạt nhân đa biến thú vị ở chỗ nó tô màu ở hầu hết các điểm. Sự khác biệt với biểu đồ phân tán cho thấy mật độ xác suất, mặc dù không có điểm nào trong tập dữ liệu cho một tọa độ nhất định. Khi màu sắc mạnh hơn, nó cho thấy sự tập trung cao độ của điểm xung quanh khu vực này.

Nếu bạn kiểm tra mật độ đa biến cho INDUS và NOX, bạn có thể thấy mối tương quan dương và hai cụm. Khi tỷ trọng của ngành trên 18, nồng độ oxit nitric trên 0.6.

Bạn có thể nghĩ đến việc thêm tương tác giữa INDUS và NOX trong mối quan hệ tuyến tính.

Cuối cùng, bạn có thể sử dụng công cụ thứ hai do Google tạo ra, Facets Deep Dive. Giao diện được chia thành bốn phần chính. Khu vực trung tâm ở giữa là màn hình hiển thị dữ liệu có thể phóng to. Ở trên cùng của bảng điều khiển, có menu thả xuống nơi bạn có thể thay đổi cách sắp xếp dữ liệu để kiểm soát faceting, định vị và màu sắc. Ở bên phải, có chế độ xem chi tiết của một hàng dữ liệu cụ thể. Điều đó có nghĩa là bạn có thể nhấp vào bất kỳ chấm dữ liệu nào trong hình ảnh trực quan ở giữa để xem chi tiết về điểm dữ liệu cụ thể đó.

Trong bước trực quan hóa dữ liệu, bạn quan tâm đến việc tìm kiếm mối tương quan từng cặp giữa biến độc lập về giá của ngôi nhà. Tuy nhiên, nó liên quan đến ít nhất ba biến và biểu đồ 3D rất phức tạp để làm việc.

Một cách để giải quyết vấn đề này là tạo một biến phân loại. Nghĩa là, chúng ta có thể tạo một biểu đồ 2D tô màu cho dấu chấm. Bạn có thể chia biến PRICE thành bốn loại, với mỗi loại là một phần tư (tức là 0.25, 0.5, 0.75). Bạn gọi biến mới này là Q_PRICE.

## Check non linearity with important features
df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
## Show non linearity between RM and LSTAT
ax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")

Biểu đồ khía cạnh

Tìm hiểu sâu về các khía cạnh

Để mở Deep Dive, bạn cần chuyển đổi dữ liệu sang định dạng json. Gấu trúc là một đối tượng cho điều đó. Bạn có thể sử dụng to_json sau tập dữ liệu Pandas.

Dòng mã đầu tiên xử lý kích thước của tập dữ liệu.

df['Q_PRICE'] =  pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])
sprite_size = 32 if len(df.index)>50000 else 64
jsonstr = df.to_json(orient='records')

Mã bên dưới đến từ Google GitHub. Sau khi chạy mã, bạn sẽ có thể thấy điều này:

Tìm hiểu sâu về các khía cạnh

# Display thde Dive visualization for this data
from IPython.core.display import display, HTML

# Create Facets template  
HTML_TEMPLATE = """<link rel="import" href="/vi/nbextensions/facets-dist/facets-jupyter.html">
        <facets-dive sprite-image-width="{sprite_size}" sprite-image-height="{sprite_size}" id="elem" height="600"></facets-dive>
        <script>
          document.querySelector("#elem").data = {jsonstr};
        </script>"""

# Load the json dataset and the sprite_size into the template
html = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)

# Display the template
display(HTML(html))

Bạn quan tâm xem liệu có mối liên hệ nào giữa tỷ lệ ngành, nồng độ oxit, khoảng cách đến trung tâm việc làm và giá nhà hay không.

Để làm được điều đó, trước tiên, bạn chia dữ liệu theo phạm vi ngành và màu sắc với tứ phân vị giá:

  • Chọn mặt X và chọn INDUS.
  • Chọn Hiển thị và chọn DIS. Nó sẽ tô màu các chấm theo phần tư của giá nhà

ở đây, màu tối hơn có nghĩa là khoảng cách đến trung tâm việc làm đầu tiên là xa.

Cho đến nay, nó lại hiển thị những gì bạn biết, tỷ lệ ngành thấp hơn, giá cao hơn. Bây giờ bạn có thể xem bảng phân tích theo INDUX, theo NOX.

  • Chọn mặt Y và chọn NOX.

Bây giờ bạn có thể thấy ngôi nhà xa trung tâm việc làm đầu tiên có tỷ lệ ngành công nghiệp thấp nhất và do đó có nồng độ oxit thấp nhất. Nếu bạn chọn hiển thị loại với Q_PRICE và phóng to góc dưới bên trái, bạn có thể thấy loại giá đó là gì.

Bạn có một gợi ý khác rằng sự tương tác giữa IND, NOX và DIS có thể là những ứng cử viên sáng giá để cải thiện mô hình.

TensorFlow

Trong phần này, bạn sẽ ước tính bộ phân loại tuyến tính bằng API ước tính TensorFlow. Bạn sẽ tiến hành như sau:

  • Chuẩn bị dữ liệu
  • Ước tính mô hình chuẩn: Không có tương tác
  • Ước tính một mô hình có tương tác

Hãy nhớ rằng, mục tiêu của học máy là giảm thiểu lỗi. Trong trường hợp này, mô hình có sai số bình phương trung bình thấp nhất sẽ thắng. Công cụ ước tính TensorFlow tự động tính toán số liệu này.

Dữ liệu chuẩn bị

Trong hầu hết các trường hợp, bạn cần chuyển đổi dữ liệu của mình. Đó là lý do tại sao Tổng quan về khía cạnh lại hấp dẫn. Từ số liệu thống kê tóm tắt, bạn thấy có những trường hợp ngoại lệ. Những giá trị đó ảnh hưởng đến ước tính vì chúng không giống với tổng thể mà bạn đang phân tích. Các ngoại lệ thường làm sai lệch kết quả. Ví dụ, một ngoại lệ dương có xu hướng đánh giá quá cao hệ số.

Một giải pháp tốt để giải quyết vấn đề này là chuẩn hóa biến. Tiêu chuẩn hóa có nghĩa là độ lệch chuẩn bằng 1 và phương tiện bằng 0. Quá trình tiêu chuẩn hóa bao gồm hai bước. Trước hết, nó trừ đi giá trị trung bình của biến. Thứ hai, nó chia cho độ lệch chuẩn để phân phối có độ lệch chuẩn đơn vị.

Thư viện sklearn rất hữu ích trong việc chuẩn hóa các biến. Bạn có thể sử dụng quá trình tiền xử lý mô-đun với thang đo đối tượng cho mục đích này.

Bạn có thể sử dụng hàm bên dưới để chia tỷ lệ tập dữ liệu. Lưu ý rằng bạn không chia tỷ lệ cột nhãn và các biến phân loại.

from sklearn import preprocessing
def standardize_data(df): 
    X_scaled = preprocessing.scale(df[['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT']])
    X_scaled_df = pd.DataFrame(X_scaled, columns = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD',
       'TAX', 'PTRATIO', 'B', 'LSTAT'])
    df_scale = pd.concat([X_scaled_df,
                       df['CHAS'],
                       df['PRICE']],axis=1, join='inner')
    return df_scale

Bạn có thể sử dụng hàm này để xây dựng tập huấn luyện/kiểm tra theo tỷ lệ.

df_train_scale = standardize_data(df_train)
df_test_scale = standardize_data(df_test)

Hồi quy cơ bản: Điểm chuẩn

Trước hết, bạn huấn luyện và thử nghiệm một mô hình mà không cần tương tác. Mục đích là để xem số liệu hiệu suất của mô hình.

Cách huấn luyện mô hình đúng như hướng dẫn trên API cấp cao. Bạn sẽ sử dụng công cụ ước tính TensorFlow LinearRegressor.

Xin nhắc lại, bạn cần chọn:

  • các tính năng để đưa vào mô hình
  • chuyển đổi các tính năng
  • xây dựng bộ hồi quy tuyến tính
  • xây dựng hàm input_fn
  • đào tạo người mẫu
  • thử nghiệm mô hình

Bạn sử dụng tất cả các biến trong tập dữ liệu để huấn luyện mô hình. Tổng cộng, có các biến liên tục cấp độ và một biến phân loại

## Add features to the bucket: 
### Define continuous list
CONTI_FEATURES  = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT']
CATE_FEATURES = ['CHAS']

Bạn chuyển đổi các tính năng thành cột số hoặc cột phân loại

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
#categorical_features = tf.feature_column.categorical_column_with_hash_bucket(CATE_FEATURES, hash_bucket_size=1000)
categorical_features = [tf.feature_column.categorical_column_with_vocabulary_list('CHAS', ['yes','no'])]

Bạn tạo mô hình bằng LinearRegressor. Bạn lưu mô hình vào thư mục train_Boston

model = tf.estimator.LinearRegressor(    
	model_dir="train_Boston",     
    feature_columns=categorical_features + continuous_features)

Đầu ra

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston', '_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 0x1a19e76ac8>, '_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}

Mỗi cột trong dữ liệu train hoặc test được chuyển đổi thành Tensor với hàm get_input_fn

FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT', 'CHAS']
LABEL= 'PRICE'
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)

Bạn ước tính mô hình trên dữ liệu tàu.

model.train(input_fn=get_input_fn(df_train_scale, 
                                      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_Boston/model.ckpt.
INFO:tensorflow:loss = 56417.703, step = 1
INFO:tensorflow:global_step/sec: 144.457
INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)
INFO:tensorflow:global_step/sec: 258.392
INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)
INFO:tensorflow:global_step/sec: 227.998
INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)
INFO:tensorflow:global_step/sec: 210.739
INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)
INFO:tensorflow:global_step/sec: 234.237
INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)
INFO:tensorflow:global_step/sec: 238.1
INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)
INFO:tensorflow:global_step/sec: 237.934
INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)
INFO:tensorflow:global_step/sec: 220.687
INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)
INFO:tensorflow:global_step/sec: 232.702
INFO:tensorflow:loss = 24049.678, step = 901 (0.432 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train_Boston/model.ckpt.
INFO:tensorflow:Loss for final step: 23228.568.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a19e76320>

Cuối cùng, bạn ước tính hiệu suất của mô hình trên tập kiểm tra

model.evaluate(input_fn=get_input_fn(df_test_scale, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-29-02:40:43
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43
INFO:tensorflow:Saving dict for global step 1000: average_loss = 86.89361, global_step = 1000, loss = 1650.9785


{'average_loss': 86.89361, 'global_step': 1000, 'loss': 1650.9785}

Sự mất mát của mô hình là 1650. Đây là số liệu cần đánh bại trong phần tiếp theo

Cải tiến mô hình: Thuật ngữ tương tác

Trong phần đầu tiên của hướng dẫn, bạn đã thấy mối quan hệ thú vị giữa các biến. Các kỹ thuật hình dung khác nhau cho thấy INDUS và NOS được liên kết với nhau và làm tăng tác động lên giá. Không chỉ sự tương tác giữa INDUS và NOS ảnh hưởng đến giá mà hiệu ứng này còn mạnh hơn khi nó tương tác với DIS.

Đã đến lúc khái quát hóa ý tưởng này và xem liệu bạn có thể cải thiện mô hình dự đoán hay không.

Bạn cần thêm hai cột mới vào mỗi tập dữ liệu: train + test. Để làm được điều đó, bạn tạo một hàm để tính số hạng tương tác và một hàm khác để tính số hạng tương tác ba. Mỗi hàm tạo ra một cột duy nhất. Sau khi các biến mới được tạo, bạn có thể ghép chúng với tập dữ liệu huấn luyện và tập dữ liệu kiểm tra.

Trước hết, bạn cần tạo một biến mới cho sự tương tác giữa INDUS và NOX.

Hàm bên dưới trả về hai khung dữ liệu, huấn luyện và kiểm tra, với sự tương tác giữa var_1 và var_2, trong trường hợp của bạn là INDUS và NOX.

def interaction_term(var_1, var_2, name):
    t_train = df_train_scale[var_1]*df_train_scale[var_2]
    train = t_train.rename(name)
    t_test = df_test_scale[var_1]*df_test_scale[var_2]
    test = t_test.rename(name)
    return train, test

Bạn lưu trữ hai cột mới

interation_ind_ns_train, interation_ind_ns_test= interaction_term('INDUS', 'NOX', 'INDUS_NOS')
interation_ind_ns_train.shape
(325,)

Thứ hai, bạn tạo hàm thứ hai để tính số hạng tương tác ba.

def triple_interaction_term(var_1, var_2,var_3, name):
    t_train = df_train_scale[var_1]*df_train_scale[var_2]*df_train_scale[var_3]
    train = t_train.rename(name)
    t_test = df_test_scale[var_1]*df_test_scale[var_2]*df_test_scale[var_3]
    test = t_test.rename(name)
    return train, test
interation_ind_ns_dis_train, interation_ind_ns_dis_test= triple_interaction_term('INDUS', 'NOX', 'DIS','INDUS_NOS_DIS')

Bây giờ bạn đã có tất cả các cột cần thiết, bạn có thể thêm chúng vào tập dữ liệu huấn luyện và kiểm tra. Bạn đặt tên cho hai khung dữ liệu mới này:

  • df_train_new
  • df_test_new
df_train_new = pd.concat([df_train_scale,
                          interation_ind_ns_train,
                          interation_ind_ns_dis_train],
                         axis=1, join='inner')
df_test_new = pd.concat([df_test_scale,
                         interation_ind_ns_test,
                         interation_ind_ns_dis_test],
                         axis=1, join='inner')
df_train_new.head(5)

Đầu ra

Cải thiện thuật ngữ tương tác mô hình

Đó là nó; bạn có thể ước tính mô hình mới bằng các thuật ngữ tương tác và xem chỉ số hiệu suất như thế nào.

CONTI_FEATURES_NEW  = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT',
                       'INDUS_NOS', 'INDUS_NOS_DIS']
### Define categorical list
continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]
model = tf.estimator.LinearRegressor(
    model_dir="train_Boston_1", 
    feature_columns= categorical_features + continuous_features_new)

Đầu ra

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train_Boston_1', '_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 0x1a1a5d5860>, '_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}

FEATURES = ['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD','TAX', 'PTRATIO', 'B', 'LSTAT','INDUS_NOS', 'INDUS_NOS_DIS','CHAS']
LABEL= 'PRICE'
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)
model.train(input_fn=get_input_fn(df_train_new, 
                                      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_Boston_1/model.ckpt.
INFO:tensorflow:loss = 56417.703, step = 1
INFO:tensorflow:global_step/sec: 124.844
INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)
INFO:tensorflow:global_step/sec: 182.704
INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)
INFO:tensorflow:global_step/sec: 208.189
INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)
INFO:tensorflow:global_step/sec: 213.855
INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)
INFO:tensorflow:global_step/sec: 209.758
INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)
INFO:tensorflow:global_step/sec: 196.618
INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)
INFO:tensorflow:global_step/sec: 196.472
INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)
INFO:tensorflow:global_step/sec: 172.82
INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)
INFO:tensorflow:global_step/sec: 168.916
INFO:tensorflow:loss = 19878.56, step = 901 (0.592 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train_Boston_1/model.ckpt.
INFO:tensorflow:Loss for final step: 19598.387.


<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1a5d5e10>
model.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Đầu ra

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-29-02:41:14
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14
INFO:tensorflow:Saving dict for global step 1000: average_loss = 79.78876, global_step = 1000, loss = 1515.9863


{'average_loss': 79.78876, 'global_step': 1000, 'loss': 1515.9863}

Khoản lỗ mới là 1515. Chỉ cần thêm hai biến mới, bạn có thể giảm khoản lỗ. Điều đó có nghĩa là bạn có thể đưa ra dự đoán tốt hơn so với mô hình chuẩn.