Gaussian Kernel ในการเรียนรู้ของเครื่อง: Python วิธีการเคอร์เนล
จุดประสงค์ของบทช่วยสอนนี้คือการทำให้ชุดข้อมูลแยกกันเชิงเส้นได้ บทช่วยสอนแบ่งออกเป็นสองส่วน:
- การเปลี่ยนแปลงคุณสมบัติ
- ฝึกตัวแยกประเภทเคอร์เนลด้วย Tensorflow
ในส่วนแรก คุณจะเข้าใจแนวคิดเบื้องหลังของวิธีเคอร์เนลในการเรียนรู้ของเครื่อง ในขณะที่ในส่วนที่สอง คุณจะได้เรียนรู้วิธีการฝึกตัวจำแนกเคอร์เนลด้วย Tensorflow คุณจะใช้ชุดข้อมูลสำหรับผู้ใหญ่ เป้าหมายของชุดข้อมูลนี้คือการจัดประเภทรายได้ที่ต่ำกว่าและสูงกว่า 50 ดอลลาร์ โดยทราบถึงพฤติกรรมของแต่ละครัวเรือน
ทำไมคุณถึงต้องใช้วิธีเคอร์เนล?
จุดมุ่งหมายของตัวแยกประเภททุกตัวคือการทำนายคลาสอย่างถูกต้อง ด้วยเหตุนี้ ชุดข้อมูลจึงควรแยกออกจากกัน ดูเนื้อเรื่องด้านล่าง มันค่อนข้างง่ายที่จะเห็นว่าทุกจุดเหนือเส้นสีดำเป็นของชั้นหนึ่งและจุดอื่นๆ เป็นของชั้นสอง อย่างไรก็ตาม เป็นเรื่องยากมากที่จะมีชุดข้อมูลที่เรียบง่าย ในกรณีส่วนใหญ่ ข้อมูลจะไม่สามารถแยกออกจากกันได้ วิธีการเคอร์เนลในการเรียนรู้ของเครื่องทำให้ตัวแยกประเภทที่ไร้เดียงสาเช่นการถดถอยโลจิสติกเป็นเรื่องยาก
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 แกน
ในตัวอย่าง Gaussian Kernel เราจะใช้การแมปพหุนามเพื่อนำข้อมูลของเราไปสู่มิติ 3 มิติ สูตรการแปลงข้อมูลมีดังนี้
คุณกำหนดฟังก์ชันใน Gaussian Kernel Python เพื่อสร้างแผนที่คุณลักษณะใหม่
คุณสามารถใช้ได้ มึน เพื่อเขียนโค้ดสูตรด้านบน:
สูตร | รหัส Numpy ที่เทียบเท่ากัน |
---|---|
x | x[:,0]** |
y | เอ็กซ์[:,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)
เรามาสร้างพล็อตใหม่ด้วย 3 แกน, x, y และ z ตามลำดับ
# 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 ในการเรียนรู้ของเครื่องคืออะไร?
แนวคิดคือการใช้พื้นที่คุณลักษณะที่มีมิติสูงกว่าเพื่อทำให้ข้อมูลแทบจะแยกออกจากกันเป็นเส้นตรงดังแสดงในรูปด้านบน
มีพื้นที่มิติที่สูงกว่ามากมายเพื่อทำให้จุดข้อมูลแยกกันได้ ตัวอย่างเช่น เราได้แสดงให้เห็นว่าการทำแผนที่พหุนามเป็นการเริ่มต้นที่ดี
เรายังแสดงให้เห็นด้วยว่าเมื่อมีข้อมูลจำนวนมาก การเปลี่ยนแปลงเหล่านี้จึงไม่มีประสิทธิภาพ แต่คุณสามารถใช้ฟังก์ชันเคอร์เนลใน Machine Learning เพื่อแก้ไขข้อมูลโดยไม่ต้องเปลี่ยนแผนคุณลักษณะใหม่ได้
ความมหัศจรรย์ของเคอร์เนลคือการหาฟังก์ชันที่หลีกเลี่ยงปัญหาทั้งหมดที่เกิดจากการคำนวณมิติสูง ผลลัพธ์ของเคอร์เนลคือสเกลาร์ หรือพูดอีกอย่างว่าเรากลับไปสู่อวกาศหนึ่งมิติ
หลังจากที่คุณพบฟังก์ชันนี้แล้ว คุณสามารถเสียบเข้ากับตัวแยกประเภทเชิงเส้นมาตรฐานได้
มาดูตัวอย่างเพื่อทำความเข้าใจแนวคิดของ Kernel Machine Learning คุณมีเวกเตอร์สองตัว, 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
มันคือกำลังของผลคูณดอทของเวกเตอร์สองตัว ด้านล่างนี้ คุณจะคืนค่าเคอร์เนลพหุนามระดับที่สอง ผลลัพธ์จะเท่ากับวิธีอื่น นี่คือความมหัศจรรย์ของเคอร์เนล
polynomial_kernel(x1, x2, p=2) 8100
ประเภทของวิธีการเคอร์เนล
มีเทคนิค Kernel ที่แตกต่างกันมากมาย ที่ง่ายที่สุดคือเคอร์เนลเชิงเส้น ฟังก์ชั่นนี้ใช้งานได้ค่อนข้างดีสำหรับการจัดหมวดหมู่ข้อความ เคอร์เนลอื่นคือ:
- เคอร์เนลพหุนาม
- เคอร์เนลเกาส์เซียน
ในตัวอย่างด้วย TensorFlowเราจะใช้สุ่มฟูเรียร์ TensorFlow มีตัวประมาณค่าในตัวเพื่อคำนวณพื้นที่ฟีเจอร์ใหม่ ฟังก์ชันตัวกรองแบบเกาส์เซียนเป็นการประมาณฟังก์ชันเคอร์เนลแบบเกาส์เซียน
ฟังก์ชันการกรองแบบเกาส์เซียนจะคำนวณความคล้ายคลึงกันระหว่างจุดข้อมูลในพื้นที่มิติที่สูงกว่ามาก
ฝึกตัวแยกประเภทเคอร์เนล Gaussian ด้วย TensorFlow
วัตถุประสงค์ของอัลกอริทึมคือการจำแนกครัวเรือนที่มีรายได้มากกว่าหรือน้อยกว่า 50 ราย
คุณจะประเมินการเรียนรู้ของเครื่องลอจิสติก Kernel Regression เพื่อให้มีแบบจำลองการวัดประสิทธิภาพ หลังจากนั้น คุณจะฝึก Kernel Classifier เพื่อดูว่าคุณจะได้ผลลัพธ์ที่ดีขึ้นหรือไม่
คุณใช้ตัวแปรต่อไปนี้จากชุดข้อมูลผู้ใหญ่:
- อายุ
- ชั้นเรียน
- Fnlwgt
- การศึกษา
- การศึกษา_num
- สมรส
- อาชีพ
- ความสัมพันธ์
- แข่ง
- เพศ
- ทุน_กำไร
- เงินทุน_ขาดทุน
- ชั่วโมง_สัปดาห์
- พื้นเมือง_ประเทศ
- ฉลาก
คุณจะดำเนินการดังต่อไปนี้ก่อนที่คุณจะฝึกและประเมินโมเดล:
- ขั้นตอนที่ 1) นำเข้าไลบรารี
- ขั้นตอนที่ 2) นำเข้าข้อมูล
- ขั้นตอนที่ 3) เตรียมข้อมูล
- ขั้นตอนที่ 4) สร้าง input_fn
- ขั้นตอนที่ 5) สร้างแบบจำลองลอจิสติกส์: แบบจำลองพื้นฐาน
- ขั้นตอนที่ 6) ประเมินแบบจำลอง
- ขั้นตอนที่ 7) สร้างตัวแยกประเภทเคอร์เนล
- ขั้นตอนที่ 8) ประเมินตัวแยกประเภทเคอร์เนล
ขั้นตอน 1) นำเข้าห้องสมุด
เพื่อนำเข้าและฝึกอบรมโมเดลเคอร์เนล ปัญญาประดิษฐ์คุณต้องนำเข้าเทนเซอร์โฟลว์ หมีแพนด้า และจำนวน
#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) เตรียมข้อมูล
ชุดข้อมูลมีทั้งคุณสมบัติต่อเนื่องและหมวดหมู่ แนวปฏิบัติที่ดีคือการสร้างมาตรฐานให้กับค่าของตัวแปรต่อเนื่อง คุณสามารถใช้ฟังก์ชัน StandardScaler จาก sci-kit learn ได้ คุณสร้างฟังก์ชันที่ผู้ใช้กำหนดเช่นกันเพื่อให้ง่ายต่อการแปลงชุดรถไฟและชุดทดสอบ โปรดทราบว่าคุณเชื่อมตัวแปรต่อเนื่องและเป็นหมวดหมู่เข้ากับชุดข้อมูลทั่วไป และอาร์เรย์ควรเป็นประเภท: 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
ฟังก์ชั่น Transformer พร้อมแล้ว คุณสามารถแปลงชุดข้อมูลและสร้างฟังก์ชัน 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) ประเมินแบบจำลอง
คุณกำหนดตัวประมาณค่าตัวเลขเพื่อประเมินโมเดล คุณใช้ชุดข้อมูลทั้งหมดสำหรับการประเมิน
# 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 เพื่อฝึก Kernel Classifier:
- RandomFourierFeatureMapper
- เคอร์เนลลิเนียร์ลักษณนาม
คุณได้เรียนรู้ในส่วนแรกว่าคุณต้องแปลงมิติต่ำให้เป็นมิติสูงโดยใช้ฟังก์ชันเคอร์เนล แม่นยำยิ่งขึ้น คุณจะใช้ Random Fourier ซึ่งเป็นค่าประมาณของฟังก์ชัน Gaussian โชคดีที่ Tensorflow มีฟังก์ชันในไลบรารี: RandomFourierFeatureMapper สามารถฝึกโมเดลได้โดยใช้ตัวประมาณค่า KernelLinearClassifier
หากต้องการสร้างแบบจำลอง คุณจะต้องทำตามขั้นตอนเหล่านี้:
- ตั้งค่าฟังก์ชันเคอร์เนลมิติสูง
- ตั้งค่าไฮเปอร์พารามิเตอร์ L2
- สร้างโมเดล
- ฝึกโมเดล
- ประเมินแบบจำลอง
ขั้นตอน ก) ตั้งค่าฟังก์ชันเคอร์เนลมิติสูง
ชุดข้อมูลปัจจุบันประกอบด้วยคุณลักษณะ 14 ประการที่คุณจะแปลงเป็นมิติสูงใหม่ของเวกเตอร์ 5.000 มิติ คุณใช้ฟีเจอร์ฟูเรียร์แบบสุ่มเพื่อให้เกิดการเปลี่ยนแปลง หากคุณจำสูตร Gaussian Kernel ได้ คุณจะทราบว่ามีค่าพารามิเตอร์ส่วนเบี่ยงเบนมาตรฐานที่ต้องกำหนด พารามิเตอร์นี้ควบคุมสำหรับการวัดความคล้ายคลึงกันซึ่งใช้ในระหว่างการจำแนกประเภท
คุณสามารถปรับแต่งพารามิเตอร์ทั้งหมดใน 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]}
ขั้นตอน ข) ตั้งค่าไฮเปอร์พารามิเตอร์ L2
เพื่อป้องกันการโอเวอร์ฟิต คุณจะต้องลงโทษฟังก์ชันการสูญเสียด้วย L2 Regularizer คุณตั้งค่าไฮเปอร์พารามิเตอร์ L2 เป็น 0.1 และอัตราการเรียนรู้เป็น 5
optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1)
ขั้นตอน ค) สร้างโมเดล
ขั้นตอนต่อไปจะคล้ายกับการจำแนกเชิงเส้น คุณใช้ KernelLinearClassifier ตัวประมาณค่าบิวด์อิน โปรดทราบว่าคุณเพิ่มเคอร์เนล mapper ที่กำหนดไว้ก่อนหน้านี้และเปลี่ยนไดเร็กทอรีโมเดล
### 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'}
ขั้นตอน ง) ฝึกโมเดล
เมื่อสร้างตัวแยกประเภทเคอร์เนลแล้ว คุณก็พร้อมที่จะฝึกมันแล้ว คุณเลือกที่จะวนซ้ำโมเดล 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>]}})
ขั้นตอน จ) ประเมินแบบจำลอง
สุดท้ายแต่ไม่ท้ายสุด คุณประเมินประสิทธิภาพของโมเดลของคุณ คุณควรจะสามารถเอาชนะการถดถอยโลจิสติกได้
# 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)