Hồi quy tuyến tính TensorFlow với Facet & Thuật ngữ tương tác

Mục lục:

Anonim

Trong hướng dẫn này, bạn sẽ học cách kiểm tra dữ liệu và chuẩn bị để 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 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à. Bộ dữ liệu Boston có kích thước nhỏ, chỉ với 506 quan sát. Tập dữ liệu này được coi là chuẩn để thử các thuật toán hồi quy tuyến tính mới.

Tập dữ liệu bao gồm:

Biến đổi Sự miêu tả
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
crim 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 ngược lại)
B tỷ lệ người da đen theo 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 công cụ hồi quy tuyến tính, nhưng trọng tâm là một quy trình cụ thể của học máy: "chuẩn bị dữ liệu".

Mô hình tổng quát hóa mô hình trong dữ liệu. Để nắm bắt được một mô hình như vậy, trước tiên bạn cần phải tìm ra nó. Một phương pháp hay 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 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 hiệp 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. Trở lại ví dụ, bạn có thể nghĩ về giáo dục như một ứng cử viên xuất sắc để dự đoán mức lương nhưng cũng là 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à học 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à một biến giải thích có thể được phóng đại so với một biến giải thích khác.

Để nắm đượ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 một 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:

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

Trong hướng dẫn này, chúng tôi sẽ cố gắng xem những biến nào có thể là một ứng cử viên tốt 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.

Trong hướng dẫn này, bạn sẽ học

  • Tóm tắt thống kê
  • Tổng quan về khía cạnh
  • Các khía cạnh Lặn sâu
  • Cài đặt Facet
  • Tổng quat
  • Đồ thị
  • Các khía cạnh Lặn sâu
  • TensorFlow
  • Dữ liệu chuẩn bị
  • Hồi quy cơ bản: Điểm chuẩn
  • Cải thiện mô hình: Thuật ngữ tương tác

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. Phương pháp 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 thử nghiệm.

Mẹo: Đối với hướng dẫn này, bạn cần cài đặt matplotlit và seaborn bằng Python. Bạn có thể cài đặt gói Python một cách nhanh chóng với Jupyter. Bạn không nên làm điều 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 một biểu đồ bằng Python. Seaborn là một thư viện trực quan hóa thống kê được xây dựng trên nền tảng của matplotlib. Nó cung cấp những con lô hấp dẫn và đẹp mắt.

Đoạn mã dưới đây nhập các thư viện cần thiết.

import pandas as pdfrom sklearn import datasetsimport tensorflow as tffrom sklearn.datasets import load_bostonimport numpy as np

Thư viện sklearn bao gồm tập 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='

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

df.columns = boston.feature_namesdf['PRICE'] = boston.targetdf.head(2)

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 no1 no2 no3 no4 noName: CHAS, dtype: object

Với gấu trúc, việc chia nhỏ tập dữ liệu rất đơn giản. Bạn phâ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ó chức năng chi phí tích hợp để tách một mẫu khung dữ liệu.

Tham số đầu tiên frac là một 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 tất cả mọi người.

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

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

  • Bộ xe lửa: 506 * 0.8 = 405
  • Bộ thử nghiệm: 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 INDUS CHAS NOX RM TUỔI TÁC DIS RAD THUẾ PTRATIO B LSTAT GIÁ BÁN
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 không cân bằng và rắc rối với các 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 để dọn dẹp tập dữ liệu là hiểu nơi nó cần làm sạch. 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 nào có thể tổng quát hóa được

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à phân chia dữ liệu theo mọi cách xử lý. Đây là một đ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 nơi dữ liệu không 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ụ vào sổ tay Jupyter.

Có hai phần đối với các khía cạnh:

  • Tổng quan về khía cạnh
  • Các khía cạnh Lặn sâu

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

Tổng quan về khía cạnh cung cấp cái nhìn 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. phần trăm quan sát bị thiếu
  2. giá trị tối thiểu và tối đa
  3. thống kê như giá trị trung bình, giá trị trung bình và độ lệch chuẩn.
  4. Nó cũng thêm một cột hiển thị phần trăm giá trị là số 0, điều này rất hữu ích khi hầu hết các giá trị 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. Nó có nghĩa là bạn có thể kiểm tra kỹ xem bài kiểm tra có phân phối tương tự với dữ liệu đào tạo hay không.

Đây là điều tối thiểu phải làm trước bất kỳ tác 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ó làm nổi bật một số bất thường.

Các khía cạnh Lặn sâu

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

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

Lưu ý : Bạn không thể sử dụng Tổng quan theo khía cạnh và Lặn sâu theo khía cạnh cùng một lúc. Trước tiên, bạn cần xóa sổ ghi chép để thay đổi công cụ.

Cài đặt Facet

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ẽ thấy cách sử dụng nó trong Máy tính xách tay Jupyter.

Trước hết, bạn cần cài đặt nbextensions. Nó được thực hiện với mã này. Bạn sao chép và dán đoạn mã sau vào thiết bị đầu cuối của máy.

pip install jupyter_contrib_nbextensions 

Ngay sau đó, bạn cần sao chép 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 (Được khuyến nghị)

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 dành cho người dùng Windows

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.

Nếu bạn chọn tùy chọn đầu tiên, tệp sẽ kết thúc 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 một đường dẫn khác.

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

echo `pwd`/`ls facets` 

Bây giờ bạn đã định vị được Các khía cạnh, bạn cần cài đặt nó trong Máy tính xách tay Jupyter. Bạn cần đặt thư mục làm việc thành đườ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 zip Facets phải giống nhau.

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

cd facets

Để cài đặt Facets trong Jupyter, bạn có hai tùy 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.

Tổng quat

Tổng quan sử dụng tập lệnh Python để 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_stosystem_generator vào Jupyter. Đừng lo lắng; tập lệnh nằm trong các tệp khía cạnh.

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

Sau đó, quay lại Jupyter và viết mã sau. Thay đổ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 timport syssys.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 importGenericFeatureStatisticsGenerator

Trong windows, mã tương tự sẽ trở thành

import syssys.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 GenericFeatureStosystemGenerator () và bạn sử dụng đối tượng ProtoFromDataFrames. Bạn có thể chuyển khung dữ liệu vào từ điển. Ví dụ: nếu chúng tôi muốn tạo thống kê tóm tắt cho tập hợp tàu, chúng tôi có thể lưu trữ thông tin trong từ điển và sử dụng thông tin đó trong đối tượng `` ProtoFromDataFrames ''

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

Tên là tên của bảng hiển thị và bạn sử dụng tên của bảng mà bạn muốn tính toán tóm tắt. 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 overviewimport base64gfsg = 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:

# Display the facets overview visualization for this data# Displfrom IPython.core.display import display, HTMLHTML_TEMPLATE = """
"""html = HTML_TEMPLATE.format(protostr=protostr)display(HTML(html))

Đồ thị

Sau khi bạn kiểm tra dữ liệu và sự phân bố của chúng, bạn có thể vẽ một 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 cho thấy mối tương quan thuận và giá trị âm là mối tương quan âm.

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

## Choose important feature and further check with Dive%matplotlib inlineimport matplotlib.pyplot as pltimport seaborn as snssns.set(style="ticks")# Compute the correlation matrixcorr = df.corr('pearson')# Generate a mask for the upper trianglemask = np.zeros_like(corr, dtype=np.bool)mask[np.triu_indices_from(mask)] = True# Set up the matplotlib figuref, ax = plt.subplots(figsize=(11, 9))# Generate a custom diverging colormapcmap = sns.diverging_palette(220, 10, as_cmap=True)# Draw the heatmap with the mask and correct aspect ratiosns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,annot=True,square=True, linewidths=.5, cbar_kws={"shrink": .5})

Đầu ra

png

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

  • LSTAT
  • RM

Có tương quan chặt chẽ với GIÁ. Một tính năng thú vị khác là mối tương quan thuận chặt chẽ giữa NOX và INDUS, có nghĩa là hai biến đó di chuyển theo cùng một hướng. Bên cạnh đó, cũng có tương quan với GIÁ. DIS cũng có 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à những ứng cử viên tốt 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 tôi được cấu tạo như sau:

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

Bạn chọn trọng tâm 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

  • INDUS
  • NOX
  • RM
  • LSTAT

hơn nữa là GIÁ CẢ.

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

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

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 thuận 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 đã được cắt bớt ở giá trị 50

Đường chéo

  • NOX dường như có hai cụm, một xung quanh 0,5 và một xung quanh 0,85.

Để kiểm tra thêm về nó, bạn có thể nhìn vào phần dưới. Mật độ nhân đa biến rất thú vị theo nghĩa nó tô màu cho hầu hết các điểm. Sự khác biệt với biểu đồ phân tán vẽ ra một 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 hơn, nó chỉ ra một điểm tập trung cao 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 thuận và hai cụm. Khi hçn hîp kh «ng ®óng 18, th × khèi lîng oxit nitric lµ 0,6.

Bạn có thể nghĩ về 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ể thu phóng. Trên đầu 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 để điều khiển khía cạnh, định vị và màu sắc. Ở bên phải, có một chế độ xem chi tiết của một hàng dữ liệu cụ thể. Nó có nghĩa là bạn có thể nhấp vào bất kỳ điểm dữ liệu nào trong phần trực quan hóa trung tâm để 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 theo 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à các bản vẽ 3D rất phức tạp để làm việc với.

Một cách để giải quyết vấn đề này là tạo một biến phân loại. Đó là, chúng ta có thể tạo một âm mưu 2D với màu sắc của dấu chấm. Bạn có thể chia biến PRICE thành bốn danh mục, với mỗi danh mục 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 featuresdf['Q_PRICE'] = pd.qcut(df['PRICE'], 4, labels=["Lowest", "Low", "Upper", "upper_plus"])## Show non linearity between RM and LSTATax = sns.lmplot(x="DIS", y="INDUS", hue="Q_PRICE", data=df, fit_reg = False,palette="Set3")

Các khía cạnh Lặn sâu

Để mở Deep Dive, bạn cần chuyển đổi dữ liệu sang định dạng json. Gấu trúc như 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 64jsonstr = df.to_json(orient='records')

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

# Display thde Dive visualization for this datafrom IPython.core.display import display, HTML# Create Facets templateHTML_TEMPLATE = """
"""# Load the json dataset and the sprite_size into the templatehtml = HTML_TEMPLATE.format(jsonstr=jsonstr, sprite_size=sprite_size)# Display the templatedisplay(HTML(html))

Bạn quan tâm xem 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á cả của ngôi nhà hay không.

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

  • Chọn khía cạnh X và chọn INDUS.
  • Chọn Hiển thị và chọn DIS. Nó sẽ tô màu các chấm với 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ó cho thấy một lần nữa 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 khía cạnh 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ỷ trọng ngành 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à thu phóng góc dưới bên trái, bạn có thể xem loại giá đó.

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 tốt để cải thiện mô hình.

TensorFlow

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

  • Chuẩn bị dữ liệu
  • Ước tính một mô hình điểm 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 phải 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à hấp dẫn. Từ thống kê tóm tắt, bạn đã thấy có những ngoại lệ. Những giá trị đó ảnh hưởng đến các ước tính bởi vì chúng không giống với dân số bạn đang phân tích. Các yếu tố ngoại lai thường làm sai lệch kết quả. Ví dụ, một giá trị ngoại lai 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. Chuẩn hóa có nghĩa là độ lệch chuẩn bằng một và độ lệch chuẩn bằng không. 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 phương sai để phân phối có phương sai đơn vị

Thư viện sklearn rất hữu ích để chuẩn hóa các biến. Bạn có thể sử dụng tiền xử lý mô-đun với quy mô đố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 preprocessingdef 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 để xây dựng tập hợp thử nghiệm / tàu được chia 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 đào tạo và thử nghiệm một mô hình mà không có sự tương tác. Mục đích là để xem chỉ số hiệu suất của mô hình.

Cách huấn luyện mô hình đúng như hướng dẫn về 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
  • biế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
  • kiểm tra 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 độ cao và một biến phân loại

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

Bạn chuyển đổi các đối tượng địa lý 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 với tuyến tính tuyến tính. 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': , '_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 huấn luyện hoặc kiểm tra được chuyển đổi thành một 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 = 1INFO:tensorflow:global_step/sec: 144.457INFO:tensorflow:loss = 76982.734, step = 101 (0.697 sec)INFO:tensorflow:global_step/sec: 258.392INFO:tensorflow:loss = 21246.334, step = 201 (0.383 sec)INFO:tensorflow:global_step/sec: 227.998INFO:tensorflow:loss = 30534.78, step = 301 (0.439 sec)INFO:tensorflow:global_step/sec: 210.739INFO:tensorflow:loss = 36794.5, step = 401 (0.477 sec)INFO:tensorflow:global_step/sec: 234.237INFO:tensorflow:loss = 8562.981, step = 501 (0.425 sec)INFO:tensorflow:global_step/sec: 238.1INFO:tensorflow:loss = 34465.08, step = 601 (0.420 sec)INFO:tensorflow:global_step/sec: 237.934INFO:tensorflow:loss = 12241.709, step = 701 (0.420 sec)INFO:tensorflow:global_step/sec: 220.687INFO:tensorflow:loss = 11019.228, step = 801 (0.453 sec)INFO:tensorflow:global_step/sec: 232.702INFO: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.

Cuối cùng, bạn ước tính hiệu suất của mô hình trên bộ thử nghiệm

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:43INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:40:43INFO: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}

Mức hao hụ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 thiệ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 ảnh hóa khác nhau cho thấy INDUS và NOS được liên kết với nhau và lần lượt 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á cả mà tác độ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 mô hình hay không.

Bạn cần thêm hai cột mới vào mỗi bộ tập dữ liệu: huấn luyện + kiểm tra. Vì vậy, bạn tạo một hàm để tính toán thuật ngữ tương tác và một hàm khác để tính toán thuật 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ể nối 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 một hàm thứ hai để tính toán thuật 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, testinteration_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 để đào tạo và kiểm tra tập dữ liệu. 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

Đó là nó; bạn có thể ước tính mô hình mới với các điều khoản 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 listcontinuous_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': , '_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 = 1INFO:tensorflow:global_step/sec: 124.844INFO:tensorflow:loss = 65522.3, step = 101 (0.803 sec)INFO:tensorflow:global_step/sec: 182.704INFO:tensorflow:loss = 15384.148, step = 201 (0.549 sec)INFO:tensorflow:global_step/sec: 208.189INFO:tensorflow:loss = 22020.305, step = 301 (0.482 sec)INFO:tensorflow:global_step/sec: 213.855INFO:tensorflow:loss = 28208.812, step = 401 (0.468 sec)INFO:tensorflow:global_step/sec: 209.758INFO:tensorflow:loss = 7606.877, step = 501 (0.473 sec)INFO:tensorflow:global_step/sec: 196.618INFO:tensorflow:loss = 26679.76, step = 601 (0.514 sec)INFO:tensorflow:global_step/sec: 196.472INFO:tensorflow:loss = 11377.163, step = 701 (0.504 sec)INFO:tensorflow:global_step/sec: 172.82INFO:tensorflow:loss = 8592.07, step = 801 (0.578 sec)INFO:tensorflow:global_step/sec: 168.916INFO: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.
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:14INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train_Boston_1/model.ckpt-1000INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-05-29-02:41:14INFO: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}

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