기계 학습의 가우스 커널: Python 커널 방법
이 튜토리얼의 목적은 데이터세트를 선형적으로 분리 가능하게 만드는 것입니다. 튜토리얼은 두 부분으로 나누어져 있습니다:
- 기능 변환
- Tensorflow를 사용하여 커널 분류기 학습
첫 번째 부분에서는 머신 러닝에서 커널 방법의 기본 개념을 이해하고 두 번째 부분에서는 Tensorflow로 커널 분류기를 훈련하는 방법을 알아봅니다. 성인 데이터 세트를 사용합니다. 이 데이터 세트의 목적은 각 가구의 행동을 알고 50k 이하와 XNUMXk 이상의 수입을 분류하는 것입니다.
커널 방법이 필요한 이유는 무엇입니까?
모든 분류기의 목적은 클래스를 올바르게 예측하는 것입니다. 이를 위해서는 데이터 세트가 분리 가능해야 합니다. 아래 줄거리를 보십시오. 검정색 선 위의 모든 점은 첫 번째 클래스에 속하고 다른 점은 두 번째 클래스에 속한다는 것을 확인하는 것은 매우 간단합니다. 그러나 이렇게 간단한 데이터세트를 갖는 경우는 극히 드뭅니다. 대부분의 경우 데이터는 분리할 수 없습니다. 기계 학습의 커널 방법은 로지스틱 회귀와 같은 순진한 분류기에 어려움을 줍니다.
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D
x_lin = np.array([1,2,3,4,5,6,7,8,9,10]) y_lin = np.array([2,2,3,2,2,9,6,8,8,9]) label_lin = np.array([0,0,0,0,0,1,1,1,1,1]) fig = plt.figure() ax=fig.add_subplot(111) plt.scatter(x_lin, y_lin, c=label_lin, s=60) plt.plot([-2.5, 10], [12.5, -2.5], 'k-', lw=2) ax.set_xlim([-5,15]) ax.set_ylim([-5,15])plt.show()
아래 그림에서는 선형으로 분리할 수 없는 데이터 세트를 플롯합니다. 직선을 그리면 대부분의 포인트가 올바른 클래스로 분류되지 않습니다.
이 문제를 해결하는 한 가지 방법은 데이터 세트를 가져와 다른 기능 맵에서 데이터를 변환하는 것입니다. 이는 함수를 사용하여 선형 가능해야 하는 다른 계획의 데이터를 변환한다는 의미입니다.
x = np.array([1,1,2,3,3,6,6,6,9,9,10,11,12,13,16,18]) y = np.array([18,13,9,6,15,11,6,3,5,2,10,5,6,1,3,1]) label = np.array([1,1,1,1,0,0,0,1,0,1,0,0,0,1,0,1])
fig = plt.figure() plt.scatter(x, y, c=label, s=60) plt.show()
위 그림의 데이터는 분리할 수 없는 2D Gaussian Kernel 계획에 있습니다. 이러한 데이터를 3차원으로 변환할 수 있습니다. 즉, XNUMX개의 축이 있는 그림을 생성한다는 의미입니다.
Gaussian Kernel 예제에서는 다항식 매핑을 적용하여 데이터를 3D 차원으로 가져옵니다. 데이터를 변환하는 공식은 다음과 같습니다.
Gaussian Kernel에서 함수를 정의합니다. Python 새로운 기능 맵을 생성하려면
당신이 사용할 수 numpy 위의 공식을 코딩하려면:
공식 | 동등한 Numpy 코드 |
---|---|
x | x[:,0]** |
y | x[:,1] |
x2 | x[:,0]**2 |
np.sqrt(2)* | |
xy | x[:,0]*x[:,1] |
y2 | x[:,1]**2 |
### illustration purpose def mapping(x, y): x = np.c_[(x, y)] if len(x) > 2: x_1 = x[:,0]**2 x_2 = np.sqrt(2)*x[:,0]*x[:,1] x_3 = x[:,1]**2 else: x_1 = x[0]**2 x_2 = np.sqrt(2)*x[0]*x[1] x_3 = x[1]**2 trans_x = np.array([x_1, x_2, x_3]) return trans_x
새 매핑은 3개 포인트가 있는 16차원이어야 합니다.
x_1 = mapping(x, y) x_1.shape
(3, 16)
각각 x, y, z의 3축을 사용하여 새로운 플롯을 만들어 보겠습니다.
# plot fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x_1[0], x_1[1], x_1[2], c=label, s=60) ax.view_init(30, 185)ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label') plt.show()
개선이 보이지만 플롯의 방향을 변경하면 이제 데이터 세트가 분리 가능하다는 것이 분명해집니다.
# plot fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.scatter(x_1[0], x_1[1], x_1[1], c=label, s=60) ax.view_init(0, -180)ax.set_ylim([150,-50]) ax.set_zlim([-10000,10000]) ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label')plt.show()
대규모 데이터 세트를 조작하고 2개 이상의 차원을 생성해야 할 경우 위의 방법을 사용하면 큰 문제에 직면하게 됩니다. 실제로 모든 데이터 포인트를 변환해야 하는데 이는 분명히 지속 가능하지 않습니다. 시간이 오래 걸리고 컴퓨터에 메모리가 부족할 수 있습니다.
이 문제를 극복하는 가장 일반적인 방법은 다음을 사용하는 것입니다. 커널.
기계 학습에서 커널이란 무엇입니까?
아이디어는 위 그림과 같이 데이터를 거의 선형적으로 분리할 수 있도록 더 높은 차원의 특징 공간을 사용하는 것입니다.
데이터 포인트를 분리 가능하게 만드는 더 높은 차원의 공간이 많이 있습니다. 예를 들어, 우리는 다항식 매핑이 좋은 시작이라는 것을 보여주었습니다.
우리는 또한 데이터가 많으면 이러한 변환이 효율적이지 않다는 것을 입증했습니다. 대신, Machine Learning의 커널 기능을 사용하여 새로운 기능 계획을 변경하지 않고도 데이터를 수정할 수 있습니다.
커널의 마법은 고차원 계산이 암시하는 모든 문제를 피하는 함수를 찾는 것입니다. 커널의 결과는 스칼라이거나 다르게 말하면 XNUMX차원 공간으로 돌아갑니다.
이 함수를 찾은 후 표준 선형 분류기에 연결할 수 있습니다.
커널 머신러닝의 개념을 이해하기 위해 예를 살펴보겠습니다. x1과 x2라는 두 개의 벡터가 있습니다. 목표는 다항식 매핑을 사용하여 더 높은 차원을 만드는 것입니다. 출력은 새 기능 맵의 내적과 같습니다. 위의 방법에서 다음을 수행해야 합니다.
- x1과 x2를 새로운 차원으로 변환
- 내적 계산: 모든 커널에 공통
- x1과 x2를 새로운 차원으로 변환
위에서 만든 함수를 사용하여 더 높은 차원을 계산할 수 있습니다.
## Kernel x1 = np.array([3,6]) x2 = np.array([10,10]) x_1 = mapping(x1, x2) print(x_1)
산출
[[ 9. 100. ] [ 25.45584412 141.42135624] [ 36. 100. ]]
내적 계산
numpy의 객체 점을 사용하여 x_1에 저장된 첫 번째 벡터와 두 번째 벡터 사이의 내적을 계산할 수 있습니다.
print(np.dot(x_1[:,0], x_1[:,1])) 8100.0
출력은 8100입니다. 문제를 보면 내적을 계산하기 위해 새로운 특징 맵을 메모리에 저장해야 합니다. 수백만 개의 레코드가 포함된 데이터 세트가 있는 경우 계산상 비효율적입니다.
대신 다항식 커널 벡터를 변환하지 않고 내적을 계산합니다. 이 함수는 마치 이 두 벡터가 더 높은 차원으로 변환된 것처럼 x1과 x2의 내적을 계산합니다. 다르게 말하면, 커널 함수는 다른 특징 공간의 내적 결과를 계산합니다.
다항식 커널 함수를 다음과 같이 작성할 수 있습니다. Python 다음과 같이.
def polynomial_kernel(x, y, p=2): return (np.dot(x, y)) ** p
두 벡터의 내적의 거듭제곱입니다. 아래에서는 다항식 커널의 XNUMX차를 반환합니다. 출력은 다른 방법과 동일합니다. 이것이 커널의 마법이다.
polynomial_kernel(x1, x2, p=2) 8100
커널 방법의 유형
다양한 커널 기술을 사용할 수 있습니다. 가장 간단한 것은 선형 커널입니다. 이 기능은 텍스트 분류에 매우 효과적입니다. 다른 커널은 다음과 같습니다.
- 다항식 커널
- 가우스 커널
다음 예에서는 TensorFlow, 우리는 랜덤 푸리에를 사용할 것입니다. TensorFlow에는 새로운 특징 공간을 계산하기 위한 추정기가 내장되어 있습니다. 가우스 필터 함수는 가우스 커널 함수의 근사치입니다.
가우스 필터링 기능은 훨씬 더 높은 차원 공간에서 데이터 포인트 간의 유사성을 계산합니다.
TensorFlow를 사용하여 Gaussian Kernel 분류기 학습
알고리즘의 목적은 가구 소득이 50달러 이상 또는 미만인지 분류하는 것입니다.
벤치마크 모델을 갖기 위해 로지스틱 커널 회귀 기계 학습을 평가합니다. 그런 다음 더 나은 결과를 얻을 수 있는지 확인하기 위해 커널 분류기를 훈련합니다.
성인 데이터 세트에서 다음 변수를 사용합니다.
- 나이
- 작업반
- fnlwgt
- 교육
- education_num
- 결혼의
- 직업
- 관계
- 경주
- 섹스
- 자본 이득
- 자본 손실
- 시간_주
- 원주민_국가
- 상표
모델을 학습하고 평가하기 전에 다음을 수행합니다.
- 1단계) 라이브러리 가져오기
- 2단계) 데이터 가져오기
- 3단계) 데이터 준비
- 4단계) input_fn 구성
- 5단계) 로지스틱 모델 구축: 기준 모델
- 6단계) 모델 평가
- 7단계) 커널 분류기 구성
- 8단계) 커널 분류기 평가
단계 1) 라이브러리 가져오기
커널 모델을 가져오고 훈련하려면 인공 지능, 텐서플로우를 가져와야 합니다. 팬더 그리고 numpy
#import numpy as np from sklearn.model_selection import train_test_split import tensorflow as tf import pandas as pd import numpy as np
단계 2) 데이터 가져 오기
다음에서 데이터를 다운로드합니다. 웹 사이트 이를 Panda 데이터 프레임으로 가져옵니다.
## 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 "## Import 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)
이제 학습 및 테스트 세트가 정의되었으므로 열 레이블을 문자열에서 정수로 변경할 수 있습니다. 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] df_train.shape (32561, 15)
단계 3) 데이터 준비
데이터 세트에는 연속형 기능과 범주형 기능이 모두 포함되어 있습니다. 좋은 방법은 연속형 변수의 값을 표준화하는 것입니다. sci-kit learn의 StandardScaler 기능을 사용할 수 있습니다. 학습 및 테스트 세트를 더 쉽게 변환할 수 있도록 사용자 정의 함수도 생성합니다. 연속형 변수와 범주형 변수를 공통 데이터 세트에 연결하고 배열은 float32 유형이어야 합니다.
COLUMNS_INT = ['age','fnlwgt','education_num','capital_gain', 'capital_loss', 'hours_week'] CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country'] from sklearn.preprocessing import StandardScaler from sklearn import preprocessing def prep_data_str(df): scaler = StandardScaler() le = preprocessing.LabelEncoder() df_toscale = df[COLUMNS_INT] df_scaled = scaler.fit_transform(df_toscale.astype(np.float64)) X_1 = df[CATE_FEATURES].apply(le.fit_transform) y = df['label'].astype(np.int32) X_conc = np.c_[df_scaled, X_1].astype(np.float32) return X_conc, y
변환기 함수가 준비되었습니다. 데이터 세트를 변환하고 input_fn 함수를 생성할 수 있습니다.
X_train, y_train = prep_data_str(df_train) X_test, y_test = prep_data_str(df_test) print(X_train.shape) (32561, 14)
다음 단계에서는 로지스틱 회귀를 학습합니다. 이는 기본 정확도를 제공합니다. 목표는 다른 알고리즘, 즉 커널 분류자를 사용하여 기준선을 능가하는 것입니다.
단계 4) 물류 모델 구축: 기준 모델
real_valued_column 개체를 사용하여 특성 열을 구성합니다. 모든 변수가 밀도가 높은 숫자 데이터인지 확인합니다.
feat_column = tf.contrib.layers.real_valued_column('features', dimension=14)
추정기는 TensorFlow Estimator를 사용하여 정의되며, 특성 열과 그래프를 저장할 위치를 지시합니다.
estimator = tf.estimator.LinearClassifier(feature_columns=[feat_column], n_classes=2, model_dir = "kernel_log" )
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {'_model_dir': 'kernel_log', '_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 0x1a2003f780>, '_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}
크기가 200인 미니 배치를 사용하여 로지스틱 회귀를 학습합니다.
# Train the model train_input_fn = tf.estimator.inputs.numpy_input_fn( x={"features": X_train}, y=y_train, batch_size=200, num_epochs=None, shuffle=True)
1.000번의 반복으로 모델을 학습할 수 있습니다.
estimator.train(input_fn=train_input_fn, 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 kernel_log/model.ckpt. INFO:tensorflow:loss = 138.62949, step = 1 INFO:tensorflow:global_step/sec: 324.16 INFO:tensorflow:loss = 87.16762, step = 101 (0.310 sec) INFO:tensorflow:global_step/sec: 267.092 INFO:tensorflow:loss = 71.53657, step = 201 (0.376 sec) INFO:tensorflow:global_step/sec: 292.679 INFO:tensorflow:loss = 69.56703, step = 301 (0.340 sec) INFO:tensorflow:global_step/sec: 225.582 INFO:tensorflow:loss = 74.615875, step = 401 (0.445 sec) INFO:tensorflow:global_step/sec: 209.975 INFO:tensorflow:loss = 76.49044, step = 501 (0.475 sec) INFO:tensorflow:global_step/sec: 241.648 INFO:tensorflow:loss = 66.38373, step = 601 (0.419 sec) INFO:tensorflow:global_step/sec: 305.193 INFO:tensorflow:loss = 87.93341, step = 701 (0.327 sec) INFO:tensorflow:global_step/sec: 396.295 INFO:tensorflow:loss = 76.61518, step = 801 (0.249 sec) INFO:tensorflow:global_step/sec: 359.857 INFO:tensorflow:loss = 78.54885, step = 901 (0.277 sec) INFO:tensorflow:Saving checkpoints for 1000 into kernel_log/model.ckpt. INFO:tensorflow:Loss for final step: 67.79706. <tensorflow.python.estimator.canned.linear.LinearClassifier at 0x1a1fa3cbe0>
단계 6) 모델 평가
모델을 평가하기 위해 numpy 추정기를 정의합니다. 평가를 위해 전체 데이터세트를 사용합니다.
# Evaluation test_input_fn = tf.estimator.inputs.numpy_input_fn( x={"features": X_test}, y=y_test, batch_size=16281, num_epochs=1, shuffle=False) estimator.evaluate(input_fn=test_input_fn, steps=1)
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-07-12-15:58:22 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from kernel_log/model.ckpt-1000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/1] INFO:tensorflow:Finished evaluation at 2018-07-12-15:58:23 INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.82353663, accuracy_baseline = 0.76377374, auc = 0.84898686, auc_precision_recall = 0.67214864, average_loss = 0.3877216, global_step = 1000, label/mean = 0.23622628, loss = 6312.495, precision = 0.7362797, prediction/mean = 0.21208474, recall = 0.39417577
{'accuracy': 0.82353663, 'accuracy_baseline': 0.76377374, 'auc': 0.84898686, 'auc_precision_recall': 0.67214864, 'average_loss': 0.3877216, 'global_step': 1000, 'label/mean': 0.23622628, 'loss': 6312.495, 'precision': 0.7362797, 'prediction/mean': 0.21208474, 'recall': 0.39417577}
당신의 정확도는 82%입니다. 다음 섹션에서는 커널 분류기를 사용하여 로지스틱 분류기를 이기기 위해 노력할 것입니다.
단계 7) 커널 분류기 구성
커널 추정기는 적어도 구성 측면에서는 기존 선형 분류기와 크게 다르지 않습니다. 배후에 있는 아이디어는 선형 분류기와 함께 명시적 커널의 기능을 사용하는 것입니다.
커널 분류기를 훈련하려면 TensorFlow에서 사용할 수 있는 사전 정의된 추정기 두 개가 필요합니다.
- 무작위푸리에FeatureMapper
- 커널선형분류기
첫 번째 섹션에서 커널 함수를 사용하여 낮은 차원을 높은 차원으로 변환해야 한다는 것을 배웠습니다. 보다 정확하게는 가우스 함수의 근사치인 Random Fourier를 사용하게 됩니다. 다행히 Tensorflow의 라이브러리에는 RandomFourierFeatureMapper라는 기능이 있습니다. 추정기 KernelLinearClassifier를 사용하여 모델을 훈련할 수 있습니다.
모델을 구축하려면 다음 단계를 따르세요.
- 고차원 커널 기능 설정
- L2 하이퍼파라미터 설정
- 모델 구축
- 모델 훈련
- 모델 평가
A 단계) 고차원 커널 기능 설정
현재 데이터세트에는 14차원 벡터의 새로운 고차원으로 변환할 5.000개의 특징이 포함되어 있습니다. 변환을 달성하려면 무작위 푸리에 기능을 사용합니다. 가우스 커널 공식을 떠올려 보면 정의해야 할 표준 편차 매개변수가 있다는 것을 알 수 있습니다. 이 매개변수는 분류 중에 사용되는 유사성 측정을 제어합니다.
다음을 사용하여 RandomFourierFeatureMapper의 모든 매개변수를 조정할 수 있습니다.
- 입력_크기 = 14
- 출력_크기= 5000
- 표준편차=4
### Prep Kernel kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')
이전에 생성된 기능 열(feat_column)을 사용하여 커널 매퍼를 구성해야 합니다.
### Map Kernel kernel_mappers = {feat_column: [kernel_mapper]}
B 단계) L2 하이퍼파라미터 설정
과적합을 방지하려면 L2 정규화 도구를 사용하여 손실 함수에 페널티를 적용합니다. L2 초매개변수를 0.1로 설정하고 학습률을 5로 설정합니다.
optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1)
단계 C) 모델 구축
다음 단계는 선형 분류와 유사합니다. 내장 추정기 KernelLinearClassifier를 사용합니다. 이전에 정의한 커널 매퍼를 추가하고 모델 디렉터리를 변경합니다.
### Prep estimator estimator_kernel = tf.contrib.kernel_methods.KernelLinearClassifier( n_classes=2, optimizer=optimizer, kernel_mappers=kernel_mappers, model_dir="kernel_train")
WARNING:tensorflow:From /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/tensorflow/contrib/kernel_methods/python/kernel_estimators.py:305: multi_class_head (from tensorflow.contrib.learn.python.learn.estimators.head) is deprecated and will be removed in a future version. Instructions for updating: Please switch to tf.contrib.estimator.*_head. WARNING:tensorflow:From /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py:1179: BaseEstimator.__init__ (from tensorflow.contrib.learn.python.learn.estimators.estimator) is deprecated and will be removed in a future version. Instructions for updating: Please replace uses of any Estimator from tf.contrib.learn with an Estimator from tf.estimator.* WARNING:tensorflow:From /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/estimator.py:427: RunConfig.__init__ (from tensorflow.contrib.learn.python.learn.estimators.run_config) is deprecated and will be removed in a future version. Instructions for updating: When switching to tf.estimator.Estimator, use tf.estimator.RunConfig instead. INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_task_type': None, '_task_id': 0, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1a200ae550>, '_master': '', '_num_ps_replicas': 0, '_num_worker_replicas': 0, '_environment': 'local', '_is_chief': True, '_evaluation_master': '', '_train_distribute': None, '_tf_config': gpu_options { per_process_gpu_memory_fraction: 1.0 } , '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_secs': 600, '_log_step_count_steps': 100, '_session_config': None, '_save_checkpoints_steps': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_model_dir': 'kernel_train'}
단계 D) 모델 훈련
이제 커널 분류기가 구축되었으므로 훈련할 준비가 되었습니다. 모델을 2000번 반복하도록 선택했습니다.
### estimate estimator_kernel.fit(input_fn=train_input_fn, steps=2000)
WARNING:tensorflow:Casting <dtype: 'int32'> labels to bool. WARNING:tensorflow:Casting <dtype: 'int32'> labels to bool. 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. WARNING:tensorflow:From /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/estimators/head.py:678: ModelFnOps.__new__ (from tensorflow.contrib.learn.python.learn.estimators.model_fn) is deprecated and will be removed in a future version. Instructions for updating: When switching to tf.estimator.Estimator, use tf.estimator.EstimatorSpec. You can use the `estimator_spec` method to create an equivalent one. 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 kernel_train/model.ckpt. INFO:tensorflow:loss = 0.6931474, step = 1 INFO:tensorflow:global_step/sec: 86.6365 INFO:tensorflow:loss = 0.39374447, step = 101 (1.155 sec) INFO:tensorflow:global_step/sec: 80.1986 INFO:tensorflow:loss = 0.3797774, step = 201 (1.247 sec) INFO:tensorflow:global_step/sec: 79.6376 INFO:tensorflow:loss = 0.3908726, step = 301 (1.256 sec) INFO:tensorflow:global_step/sec: 95.8442 INFO:tensorflow:loss = 0.41890752, step = 401 (1.043 sec) INFO:tensorflow:global_step/sec: 93.7799 INFO:tensorflow:loss = 0.35700393, step = 501 (1.066 sec) INFO:tensorflow:global_step/sec: 94.7071 INFO:tensorflow:loss = 0.35535482, step = 601 (1.056 sec) INFO:tensorflow:global_step/sec: 90.7402 INFO:tensorflow:loss = 0.3692882, step = 701 (1.102 sec) INFO:tensorflow:global_step/sec: 94.4924 INFO:tensorflow:loss = 0.34746957, step = 801 (1.058 sec) INFO:tensorflow:global_step/sec: 95.3472 INFO:tensorflow:loss = 0.33655524, step = 901 (1.049 sec) INFO:tensorflow:global_step/sec: 97.2928 INFO:tensorflow:loss = 0.35966292, step = 1001 (1.028 sec) INFO:tensorflow:global_step/sec: 85.6761 INFO:tensorflow:loss = 0.31254214, step = 1101 (1.167 sec) INFO:tensorflow:global_step/sec: 91.4194 INFO:tensorflow:loss = 0.33247527, step = 1201 (1.094 sec) INFO:tensorflow:global_step/sec: 82.5954 INFO:tensorflow:loss = 0.29305756, step = 1301 (1.211 sec) INFO:tensorflow:global_step/sec: 89.8748 INFO:tensorflow:loss = 0.37943482, step = 1401 (1.113 sec) INFO:tensorflow:global_step/sec: 76.9761 INFO:tensorflow:loss = 0.34204718, step = 1501 (1.300 sec) INFO:tensorflow:global_step/sec: 73.7192 INFO:tensorflow:loss = 0.34614792, step = 1601 (1.356 sec) INFO:tensorflow:global_step/sec: 83.0573 INFO:tensorflow:loss = 0.38911164, step = 1701 (1.204 sec) INFO:tensorflow:global_step/sec: 71.7029 INFO:tensorflow:loss = 0.35255936, step = 1801 (1.394 sec) INFO:tensorflow:global_step/sec: 73.2663 INFO:tensorflow:loss = 0.31130585, step = 1901 (1.365 sec) INFO:tensorflow:Saving checkpoints for 2000 into kernel_train/model.ckpt. INFO:tensorflow:Loss for final step: 0.37795097. KernelLinearClassifier(params={'head': <tensorflow.contrib.learn.python.learn.estimators.head._BinaryLogisticHead object at 0x1a2054cd30>, 'feature_columns': {_RealValuedColumn(column_name='features_MAPPED', dimension=5000, default_value=None, dtype=tf.float32, normalizer=None)}, 'optimizer': <tensorflow.python.training.ftrl.FtrlOptimizer object at 0x1a200aec18>, 'kernel_mappers': {_RealValuedColumn(column_name='features', dimension=14, default_value=None, dtype=tf.float32, normalizer=None): [<tensorflow.contrib.kernel_methods.python.mappers.random_fourier_features.RandomFourierFeatureMapper object at 0x1a200ae400>]}})
E 단계) 모델 평가
마지막으로 모델의 성능을 평가합니다. 로지스틱 회귀를 이길 수 있어야 합니다.
# Evaluate and report metrics. eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)
WARNING:tensorflow:Casting <dtype: 'int32'> labels to bool. WARNING:tensorflow:Casting <dtype: 'int32'> labels to bool. 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:Starting evaluation at 2018-07-12-15:58:50 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from kernel_train/model.ckpt-2000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Evaluation [1/1] INFO:tensorflow:Finished evaluation at 2018-07-12-15:58:51 INFO:tensorflow:Saving dict for global step 2000: accuracy = 0.83975184, accuracy/baseline_label_mean = 0.23622628, accuracy/threshold_0.500000_mean = 0.83975184, auc = 0.8904007, auc_precision_recall = 0.72722375, global_step = 2000, labels/actual_label_mean = 0.23622628, labels/prediction_mean = 0.23786618, loss = 0.34277728, precision/positive_threshold_0.500000_mean = 0.73001117, recall/positive_threshold_0.500000_mean = 0.5104004
최종 정확도는 84%로, 로지스틱 회귀에 비해 2% 향상된 수치입니다. 정확도 향상과 계산 비용 사이에는 균형이 있습니다. 2% 개선이 다른 분류기에 소요되는 시간보다 가치가 있는지, 그리고 그것이 귀하의 비즈니스에 강력한 영향을 미치는지 생각해야 합니다.
요약
커널은 비선형 데이터를 (거의) 선형 데이터로 변환하는 훌륭한 도구입니다. 이 방법의 단점은 계산 시간과 비용이 많이 든다는 것입니다.
아래에서 커널 분류기를 훈련하는 데 가장 중요한 코드를 찾을 수 있습니다.
고차원 커널 기능 설정
- 입력_크기 = 14
- 출력_크기= 5000
- 표준편차=4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')
L2 하이퍼파라미터 설정
optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1)
모델 구축
estimator_kernel = tf.contrib.kernel_methods.KernelLinearClassifier( n_classes=2, optimizer=optimizer, kernel_mappers=kernel_mappers, model_dir="kernel_train")
모델 훈련
estimator_kernel.fit(input_fn=train_input_fn, steps=2000)
모델 평가
eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)