TensorFlow를 사용한 선형 회귀 튜토리얼 [예제]

선형 회귀는 무엇입니까?

선형 회귀 두 변수 사이의 관계를 모델링하기 위한 통계적 접근 방식입니다. 이 모델링은 스칼라 응답과 하나 이상의 설명 변수 사이에서 수행됩니다. 하나의 설명변수와의 관계를 단순선형회귀라고 하고, 설명변수가 XNUMX개 이상인 경우에는 다중선형회귀라고 합니다.

TensorFlow는 계산을 완전히 제어할 수 있는 도구를 제공합니다. 이는 저수준 API를 통해 수행됩니다. 게다가 TensorFlow는 다양한 작업을 수행할 수 있는 광범위한 API를 갖추고 있습니다. 기계 학습 알고리즘. 이는 고급 API입니다. TensorFlow는 이를 추정자라고 부릅니다.

  • 저수준 API: 빌드 archi강의, 처음부터 모델 최적화. 초보자에게는 복잡해요
  • 높은 수준의 API: 알고리즘을 정의합니다. 더 쉽게 사용할 수 있습니다. TensorFlow는 도구를 제공합니다box 라는 견적 자 구성, 훈련, 평가 및 예측을 수행합니다.

이 튜토리얼에서는 추정자만. 계산이 더 빠르고 구현하기가 더 쉽습니다. 튜토리얼의 첫 번째 부분에서는 경사하강법 최적화 프로그램을 사용하여 TensorFlow에서 선형 회귀를 학습하는 방법을 설명합니다. 두 번째 부분에서는 보스턴 데이터세트를 사용하여 TensorFlow 추정기를 사용하여 주택 가격을 예측합니다.

보스턴 데이터세트 다운로드

선형 회귀 모델을 훈련하는 방법

모델 학습을 시작하기 전에 선형 회귀가 무엇인지 살펴보겠습니다.

x와 y라는 두 개의 변수가 있고 kno의 값을 예측하는 작업이 있다고 가정해 보세요.wing 의 가치 . 데이터를 플로팅하면 독립 변수 x와 종속 변수 y 사이에 양의 관계가 있음을 확인할 수 있습니다.

선형 회귀 모델 학습

x=1이면 y는 대략 6과 같고 x=2이면 y는 약 8.5가 됩니다.

이는 매우 정확한 방법이 아니며 오류가 발생하기 쉽습니다. 특히 수십만 개의 포인트가 있는 데이터 세트의 경우 더욱 그렇습니다.

선형 회귀는 방정식으로 평가됩니다. 변수 y는 하나 이상의 공변량으로 설명됩니다. 귀하의 예에는 종속 변수가 하나만 있습니다. 이 방정식을 작성해야 한다면 다음과 같습니다.

선형 회귀 모델 학습

와:

  • TensorFlow를 사용한 선형 회귀 편견이다. 즉, x=0이면 y=선형 회귀 모델 학습
  • 선형 회귀 모델 학습 x에 관련된 가중치입니다.
  • 선형 회귀 모델 학습 모델의 잔차 또는 오류입니다. 모델이 데이터에서 학습할 수 없는 내용도 포함됩니다.

당신이 모델에 적합하고 추종자를 찾는다고 상상해보십시오.wing 솔루션:

  • 선형 회귀 모델 학습 = 3.8
  • 선형 회귀 모델 학습 = 2.78

방정식에서 해당 숫자를 대체하면 다음과 같이 됩니다.

y= 3.8 + 2.78x

이제 y의 값을 찾는 더 좋은 방법이 생겼습니다. 즉, x를 y를 예측하려는 값으로 바꿀 수 있습니다. 아래 이미지에서는 방정식의 x를 데이터세트의 모든 값으로 바꾸고 결과를 플롯했습니다.

선형 회귀 모델 학습

빨간색 선은 적합치, 즉 각 x 값에 대한 y 값을 나타냅니다. y를 예측하기 위해 x 값을 볼 필요는 없습니다. 각 x에 대해 빨간색 선에 속하는 값이 있습니다. 2보다 큰 x 값을 예측할 수도 있습니다!

선형 회귀를 더 많은 공변량으로 확장하려면 모델에 더 많은 변수를 추가하면 됩니다. 전통적인 분석과 선형 회귀의 차이점은 선형 회귀가 독립적으로 취해진 각 변수 x에 대해 y가 어떻게 반응하는지 살펴보는 것입니다.

예를 살펴보겠습니다. 아이스크림 가게의 매출을 예측한다고 가정해 보겠습니다. 데이터 세트에는 날씨(예: 비, 맑음, 흐림), 고객 정보(예: 급여, 성별, 결혼 상태)와 같은 다양한 정보가 포함되어 있습니다.

전통적인 분석에서는 각 변수의 평균을 계산하여 판매를 예측하고 다양한 시나리오에 대한 판매를 추정하려고 시도합니다. 이는 잘못된 예측으로 이어지고 분석을 선택한 시나리오로 제한합니다.

선형 회귀를 사용하는 경우 다음 방정식을 작성할 수 있습니다.

선형 회귀 모델 학습

알고리즘은 가중치에 대한 최상의 솔루션을 찾습니다. 이는 비용(적합선과 데이터 점 간의 차이)을 최소화하려고 노력한다는 의미입니다.

알고리즘 작동 방식

알고리즘 작업

알고리즘은 각각에 대해 임의의 숫자를 선택합니다. TensorFlow를 사용한 선형 회귀알고리즘 작업 x의 값을 대체하여 예측된 y의 값을 얻습니다. 데이터 세트에 100개의 관측치가 있는 경우 알고리즘은 100개의 예측 값을 계산합니다.

우리는 오류를 계산할 수 있습니다. 알고리즘 작업 모델의 예측값과 실제값의 차이입니다. 양수 오류는 모델이 y 예측을 과소평가한다는 의미이고, 음수 오류는 모델이 y 예측을 과대평가한다는 의미입니다.

알고리즘 작업

당신의 목표는 오류의 제곱을 최소화하는 것입니다. 알고리즘은 제곱 오류의 평균을 계산합니다. 이 단계를 오류 최소화라고 합니다. 선형 회귀의 경우 평균 제곱 오차, MSE라고도 합니다. 수학적으로는 다음과 같습니다.

알고리즘 작업

어디에:

  • 알고리즘 작업 무게가 그래서인지 알고리즘 작업 예측된 값을 말합니다.
  • y는 실제 값입니다.
  • m은 관측치 수입니다.

참고 알고리즘 작업 이는 행렬의 전치(transpose)를 사용한다는 것을 의미합니다. 그만큼 알고리즘 작업 평균의 수학적 표기법입니다.

목표는 최고의 것을 찾는 것입니다. 알고리즘 작업 MSE를 최소화하는

평균 오차가 크면 모델 성능이 좋지 않고 가중치가 제대로 선택되지 않았음을 의미합니다. 가중치를 수정하려면 옵티마이저를 사용해야 합니다. 전통적인 최적화 프로그램은 다음과 같습니다. 그라데이션 하강.

경사하강법은 도함수를 취하고 가중치를 줄이거나 늘립니다. 도함수가 양수이면 가중치가 감소합니다. 도함수가 음수이면 가중치가 증가합니다. 모델은 가중치를 업데이트하고 오류를 다시 계산합니다. 이 프로세스는 오류가 더 이상 변경되지 않을 때까지 반복됩니다. 각 프로세스를 되풀이. 게다가 기울기에 학습률을 곱합니다. 학습 속도를 나타냅니다.

학습률이 너무 작으면 알고리즘이 수렴하는 데 매우 오랜 시간이 걸립니다(즉, 많은 반복이 필요함). 학습률이 너무 높으면 알고리즘이 수렴되지 않을 수 있습니다.

알고리즘 작업

위 그림에서 볼 수 있듯이, 모델은 가중치에 대한 안정적인 값을 찾기 전에 이 과정을 약 20번 반복하여 가장 낮은 오류에 도달합니다.

참고, 오류는 5이 아니지만 약 5로 안정화됩니다. 이는 모델이 일반적인 오류 XNUMX를 만든다는 의미입니다. 오류를 줄이려면 더 많은 변수와 같은 더 많은 정보를 모델에 추가하거나 다른 추정기를 사용해야 합니다. .

첫 번째 방정식을 기억하시나요?

알고리즘 작업

최종 가중치는 3.8과 2.78입니다. 아래 비디오는 경사하강법이 손실 함수를 최적화하여 이 가중치를 찾는 방법을 보여줍니다.

TensorFlow를 사용하여 선형 회귀를 학습하는 방법

이제 내부적으로 무슨 일이 일어나고 있는지 더 잘 이해했으므로 TensorFlow에서 제공하는 추정기 API를 사용하여 TensorFlow를 사용한 첫 번째 선형 회귀를 학습할 준비가 되었습니다.

다음을 포함하는 Boston Dataset을 사용합니다.wing 변수

크림 도시별 XNUMX인당 범죄율
zn 25,000 평방피트를 초과하는 부지에 대해 구역화된 주거용 토지의 비율.
인더스 문자 도시당 비소매 사업 면적의 비율.
녹스 산화질소 농도
rm 가구당 평균 방 수
나이 1940년 이전에 건축된 자가 거주 주택의 비율
말요 보스턴 고용 센터 XNUMX곳까지의 가중치 거리
달러당 전체 재산세율 10,000
비율 도시별 학생-교사 비율
의료 소유자가 거주하는 주택의 중간 가치(천 달러)

세 가지 다른 데이터 세트를 생성합니다.

데이터 세트 목표 형성
트레이닝 모델을 훈련하고 가중치를 얻습니다. 400, 10
평가 보이지 않는 데이터에 대한 모델 성능 평가 100, 10
예측 모델을 사용하여 새 데이터에 대한 주택 가치 예측 6, 10

목표는 데이터세트의 특징을 사용하여 집의 가치를 예측하는 것입니다.

튜토리얼의 두 번째 부분에서는 데이터를 가져오는 세 가지 방법으로 TensorFlow를 사용하는 방법을 배웁니다.

  • 팬더와 함께
  • 누피
  • TF만

참고로 모든 옵션은 동일한 결과를 제공합니다.

TensorFlow 선형 회귀 모델을 구축하고 평가하기 위해 고급 API를 사용하는 방법을 배우게 됩니다. 하위 수준 API를 사용하는 경우 다음을 직접 정의해야 했습니다.

  • 손실 기능
  • 최적화: 경사하강법
  • 행렬 곱셈
  • 그래프와 텐서

이것은 초보자에게는 지루하고 더 복잡합니다.

판다

모델을 학습하려면 필요한 라이브러리를 가져와야 합니다.

import pandas as pd
from sklearn import datasets
import tensorflow as tf
import itertools

단계 1) 다음을 사용하여 데이터를 가져옵니다. 팬더.

열 이름을 정의하고 이를 COLUMNS에 저장합니다. pd.read_csv()를 사용하여 데이터를 가져올 수 있습니다.

COLUMNS = ["crim", "zn", "indus", "nox", "rm", "age",
           "dis", "tax", "ptratio", "medv"]

training_set = pd.read_csv(“E:/boston_train.csv”, Skipinitialspace=True,skiprows=1, names=COLUMNS)

test_set = pd.read_csv(“E:/boston_test.csv”, Skipinitialspace=True,skiprows=1, names=COLUMNS)

예측_세트 = pd.read_csv("E:/boston_predict.csv", Skipinitialspace=True,skiprows=1, names=COLUMNS)

데이터의 모양을 인쇄할 수 있습니다.

print(training_set.shape, test_set.shape, prediction_set.shape)

산출

(400, 10) (100, 10) (6, 10)

레이블, 즉 y가 데이터세트에 포함되어 있습니다. 따라서 두 개의 다른 목록을 정의해야 합니다. 하나는 기능만 포함하고 다른 하나는 라벨 이름만 포함합니다. 이 두 목록은 추정자에게 데이터 세트의 기능이 무엇인지, 레이블이 어떤 열 이름인지 알려줍니다.

아래 코드로 완료됩니다.

FEATURES = ["crim", "zn", "indus", "nox", "rm",				
                 "age", "dis", "tax", "ptratio"]
LABEL = "medv"

단계 2) 데이터 변환

숫자변수를 적절한 형식으로 변환해야 합니다. Tensorflow는 연속형 변수를 변환하는 방법인 tf.feature_column.numeric_column()을 제공합니다.

이전 단계에서는 모델에 포함할 기능 목록을 정의했습니다. 이제 이 목록을 사용하여 숫자 데이터로 변환할 수 있습니다. 모델에서 기능을 제외하려면 feature_cols를 구성하기 전에 FEATURES 목록에 하나 이상의 변수를 자유롭게 삭제하세요.

FEATURES 목록과 함께 Python 목록 이해를 사용하여 feature_cols라는 새 목록을 생성합니다. tf.feature_column.numeric_column()을 XNUMX번 쓰는 것을 방지하는 데 도움이 됩니다. 목록 이해는 새 목록을 만드는 더 빠르고 깔끔한 방법입니다.

feature_cols = [tf.feature_column.numeric_column(k) for k in FEATURES]

단계 3) 추정량 정의

이 단계에서는 추정기를 정의해야 합니다. Tensorflow는 현재 분류 ​​작업용 6개와 TensorFlow 회귀 작업용 3개를 포함하여 사전 구축된 추정기 3개를 제공합니다.

  • 회귀자
    • DNNRegressor
    • 선형회귀기
    • DNNLineaCombinedRegressor
  • 분류
    • DNN 분류기
    • 선형 분류기
    • DNNLineaCombinedClassifier

이 자습서에서는 선형 회귀 분석기를 사용합니다. 이 기능에 접근하려면 tf.estimator를 사용해야 합니다.

이 함수에는 두 가지 인수가 필요합니다.

  • feature_columns: 모델에 포함할 변수를 포함합니다.
  • model_dir: 그래프 저장 경로, 모델 매개변수 저장 등

Tensorflow는 작업 디렉터리에 train이라는 파일을 자동으로 생성합니다. 아래 TensorFlow 회귀 예제에 표시된 것처럼 Tensorboard에 액세스하려면 이 경로를 사용해야 합니다.

estimator = tf.estimator.LinearRegressor(    
        feature_columns=feature_cols,   
        model_dir="train")

산출

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a215dc550>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

TensorFlow의 까다로운 부분은 모델에 피드를 제공하는 방법입니다. Tensorflow는 병렬 컴퓨팅 및 매우 큰 데이터 세트에서 작동하도록 설계되었습니다. 기계 리소스의 제한으로 인해 모델에 모든 데이터를 한 번에 공급하는 것은 불가능합니다. 이를 위해서는 매번 데이터 배치를 제공해야 합니다. 우리는 수백만 개 이상의 레코드가 포함된 거대한 데이터 세트에 대해 이야기하고 있습니다. 배치를 추가하지 않으면 메모리 오류가 발생합니다.

예를 들어, 데이터에 100개의 관측치가 포함되어 있고 배치 크기를 10으로 정의하면 모델은 각 반복(10*10)에 대해 10개의 관측치를 보게 됩니다.

모델이 모든 데이터를 확인하면 하나의 데이터를 완료합니다. 시대. 에포크는 모델이 데이터를 확인하려는 횟수를 정의합니다. 이 단계를 없음으로 설정하고 모델이 반복 횟수를 수행하도록 하는 것이 좋습니다.

추가할 두 번째 정보는 각 반복 전에 데이터를 섞으려는 경우입니다. 훈련 중에는 모델이 데이터 세트의 특정 패턴을 학습하지 않도록 데이터를 섞는 것이 중요합니다. 모델이 de를 학습하면tails 데이터의 기본 패턴 때문에 보이지 않는 데이터에 대한 예측을 일반화하는 데 어려움이 있습니다. 이것은 ... 불리운다 과적 합. 모델은 훈련 데이터에서는 잘 작동하지만, 보이지 않는 데이터에 대해서는 올바르게 예측할 수 없습니다.

TensorFlow를 사용하면 이 두 단계를 쉽게 수행할 수 있습니다. 데이터가 파이프라인으로 이동하면 필요한 관찰 수(일괄)와 데이터를 섞어야 하는지 여부를 알 수 있습니다.

Tensorflow에 모델 공급 방법을 지시하려면 pandas_input_fn을 사용할 수 있습니다. 이 객체에는 5개의 매개변수가 필요합니다.

  • x: 특징 데이터
  • y: 라벨 데이터
  • 배치_크기: 배치. 기본적으로 128
  • num_epoch: 에포크 수, 기본적으로 1
  • shuffle: 데이터를 섞거나 섞지 않습니다. 기본적으로 없음

모델에 여러 번 공급해야 하므로 이 프로세스를 반복하는 함수를 정의합니다. 이 모든 기능은 get_input_fn입니다.

def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):    
         return tf.estimator.inputs.pandas_input_fn(       
         x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),       
         y = pd.Series(data_set[LABEL].values),       
         batch_size=n_batch,          
         num_epochs=num_epochs,       
         shuffle=shuffle)

모델의 성능을 평가하는 일반적인 방법은 다음과 같습니다.

  • 모델 훈련
  • 다른 데이터 세트에서 모델 평가
  • 예측하기

Tensorflow 추정기는 이 세 단계를 쉽게 수행할 수 있도록 세 가지 다른 기능을 제공합니다.

단계 4): 모델 훈련

추정기 열차를 사용하여 모델을 평가할 수 있습니다. 열차 추정기에는 input_fn과 여러 단계가 필요합니다. 위에서 만든 함수를 사용하여 모델에 피드를 제공할 수 있습니다. 그런 다음 모델에 1000번 반복하도록 지시합니다. 세대 수를 지정하지 않고 모델이 1000번 반복하도록 허용한다는 점에 유의하세요. Epoch 수를 1로 설정하면 모델은 4번 반복됩니다. 훈련 세트에는 400개의 레코드가 있고 배치 크기는 128입니다.

  1. 행 128 개
  2. 행 128 개
  3. 행 128 개
  4. 행 16 개

따라서 아래 TensorFlow 분류 예시와 같이 epoch 수를 없음으로 설정하고 반복 횟수를 정의하는 것이 더 쉽습니다.

estimator.train(input_fn=get_input_fn(training_set,                                       
                                           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/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 238.616
INFO:tensorflow:loss = 13909.657, step = 101 (0.420 sec)
INFO:tensorflow:global_step/sec: 314.293
INFO:tensorflow:loss = 12881.449, step = 201 (0.320 sec)
INFO:tensorflow:global_step/sec: 303.863
INFO:tensorflow:loss = 12391.541, step = 301 (0.327 sec)
INFO:tensorflow:global_step/sec: 308.782
INFO:tensorflow:loss = 12050.5625, step = 401 (0.326 sec)
INFO:tensorflow:global_step/sec: 244.969
INFO:tensorflow:loss = 11766.134, step = 501 (0.407 sec)
INFO:tensorflow:global_step/sec: 155.966
INFO:tensorflow:loss = 11509.922, step = 601 (0.641 sec)
INFO:tensorflow:global_step/sec: 263.256
INFO:tensorflow:loss = 11272.889, step = 701 (0.379 sec)
INFO:tensorflow:global_step/sec: 254.112
INFO:tensorflow:loss = 11051.9795, step = 801 (0.396 sec)
INFO:tensorflow:global_step/sec: 292.405
INFO:tensorflow:loss = 10845.855, step = 901 (0.341 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.9873.

Tensorboard가 다음 작업을 수행하는지 확인할 수 있습니다.wing 명령:

activate hello-tf
# For MacOS
tensorboard --logdir=./train
# For Windows
tensorboard --logdir=train

단계 5) 모델 평가

아래 코드를 사용하여 테스트 세트에서 모델의 적합성을 평가할 수 있습니다.

ev = estimator.evaluate(    
          input_fn=get_input_fn(test_set,                          
          num_epochs=1,                          
          n_batch = 128,                          
          shuffle=False))

산출

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-01:43:13
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-01:43:13
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896

아래 코드를 사용하여 손실을 인쇄할 수 있습니다.

loss_score = ev["loss"]
print("Loss: {0:f}".format(loss_score))

산출

Loss: 3215.895996

모델의 손실은 3215입니다. 요약 통계를 확인하면 오류가 얼마나 큰지 알 수 있습니다.

training_set['medv'].describe()

산출

count    400.000000
mean      22.625500
std        9.572593
min        5.000000
25%       16.600000
50%       21.400000
75%       25.025000
max       50.000000
Name: medv, dtype: float64

위의 요약 통계를 보면 주택 평균 가격이 22이고 최저 가격이 9이고 최대 가격이 50이라는 것을 알 수 있습니다. 이 모델은 일반적으로 3달러의 오류를 범합니다.

단계 6) 예측을 해보세요

마지막으로 TensorFlow 예측 추정기를 사용하여 보스턴 주택 6채의 가치를 추정할 수 있습니다.

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

의 예상 값을 인쇄하려면 다음 코드를 사용할 수 있습니다.

predictions = list(p["predictions"] for p in itertools.islice(y, 6))print("Predictions: {}".format(str(predictions)))

산출

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.96125], dtype=float32), array([27.270979], dtype=float32), array([29.299236], dtype=float32), array([16.436684], dtype=float32), array([21.460876], dtype=float32)]

모델은 다음을 예측합니다.wing 값 :

예측
1 32.29
2 18.96
3 27.27
4 29.29
5 16.43
7 21.46

우리는 의 진정한 가치를 모른다는 점에 유의하십시오. 딥러닝 튜토리얼에서는 선형 모델을 이기기 위해 노력할 것입니다.

Numpy 솔루션

이 섹션에서는 데이터를 공급하기 위해 numpy 추정기를 사용하여 모델을 훈련하는 방법을 설명합니다. numpy_input_fn 추정기를 사용한다는 점을 제외하면 방법은 동일합니다.

training_set_n = pd.read_csv(“E:/boston_train.csv”).values

test_set_n = pd.read_csv(“E:/boston_test.csv”).values

예측_세트_n = pd.read_csv("E:/boston_predict.csv").values

단계 1) 데이터 가져 오기

우선, 라벨과 특성 변수를 구별해야 합니다. 훈련 데이터와 평가를 위해 이 작업을 수행해야 합니다. 데이터를 분할하는 함수를 정의하는 것이 더 빠릅니다.

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

이 함수를 사용하여 데이터 세트 학습/평가의 기능에서 레이블을 분할할 수 있습니다.

X_train, y_train = prepare_data(training_set_n)
X_test, y_test = prepare_data(test_set_n)

NaN만 포함되어 있으므로 예측 데이터 세트의 마지막 열을 제외해야 합니다.

x_predict = prediction_set_n[:, :-2]

배열의 모양을 확인합니다. 레이블에는 차원이 없어야 합니다. 이는 (400,)을 의미합니다.

print(X_train.shape, y_train.shape, x_predict.shape)

산출

(400, 9) (400,) (6, 9)

다음과 같이 특성 열을 구성할 수 있습니다.

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

추정량은 이전과 같이 정의되며 특성 열과 그래프를 저장할 위치를 지시합니다.

estimator = tf.estimator.LinearRegressor(    
         feature_columns=feature_columns,    
         model_dir="train1")

산출

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'train1', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a218d8f28>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

numpy estimapor를 사용하여 모델에 데이터를 공급한 다음 모델을 훈련할 수 있습니다. 가독성을 높이기 전에 input_fn 함수를 정의합니다.

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

산출

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train1/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 490.057
INFO:tensorflow:loss = 13909.656, step = 101 (0.206 sec)
INFO:tensorflow:global_step/sec: 788.986
INFO:tensorflow:loss = 12881.45, step = 201 (0.126 sec)
INFO:tensorflow:global_step/sec: 736.339
INFO:tensorflow:loss = 12391.541, step = 301 (0.136 sec)
INFO:tensorflow:global_step/sec: 383.305
INFO:tensorflow:loss = 12050.561, step = 401 (0.260 sec)
INFO:tensorflow:global_step/sec: 859.832
INFO:tensorflow:loss = 11766.133, step = 501 (0.117 sec)
INFO:tensorflow:global_step/sec: 804.394
INFO:tensorflow:loss = 11509.918, step = 601 (0.125 sec)
INFO:tensorflow:global_step/sec: 753.059
INFO:tensorflow:loss = 11272.891, step = 701 (0.134 sec)
INFO:tensorflow:global_step/sec: 402.165
INFO:tensorflow:loss = 11051.979, step = 801 (0.248 sec)
INFO:tensorflow:global_step/sec: 344.022
INFO:tensorflow:loss = 10845.854, step = 901 (0.288 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train1/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.985.
Out[23]:
<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x1a1b6ea860>

모델을 평가하기 위해 다른 추정기로 동일한 단계를 반복합니다.

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)

산출

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-01:44:00
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-01:44:00
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.158947, global_step = 1000, loss = 3215.8945
Out[24]:
{'average_loss': 32.158947, 'global_step': 1000, 'loss': 3215.8945}

마지막으로 예측을 계산할 수 있습니다. 팬더와 비슷해야합니다.

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

산출

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Predictions: [array([32.297546], dtype=float32), array([18.961248], dtype=float32), array([27.270979], dtype=float32), array([29.299242], dtype=float32), array([16.43668], dtype=float32), array([21.460878], dtype=float32)]

텐서플로우 솔루션

마지막 섹션은 TensorFlow 솔루션에 관한 것입니다. 이 방법은 다른 방법보다 약간 더 복잡합니다.

사용하는 경우 Jupyter 수첩, 이 세션을 실행하려면 커널을 다시 시작하고 정리해야 합니다.

TensorFlow 데이터를 파이프라인으로 전달하는 훌륭한 도구를 구축했습니다. 이 섹션에서는 input_fn 함수를 직접 빌드해 보겠습니다.

단계 1) 데이터의 경로와 형식을 정의합니다.

먼저 csv 파일의 경로를 사용하여 두 개의 변수를 선언합니다. 훈련 세트용 파일과 테스트 세트용 파일 두 개가 있습니다.

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

그런 다음 csv 파일에서 사용하려는 열을 정의해야 합니다. 우리는 모두 사용할 것입니다. 그런 다음 변수 유형을 선언해야 합니다.

부동 변수는 [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]]

단계 2) input_fn 함수 정의

이 기능은 세 부분으로 나눌 수 있습니다.

  1. 데이터 가져 오기
  2. 반복자 만들기
  3. 데이터 소비

아래는 함수를 정의하는 전체 코드입니다. 코드는 나중에 설명하겠습니다.

def input_fn(data_file, batch_size, num_epoch = None):				
       # Step 1				
          def parse_csv(value):        
          columns = tf.decode_csv(value, record_defaults= RECORDS_ALL)        
          features = dict(zip(COLUMNS, columns))				
          #labels = features.pop('median_house_value')        
          labels =  features.pop('medv')        
          return features, labels							
          
          # Extract lines from input files using the 
          Dataset API.    dataset = (tf.data.TextLineDataset(data_file) # Read text file       
          .skip(1) # Skip header row       
          .map(parse_csv))			   
          
          dataset = dataset.repeat(num_epoch)    
          dataset = dataset.batch(batch_size) 				
          # Step 3    
          iterator = dataset.make_one_shot_iterator()    
          features, labels = iterator.get_next()    
          return features, labels

** 데이터 가져오기**

csv 파일의 경우 데이터 세트 메서드는 한 번에 한 줄을 읽습니다. 데이터세트를 구축하려면 객체를 사용해야 합니다. TextLine데이터세트. 데이터세트에 헤더가 있으므로 첫 번째 줄을 건너뛰려면 Skip(1)을 사용해야 합니다. 이 시점에서는 데이터만 읽고 파이프라인에서 헤더를 제외합니다. 모델을 공급하려면 레이블에서 기능을 분리해야 합니다. 데이터에 변환을 적용하는 데 사용되는 방법은 맵입니다.

이 메소드는 데이터 변환 방법을 지시하기 위해 생성할 함수를 호출합니다. 간단히 말해서, TextLine데이터 세트 개체, 헤더를 제외하고 함수의 지시에 따라 변환을 적용합니다.코드 설명

  • tf.data.TextLineDataset(data_file): 이 줄은 csv 파일을 읽습니다.
  • .skip(1) : 헤더를 건너뜁니다.
  • .map(parse_csv)): 레코드를 텐서로 구문 분석합니다. 지도 객체에 지시하는 함수를 정의해야 합니다. 이 함수를 pars_csv라고 부를 수 있습니다.

이 함수는 tf.decode_csv 및 decl 메소드를 사용하여 csv 파일을 구문 분석합니다.ares 기능과 라벨. 기능은 사전이나 튜플로 선언될 수 있습니다. 더 편리하기 때문에 사전 방법을 사용합니다.코드 설명

  • tf.decode_csv(value, Record_defaults= RECORDS_ALL): decode_csv 메소드는 다음의 출력을 사용합니다. TextLinecsv 파일을 읽기 위한 데이터세트입니다. Record_defaults는 TensorFlow에 열 유형에 대해 지시합니다.
  • dict(zip(_CSV_COLUMNS, columns)): 이 데이터 처리 중에 추출된 모든 열로 사전을 채웁니다.
  • feature.pop('median_house_value'): 특성 변수에서 대상 변수를 제외하고 레이블 변수를 생성합니다.

데이터 세트에는 Tensor에 반복적으로 공급하기 위한 추가 요소가 필요합니다. 실제로, 데이터 세트가 모델에 계속 공급되도록 하려면 반복 메소드를 추가해야 합니다. 메서드를 추가하지 않으면 모델은 한 번만 반복한 다음 파이프라인에 더 이상 데이터가 제공되지 않기 때문에 오류를 발생시킵니다.

그런 다음 배치 방법을 사용하여 배치 크기를 제어할 수 있습니다. 이는 각 반복마다 파이프라인에 전달하려는 데이터 수를 데이터 세트에 알려주는 것을 의미합니다. 큰 배치 크기를 설정하면 모델이 느려집니다.

3단계) ​​반복자 생성

이제 두 번째 단계인 데이터 세트의 요소를 반환하는 반복기를 생성할 준비가 되었습니다.

연산자를 생성하는 가장 간단한 방법은 make_one_shot_iterator 메서드를 사용하는 것입니다.

그런 다음 반복기에서 기능과 레이블을 생성할 수 있습니다.

4단계) 데이터 소비

input_fn 함수로 어떤 일이 일어나는지 확인할 수 있습니다. 데이터를 사용하려면 세션에서 함수를 호출해야 합니다. 배치 크기를 1로 설정해 봅니다.

사전의 기능과 레이블을 배열로 인쇄합니다.

csv 파일의 첫 번째 줄이 표시됩니다. 다양한 배치 크기로 이 코드를 여러 번 실행해 볼 수 있습니다.

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)

산출

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

단계 4) 특성 열 정의

다음과 같이 숫자 열을 정의해야 합니다.

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

버킷의 모든 변수를 결합해야 합니다.

base_columns = [X1, X2, X3,X4, X5, X6,X7, X8, X9]

단계 5) 모델 구축

추정기 LinearRegressor를 사용하여 모델을 훈련할 수 있습니다.

model = tf.estimator.LinearRegressor(feature_columns=base_columns, model_dir='train3')

산출

INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'train3', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820a010f0>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

inpu_fn 함수에 인수를 쓰려면 람다 함수를 사용해야 합니다. 당신이 사용하지 않는 경우 람다 함수, 모델을 훈련할 수 없습니다.

# Train the estimatormodel.train(steps =1000,    
          input_fn= lambda : input_fn(df_train,batch_size=128, num_epoch = None))

산출

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Create CheckpointSaverHook.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Saving checkpoints for 1 into train3/model.ckpt.
INFO:tensorflow:loss = 83729.64, step = 1
INFO:tensorflow:global_step/sec: 72.5646
INFO:tensorflow:loss = 13909.657, step = 101 (1.380 sec)
INFO:tensorflow:global_step/sec: 101.355
INFO:tensorflow:loss = 12881.449, step = 201 (0.986 sec)
INFO:tensorflow:global_step/sec: 109.293
INFO:tensorflow:loss = 12391.541, step = 301 (0.915 sec)
INFO:tensorflow:global_step/sec: 102.235
INFO:tensorflow:loss = 12050.5625, step = 401 (0.978 sec)
INFO:tensorflow:global_step/sec: 104.656
INFO:tensorflow:loss = 11766.134, step = 501 (0.956 sec)
INFO:tensorflow:global_step/sec: 106.697
INFO:tensorflow:loss = 11509.922, step = 601 (0.938 sec)
INFO:tensorflow:global_step/sec: 118.454
INFO:tensorflow:loss = 11272.889, step = 701 (0.844 sec)
INFO:tensorflow:global_step/sec: 114.947
INFO:tensorflow:loss = 11051.9795, step = 801 (0.870 sec)
INFO:tensorflow:global_step/sec: 111.484
INFO:tensorflow:loss = 10845.855, step = 901 (0.897 sec)
INFO:tensorflow:Saving checkpoints for 1000 into train3/model.ckpt.
INFO:tensorflow:Loss for final step: 5925.9873.
Out[8]:
<tensorflow.python.estimator.canned.linear.LinearRegressor at 0x18225eb8d0>

아래 코드를 사용하여 테스트 세트에 대한 모델의 적합성을 평가할 수 있습니다.

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

산출

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-05-13-02:06:02
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Finished evaluation at 2018-05-13-02:06:02
INFO:tensorflow:Saving dict for global step 1000: average_loss = 32.15896, global_step = 1000, loss = 3215.896
   average_loss, was: 32.158958435058594
   loss, was: 3215.89599609375
   global_step, was: 1000

마지막 단계는 특성의 행렬인 의 값을 기반으로 의 값을 예측하는 것입니다. 예측하려는 값으로 사전을 작성할 수 있습니다. 모델에는 9개의 기능이 있으므로 각각에 대한 값을 제공해야 합니다. 모델은 각각에 대한 예측을 제공합니다.

아래 코드에서는 df_predict csv 파일에 포함된 각 기능의 값을 작성했습니다.

데이터세트에 라벨이 없으므로 새로운 input_fn 함수를 작성해야 합니다. 데이터세트의 from_tensor API를 사용할 수 있습니다.

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)

마지막으로 예측을 인쇄합니다.

for pred in enumerate(pred_results):    
print(pred)

산출

INFO:tensorflow:Calling model_fn.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
(0, {'predictions': array([32.297546], dtype=float32)})
(1, {'predictions': array([18.96125], dtype=float32)})
(2, {'predictions': array([27.270979], dtype=float32)})
(3, {'predictions': array([29.299236], dtype=float32)})
(4, {'predictions': array([16.436684], dtype=float32)})
(5, {'predictions': array([21.460876], dtype=float32)})

INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train3/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. (0, {'predictions': array([35.60663], dtype=float32)}) (1, {'predictions': array([22.298521], dtype=float32)}) (2, {'predictions': array([25.74533], dtype=float32)}) (3, {'predictions': array([35.126694], dtype=float32)}) (4, {'predictions': array([17.94416], dtype=float32)}) (5, {'predictions': array([22.606628], dtype=float32)})

요약

모델을 훈련하려면 다음을 수행해야 합니다.

  • 특징 정의: 독립변수: X
  • 레이블 정의: 종속 변수: y
  • 기차/테스트 세트 구성
  • 초기 가중치 정의
  • 손실 함수 정의: MSE
  • 모델 최적화: 경사하강법
  • 밝히다:
    • 학습률
    • 시대의 수
    • 배치 크기

이 튜토리얼에서는 선형 회귀 TensorFlow 추정기에 대한 고급 API를 사용하는 방법을 배웠습니다. 다음을 정의해야 합니다.

  1. 특성 열. 연속적인 경우: tf.feature_column.numeric_column(). Python 목록 이해 기능으로 목록을 채울 수 있습니다.
  2. 추정기: tf.estimator.LinearRegressor(feature_columns, model_dir)
  3. 데이터, 배치 크기 및 시대를 가져오는 함수: input_fn()

그런 다음 train(), 평가() 및 예측()을 사용하여 훈련, 평가 및 예측을 수행할 준비가 되었습니다.