Hạt nhân Gaussian trong học máy: Python Phương thức hạt nhân

Mục đích của hướng dẫn này là làm cho một tập dữ liệu có thể phân tách tuyến tính. Hướng dẫn được chia thành hai phần:

  1. Chuyển đổi tính năng
  2. Huấn luyện trình phân loại hạt nhân với Tensorflow

Trong phần đầu tiên, bạn sẽ hiểu ý tưởng đằng sau phương pháp Kernel trong Machine Learning trong khi ở phần thứ hai, bạn sẽ thấy cách đào tạo bộ phân loại kernel bằng Tensorflow. Bạn sẽ sử dụng tập dữ liệu người lớn. Mục tiêu của tập dữ liệu này là phân loại doanh thu dưới và trên 50k, biết được hành vi của từng hộ gia đình.

Tại sao bạn cần Phương thức hạt nhân?

Mục đích của mọi phân loại là dự đoán các lớp một cách chính xác. Vì vậy, tập dữ liệu phải được phân tách. Nhìn vào cốt truyện bên dưới; khá đơn giản để thấy rằng tất cả các điểm phía trên đường màu đen thuộc về lớp thứ nhất và các điểm khác thuộc lớp thứ hai. Tuy nhiên, rất hiếm khi có một tập dữ liệu đơn giản như vậy. Trong hầu hết các trường hợp, dữ liệu không thể tách rời được. Các phương pháp hạt nhân trong Machine Learning gây khó khăn cho các bộ phân loại ngây thơ như hồi quy logistic.

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

Phương pháp hạt nhân

Trong hình bên dưới, chúng tôi vẽ một tập dữ liệu không thể phân tách tuyến tính. Nếu vẽ một đường thẳng thì hầu hết các điểm sẽ không được xếp vào đúng lớp.

Một cách để giải quyết vấn đề này là lấy tập dữ liệu và chuyển đổi dữ liệu sang một bản đồ đặc trưng khác. Điều đó có nghĩa là bạn sẽ sử dụng một hàm để chuyển đổi dữ liệu trong một gói khác, dữ liệu này có thể tuyến tính được.

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

Phương pháp hạt nhân

Dữ liệu từ hình trên nằm trong sơ đồ Hạt nhân Gaussian 2D không thể tách rời. Bạn có thể thử chuyển đổi những dữ liệu này theo không gian ba chiều, nghĩa là bạn tạo một hình có 3 trục.

Trong ví dụ về Hạt nhân Gaussian, chúng tôi sẽ áp dụng ánh xạ đa thức để đưa dữ liệu của mình sang kích thước 3D. Công thức chuyển đổi dữ liệu như sau.

Phương pháp hạt nhân

Bạn xác định một hàm trong Gaussian Kernel Python để tạo các bản đồ tính năng mới

Bạn có thể sử dụng cục mịch để mã hóa công thức trên:

Công thức Mã Numpy tương đương
x x[:,0]**
y x[:,1]
x2 x[:,0]**2
Phương pháp hạt nhân 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			

Ánh xạ mới phải có 3 chiều với 16 điểm

x_1  = mapping(x, y)
x_1.shape
(3, 16)

Hãy tạo một đồ thị mới với 3 trục x, y và z tương ứng.

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

Phương pháp hạt nhân

Chúng tôi nhận thấy sự cải thiện nhưng nếu chúng tôi thay đổi hướng của biểu đồ thì rõ ràng là tập dữ liệu hiện có thể tách rời được

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

Phương pháp hạt nhân

Để thao tác với một tập dữ liệu lớn và có thể phải tạo nhiều hơn 2 chiều, bạn sẽ gặp phải một vấn đề lớn khi sử dụng phương pháp trên. Trên thực tế, bạn cần chuyển đổi tất cả các điểm dữ liệu, điều này rõ ràng là không bền vững. Bạn sẽ mất nhiều thời gian và máy tính của bạn có thể hết bộ nhớ.

Cách phổ biến nhất để khắc phục vấn đề này là sử dụng hạt nhân.

Hạt nhân trong học máy là gì?

Ý tưởng là sử dụng không gian đặc trưng có chiều cao hơn để làm cho dữ liệu gần như có thể phân tách tuyến tính như trong hình trên.

Có rất nhiều không gian có chiều cao hơn để làm cho các điểm dữ liệu có thể phân tách được. Ví dụ: chúng tôi đã chỉ ra rằng ánh xạ đa thức là một khởi đầu tuyệt vời.

Chúng tôi cũng đã chứng minh rằng với nhiều dữ liệu, việc chuyển đổi này không hiệu quả. Thay vào đó, bạn có thể sử dụng hàm Kernel trong Machine Learning để sửa đổi dữ liệu mà không cần thay đổi sang gói tính năng mới.

Điều kỳ diệu của hạt nhân là tìm ra một hàm tránh được mọi rắc rối do tính toán nhiều chiều gây ra. Kết quả của kernel là vô hướng, hay nói cách khác ta quay lại không gian một chiều

Sau khi tìm thấy hàm này, bạn có thể cắm nó vào bộ phân loại tuyến tính tiêu chuẩn.

Hãy xem một ví dụ để hiểu khái niệm về Kernel Machine Learning. Bạn có hai vectơ, x1 và x2. Mục tiêu là tạo ra một chiều cao hơn bằng cách sử dụng ánh xạ đa thức. Đầu ra bằng sản phẩm chấm của bản đồ tính năng mới. Từ phương pháp trên, bạn cần:

  1. Biến x1 và x2 thành một chiều mới
  2. Tính tích số chấm: chung cho tất cả các hạt nhân
  3. Biến x1 và x2 thành một chiều mới

Bạn có thể sử dụng hàm được tạo ở trên để tính kích thước cao hơn.

## Kernel
x1 = np.array([3,6])
x2 = np.array([10,10])			

x_1 = mapping(x1, x2)
print(x_1)

Đầu ra

[[  9.         100.        ] 
      [ 25.45584412 141.42135624] 
      [ 36.         100.        ]]

Tính tích chấm

Bạn có thể sử dụng dấu chấm đối tượng từ numpy để tính tích số chấm giữa vectơ thứ nhất và vectơ thứ hai được lưu trữ trong x_1.

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

Đầu ra là 8100. Bạn thấy có vấn đề, bạn cần lưu vào bộ nhớ một bản đồ đặc trưng mới để tính tích chấm. Nếu bạn có một tập dữ liệu với hàng triệu bản ghi thì nó sẽ không hiệu quả về mặt tính toán.

Thay vào đó, bạn có thể sử dụng nhân đa thức để tính tích số chấm mà không làm biến đổi vectơ. Hàm này tính tích vô hướng của x1 và x2 như thể hai vectơ này đã được chuyển đổi sang chiều cao hơn. Nói cách khác, hàm hạt nhân tính toán kết quả của tích số chấm từ một không gian đặc trưng khác.

Bạn có thể viết hàm hạt nhân đa thức trong Python như sau.

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

Đó là lũy thừa của tích vô hướng của hai vectơ. Dưới đây, bạn trả về bậc hai của hạt nhân đa thức. Đầu ra bằng với phương pháp khác. Đây là sự kỳ diệu của hạt nhân.

polynomial_kernel(x1, x2, p=2)			
8100

Các loại phương thức hạt nhân

Có rất nhiều kỹ thuật hạt nhân khác nhau có sẵn. Đơn giản nhất là hạt nhân tuyến tính. Chức năng này hoạt động khá tốt cho việc phân loại văn bản. Hạt nhân khác là:

  • nhân đa thức
  • Hạt nhân Gaussian

Trong ví dụ với TensorFlow, chúng ta sẽ sử dụng Fourier ngẫu nhiên. TensorFlow có một công cụ ước tính tích hợp để tính toán không gian tính năng mới. Hàm lọc Gaussian là một hàm gần đúng của hàm nhân Gaussian.

Các loại phương thức hạt nhân

Hàm lọc Gaussian tính toán độ tương tự giữa các điểm dữ liệu trong không gian có chiều cao hơn nhiều.

Đào tạo trình phân loại hạt nhân Gaussian với TensorFlow

Mục tiêu của thuật toán là phân loại hộ gia đình có thu nhập nhiều hơn hoặc ít hơn 50 nghìn.

Bạn sẽ đánh giá Máy học hồi quy hạt nhân logistic để có mô hình chuẩn. Sau đó, bạn sẽ huấn luyện bộ phân loại hạt nhân để xem liệu bạn có thể nhận được kết quả tốt hơn hay không.

Bạn sử dụng các biến sau từ tập dữ liệu người lớn:

  • tuổi
  • lớp học nghề
  • fnlwgt
  • giáo dục
  • giáo dục_num
  • hôn nhân
  • nghề nghiệp
  • mối quan hệ
  • cuộc đua
  • quan hệ tình dục
  • tăng vốn
  • vốn_lỗ
  • giờ_tuần
  • quê hương
  • nhãn

Bạn sẽ tiến hành như sau trước khi huấn luyện và đánh giá mô hình:

  • Bước 1) Nhập thư viện
  • Bước 2) Nhập dữ liệu
  • Bước 3) Chuẩn bị dữ liệu
  • Bước 4) Xây dựng input_fn
  • Bước 5) Xây dựng mô hình logistic: Mô hình cơ sở
  • Bước 6) Đánh giá mô hình
  • Bước 7) Xây dựng bộ phân loại hạt nhân
  • Bước 8) Đánh giá bộ phân loại hạt nhân

Bước 1) Nhập các thư viện

Để nhập và huấn luyện các mô hình Kernel trong Trí tuệ nhân tạo, bạn cần nhập tensorflow, gấu trúc và uể oải

#import numpy as np
from sklearn.model_selection 
import train_test_split
import tensorflow as tf
import pandas as pd
import numpy as np

Bước 2) Nhập dữ liệu

Bạn tải dữ liệu từ các nguồn sau trang mạng và bạn nhập nó dưới dạng khung dữ liệu gấu trúc.

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

Bây giờ tập huấn luyện và tập kiểm tra đã được xác định, bạn có thể thay đổi nhãn cột từ chuỗi thành số nguyên. tensorflow không chấp nhận giá trị chuỗi cho nhãn.

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)			

Bước 3) Chuẩn bị dữ liệu

Tập dữ liệu chứa cả các tính năng liên tục và phân loại. Một cách thực hành tốt là chuẩn hóa các giá trị của các biến liên tục. Bạn có thể sử dụng hàm StandardScaler từ sci-kit learn. Bạn cũng tạo một hàm do người dùng xác định để giúp chuyển đổi tập huấn luyện và tập kiểm tra dễ dàng hơn. Lưu ý rằng, bạn ghép các biến liên tục và biến phân loại thành một tập dữ liệu chung và mảng phải có kiểu: 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

Hàm biến áp đã sẵn sàng, bạn có thể chuyển đổi tập dữ liệu và tạo hàm 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)

Trong bước tiếp theo, bạn sẽ huấn luyện hồi quy logistic. Nó sẽ cung cấp cho bạn độ chính xác cơ bản. Mục tiêu là vượt qua đường cơ sở bằng một thuật toán khác, cụ thể là bộ phân loại hạt nhân.

Bước 4) Xây dựng mô hình logistic: Mô hình cơ sở

Bạn xây dựng cột tính năng với đối tượng real_valued_column. Nó sẽ đảm bảo tất cả các biến đều là dữ liệu số dày đặc.

feat_column = tf.contrib.layers.real_valued_column('features', dimension=14)

Công cụ ước tính được xác định bằng Công cụ ước tính TensorFlow, bạn hướng dẫn các cột tính năng và nơi lưu biểu đồ.

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}

Bạn sẽ huấn luyện hồi quy logisitc bằng cách sử dụng các lô nhỏ có kích thước 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)

Bạn có thể huấn luyện mô hình với 1.000 lần lặp

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>

Bước 6) Đánh giá mô hình

Bạn xác định công cụ ước tính gọn gàng để đánh giá mô hình. Bạn sử dụng toàn bộ tập dữ liệu để đánh giá

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

Bạn có độ chính xác là 82 phần trăm. Trong phần tiếp theo, bạn sẽ cố gắng đánh bại bộ phân loại logistic bằng bộ phân loại Kernel

Bước 7) Xây dựng bộ phân loại hạt nhân

Công cụ ước tính hạt nhân không quá khác biệt so với công cụ phân loại tuyến tính truyền thống, ít nhất là về mặt xây dựng. Ý tưởng đằng sau là sử dụng sức mạnh của kernel rõ ràng với bộ phân loại tuyến tính.

Bạn cần hai công cụ ước tính được xác định trước có sẵn trong TensorFlow để huấn luyện Trình phân loại hạt nhân:

  • RandomFourierTính năngMapper
  • KernelPhân loại tuyến tính

Bạn đã học trong phần đầu tiên rằng bạn cần chuyển đổi chiều thấp thành chiều cao bằng cách sử dụng hàm kernel. Chính xác hơn, bạn sẽ sử dụng Random Fourier, một hàm gần đúng của hàm Gaussian. May mắn thay, Tensorflow có chức năng trong thư viện của nó: RandomFourierFeatureMapper. Mô hình có thể được huấn luyện bằng cách sử dụng công cụ ước tính KernelLinearClassifier.

Để xây dựng mô hình, bạn sẽ làm theo các bước sau:

  1. Đặt chức năng hạt nhân kích thước cao
  2. Đặt siêu tham số L2
  3. Xây dựng mô hình
  4. Đào tạo mô hình
  5. Đánh giá mô hình

Bước A) Đặt chức năng hạt nhân kích thước cao

Tập dữ liệu hiện tại chứa 14 tính năng mà bạn sẽ chuyển đổi sang chiều cao mới của vectơ 5.000 chiều. Bạn sử dụng các tính năng Fourier ngẫu nhiên để đạt được sự chuyển đổi. Nếu bạn nhớ lại công thức Hạt nhân Gaussian, bạn lưu ý rằng có tham số độ lệch chuẩn cần xác định. Tham số này kiểm soát thước đo độ tương tự được sử dụng trong quá trình phân loại.

Bạn có thể điều chỉnh tất cả các tham số trong RandomFourierFeatureMapper bằng:

  • đầu vào_dim = 14
  • đầu ra_dim= 5000
  • stddev=4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')

Bạn cần xây dựng trình ánh xạ kernel bằng cách sử dụng các cột tính năng được tạo trước đó: feat_column

### Map Kernel
kernel_mappers = {feat_column: [kernel_mapper]}

Bước B) Đặt siêu tham số L2

Để ngăn chặn việc trang bị quá mức, bạn xử phạt hàm mất mát bằng bộ điều chỉnh L2. Bạn đặt siêu tham số L2 thành 0.1 và tốc độ học thành 5

optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1)

Bước C) Xây dựng mô hình

Bước tiếp theo tương tự như phân loại tuyến tính. Bạn sử dụng công cụ ước tính tích hợp sẵn KernelLinearClassifier. Lưu ý rằng bạn thêm trình ánh xạ hạt nhân được xác định trước đó và thay đổi thư mục mô hình.

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

Bước D) Đào tạo mô hình

Bây giờ bộ phân loại hạt nhân đã được xây dựng, bạn đã sẵn sàng huấn luyện nó. Bạn chọn lặp lại 2000 lần mô hình

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

Bước E) Đánh giá mô hình

Cuối cùng nhưng không kém phần quan trọng, bạn đánh giá hiệu suất của mô hình của mình. Bạn sẽ có thể đánh bại hồi quy logistic.

# 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

Độ chính xác cuối cùng là 84%, cải thiện 2% so với hồi quy logistic. Có sự cân bằng giữa việc cải thiện độ chính xác và chi phí tính toán. Bạn cần suy nghĩ xem liệu mức cải thiện 2% có xứng đáng với thời gian mà bộ phân loại khác đã bỏ ra hay không và liệu nó có tác động thuyết phục đến doanh nghiệp của bạn hay không.

Tổng kết

Hạt nhân là một công cụ tuyệt vời để chuyển đổi dữ liệu phi tuyến tính thành (gần như) tuyến tính. Nhược điểm của phương pháp này là tốn thời gian và chi phí tính toán.

Dưới đây, bạn có thể tìm thấy mã quan trọng nhất để huấn luyện trình phân loại hạt nhân

Đặt chức năng hạt nhân kích thước cao

  • đầu vào_dim = 14
  • đầu ra_dim= 5000
  • stddev=4
### Prep Kernelkernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm')

Đặt siêu tham số L2

optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1)

Xây dựng mô hình

estimator_kernel = tf.contrib.kernel_methods.KernelLinearClassifier(    n_classes=2,    
	optimizer=optimizer,    
    kernel_mappers=kernel_mappers,    
    model_dir="kernel_train")

Đào tạo mô hình

estimator_kernel.fit(input_fn=train_input_fn, steps=2000)

Đánh giá mô hình

eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)