機械学習におけるガウスカーネル: Python カーネルメソッド

このチュートリアルの目的は、データセットを線形分離可能にすることです。 チュートリアルは XNUMX つの部分に分かれています。

  1. 特徴変換
  2. Tensorflow を使用してカーネル分類器をトレーニングする

最初の部分では、機械学習におけるカーネル法の背後にある考え方を理解し、50 番目の部分では、Tensorflow を使用してカーネル分類器をトレーニングする方法を確認します。成人データセットを使用します。このデータセットの目的は、各世帯の行動を把握しながら、XNUMX ドル未満の収入と XNUMX ドルを超える収入を分類することです。

なぜカーネルメソッドが必要なのでしょうか?

すべての分類子の目的は、クラスを正確に予測することです。 そのためには、データセットが分離可能である必要があります。 以下のプロットを見てください。 黒い線より上のすべての点が第 XNUMX クラスに属し、その他の点が第 XNUMX クラスに属していることが非常に簡単にわかります。 ただし、これほど単純なデータセットがあることは非常にまれです。 ほとんどの場合、データは分離できません。 機械学習のカーネル メソッドは、ロジスティック回帰のような単純な分類器に困難を与えます。

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

カーネルメソッド

下の図では、線形分離不可能なデータセットをプロットしています。 直線を引くと、ほとんどの点は正しいクラスに分類されなくなります。

この問題に取り組む XNUMX つの方法は、データセットを取得し、そのデータを別の特徴マップに変換することです。 つまり、関数を使用して別のプランのデータを変換することになりますが、これは線形である必要があります。

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 ガウス カーネル プランにあります。 これらのデータを 3 次元に変換してみます。つまり、XNUMX つの軸を持つ図を作成することになります。

ガウス カーネルの例では、多項式マッピングを適用してデータを 3D 次元にします。 データを変換する式は次のとおりです。

カーネルメソッド

ガウスカーネルで関数を定義する 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 つ以上のディメンションを作成する必要がある場合、上記の方法を使用すると大きな問題に直面することになります。 実際には、すべてのデータ ポイントを変換する必要がありますが、これは明らかに持続可能ではありません。 それには長い時間がかかり、コンピュータのメモリが不足する可能性があります。

この問題を解決する最も一般的な方法は、 kernel.

機械学習におけるカーネルとは何ですか?

アイデアは、上の図に示すように、高次元の特徴空間を使用してデータをほぼ線形に分離可能にすることです。

データポイントを分離可能にするための高次元空間がたくさんあります。 たとえば、多項式マッピングが優れた出発点であることを示しました。

また、大量のデータがある場合、これらの変換は効率的ではないことも実証しました。 代わりに、機械学習のカーネル関数を使用して、新しい機能プランに変更せずにデータを変更できます。

カーネルの魔法は、高次元の計算に伴うすべての問題を回避する関数を見つけることです。 カーネルの結果はスカラーです。別の言い方をすれば、XNUMX 次元空間に戻ります。

この関数を見つけたら、それを標準の線形分類器に接続できます。

カーネル機械学習の概念を理解するために例を見てみましょう。 x1 と x2 という XNUMX つのベクトルがあります。 目的は、多項式マッピングを使用してより高い次元を作成することです。 出力は、新しい特徴マップのドット積に等しくなります。 上記の方法から、次のことを行う必要があります。

  1. x1 と x2 を新しい次元に変換します
  2. ドット積の計算: すべてのカーネルに共通
  3. 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 に格納されている最初のベクトルと XNUMX 番目のベクトルの間の内積を計算できます。

print(np.dot(x_1[:,0], x_1[:,1]))			
8100.0

出力は 8100 です。問題がわかります。ドット積を計算するには、新しい特徴マップをメモリに保存する必要があります。 数百万のレコードを含むデータセットがある場合、計算効率が低くなります。

代わりに、 多項式カーネル ベクトルを変換せずにドット積を計算します。 この関数は、これら 1 つのベクトルが高次元に変換されたかのように、x2 と xXNUMX の内積を計算します。 別の言い方をすると、カーネル関数は別の特徴空間からの内積の結果を計算します。

多項式カーネル関数は次のように記述できます。 Python 以下の通りです。

def polynomial_kernel(x, y, p=2):				
	return (np.dot(x, y)) ** p

これは XNUMX つのベクトルの内積のべき乗です。 以下では、多項式カーネルの XNUMX 次を返します。 出力は他の方法と同じです。 これがカーネルの魔法です。

polynomial_kernel(x1, x2, p=2)			
8100

カーネルメソッドの種類

さまざまなカーネル技術が利用可能です。 最も単純なのは線形カーネルです。 この関数はテキストの分類に非常に適しています。 他のカーネルは次のとおりです。

  • 多項式カーネル
  • ガウス カーネル

の例では TensorFlow、ランダムフーリエを使用します。 TensorFlow には、新しい特徴空間を計算するための推定器が組み込まれています。 ガウス フィルター関数は、ガウス カーネル関数の近似です。

カーネルメソッドの種類

ガウス フィルター関数は、より高次元の空間におけるデータ ポイント間の類似性を計算します。

TensorFlow を使用してガウス カーネル分類器をトレーニングする

アルゴリズムの目的は、世帯収入が 50 を超えるか、またはそれ以下かを分類することです。

ロジスティック カーネル回帰機械学習を評価して、ベンチマーク モデルを作成します。 その後、カーネル分類子をトレーニングして、より良い結果が得られるかどうかを確認します。

成人データセットから次の変数を使用します。

  • 年齢
  • ワーククラス
  • fnlwgt
  • 教育
  • 教育番号
  • 夫婦の
  • 職業
  • 関係
  • レース
  • セックス
  • 資本利得
  • 資本損失
  • 時間_週
  • 母国
  • ラベル

モデルをトレーニングして評価する前に、次の手順を実行します。

  • ステップ 1) ライブラリをインポートする
  • ステップ 2) データをインポートする
  • ステップ3) データを準備する
  • ステップ 4) input_fn を構築する
  • ステップ 5) ロジスティック モデルの構築: ベースライン モデル
  • ステップ 6) モデルを評価する
  • ステップ 7) カーネル分類器を構築する
  • ステップ 8) カーネル分類器を評価する

ステップ1) ライブラリをインポートする

カーネル モデルをインポートしてトレーニングするには Artificial Intelligencetensorflow をインポートする必要があります。 パンダ でこぼこ

#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) データをインポートする

以下のサイトからデータをダウンロードしてください ウェブサイト それをパンダ データフレームとしてインポートします。

## 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 で使用できる XNUMX つの事前定義された推定器が必要です。

  • ランダムフーリエ特徴マッパー
  • KernelLinearClassifier

最初のセクションで、カーネル関数を使用して低次元を高次元に変換する必要があることを学びました。 より正確には、ガウス関数の近似であるランダム フーリエを使用します。 幸いなことに、Tensorflow のライブラリには RandomFourierFeatureMapper という関数があります。 モデルは、推定器 KernelLinearClassifier を使用してトレーニングできます。

モデルを構築するには、次の手順に従います。

  1. 高次元カーネル関数の設定
  2. L2ハイパーパラメータを設定する
  3. モデルを構築する
  4. モデルを訓練する
  5. モデルを評価する

ステップA) 高次元カーネル関数の設定

現在のデータセットには、14 次元ベクトルの新しい高次元に変換する 5.000 個のフィーチャが含まれています。 変換を行うには、ランダム フーリエ特徴を使用します。 ガウス カーネルの公式を思い出すと、標準偏差パラメータを定義する必要があることがわかります。 このパラメータは、分類中に使用される類似性の尺度を制御します。

RandomFourierFeatureMapper のすべてのパラメーターを次のように調整できます。

  • input_dim = 14
  • 出力ディム = 5000
  • stddev=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% の改善が、さまざまな分類子によって費やされる時間に見合う価値があるかどうか、また、それがビジネスに説得力のある影響を与えるかどうかを考える必要があります。

製品概要

カーネルは、非線形データを (ほぼ) 線形に変換するための優れたツールです。 この方法の欠点は、計算に時間がかかり、コストがかかることです。

以下に、カーネル分類器をトレーニングするための最も重要なコードを示します。

高次元カーネル関数の設定

  • input_dim = 14
  • 出力ディム = 5000
  • stddev=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)