패싯 및 상호작용 항을 사용한 TensorFlow 선형 회귀

이 튜토리얼에서는 간단한 선형 회귀 작업을 생성하기 위해 데이터를 확인하고 준비하는 방법을 배웁니다.

이 튜토리얼은 두 부분으로 나누어져 있습니다:

  • 상호작용을 찾아보세요
  • 모델 테스트

. 이전 튜토리얼, 보스턴 데이터 세트를 사용하여 주택의 중간 가격을 추정했습니다. 보스턴 데이터 세트는 크기가 작아서 관측치가 506개에 불과합니다. 이 데이터 세트는 새로운 선형 회귀 알고리즘을 시도하는 벤치마크로 간주됩니다.

데이터 세트는 다음으로 구성됩니다.

변하기 쉬운 상품 설명
zn 25,000 평방피트를 초과하는 부지에 대해 구역화된 주거용 토지의 비율입니다.
인더스 문자 도시당 비소매 사업 면적의 비율입니다.
녹스 산화질소 농도
rm 가구당 평균 방 수
나이 1940년 이전에 건축된 자가 거주 주택의 비율
말요 보스턴 고용 센터 XNUMX곳까지의 가중치 거리
달러당 전체 재산세율 10,000
비율 마을별 학생-교사 비율
의료 소유자가 거주하는 주택의 평균 가치(천 달러)
크림 도시별 XNUMX인당 범죄율
챠 시스 Charles River 더미 변수(강의 경계가 있는 경우 1, 그렇지 않은 경우 0)
B 마을의 흑인 비율

이 튜토리얼에서는 선형 회귀 분석기를 사용하여 중간 가격을 추정하지만 초점은 한 가지 특정 프로세스에 있습니다. 기계 학습: "데이터 준비."

모델은 데이터의 패턴을 일반화합니다. 그러한 패턴을 포착하려면 먼저 패턴을 찾아야 합니다. 좋은 방법은 기계 학습 알고리즘을 실행하기 전에 데이터 분석을 수행하는 것입니다.

올바른 기능을 선택하면 모델의 성공이 크게 달라집니다. 사람들의 임금을 추정하려고 한다고 가정해 보십시오. 성별을 공변량으로 포함하지 않으면 잘못된 추정 결과가 나옵니다.

모델을 개선하는 또 다른 방법은 독립변수 간의 상관관계를 살펴보는 것입니다. 다시 예로 돌아가서, 교육은 임금뿐만 아니라 직업도 예측할 수 있는 훌륭한 후보라고 생각할 수 있습니다. 직업은 교육 수준에 따라 결정된다고 말하는 것이 공평합니다. 즉, 고등 교육을 받으면 더 나은 직업으로 이어지는 경우가 많습니다. 이 아이디어를 일반화하면 종속변수와 설명변수 사이의 상관관계가 또 다른 설명변수에 의해 확대될 수 있다고 말할 수 있습니다.

직업에 대한 교육의 제한된 효과를 포착하기 위해 상호작용 용어를 사용할 수 있습니다.

상호작용 기간

임금 방정식을 살펴보면 다음과 같습니다.

상호작용 기간

If 상호작용 기간 긍정적인 경우, 이는 추가 교육 수준이 높은 직업 수준에 대한 주택의 중간 가치의 더 높은 증가를 가져온다는 것을 의미합니다. 즉, 교육과 직업 사이에 상호작용 효과가 있는 것이다.

이 튜토리얼에서는 어떤 변수가 상호 작용 용어에 적합한 후보가 될 수 있는지 살펴보겠습니다. 이런 종류의 정보를 추가하면 가격 예측이 더 좋아지는지 테스트해 보겠습니다.

요약 통계

모델을 진행하기 전에 따라야 할 몇 가지 단계가 있습니다. 앞서 언급했듯이 모델은 데이터를 일반화한 것입니다. 가장 적합한 방법은 데이터를 이해하고 예측하는 것입니다. 데이터를 모른다면 모델을 개선할 가능성이 희박합니다.

첫 번째 단계로 데이터를 Pandas 데이터 프레임으로 로드하고 훈련 세트와 테스트 세트를 만듭니다.

팁: 이 튜토리얼에서는 matplotlit 및 seaborn이 설치되어 있어야 합니다. Python. 당신은 설치할 수 있습니다 Python 즉석에서 패키지 Jupyter. 당신 하지 않아야 이 작업을 수행

!conda install -- yes matplotlib

비자 면제 프로그램에 해당하는 국가의 시민권을 가지고 있지만

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

matplotlib 및 seaborn이 설치되어 있으면 이 단계가 필요하지 않습니다.

Matplotlib은 그래프를 생성하는 라이브러리입니다. Python. Seaborn은 matplotlib를 기반으로 구축된 통계 시각화 라이브러리입니다. 매력적이고 아름다운 플롯을 제공합니다.

아래 코드는 필요한 라이브러리를 가져옵니다.

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

라이브러리 sklearn에는 Boston 데이터 세트가 포함되어 있습니다. 해당 API를 호출하여 데이터를 가져올 수 있습니다.

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

기능의 이름은 배열의 feature_names 객체에 저장됩니다.

boston.feature_names

산출

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

열 이름을 바꿀 수 있습니다.

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

패싯 및 상호 작용 항을 사용한 선형 회귀

CHAS 변수를 문자열 변수로 변환하고 CHAS = 1이면 yes로 레이블을 지정하고 CHAS = 0이면 no로 레이블을 지정합니다.

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

Pandas를 사용하면 데이터 세트를 분할하는 것이 간단합니다. 데이터 세트를 80% 훈련 세트와 20% 테스트 세트로 무작위로 나눕니다. 판다 데이터 프레임 샘플을 분할하는 비용 함수가 내장되어 있습니다.

첫 번째 매개변수 frac는 0에서 1 사이의 값입니다. 데이터 프레임의 0.8%를 무작위로 선택하려면 이 값을 80로 설정합니다.

Random_state를 사용하면 모든 사람에게 동일한 데이터 프레임을 반환할 수 있습니다.

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

데이터의 모양을 얻을 수 있습니다. 그것은해야한다:

  • 열차 세트: 506*0.8 = 405
  • 테스트 세트: 506*0.2 = 101
print(df_train.shape, df_test.shape)

산출

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

산출

크림 ZN 인더스 차스 NOx RM 연령 DIS RAD 세금 프트라티오 B LSTAT 보장
0 0.00632 18.0 2.31 아니 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 아니 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 아니 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 아니 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 아니 0.524 6.172 96.1 5.9505 5.0 311.0 15.2 396.90 19.15 27.1

데이터가 지저분합니다. 종종 균형이 맞지 않고 분석 및 기계 학습 교육을 방해하는 이상치 값이 ​​뿌려집니다.

데이터 세트를 정리하는 첫 번째 단계는 정리가 필요한 위치를 이해하는 것입니다. 데이터세트 정리는 특히 일반화 가능한 방식으로 수행하기 까다로울 수 있습니다.

Google 연구팀은 이 작업을 위해 다음과 같은 도구를 개발했습니다. 패싯 데이터를 시각화하고 모든 종류의 방식으로 분할하는 데 도움이 됩니다. 이는 데이터 세트가 어떻게 배치되어 있는지 이해하는 좋은 출발점입니다.

패싯을 사용하면 데이터가 생각하는 방식과 다르게 보이는 부분을 찾을 수 있습니다.

웹 앱을 제외하고 Google은 툴킷을 Jupyter 공책.

패싯에는 두 부분이 있습니다.

  • 패싯 개요
  • 패싯 심층 분석

패싯 개요

Facets Overview는 데이터 세트에 대한 개요를 제공합니다. Facets Overview는 데이터 열을 눈에 띄는 정보의 행으로 분할하여 다음을 표시합니다.

  1. 누락된 관측치의 백분율
  2. 최소값과 최대값
  3. 평균, 중앙값, 표준편차와 같은 통계입니다.
  4. 또한 XNUMX인 값의 ​​백분율을 표시하는 열을 추가합니다. 이는 대부분의 값이 XNUMX인 경우에 유용합니다.
  5. 테스트 데이터 세트와 각 피처의 훈련 세트에서 이러한 분포를 볼 수 있습니다. 즉, 테스트가 훈련 데이터와 유사한 분포를 가지고 있는지 다시 확인할 수 있습니다.

이는 최소한 기계 학습 작업 전에 수행해야 하는 최소한의 작업입니다. 이 도구를 사용하면 이 중요한 단계를 놓치지 않고 몇 가지 이상 현상을 강조할 수 있습니다.

패싯 심층 분석

Facets Deep Dive는 멋진 도구입니다. 데이터세트에 대한 명확성을 확보하고 개별 데이터를 보기 위해 확대할 수 있습니다. 즉, 데이터세트의 모든 피처에서 행과 열로 데이터를 패싯할 수 있습니다.

보스턴 데이터세트에 이 두 가지 도구를 사용하겠습니다.

주의 사항: Facets 개요와 Facets Deep Dive를 동시에 사용할 수 없습니다. 도구를 변경하려면 먼저 노트북을 지워야 합니다.

패싯 설치

대부분의 분석에는 Facet 웹 앱을 사용할 수 있습니다. 이 튜토리얼에서는 이를 사용하는 방법을 살펴보겠습니다. Jupyter 노트북입니다.

우선, nbextensions를 설치해야 합니다. 이 코드로 설치합니다. 다음 코드를 복사하여 컴퓨터의 터미널에 붙여넣습니다.

pip install jupyter_contrib_nbextensions

그런 다음 컴퓨터의 리포지토리를 복제해야 합니다. 두 가지 선택이 있습니다:

옵션 1) 이 코드를 복사하여 터미널에 붙여넣으세요. (권장)

컴퓨터에 Git이 설치되어 있지 않으면 다음 URL로 이동하세요. https://git-scm.com/download/win 그리고 지시를 따르세요. 완료되면 Mac 사용자의 경우 터미널에서 git 명령을 사용하거나 Anaconda 프롬프트를 사용할 수 있습니다. Windows 사용자

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

옵션 2) We Buy Orders 신청서를 클릭하세요. https://github.com/PAIR-code/facets 그리고 저장소를 다운로드하세요.

패싯 설치

첫 번째 옵션을 선택하면 파일이 다운로드 파일에 저장됩니다. 파일을 다운로드하도록 허용하거나 다른 경로로 드래그할 수 있습니다.

다음 명령줄을 사용하여 Facets가 저장된 위치를 확인할 수 있습니다.

echo `pwd`/`ls facets`

이제 Facets를 찾았으므로 이를 설치해야 합니다. Jupyter 공책. 작업 디렉터리를 패싯이 있는 경로로 설정해야 합니다.

현재 작업 디렉터리와 Facets zip 위치가 동일해야 합니다.

패싯 설치

작업 디렉터리를 Facet으로 지정해야 합니다.

cd facets

패싯을 설치하려면 Jupyter, 두 가지 옵션이 있습니다. 설치한 경우 Jupyter 모든 사용자에 대해 Conda를 사용하려면 다음 코드를 복사하세요.

jupyter nbextension install facets-dist/를 사용할 수 있습니다

jupyter nbextension install facets-dist/

그렇지 않으면 다음을 사용하세요.

jupyter nbextension install facets-dist/ --user

좋습니다. 모든 준비가 완료되었습니다. 패싯 개요를 열어 보겠습니다.

살펴보기

개요에서는 Python 통계를 계산하는 스크립트입니다. generic_feature_statistics_generator라는 스크립트를 가져와야 합니다. Jupyter. 괜찮아요; 스크립트는 패싯 파일에 있습니다.

경로를 찾아야 합니다. 그것은 쉽게 이루어집니다. 패싯을 열고, 패싯_개요 파일을 연 다음 Python을 엽니다. 경로 복사

개요 패싯

그 후로 돌아가십시오. Jupyter, 다음 코드를 작성하세요. 경로 '/Users/Thomas/facets/facets_overview/python'을 자신의 경로로 변경하세요.

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

아래 코드를 사용하여 스크립트를 가져올 수 있습니다.

from generic_feature_statistics_generator import 
GenericFeatureStatisticsGenerator

창에서는 동일한 코드가 됩니다.

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

from generic_feature_statistics_generator import GenericFeatureStatisticsGenerator

기능 통계를 계산하려면 GenericFeatureStatistics 함수를 사용해야 합니다.Generator(), ProtoFromDataFrames 개체를 사용합니다. 데이터 프레임을 사전에 전달할 수 있습니다. 예를 들어 열차 세트에 대한 요약 통계를 생성하려는 경우 해당 정보를 사전에 저장하고 'ProtoFromDataFrames' 개체에서 사용할 수 있습니다.

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

이름은 표시되는 테이블의 이름이며 요약을 계산하려는 테이블의 이름을 사용합니다. 귀하의 예에서 데이터가 포함된 테이블은 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")

마지막으로 아래 코드를 복사해서 붙여넣으면 됩니다. 코드는 GitHub에서 직접 제공됩니다. 당신은 이것을 볼 수 있어야합니다 :

개요 패싯

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

HTML_TEMPLATE = """<link rel="import" href="/ko/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))

그래프

데이터와 해당 분포를 확인한 후 상관 행렬을 그릴 수 있습니다. 상관 행렬은 피어슨 계수를 계산합니다. 이 계수는 -1과 1 사이에 결합되어 있으며 양수 값은 양의 상관 관계를 나타내고 음수 값은 음의 상관 관계를 나타냅니다.

어떤 변수가 상호 작용 항에 적합한 후보가 될 수 있는지 확인하고 싶습니다.

## 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})

산출

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

PNG

패싯 그래프

매트릭스에서 다음을 확인할 수 있습니다.

  • LSTAT
  • RM

PRICE와 강력하게 상관관계가 있습니다. 또 다른 흥미로운 특징은 NOX와 INDUS 사이의 강력한 양의 상관관계인데, 이는 이 두 변수가 같은 방향으로 움직인다는 것을 의미합니다. 게다가 PRICE와도 상관관계가 있습니다. DIS도 IND와 NOX와 높은 상관관계가 있습니다.

IND와 NOX가 절편 항에 대한 좋은 후보가 될 수 있고 DIS도 관심을 가질 수 있다는 첫 번째 힌트가 있습니다.

쌍 그리드를 그려서 조금 더 깊이 들어갈 수 있습니다. 이전에 구성한 상관 관계 맵을 더 자세히 설명합니다.

우리가 구성한 쌍 그리드는 다음과 같습니다.

  • 상단: 적합선이 있는 산점도
  • 대각선: 커널 밀도 도표
  • 하단: 다변량 커널 밀도 플롯

네 개의 독립 변수에 초점을 맞추는 것을 선택합니다. 선택은 PRICE와 강한 상관관계가 있는 변수에 해당합니다.

  • 인더스
  • NOx
  • RM
  • LSTAT

게다가 가격.

주의 사항 표준 오류는 기본적으로 산점도에 추가됩니다.

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)

산출

패싯 그래프

위쪽 부분부터 시작해 보겠습니다.

  • 가격은 INDUS, NOX, LSTAT와 음의 상관관계가 있습니다. RM과 양의 상관관계가 있습니다.
  • LSTAT 및 PRICE에는 약간의 비선형성이 있습니다.
  • 가격이 50이면 직선과 같습니다. 데이터 세트 설명에 따르면 PRICE는 50 값에서 잘렸습니다.

대각선

  • NOX에는 두 개의 클러스터가 있는 것으로 보이는데, 하나는 0.5 근처이고 다른 하나는 0.85 근처입니다.

이에 대해 자세히 알아보려면 아래 부분을 보면 됩니다. 다변량 커널 밀도는 대부분의 점이 있는 곳을 색칠한다는 점에서 흥미롭습니다. 산점도와의 차이는 주어진 좌표에 대한 데이터 세트에 점이 없더라도 확률 밀도를 그립니다. 색상이 더 강하면 이 영역 주변에 점이 많이 집중되어 있음을 나타냅니다.

INDUS와 NOX의 다변량 밀도를 확인하면 양의 상관관계와 두 클러스터를 볼 수 있습니다. 산업 점유율이 18 이상이면 일산화질소 농도가 0.6 이상입니다.

선형 관계에서 INDUS와 NOX 사이의 상호작용을 추가하는 것을 생각해 볼 수 있습니다.

마지막으로, Google에서 만든 두 번째 도구인 Facets Deep Dive를 사용할 수 있습니다. 인터페이스는 네 개의 주요 섹션으로 나뉩니다. 중앙의 중앙 영역은 확대 가능한 데이터 디스플레이입니다. 패널 상단에는 데이터의 배열을 변경하여 패싯, 위치 지정 및 색상을 제어할 수 있는 드롭다운 메뉴가 있습니다. 오른쪽에는 특정 데이터 행의 자세한 보기가 있습니다. 즉, 중앙 시각화에서 데이터의 아무 점이나 클릭하면 해당 특정 데이터 포인트에 대한 세부 정보를 볼 수 있습니다.

데이터 시각화 단계에서는 주택 가격의 독립 변수 간의 쌍별 상관관계를 찾는 데 관심이 있습니다. 그러나 여기에는 최소 3개의 변수가 포함되고 XNUMXD 플롯은 작업하기 복잡합니다.

이 문제를 해결하는 한 가지 방법은 범주형 변수를 만드는 것입니다. 즉, 점의 색상을 지정하여 2D 플롯을 생성할 수 있습니다. 변수 PRICE를 네 가지 범주로 나눌 수 있으며, 각 범주는 사분위수(예: 0.25, 0.5, 0.75)입니다. 이 새로운 변수를 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")

패싯 그래프

패싯 심층 분석

Deep Dive를 열려면 데이터를 json 형식으로 변환해야 합니다. 그 대상으로 팬더. Pandas 데이터 세트 뒤에 to_json을 사용할 수 있습니다.

코드의 첫 번째 줄은 데이터세트의 크기를 처리합니다.

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')

아래 코드는 Google GitHub에서 가져온 것입니다. 코드를 실행하면 다음을 볼 수 있습니다.

패싯 심층 분석

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

# Create Facets template  
HTML_TEMPLATE = """<link rel="import" href="/ko/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))

귀하는 산업 비율, 산화물 농도, 고용 센터까지의 거리 및 주택 가격 사이에 연관성이 있는지 확인하고 싶습니다.

이를 위해 먼저 데이터를 산업 범위 및 색상별로 가격 사분위수로 분할합니다.

  • 패싯 X를 선택하고 INDUS를 선택합니다.
  • 디스플레이를 선택하고 DIS를 선택합니다. 집값의 사분위수에 따라 점들을 색칠할 것입니다.

여기서 색이 짙을수록 첫 번째 고용센터까지의 거리가 멀다는 뜻이다.

지금까지 여러분이 알고 있는 산업 요율이 낮아지고 가격이 높아지는 것을 다시 보여줍니다. 이제 INDUX, NOX별 분석을 볼 수 있습니다.

  • 패싯 Y를 선택하고 NOX를 선택합니다.

이제 첫 번째 일자리 센터에서 멀리 떨어진 집이 업계 점유율이 가장 낮고 따라서 산화물 농도도 가장 낮다는 것을 알 수 있습니다. Q_PRICE로 유형을 표시하고 왼쪽 아래 모서리를 확대하면 어떤 유형의 가격인지 볼 수 있습니다.

IND, NOX 및 DIS 간의 상호 작용이 모델을 개선하는 데 좋은 후보가 될 수 있다는 또 다른 힌트가 있습니다.

TensorFlow

이 섹션에서는 TensorFlow 추정기 API를 사용하여 선형 분류기를 추정합니다. 다음과 같이 진행하게 됩니다:

  • 데이터 준비
  • 벤치마크 모델 추정: 상호 작용 없음
  • 상호 작용을 통해 모델 추정

머신러닝의 목표는 오류를 최소화하는 것임을 기억하세요. 이 경우 평균 제곱 오차가 가장 낮은 모델이 승리합니다. TensorFlow 추정기는 이 측정항목을 자동으로 계산합니다.

준비 데이터

대부분의 경우 데이터를 변환해야 합니다. 이것이 바로 Facets 개요가 흥미로운 이유입니다. 요약 통계를 보면 이상값이 있는 것을 알 수 있습니다. 이러한 값은 분석 중인 모집단과 같지 않기 때문에 추정치에 영향을 미칩니다. 특이치는 일반적으로 결과를 편향시킵니다. 예를 들어, 양수 이상값은 계수를 과대평가하는 경향이 있습니다.

이 문제를 해결하는 좋은 해결책은 변수를 표준화하는 것입니다. 표준화란 표준편차가 XNUMX이고 평균이 XNUMX임을 의미합니다. 표준화 프로세스에는 두 단계가 포함됩니다. 먼저 변수의 평균값을 뺍니다. 둘째, 분포가 단위 표준편차를 갖도록 표준편차로 나눕니다.

라이브러리 sklearn은 변수를 표준화하는 데 도움이 됩니다. 이러한 목적으로 객체 스케일과 함께 모듈 전처리를 사용할 수 있습니다.

아래 함수를 사용하여 데이터 세트의 크기를 조정할 수 있습니다. 레이블 열과 범주형 변수는 척도화되지 않습니다.

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

이 함수를 사용하여 확장된 열차/테스트 세트를 구성할 수 있습니다.

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

기본 회귀:벤치마크

우선, 상호 작용 없이 모델을 훈련하고 테스트합니다. 목적은 모델의 성능 지표를 확인하는 것입니다.

모델을 훈련하는 방법은 튜토리얼과 똑같습니다. 높은 수준의 API. TensorFlow 추정기 LinearRegressor를 사용합니다.

참고로 다음을 선택해야 합니다.

  • 모델에 넣을 특징
  • 특징을 변형하다
  • 선형 회귀 분석기 구성
  • input_fn 함수 구성
  • 모델 훈련
  • 모델을 테스트하다

데이터세트의 모든 변수를 사용하여 모델을 학습합니다. 전체적으로, 레벨 연속형 변수와 하나의 범주형 변수가 있습니다.

## 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']

기능을 숫자 열 또는 범주형 열로 변환합니다.

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'])]

선형Regressor를 사용하여 모델을 생성합니다. 모델을 train_Boston 폴더에 저장합니다.

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

산출

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}

기차 또는 테스트 데이터의 각 열은 get_input_fn 함수를 사용하여 Tensor로 변환됩니다.

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)

기차 데이터에서 모델을 추정합니다.

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

산출

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>

마지막으로 테스트 세트에서 모델의 성능을 추정합니다.

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

산출

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}

모델의 손실은 1650입니다. 이는 다음 섹션에서 이길 수 있는 지표입니다.

모델 개선: 상호작용 항

튜토리얼의 첫 번째 부분에서 변수 간의 흥미로운 관계를 보았습니다. 다양한 시각화 기법을 통해 INDUS와 NOS가 서로 연결되어 있으며 가격에 미치는 영향을 확대하는 것으로 나타났습니다. INDUS와 NOS 간의 상호 작용이 가격에 영향을 미칠 뿐만 아니라 DIS와 상호 작용할 때 이 효과가 더 강해집니다.

이제 이 아이디어를 일반화하고 모델 예측 모델을 개선할 수 있는지 확인할 시간입니다.

각 데이터세트 세트에 훈련 + 테스트라는 두 개의 새로운 열을 추가해야 합니다. 이를 위해 상호 작용 항을 계산하는 함수 하나와 삼중 상호 작용 항을 계산하는 또 다른 함수를 만듭니다. 각 함수는 단일 열을 생성합니다. 새 변수가 생성된 후 이를 훈련 데이터 세트와 테스트 데이터 세트에 연결할 수 있습니다.

먼저 INDUS와 NOX 간의 상호작용을 위한 새로운 변수를 생성해야 합니다.

아래 함수는 var_1과 var_2(귀하의 경우 INDUS 및 NOX) 간의 상호 작용을 통해 train 및 test라는 두 개의 데이터 프레임을 반환합니다.

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

두 개의 새로운 열을 저장합니다.

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

둘째, 삼중 상호 작용 항을 계산하는 두 번째 함수를 만듭니다.

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')

이제 필요한 모든 열이 있으므로 이를 데이터 세트 학습 및 테스트에 추가할 수 있습니다. 이 두 개의 새로운 데이터프레임 이름을 다음과 같이 지정합니다.

  • 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)

산출

모델 상호 작용 항 개선

그게 다야; 상호 작용 항을 사용하여 새 모델을 추정하고 성능 지표가 어떤지 확인할 수 있습니다.

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)

산출

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}

CODE

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)

산출

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)

산출

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}

새로운 손실은 1515입니다. 두 개의 새로운 변수를 추가하는 것만으로 손실을 줄일 수 있었습니다. 이는 벤치마크 모델보다 더 나은 예측을 할 수 있다는 것을 의미합니다.