TensorFlow 이진 분류: 선형 분류기 예

가장 흔한 두 가지 지도 학습 작업은 선형 회귀 및 선형 분류기입니다. 선형 회귀는 값을 예측하고 선형 분류기는 클래스를 예측합니다. 이 튜토리얼은 선형 분류기에 중점을 두고 있습니다.

선형 분류기란 무엇입니까?

A 선형 분류기 머신러닝에서는 통계적 분류를 위해 객체의 특성을 기반으로 객체의 클래스를 찾는 방법입니다. 객체의 특성의 선형 조합 값을 기반으로 분류 결정을 내립니다. 선형 분류기는 문서 분류 및 변수가 많은 문제와 같은 실제 문제에 사용됩니다.

분류 문제는 머신러닝 작업의 약 80%를 차지합니다. 분류는 일련의 입력이 주어졌을 때 각 클래스의 확률을 예측하는 것을 목표로 합니다. 레이블(즉, 종속 변수)은 클래스라고 하는 이산 값입니다.

  1. 레이블에 클래스가 두 개만 있는 경우 학습 알고리즘은 이진 분류자입니다.
  2. 다중 클래스 분류기는 XNUMX개 이상의 클래스가 있는 레이블을 처리합니다.

예를 들어, 전형적인 이진 분류 문제는 고객이 두 번째 구매를 할 가능성을 예측하는 것입니다. 그림에 표시된 동물의 종류를 예측하는 것은 두 가지 이상의 동물 종류가 존재하기 때문에 다중 클래스 분류 문제입니다.

이 튜토리얼의 이론적 부분에서는 바이너리 클래스에 중점을 둡니다. 향후 튜토리얼에서 멀티클래스 출력 기능에 대해 자세히 알아볼 것입니다.

이진 분류기는 어떻게 작동하나요?

이전 자습서에서 함수는 종속 변수와 기능 집합(독립 변수)이라는 두 가지 종류의 변수로 구성된다는 것을 배웠습니다. 선형 회귀 분석에서 종속 변수는 범위가 없는 실수입니다. 주요 목표는 평균 제곱 오차를 최소화하여 값을 예측하는 것입니다.

TensorFlow Binary Classifier의 경우 라벨에는 두 가지 정수 값이 있을 수 있습니다. 대부분의 경우 [0,1] 또는 [1,2]입니다. 예를 들어, 목표는 고객이 제품을 구매할지 여부를 예측하는 것입니다. 레이블은 다음과 같이 정의됩니다.

  • Y = 1(고객이 제품을 구매함)
  • Y = 0(고객이 제품을 구매하지 않음)

모델은 특성 X를 사용하여 각 고객을 그가 속할 가능성이 가장 높은 클래스, 즉 잠재적 구매자인지 아닌지 분류합니다.

성공 확률은 다음과 같이 계산됩니다. 로지스틱 회귀. 알고리즘은 특성 X를 기반으로 확률을 계산하고 이 확률이 50%를 초과하면 성공을 예측합니다. 보다 공식적으로 확률은 아래 TensorFlow 이진 분류 예시와 같이 계산됩니다.

이진 분류 예

여기서 0은 가중치, 특징, b는 편향의 집합입니다.

이 함수는 두 부분으로 분해될 수 있습니다.

  • 선형 모델
  • 물류 기능

선형 모델

당신은 이미 가중치가 계산되는 방식에 익숙합니다. 가중치는 내적을 사용하여 계산됩니다.내적 Y는 모든 특징 x의 선형 함수입니다.i. 모델에 특징이 없으면 예측은 편향 b와 같습니다.

가중치는 특성 x 간의 상관 관계 방향을 나타냅니다.i 그리고 라벨 y. 양의 상관관계는 양의 클래스의 확률을 증가시키는 반면, 음의 상관관계는 확률을 0에 더 가깝게 만듭니다(즉, 음의 클래스).

선형 모델은 실수만 반환하며 이는 범위 [0,1]의 확률 측정값과 일치하지 않습니다. 선형 모델 출력을 확률로 변환하려면 로지스틱 함수가 필요하며,

물류 기능

로지스틱 함수 또는 시그모이드 함수는 S자 모양을 가지며 이 함수의 출력은 항상 0과 1 사이입니다.

물류 기능의 예

물류 기능의 예
물류 기능의 예

선형 회귀의 출력을 시그모이드 함수로 대체하는 것은 쉽습니다. 결과적으로 0과 1 사이의 확률을 갖는 새로운 숫자가 생성됩니다.

분류기는 확률을 클래스로 변환할 수 있습니다.

  • 0에서 0.49 사이의 값은 클래스 0이 됩니다.
  • 0.5에서 1 사이의 값은 클래스 1이 됩니다.

선형 분류기의 성능을 측정하는 방법은 무엇입니까?

정확성

분류기의 전반적인 성능은 정확도 측정항목으로 측정됩니다. 정확도는 모든 정확한 값을 총 관측치 수로 나눈 값을 수집합니다. 예를 들어 정확도 값이 80%라는 것은 모델이 사례의 80%에서 정확하다는 것을 의미합니다.

정확도 메트릭
정확도 측정항목을 사용하여 선형 분류기의 성능 측정

이 지표에는 단점이 있는데, 특히 불균형 클래스의 경우 그렇습니다. 불균형 데이터 세트는 그룹당 관찰 수가 같지 않을 때 발생합니다. 로지스틱 함수로 드문 사건을 분류하려고 한다고 가정해 보겠습니다. 분류기가 질병으로 인한 환자의 사망을 추정하려고 한다고 가정해 보겠습니다. 데이터에서 환자의 5%가 사망합니다. 분류기를 훈련하여 사망자 수를 예측하고 정확도 지표를 사용하여 성능을 평가할 수 있습니다. 분류기가 전체 데이터 세트에 대해 0명의 사망자를 예측하는 경우 95%의 경우 정확할 것입니다.

혼동 행렬

분류기의 성능을 평가하는 더 좋은 방법은 혼동 행렬을 살펴보는 것입니다.

혼란 매트릭스
Confusion Matrix를 이용한 선형 분류기의 성능 측정

The 혼란 매트릭스 위의 선형 분류기 예에서 보여진 것처럼 실제 클래스와 예측 클래스를 비교하여 분류기의 정확도를 시각화합니다. 이진 혼동 행렬은 정사각형으로 구성됩니다.

  • TP: 참양성(True Positive): 예측값이 실제 양성으로 정확하게 예측됨
  • FP: 예측된 값이 실제 양성을 잘못 예측했습니다. 즉, 음수 값이 양수로 예측됨
  • FN: 거짓음성(False Negative): 양수값이 음수로 예측됨
  • TN: 참음성(True Negative): 실제 음성으로 정확하게 예측된 예측값

혼동행렬을 통해 실제 클래스와 예측 클래스를 쉽게 비교할 수 있습니다.

정밀도와 감도

혼동 행렬은 참양성과 거짓양성에 대한 좋은 통찰력을 제공합니다. 어떤 경우에는 보다 간결한 측정항목을 사용하는 것이 더 좋습니다.

Precision

정밀도 측정항목은 양성 클래스의 정확도를 보여줍니다. 이는 양성 클래스의 예측이 얼마나 정확할 가능성을 측정합니다.

Precision

분류기가 모든 양의 값을 완벽하게 분류한 경우 최대 점수는 1입니다. 정밀도만으로는 네거티브 클래스를 무시하므로 별로 도움이 되지 않습니다. 측정항목은 일반적으로 Recall 측정항목과 쌍을 이룹니다. 재현율은 민감도 또는 진양성률이라고도 합니다.

감도

민감도는 올바르게 감지된 양성 클래스의 비율을 계산합니다. 이 지표는 모델이 포지티브 클래스를 인식하는 데 얼마나 좋은지 보여줍니다.

감도

TensorFlow를 사용한 선형 분류기

이 튜토리얼에서는 인구 조사 데이터 세트를 사용합니다. 목적은 인구 조사 데이터 세트의 변수를 사용하여 소득 수준을 예측하는 것입니다. 소득은 이진 변수입니다.

  • 소득 > 1인 경우 값이 50입니다.
  • 소득이 0 미만인 경우 50입니다.

이 변수는 라벨입니다

이 데이터 세트에는 XNUMX개의 범주형 변수가 포함되어 있습니다.

  • 직장
  • 교육
  • 결혼의
  • 직업
  • 관계
  • 경주
  • 섹스
  • 원주민_국가

또한 XNUMX개의 연속 변수:

  • 나이
  • fnlwgt
  • education_num
  • 자본 이득
  • 자본 손실
  • 시간_주

이 TensorFlow 분류 예제를 통해 TensorFlow 추정기를 사용하여 선형 TensorFlow 분류자를 훈련하는 방법과 정확도 측정항목을 개선하는 방법을 이해하게 됩니다.

우리는 다음과 같이 진행합니다:

  • 1단계) 데이터 가져오기
  • 2단계) 데이터 변환
  • 3단계) ​​분류기 학습
  • 4단계) 모델 개선
  • 5단계) 하이퍼파라미터: Lasso & Ridge

1단계) 데이터 가져오기

먼저 튜토리얼 중에 사용된 라이브러리를 가져옵니다.

import tensorflow as tf
import pandas as pd

다음으로, UCI 아카이브에서 데이터를 가져오고 열 이름을 정의합니다. COLUMNS를 사용하여 pandas 데이터 프레임의 열 이름을 지정합니다.

Pandas 데이터프레임을 사용하여 분류기를 훈련할 것이라는 점에 유의하세요.

## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital',
           'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
           'hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
PATH_test = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"

온라인에 저장된 데이터는 이미 열차 세트와 테스트 세트로 나누어져 있습니다.

df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False)
df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)

열차 세트에는 32,561개의 관측치가 포함되어 있고 테스트 세트에는 16,281개의 관측치가 포함되어 있습니다.

print(df_train.shape, df_test.shape)
print(df_train.dtypes)
(32561, 15) (16281, 15)
age                int64
workclass         object
fnlwgt             int64
education         object
education_num      int64
marital           object
occupation        object
relationship      object
race              object
sex               object
capital_gain       int64
capital_loss       int64
hours_week         int64
native_country    object
label             object
dtype: object

Tensorflow는 분류기를 훈련하기 위해 부울 값이 필요합니다. 문자열에서 정수로 값을 캐스팅해야 합니다. 레이블은 객체로 저장되지만 숫자 값으로 변환해야 합니다. 아래 코드는 변환할 값이 있는 사전을 만들고 열 항목을 반복합니다. 이 작업을 두 번 수행합니다. 하나는 훈련 테스트용이고 다른 하나는 테스트 세트용입니다.

label = {'<=50K': 0,'>50K': 1}
df_train.label = [label[item] for item in df_train.label]
label_t = {'<=50K.': 0,'>50K.': 1}
df_test.label = [label_t[item] for item in df_test.label]

열차 데이터에는 24,720만 미만 소득이 50개, 7841만 이상 소득이 XNUMX개 있습니다. 테스트 세트의 비율은 거의 동일합니다. 자세한 내용은 Facets에 대한 이 튜토리얼을 참조하세요.

print(df_train["label"].value_counts())
### The model will be correct in atleast 70% of the case
print(df_test["label"].value_counts())
## Unbalanced label
print(df_train.dtypes)
0    24720
1     7841
Name: label, dtype: int64
0    12435
1     3846
Name: label, dtype: int64
age                int64
workclass         object
fnlwgt             int64
education         object
education_num      int64
marital           object
occupation        object
relationship      object
race              object
sex               object
capital_gain       int64
capital_loss       int64
hours_week         int64
native_country    object
label              int64
dtype: object

2단계) 데이터 변환

Tensorflow를 사용하여 선형 분류기를 훈련하려면 몇 가지 단계가 필요합니다. 모델에 포함할 기능을 준비해야 합니다. 벤치마크 회귀에서는 변환을 적용하지 않고 원본 데이터를 사용합니다.

추정기에는 모델을 학습하기 위한 기능 목록이 필요합니다. 따라서 열의 데이터를 텐서로 변환해야 합니다.

좋은 방법은 유형에 따라 두 개의 기능 목록을 정의한 다음 이를 추정기의 feature_columns에 전달하는 것입니다.

연속 특성 변환으로 시작한 다음 범주형 데이터로 버킷을 정의합니다.

데이터 세트의 기능에는 두 가지 형식이 있습니다.

  • 정수
  • 목적

각 기능은 유형에 따라 다음 두 변수에 나열됩니다.

## Add features to the bucket: 
### Define continuous list
CONTI_FEATURES  = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week']
### Define the categorical list
CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']

feature_column에는 연속 변수를 텐서로 변환하는 데 도움이 되는 Numeric_column 개체가 장착되어 있습니다. 아래 코드에서는 CONTI_FEATURES의 모든 변수를 숫자 값이 있는 텐서로 변환합니다. 이는 모델을 구성하는 데 필수입니다. 모든 독립 변수는 적절한 유형의 텐서로 변환되어야 합니다.

아래에서는 feature_column.numeric_column 뒤에서 무슨 일이 일어나고 있는지 확인할 수 있는 코드를 작성합니다. 나이에 맞게 변환된 값을 출력하겠습니다. 설명을 위한 것이므로 Python 코드를 이해할 필요는 없습니다. 코드를 이해하려면 공식 문서를 참조하세요.

def print_transformation(feature = "age", continuous = True, size = 2): 
    #X = fc.numeric_column(feature)
    ## Create feature name
    feature_names = [
    feature]

    ## Create dict with the data
    d = dict(zip(feature_names, [df_train[feature]]))

    ## Convert age
    if continuous == True:
        c = tf.feature_column.numeric_column(feature)
        feature_columns = [c]
    else: 
        c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size) 
        c_indicator = tf.feature_column.indicator_column(c)
        feature_columns = [c_indicator]
    
## Use input_layer to print the value
    input_layer = tf.feature_column.input_layer(
        features=d,
        feature_columns=feature_columns
        )
    ## Create lookup table
    zero = tf.constant(0, dtype=tf.float32)
    where = tf.not_equal(input_layer, zero)
    ## Return lookup tble
    indices = tf.where(where)
    values = tf.gather_nd(input_layer, indices)
    ## Initiate graph
    sess = tf.Session()
    ## Print value
    print(sess.run(input_layer))
print_transformation(feature = "age", continuous = True) 
[[39.]
 [50.]
 [38.]
 ...
 [58.]
 [22.]
 [52.]]

값은 df_train의 값과 정확히 동일합니다.

continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]

TensorFlow 문서에 따르면 범주형 데이터를 변환하는 다양한 방법이 있습니다. 기능의 어휘 목록이 알려져 있고 값이 많지 않은 경우 categorical_column_with_vocabulary_list를 사용하여 범주형 열을 생성할 수 있습니다. 모든 고유 어휘 목록에 ID를 할당합니다.

예를 들어 변수 상태에 세 가지 고유한 값이 있는 경우:

  • 남편
  • 아내
  • 하나의

그러면 1개의 ID가 부여됩니다. 예를 들어 남편의 ID는 2, 아내의 ID는 XNUMX 등입니다.

설명을 위해 이 코드를 사용하여 TensorFlow에서 객체 변수를 범주형 열로 변환할 수 있습니다.

특징 성별은 남성 또는 여성의 두 가지 값만 가질 수 있습니다. 특징 성별을 변환할 때 Tensorflow는 남성과 여성을 위한 두 개의 새 열을 만듭니다. 성별이 남성과 같으면 새 열 남성은 2과 같고 여성은 1과 같습니다. 이 예는 아래 표에 표시됩니다.

섹스 변신 후 남성 여자
1 남성 => 1 0
2 남성 => 1 0
3 여자 => 0 1

텐서플로우에서:

print_transformation(feature = "sex", continuous = False, size = 2)
[[1. 0.]
 [1. 0.]
 [1. 0.]
 ...
 [0. 1.]
 [1. 0.]
 [0. 1.]]

relationship = tf.feature_column.categorical_column_with_vocabulary_list(
    'relationship', [
        'Husband', 'Not-in-family', 'Wife', 'Own-child', 'Unmarried',
        'Other-relative'])

아래에 추가했습니다. Python 인코딩을 인쇄하는 코드입니다. 다시 말하지만, 코드를 이해할 필요는 없습니다. 목적은 변환을 보는 것입니다.

그러나 데이터를 변환하는 더 빠른 방법은 categorical_column_with_hash_bucket 메서드를 사용하는 것입니다. 희소 행렬의 문자열 변수를 변경하는 것이 유용합니다. 희소 행렬은 대부분 XNUMX인 행렬입니다. 이 방법은 모든 것을 처리합니다. 버킷 수와 키 열만 지정하면 됩니다. 버킷 수는 Tensorflow가 생성할 수 있는 최대 그룹 수입니다. 키 열은 단순히 변환할 열의 이름입니다.

아래 코드에서는 모든 범주형 기능에 대한 루프를 만듭니다.

categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]

3단계) ​​분류기 학습

TensorFlow는 현재 선형 회귀 및 선형 분류를 위한 추정기를 제공합니다.

  • 선형 회귀: LinearRegressor
  • 선형 분류: LinearClassifier

선형 분류기의 구문은 튜토리얼의 구문과 동일합니다. 선형 회귀 하나의 인수 n_class를 제외하고. 기능 열, 모델 디렉터리를 정의하고 선형 회귀 분석기와 비교해야 합니다. 수업 수를 정의할 수 있습니다. 로짓 회귀의 경우 클래스 수는 2와 같습니다.

모델은 Continuous_features 및 categorical_features에 포함된 열의 가중치를 계산합니다.

model = tf.estimator.LinearClassifier(
    n_classes = 2,
    model_dir="ongoing/train", 
    feature_columns=categorical_features+ continuous_features)

산출

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

이제 분류자가 정의되었으므로 입력 함수를 만들 수 있습니다. 방법은 선형 회귀 튜토리얼과 동일합니다. 여기서는 배치 크기 128을 사용하고 데이터를 섞습니다.

FEATURES = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country']
LABEL= 'label'
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)

선형 추정기에 필요한 인수(예: 에포크 수, 배치 수)를 사용하여 함수를 생성하고 데이터 세트 또는 메모를 섞습니다. 당신이 사용하기 때문에 판다 모델에 데이터를 전달하는 방법을 사용하려면 X 변수를 Pandas 데이터 프레임으로 정의해야 합니다. FEATURES에 저장된 모든 데이터를 반복합니다.

객체 model.train을 사용하여 모델을 훈련해 보겠습니다. 이전에 정의한 함수를 사용하여 모델에 적절한 값을 제공합니다. 배치 크기를 128로 설정하고 에포크 수를 없음으로 설정했습니다. 모델은 XNUMX단계 이상 학습됩니다.

model.train(input_fn=get_input_fn(df_train, 
                                      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 ongoing/train/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 65.8282
INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)
INFO:tensorflow:global_step/sec: 118.386
INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)
INFO:tensorflow:global_step/sec: 110.542
INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)
INFO:tensorflow:global_step/sec: 199.03
INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)
INFO:tensorflow:global_step/sec: 167.488
INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)
INFO:tensorflow:global_step/sec: 220.155
INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)
INFO:tensorflow:global_step/sec: 199.016
INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)
INFO:tensorflow:global_step/sec: 197.531
INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)
INFO:tensorflow:global_step/sec: 208.479
INFO:tensorflow:loss = 22201.918, step = 901 (0.479 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train/model.ckpt.
INFO:tensorflow:Loss for final step: 5444.363.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181f223630>

이후 마지막 100단계, 즉 901단계에서 1000단계 동안 손실이 감소했습니다.

5444번의 반복 후 최종 손실은 1입니다. 테스트 세트에서 모델을 추정하고 성능을 확인할 수 있습니다. 모델의 성능을 평가하려면 평가 객체를 사용해야 합니다. 모델에 테스트 세트를 제공하고 시대 수를 XNUMX로 설정합니다. 즉, 데이터가 모델에 한 번만 전달됩니다.

model.evaluate(input_fn=get_input_fn(df_test, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
									  
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:22
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:23
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7615626, accuracy_baseline = 0.76377374, auc = 0.63300294, auc_precision_recall = 0.50891197, average_loss = 47.12155, global_step = 1000, label/mean = 0.23622628, loss = 5993.6406, precision = 0.49401596, prediction/mean = 0.18454961, recall = 0.38637546

{'accuracy': 0.7615626,
 'accuracy_baseline': 0.76377374,
 'auc': 0.63300294,
 'auc_precision_recall': 0.50891197,
 'average_loss': 47.12155,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 5993.6406,
 'precision': 0.49401596,
 'prediction/mean': 0.18454961,
 'recall': 0.38637546}

TensorFlow는 이론적 부분에서 배운 모든 측정항목을 반환합니다. 당연히 불균형 레이블로 인해 정확도가 높습니다. 실제로 모델은 무작위 추측보다 약간 더 나은 성능을 발휘합니다. 모델이 소득이 50보다 낮은 모든 가구를 예측한다고 가정하면 모델의 정확도는 70%입니다. 자세히 분석해 보면 예측과 재현율이 상당히 낮다는 것을 알 수 있습니다.

4단계) 모델 개선

이제 벤치마크 모델이 있으므로 모델을 개선해 볼 수 있습니다. 즉 정확도를 높일 수 있습니다. 이전 튜토리얼에서는 상호작용 항을 사용하여 예측력을 향상시키는 방법을 배웠습니다. 이 튜토리얼에서는 회귀에 다항식 항을 추가하여 이 아이디어를 다시 살펴보겠습니다.

다항식 회귀는 데이터에 비선형성이 있을 때 유용합니다. 데이터의 비선형성을 포착하는 방법에는 두 가지가 있습니다.

  • 다항식 항 추가
  • 연속형 변수를 범주형 변수로 버킷화

다항식 항

아래 그림을 보면 다항식 회귀가 무엇인지 알 수 있습니다. 이는 검정력이 다른 X 변수를 사용하는 방정식입니다. XNUMX차 다항식 회귀에는 X와 X 제곱이라는 두 개의 변수가 있습니다. XNUMX급에는 세 개의 변수 X, X가 있습니다.2, 그리고 X3

다항 회귀
다항식 회귀란 무엇입니까?

아래에서는 두 개의 변수 X와 Y를 사용하여 그래프를 구성했습니다. 관계가 선형이 아닌 것은 분명합니다. 선형 회귀를 추가하면 모델이 패턴을 캡처할 수 없음을 알 수 있습니다(왼쪽 그림).

이제 아래 그림의 왼쪽 그림을 보면 회귀 분석에 XNUMX항을 추가했습니다(즉, y=x+x).2+x3+x4+x5. 이제 모델은 패턴을 훨씬 더 잘 포착합니다. 이것이 다항식 회귀의 힘입니다.

다항 회귀

우리의 예로 돌아가 보겠습니다. 나이는 소득과 선형 관계에 있지 않습니다. 어린이나 청소년은 일을 하지 않기 때문에 어린 나이에는 고정 소득이 XNUMX에 가까울 수 있습니다. 그 다음에는 근로 연령이 증가하고 은퇴 기간 동안 감소합니다. 일반적으로 역U자 모양입니다. 이 패턴을 포착하는 한 가지 방법은 회귀에 거듭제곱 XNUMX를 추가하는 것입니다.

정확도가 높아지는지 살펴보겠습니다.

이 새로운 기능을 데이터 세트와 연속 기능 목록에 추가해야 합니다.

학습 및 테스트 데이터 세트에 새 변수를 추가하므로 함수 작성이 더 편리합니다.

def square_var(df_t, df_te, var_name = 'age'):
    df_t['new'] = df_t[var_name].pow(2) 
    df_te['new'] = df_te[var_name].pow(2) 
    return df_t, df_te

이 함수에는 3개의 인수가 있습니다.

  • df_t: 훈련 세트 정의
  • df_te: 테스트 세트 정의
  • var_name = 'age': 변환할 변수를 정의합니다.

pow(2) 객체를 사용하여 변수 age를 제곱할 수 있습니다. 새 변수의 이름은 'new'입니다.

이제 square_var 함수가 작성되었으므로 새 데이터 세트를 생성할 수 있습니다.

df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age')

보시다시피 새 데이터 세트에는 기능이 하나 더 있습니다.

print(df_train_new.shape, df_test_new.shape)			
(32561, 16) (16281, 16)

데이터세트에서는 square 변수를 new라고 합니다. 연속 기능 목록에 추가해야 합니다.

CONTI_FEATURES_NEW  = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week', 'new']
continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]

주의 사항 그래프의 디렉토리를 변경했다는 것입니다. 동일한 디렉터리에서 서로 다른 모델을 훈련할 수 없습니다. 즉, model_dir 인수의 경로를 변경해야 합니다. 그렇지 않으면 TensorFlow에서 오류가 발생합니다.

model_1 = tf.estimator.LinearClassifier(
    model_dir="ongoing/train1", 
    feature_columns=categorical_features+ continuous_features_new)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/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 0x1820f04b70>, '_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_NEW = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'new']
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_NEW}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

이제 분류기가 새 데이터 세트로 설계되었으므로 모델을 훈련하고 평가할 수 있습니다.

model_1.train(input_fn=get_input_fn(df_train, 
                                      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 ongoing/train1/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 81.487
INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)
INFO:tensorflow:global_step/sec: 111.169
INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)
INFO:tensorflow:global_step/sec: 128.91
INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)
INFO:tensorflow:global_step/sec: 132.546
INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)
INFO:tensorflow:global_step/sec: 162.194
INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)
INFO:tensorflow:global_step/sec: 204.852
INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)
INFO:tensorflow:global_step/sec: 188.923
INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)
INFO:tensorflow:global_step/sec: 192.041
INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)
INFO:tensorflow:global_step/sec: 197.025
INFO:tensorflow:loss = 3309.5786, step = 901 (0.507 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train1/model.ckpt.
INFO:tensorflow:Loss for final step: 28861.898.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1820f04c88>
model_1.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:37
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:39
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7944229, accuracy_baseline = 0.76377374, auc = 0.6093755, auc_precision_recall = 0.54885805, average_loss = 111.0046, global_step = 1000, label/mean = 0.23622628, loss = 14119.265, precision = 0.6682401, prediction/mean = 0.09116262, recall = 0.2576703

{'accuracy': 0.7944229,
 'accuracy_baseline': 0.76377374,
 'auc': 0.6093755,
 'auc_precision_recall': 0.54885805,
 'average_loss': 111.0046,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 14119.265,
 'precision': 0.6682401,
 'prediction/mean': 0.09116262,
 'recall': 0.2576703}

제곱변수는 정확도를 0.76에서 0.79로 향상시켰습니다. 버킷화와 상호 작용 기간을 함께 결합하여 더 나은 결과를 얻을 수 있는지 살펴보겠습니다.

버킷화 및 상호작용

이전에 보았듯이 선형 분류기는 연령-소득 패턴을 올바르게 포착할 수 없습니다. 이는 각 기능에 대해 단일 가중치를 학습하기 때문입니다. 분류기를 더 쉽게 만들기 위해 할 수 있는 한 가지 작업은 기능을 버킷하는 것입니다. 버킷팅은 숫자 특성을 해당 범위에 따라 여러 특정 특성으로 변환하며, 이러한 새로운 특성 각각은 사람의 나이가 해당 범위에 속하는지 여부를 나타냅니다.

이러한 새로운 기능을 통해 선형 모델은 각 버킷에 대해 서로 다른 가중치를 학습하여 관계를 포착할 수 있습니다.

TensorFlow에서는 bucketized_column을 사용하여 수행됩니다. 경계에 값 범위를 추가해야 합니다.

age = tf.feature_column.numeric_column('age')
age_buckets = tf.feature_column.bucketized_column(
    age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

당신은 이미 나이와 소득이 비선형이라는 것을 알고 있습니다. 모델을 개선하는 또 다른 방법은 상호작용을 통해서입니다. TensorFlow의 말로는 특성 교차입니다. 특성 교차는 기존 특성을 조합한 새로운 특성을 생성하는 방법으로, 특성 간 상호 작용을 모델링할 수 없는 선형 분류기에 유용할 수 있습니다.

교육과 같은 다른 기능으로 연령을 분류할 수 있습니다. 즉, 일부 그룹은 소득이 높고 다른 그룹은 소득이 낮을 가능성이 높습니다(박사 학위 학생을 생각해 보세요).

education_x_occupation = [tf.feature_column.crossed_column(
    ['education', 'occupation'], hash_bucket_size=1000)]
age_buckets_x_education_x_occupation = [tf.feature_column.crossed_column(
    [age_buckets, 'education', 'occupation'], hash_bucket_size=1000)]

교차 특성 열을 생성하려면 교차할 변수와 함께cross_column을 괄호 안에 사용합니다. hash_bucket_size는 최대 교차 가능성을 나타냅니다. 변수 간의 상호 작용을 생성하려면(최소 하나의 변수가 범주형이어야 함) tf.feature_column.crossed_column을 사용할 수 있습니다. 이 개체를 사용하려면 상호 작용할 변수를 대괄호 안에 추가하고 두 번째 인수인 버킷 크기를 추가해야 합니다. 버킷 크기는 변수 내에서 가능한 최대 그룹 수입니다. 여기서는 정확한 그룹 수를 모르기 때문에 1000으로 설정했습니다.

age_buckets를 특성 열에 추가하기 전에 제곱해야 합니다. 또한 특성 열에 새 특성을 추가하고 추정기를 준비합니다.

base_columns = [
    age_buckets,
]

model_imp = tf.estimator.LinearClassifier(
    model_dir="ongoing/train3", 
    feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)

산출

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/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 0x1823021be0>, '_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_imp = ['age','workclass', 'education', 'education_num', 'marital',
                'occupation', 'relationship', 'race', 'sex', 'native_country', 'new']

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_imp}),
       y = pd.Series(data_set[LABEL].values),
       batch_size=n_batch,   
       num_epochs=num_epochs,
       shuffle=shuffle)

새 모델을 추정하고 정확도가 향상되는지 확인할 준비가 되었습니다.

model_imp.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 ongoing/train3/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 94.969
INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)
INFO:tensorflow:global_step/sec: 242.342
INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)
INFO:tensorflow:global_step/sec: 213.686
INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)
INFO:tensorflow:global_step/sec: 174.084
INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)
INFO:tensorflow:global_step/sec: 191.78
INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)
INFO:tensorflow:global_step/sec: 163.436
INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)
INFO:tensorflow:global_step/sec: 164.347
INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)
INFO:tensorflow:global_step/sec: 154.274
INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)
INFO:tensorflow:global_step/sec: 189.14
INFO:tensorflow:loss = 44.69645, step = 901 (0.531 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train3/model.ckpt.
INFO:tensorflow:Loss for final step: 44.18133.

<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1823021cf8>
model_imp.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)
									  
INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:28:52
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:28:54
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.8358209, accuracy_baseline = 0.76377374, auc = 0.88401634, auc_precision_recall = 0.69599575, average_loss = 0.35122654, global_step = 1000, label/mean = 0.23622628, loss = 44.67437, precision = 0.68986726, prediction/mean = 0.23320661, recall = 0.55408216


{'accuracy': 0.8358209,
 'accuracy_baseline': 0.76377374,
 'auc': 0.88401634,
 'auc_precision_recall': 0.69599575,
 'average_loss': 0.35122654,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 44.67437,
 'precision': 0.68986726,
 'prediction/mean': 0.23320661,
 'recall': 0.55408216}

새로운 정확도 수준은 83.58%입니다. 이전 모델보다 XNUMX% 높아졌다.

마지막으로 과적합을 방지하기 위해 정규화 용어를 추가할 수 있습니다.

5단계) 하이퍼파라미터: Lasso & Ridge

귀하의 모델은 다음과 같은 문제를 겪을 수 있습니다. 과적 합 or 과소적합.

  • 과적합: 모델이 새 데이터에 대한 예측을 일반화할 수 없습니다.
  • 과소적합: 모델이 데이터 패턴을 포착할 수 없습니다. 즉, 데이터가 비선형일 때의 선형 회귀

모델에 매개변수가 많고 데이터 양이 상대적으로 적으면 예측이 좋지 않습니다. 한 그룹에는 세 가지 관찰만 있다고 상상해 보세요. 모델은 이 그룹에 대한 가중치를 계산합니다. 가중치는 예측을 하는 데 사용됩니다. 이 특정 그룹에 대한 테스트 세트의 관측치가 훈련 세트와 완전히 다른 경우 모델은 잘못된 예측을 하게 됩니다. 훈련 세트로 평가하는 동안 정확도는 좋지만 테스트 세트에서는 계산된 가중치가 패턴을 일반화하는 실제 가중치가 아니기 때문에 좋지 않습니다. 이 경우, 보이지 않는 데이터에 대해서는 합리적인 예측을 하지 않습니다.

과잉적합을 방지하기 위해 정규화는 이러한 복잡성을 제어하고 더 일반화할 수 있는 가능성을 제공합니다. 정규화 기술은 두 가지가 있습니다.

  • L1: 올가미
  • L2: 능선

TensorFlow에서는 최적화 프로그램에 이 두 개의 하이퍼파라미터를 추가할 수 있습니다. 예를 들어, 하이퍼파라미터 L2가 높을수록 가중치는 매우 낮아지고 2에 가까워지는 경향이 있습니다. 적합선은 매우 평평한 반면, LXNUMX는 XNUMX에 가까우며 가중치가 일반 선형 회귀에 가깝다는 것을 의미합니다.

하이퍼파라미터의 다양한 값을 직접 시도해 보고 정확도 수준을 높일 수 있는지 확인할 수 있습니다.

주의 사항 하이퍼파라미터를 변경하는 경우 ongoing/train4 폴더를 삭제해야 합니다. 그렇지 않으면 모델이 이전에 훈련된 모델로 시작됩니다.

과대 광고의 정확성이 어떤지 봅시다

model_regu = tf.estimator.LinearClassifier(
    model_dir="ongoing/train4", feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation,
    optimizer=tf.train.FtrlOptimizer(
        learning_rate=0.1,
        l1_regularization_strength=0.9,
        l2_regularization_strength=5))

출력

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train4', '_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 0x1820d9c128>, '_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}
model_regu.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 ongoing/train4/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 77.4165
INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)
INFO:tensorflow:global_step/sec: 187.889
INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)
INFO:tensorflow:global_step/sec: 201.895
INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)
INFO:tensorflow:global_step/sec: 217.992
INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)
INFO:tensorflow:global_step/sec: 193.676
INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)
INFO:tensorflow:global_step/sec: 202.195
INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)
INFO:tensorflow:global_step/sec: 216.756
INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)
INFO:tensorflow:global_step/sec: 240.215
INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)
INFO:tensorflow:global_step/sec: 220.336
INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.
INFO:tensorflow:Loss for final step: 43.4942.


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

산출

INFO:tensorflow:Calling model_fn.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to "careful_interpolation" instead.
INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2018-06-02-08:29:07
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [100/1000]
INFO:tensorflow:Finished evaluation at 2018-06-02-08:29:09
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.83833915, accuracy_baseline = 0.76377374, auc = 0.8869794, auc_precision_recall = 0.7014905, average_loss = 0.34691378, global_step = 1000, label/mean = 0.23622628, loss = 44.12581, precision = 0.69720596, prediction/mean = 0.23662092, recall = 0.5579823





{'accuracy': 0.83833915,
 'accuracy_baseline': 0.76377374,
 'auc': 0.8869794,
 'auc_precision_recall': 0.7014905,
 'average_loss': 0.34691378,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 44.12581,
 'precision': 0.69720596,
 'prediction/mean': 0.23662092,
 'recall': 0.5579823}

이 하이퍼파라미터를 사용하면 정확도 지표가 약간 높아집니다. 다음 튜토리얼에서는 커널 방법을 사용하여 선형 분류기를 개선하는 방법을 배우게 됩니다.

제품 개요

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

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

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

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

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

모델의 성능을 향상하려면 다음을 수행할 수 있습니다.

  • 다항식 회귀 사용
  • 상호작용 용어: tf.feature_column.crossed_column
  • 정규화 매개변수 추가