Gaussian Kernel ในการเรียนรู้ของเครื่อง: Python วิธีการเคอร์เนล

⚡ สรุปอย่างชาญฉลาด

วิธีการใช้เคอร์เนลแบบเกาส์เซียนทำให้ข้อมูลที่ไม่สามารถแยกได้ด้วยเส้นตรงสามารถแยกได้โดยไม่ต้องสร้างแผนที่ฟีเจอร์ที่มีมิติสูง บทความนี้จะแสดงแผนที่พหุนามping ด้วยมือ จากนั้นจึงฝึกตัวจำแนกเคอร์เนลฟูริเยร์แบบสุ่มใน TensorFlow

  • 🔘 ปัญหาการแยกส่วน: ตัวจำแนกเชิงเส้นจะล้มเหลวเมื่อไม่มีเส้นตรงแบ่งคลาสในพื้นที่คุณลักษณะดั้งเดิม
  • ☑️ แผนที่พหุนามping: การแปลงเป็น x กำลังสอง, รากที่สองของ xy และ y กำลังสอง จะยกระดับสองมิติเป็นสามมิติและแยกข้อมูลตัวอย่างออกจากกัน
  • เทคนิคเคอร์เนล: เคอร์เนลจะส่งคืนค่าผลคูณดอทของเวกเตอร์ที่แมปโดยตรง ดังนั้นจึงไม่มีการจัดเก็บแผนที่ฟีเจอร์ที่ขยายออกไปแต่อย่างใด
  • 🧪 สามเมล็ด: แบบจำลองเชิงเส้นเหมาะสำหรับการจำแนกประเภทข้อความ แบบจำลองพหุนามจับปฏิสัมพันธ์ของคุณลักษณะ และแบบจำลอง Gaussian RBF วัดความคล้ายคลึงตามระยะทาง
  • 🛠️ การสร้าง TensorFlow: RandomFourierFeatureMapper ฉายภาพคุณลักษณะ 14 รายการไปยังมิติ 5,000 มิติ ก่อนที่ KernelLinearClassifier จะฝึกฝนด้วยตัวเพิ่มประสิทธิภาพ Ftrl
  • 📈 ผลการวัด: ตัวจำแนกแบบเคอร์เนลมีความแม่นยำ 0.83975184 ในขณะที่ตัวจำแนกแบบโลจิสติกมีความแม่นยำ 0.82353663

Gaussian Kernel ในการเรียนรู้ของเครื่อง

จุดประสงค์ของบทช่วยสอนนี้คือการทำให้ชุดข้อมูลแยกกันเชิงเส้นได้ บทช่วยสอนแบ่งออกเป็นสองส่วน:

  1. การเปลี่ยนแปลงคุณสมบัติ
  2. ฝึกฝนตัวจำแนกประเภท Kernel ด้วย 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()

แผนภาพกระจายจุดของชุดข้อมูลที่คลาสทั้งสองทับซ้อนกันและไม่มีเส้นตรงคั่นระหว่างคลาสทั้งสอง

ข้อมูลจากรูปด้านบนอยู่ในระนาบ 2 มิติและไม่สามารถแยกออกจากกันได้ คุณสามารถลองแปลงข้อมูลนี้ให้เป็นสามมิติ ซึ่งหมายความว่าคุณสร้างรูปที่มี 3 แกน

ในตัวอย่าง Gaussian Kernel ของเรา เราจะใช้การแมปพหุนามping เพื่อนำข้อมูลของเราไปสู่มิติที่สาม สูตรในการแปลงข้อมูลมีดังนี้

แผนที่พหุนามping สูตรฟีของ x และ y เท่ากับ x กำลังสอง รากที่สองของสองเท่า xy, y กำลังสอง

คุณกำหนดฟังก์ชันใน Gaussian Kernel Python เพื่อสร้างแผนที่ลักษณะใหม่

คุณสามารถใช้ได้ นำพาย เพื่อเขียนโค้ดสูตรข้างต้น แต่ละแถวด้านล่างจะจับคู่คำศัพท์หนึ่งคำจากแผนที่ping โดยใช้สูตรอาร์เรย์ที่สร้างผลลัพธ์นั้น และรูปภาพขนาดเล็กแสดงถึงรากที่สองของตัวประกอบสอง

สูตร โค้ด NumPy ที่เทียบเท่า
x เอ็กซ์[:,0]
y เอ็กซ์[:,1]
x[:,0]**2
รากที่สองของสอง ตัวประกอบจากแผนที่พหุนามping np.sqrt(2)*
xy x[:,0]*x[:,1]
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			

แผนที่ใหม่ping มี 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()

แผนภาพกระจายสามมิติของจุดที่ทำแผนที่ไว้ มองจากระดับความสูง 30 องศา และมุมอะซิมุธ 185 องศา

เราเห็นการปรับปรุง แต่ถ้าเราเปลี่ยนทิศทางการแสดงกราฟ จะเห็นได้ชัดว่าชุดข้อมูลสามารถแยกออกจากกันได้แล้ว

# 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 ในการเรียนรู้ของเครื่องคืออะไร?

แนวคิดคือการใช้พื้นที่คุณลักษณะที่มีมิติสูงกว่าเพื่อทำให้ข้อมูลสามารถแยกออกจากกันได้เกือบจะเป็นเส้นตรง ดังแสดงในรูปด้านบน

มีพื้นที่มิติสูงมากมายที่ทำให้จุดข้อมูลแยกออกจากกันได้ ตัวอย่างเช่น เราได้แสดงให้เห็นแล้วว่าแผนที่พหุนามping เป็นการเริ่มต้นที่ดี

เราได้แสดงให้เห็นแล้วว่า การแปลงข้อมูลเหล่านี้ไม่มีประสิทธิภาพเมื่อมีข้อมูลจำนวนมาก แทนที่จะใช้วิธีการแปลงข้อมูลโดยตรง คุณสามารถใช้ฟังก์ชัน Kernel ใน Machine Learning เพื่อปรับเปลี่ยนข้อมูลโดยไม่ต้องย้ายไปยังระนาบคุณลักษณะใหม่

หัวใจสำคัญของเคอร์เนลคือการค้นหาฟังก์ชันที่หลีกเลี่ยงปัญหาทั้งหมดที่เกิดจากการคำนวณในมิติสูง ผลลัพธ์ของเคอร์เนลเป็นค่าสเกลาร์ หรือกล่าวอีกอย่างคือ เรากลับไปสู่พื้นที่หนึ่งมิติอีกครั้ง

หลังจากที่คุณค้นพบฟังก์ชันนี้แล้ว คุณสามารถนำไปใช้ร่วมกับตัวจำแนกเชิงเส้นมาตรฐานได้

นี่คือตัวอย่างที่ทำให้เข้าใจแนวคิดของ Kernel Machine Learning ได้อย่างชัดเจน คุณมีเวกเตอร์สองตัว คือ x1 และ x2 เป้าหมายคือการสร้างมิติที่สูงขึ้นโดยใช้แผนที่พหุนามpingผลลัพธ์ที่ได้จะเท่ากับผลคูณดอทของแผนที่ฟีเจอร์ใหม่ จากวิธีการข้างต้น คุณต้องดำเนินการดังนี้:

  1. แปลง x1 และ x2 ให้เป็นมิติใหม่
  2. คำนวณดอทโปรดัค: เหมือนกันกับเมล็ดทั้งหมด

แปลง 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.        ]]

คำนวณผลคูณดอท

คุณสามารถใช้จุดวัตถุจาก นำพาย เพื่อคำนวณผลคูณดอทระหว่างเวกเตอร์แรกและเวกเตอร์ที่สองที่เก็บไว้ใน 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

ประเภทของวิธีการเคอร์เนล

มีเทคนิคเคอร์เนลหลายแบบให้เลือกใช้ แบบที่ง่ายที่สุดคือเคอร์เนลเชิงเส้น ฟังก์ชันนี้ใช้งานได้ดีทีเดียวสำหรับการจำแนกประเภทข้อความ เคอร์เนลแบบอื่นๆ ได้แก่:

  • เคอร์เนลพหุนาม
  • เคอร์เนลเกาส์เซียน

ตารางด้านล่างสรุปหน้าที่ของแต่ละอย่างและช่วงเวลาที่ผู้ปฏิบัติงานควรใช้แต่ละอย่าง

เมล็ด สิ่งที่มันคำนวณ การใช้งานทั่วไป
วัดเชิงเส้น ผลคูณดอทธรรมดาในพื้นที่คุณลักษณะดั้งเดิม ข้อมูลที่แยกออกจากกันได้แล้วและคุณลักษณะข้อความมิติสูง
พหุนาม ผลคูณดอทที่ยกกำลังด้วยดีกรี p ซึ่งแสดงถึงปฏิสัมพันธ์ของคุณลักษณะต่างๆ ขอบเขตโค้งเมื่อทราบว่าปฏิสัมพันธ์มีความสำคัญ
เกาส์เซียน (RBF) ความคล้ายคลึงที่วัดจากระยะทาง ซึ่งจะลดลงเข้าใกล้ศูนย์เมื่อจุดต่างๆ อยู่ห่างกันมากขึ้น โดยทั่วไปแล้ว วิธีนี้จะเป็นตัวเลือกแรกเมื่อไม่ทราบรูปทรงของขอบเขต

ในตัวอย่างที่ใช้ TensorFlow เราจะใช้ฟีเจอร์ฟูริเยร์แบบสุ่ม TensorFlow มีตัวประมาณค่าในตัวเพื่อคำนวณพื้นที่ฟีเจอร์ใหม่ ตัวแมปเปอร์ฟีเจอร์ฟูริเยร์แบบสุ่มเป็นการประมาณค่าฟังก์ชันเคอร์เนลแบบเกาส์เซียนดังแสดงด้านล่าง

สูตรเคอร์เนลเกาส์เซียน: e ยกกำลังลบค่ากำลังสองของนอร์มของ x ลบ y หารด้วยสองซิกมากำลังสอง

ฟังก์ชันการกรองแบบเกาส์เซียนจะคำนวณความคล้ายคลึงกันระหว่างจุดข้อมูลในพื้นที่มิติที่สูงกว่ามาก

เมื่อเข้าใจทฤษฎีอย่างถ่องแท้แล้ว ส่วนที่เหลือของบทแนะนำนี้จะนำเคอร์เนลแบบเกาส์เซียนไปใช้กับชุดข้อมูลจริง

ฝึกตัวแยกประเภทเคอร์เนล Gaussian ด้วย TensorFlow

วัตถุประสงค์ของอัลกอริทึมคือการจำแนกครัวเรือนที่มีรายได้มากกว่าหรือน้อยกว่า 50 ราย

ขั้นแรก คุณจะประเมินการถดถอยโลจิสติกส์เพื่อใช้เป็นแบบจำลองมาตรฐาน หลังจากนั้น คุณจะฝึกตัวจำแนกประเภทแบบเคอร์เนลเพื่อดูว่าคุณจะได้ผลลัพธ์ที่ดีขึ้นหรือไม่

คุณใช้ตัวแปรต่อไปนี้จากชุดข้อมูลผู้ใหญ่:

  • อายุ
  • ชั้นเรียน
  • Fnlwgt
  • การศึกษา
  • การศึกษา_num
  • สมรส
  • อาชีพ
  • ความสัมพันธ์
  • แข่ง
  • เพศ
  • ทุน_กำไร
  • เงินทุน_ขาดทุน
  • ชั่วโมง_สัปดาห์
  • พื้นเมือง_ประเทศ
  • ฉลาก

ก่อนที่จะฝึกฝนและประเมินโมเดล คุณจะต้องดำเนินการดังต่อไปนี้:

  1. นำเข้าห้องสมุด
  2. นำเข้าข้อมูล
  3. เตรียมข้อมูล
  4. สร้างแบบจำลองโลจิสติกส์: แบบจำลองพื้นฐาน
  5. ประเมินแบบจำลอง
  6. สร้างและประเมินตัวจำแนกประเภทเคอร์เนล

หมายเหตุเกี่ยวกับเวอร์ชัน: โค้ดส่วนย่อยด้านล่างนี้ทั้งหมดกำหนดเป้าหมายไปที่ TensorFlow 1.x เนมสเปซ tf.contrib ซึ่งเป็นแหล่งที่มาของ real_valued_column, RandomFourierFeatureMapper และ KernelLinearClassifier ถูกลบออกไปใน TensorFlow 2.0 และ tf.estimator เองก็ถูกลบออกไปใน TensorFlow 2.16 ในเวอร์ชันปัจจุบัน ให้สร้างไปป์ไลน์เดียวกันโดยใช้เลเยอร์ tf.keras.layers.experimental.RandomFourierFeatures ตามด้วยเลเยอร์เอาต์พุต Dense หรือใช้คู่ RBFSampler และ SGDClassifier จาก scikit-learn

ขั้นตอนที่ 1) นำเข้าไลบรารี

เพื่อนำเข้าและฝึกอบรมโมเดลเคอร์เนล ปัญญาประดิษฐ์คุณต้องนำเข้า TensorFlow ก่อน หมีแพนด้า และ 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) นำเข้าข้อมูล

คุณดาวน์โหลดข้อมูลจาก หน้าชุดข้อมูลผู้ใหญ่ของ UCI และนำเข้าเป็น DataFrame ของ pandas

## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
PATH_test ="https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test
"## 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 = {&#x27;<=50K': 0,'>50K': 1}
df_train.label = [label[item] for item in df_train.label]
label_t = {&#x27;<=50K.': 0,'>50K.': 1}
df_test.label = [label_t[item] for item in df_test.label]			
df_train.shape			

(32561, 15)			

ขั้นตอนที่ 3) เตรียมข้อมูล

ชุดข้อมูลประกอบด้วยทั้งคุณลักษณะแบบต่อเนื่องและแบบจัดกลุ่ม วิธีปฏิบัติที่ดีคือการปรับค่ามาตรฐานของตัวแปรต่อเนื่อง คุณสามารถใช้ฟังก์ชัน StandardScaler จากไลบรารีได้ scikit เรียนรู้นอกจากนี้ คุณยังต้องสร้างฟังก์ชันที่ผู้ใช้กำหนดเองเพื่อให้การแปลงชุดข้อมูลฝึกฝนและชุดข้อมูลทดสอบง่ายขึ้น โปรดทราบว่าคุณต้องรวมตัวแปรต่อเนื่องและตัวแปรเชิงหมวดหมู่เข้าด้วยกันเป็นชุดข้อมูลทั่วไป และอาร์เรย์ควรมีชนิดข้อมูลเป็น float32

COLUMNS_INT = [&#x27;age','fnlwgt','education_num','capital_gain', 'capital_loss', 'hours_week']
CATE_FEATURES = [&#x27;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[&#x27;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(&#x27;features', dimension=14)

ตัวประมาณค่าถูกกำหนดโดยใช้ TensorFlow Estimator API โดยคุณจะต้องระบุคอลัมน์คุณลักษณะและตำแหน่งที่จะบันทึกกราฟ

estimator = tf.estimator.LinearClassifier(feature_columns=[feat_column],
                                          n_classes=2,
                                          model_dir = "kernel_log"
                                         )	
INFO:tensorflow:Using default config.INFO:tensorflow:Using config: {&#x27;_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>

ขั้นตอนที่ 5) ประเมินแบบจำลอง

คุณกำหนดฟังก์ชันอินพุตของ 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
{&#x27;accuracy': 0.82353663,
 &#x27;accuracy_baseline': 0.76377374,
 &#x27;auc': 0.84898686,
 &#x27;auc_precision_recall': 0.67214864,
 &#x27;average_loss': 0.3877216,
 &#x27;global_step': 1000,
 &#x27;label/mean': 0.23622628,
 &#x27;loss': 6312.495,
 &#x27;precision': 0.7362797,
 &#x27;prediction/mean': 0.21208474,
 &#x27;recall': 0.39417577}

คุณมีความแม่นยำ 82 เปอร์เซ็นต์ ในส่วนถัดไป คุณจะลองเอาชนะตัวจำแนกแบบโลจิสติกส์ด้วยตัวจำแนกแบบเคอร์เนล

ขั้นตอนที่ 6) สร้างตัวแยกประเภทเคอร์เนล

ตัวประมาณเคอร์เนลไม่ได้แตกต่างจากตัวจำแนกเชิงเส้นแบบดั้งเดิมมากนัก อย่างน้อยก็ในแง่ของโครงสร้าง แนวคิดเบื้องหลังคือการรวมพลังของแผนที่เคอร์เนลที่ชัดเจนเข้าด้วยกันping โดยใช้ตัวจำแนกเชิงเส้น

คุณต้องมีตัวประมาณค่าที่กำหนดไว้ล่วงหน้าสองตัวที่มีอยู่ใน TensorFlow เพื่อฝึก Kernel Classifier:

  • RandomFourierFeatureMapper
  • เคอร์เนลลิเนียร์ลักษณนาม

ในหัวข้อแรก คุณได้เรียนรู้แล้วว่าคุณจำเป็นต้องแปลงมิติที่ต่ำกว่าให้เป็นมิติที่สูงกว่าโดยใช้ฟังก์ชันเคอร์เนล โดยเฉพาะอย่างยิ่ง คุณจะใช้คุณลักษณะฟูริเยร์แบบสุ่ม ซึ่งเป็นการประมาณฟังก์ชันเกาส์เซียน TensorFlow 1.x มีฟังก์ชันดังกล่าวให้ใช้งานping โดยใช้ RandomFourierFeatureMapper เป็นตัวแปร และสามารถฝึกฝนโมเดลได้โดยใช้ตัวประมาณค่า KernelLinearClassifier

หากต้องการสร้างแบบจำลอง คุณจะต้องทำตามขั้นตอนเหล่านี้:

  1. ตั้งค่าฟังก์ชันเคอร์เนลมิติสูง
  2. ตั้งค่าไฮเปอร์พารามิเตอร์ L2
  3. สร้างโมเดล
  4. ฝึกโมเดล
  5. ประเมินแบบจำลอง

ขั้นตอน ก) ตั้งค่าฟังก์ชันเคอร์เนลที่มีมิติสูง

ชุดข้อมูลปัจจุบันประกอบด้วยคุณลักษณะ 14 ประการที่คุณจะแปลงเป็นเวกเตอร์ใหม่ที่มีมิติ 5,000 มิติ คุณใช้คุณลักษณะฟูริเยร์แบบสุ่มเพื่อให้ได้การแปลง หากคุณจำสูตรเคอร์เนลแบบเกาส์เซียนได้ คุณจะสังเกตเห็นว่ามีพารามิเตอร์ค่าเบี่ยงเบนมาตรฐานที่ต้องกำหนด พารามิเตอร์นี้ควบคุมการวัดความคล้ายคลึงที่ใช้ระหว่างการจำแนกประเภท: ค่าเบี่ยงเบนมาตรฐานน้อยจะทำให้เคอร์เนลพิจารณาเฉพาะจุดที่อยู่ใกล้กันมากว่าคล้ายกัน ในขณะที่ค่าเบี่ยงเบนมาตรฐานมากจะทำให้ขอบเขตการตัดสินใจเรียบขึ้น

คุณสามารถปรับแต่งพารามิเตอร์ทั้งหมดใน RandomFourierFeatureMapper ด้วย:

  • input_dim = 14
  • output_dim = 5000
  • ค่าเบี่ยงเบนมาตรฐาน = 4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name=&#x27;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)

ขั้นตอน ค) สร้างแบบจำลอง

ขั้นตอนต่อไปจะคล้ายกับการจำแนกประเภทเชิงเส้น คุณใช้ตัวประมาณค่าในตัว KernelLinearClassifier โปรดทราบว่าคุณต้องเพิ่มตัวแมปเปอร์เคอร์เนลที่กำหนดไว้ก่อนหน้านี้และเปลี่ยนไดเร็กทอรีของโมเดล

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

ข้อความเตือนเกี่ยวกับการเลิกใช้งานด้านล่างนี้ คาดว่าจะพบได้ใน TensorFlow 1.x เนื่องจากโมดูล kernel_methods สร้างขึ้นจากตัวประมาณค่า tf.contrib.learn รุ่นเก่า

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: {&#x27;_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
}
, &#x27;_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) ฝึกฝนโมเดล

เมื่อสร้างตัวจำแนกประเภท Kernel เสร็จแล้ว คุณก็พร้อมที่จะฝึกฝนโมเดล คุณเลือกที่จะฝึกฝนโมเดล 2,000 ครั้ง

### estimate 
estimator_kernel.fit(input_fn=train_input_fn, steps=2000)
WARNING:tensorflow:Casting <dtype: &#x27;int32'> labels to bool.
WARNING:tensorflow:Casting <dtype: &#x27;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={&#x27;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: &#x27;int32'> labels to bool.
WARNING:tensorflow:Casting <dtype: &#x27;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% สูงกว่าค่าพื้นฐานของการถดถอยโลจิสติกส์ประมาณ 1.6 เปอร์เซ็นต์ (0.83975184 เทียบกับ 0.82353663) มีความสมดุลระหว่างการปรับปรุงความแม่นยำและต้นทุนการคำนวณ คุณต้องพิจารณาว่าการปรับปรุงนั้นคุ้มค่ากับเวลาที่ใช้ไปกับตัวจำแนกที่ซับซ้อนกว่าหรือไม่ และมีผลกระทบที่สำคัญต่อธุรกิจของคุณหรือไม่

คำถามที่พบบ่อย

เทคนิคเคอร์เนลจะคำนวณผลคูณดอทของเวกเตอร์สองตัวหลังจากแมปมิติสูงpingโดยที่ไม่เคยสร้างแผนที่นั้นเลยpingฟังก์ชัน polynomial_kernel ในบทช่วยสอนนี้จะส่งคืนค่า 8100 โดยตรง ซึ่งเป็นค่าเดียวกับที่ได้จากการแปลงสามมิติแบบชัดเจน

ไม่ tf.contrib ถูกลบออกไปใน TensorFlow 2.0 และ tf.estimator ในเวอร์ชัน 2.16 ดังนั้น real_valued_column, RandomFourierFeatureMapper และ KernelLinearClassifier จึงหายไปแล้ว ให้ใช้เลเยอร์ tf.keras.layers.experimental.RandomFourierFeatures ร่วมกับเอาต์พุต Dense หรือ RBFSampler ร่วมกับ SGDClassifier แทน

เครื่องมือค้นหาอัตโนมัติจะตรวจสอบประเภทเคอร์เนล ระดับ แกมมา หรือค่าเบี่ยงเบนมาตรฐาน และความแรงของการปรับค่าให้เป็นมาตรฐานในการทำงานแบบขนาน จากนั้นจัดอันดับตามคะแนนที่ได้จากการตรวจสอบแบบไขว้ เครื่องมือเหล่านี้เปลี่ยนการเลือกเคอร์เนลให้เป็นการเปรียบเทียบที่วัดผลได้ แม้ว่าคุณจะยังคงกำหนดงบประมาณการค้นหาและตัวชี้วัดการให้คะแนนอยู่ก็ตาม

มันร่างโครงสร้างพื้นฐานอย่างรวดเร็ว: การปรับขนาดคุณลักษณะ การเรียกใช้ตัวแมปเปอร์ ตัวประมาณค่า และลูปการประเมินผล ให้ถือว่าข้อเสนอแนะเหล่านี้เป็นเพียงขั้นตอนแรก เพราะ นักบิน GitHub สามารถจำลอง API ของ TensorFlow 1.x ที่ถูกลบออกไปแล้ว ซึ่งไม่สามารถใช้งานได้ในเวอร์ชันปัจจุบันได้อย่างง่ายดาย

ค่าเบี่ยงเบนมาตรฐาน (stddev) จะกำหนดความกว้างของระฆังแสดงความคล้ายคลึงกัน ค่าเบี่ยงเบนมาตรฐานที่น้อยจะทำให้เฉพาะจุดที่อยู่ใกล้กันมากเท่านั้นที่ถูกนับว่าคล้ายคลึงกัน ส่งผลให้ขอบเขตแคบและคดเคี้ยว ซึ่งอาจทำให้เกิดการโอเวอร์ฟิตได้ ในทางกลับกัน ค่าเบี่ยงเบนมาตรฐานที่มากจะทำให้ขอบเขตเรียบขึ้นและทำให้แบบจำลองกลับไปสู่การปรับแบบเชิงเส้นมากขึ้น

จำนวนฟีเจอร์ฟูริเยร์แบบสุ่มที่ใช้ในการประมาณเคอร์เนลแบบเกาส์เซียนเรียกว่าค่าคงที่ของฟีเจอร์ ยิ่งมีฟีเจอร์มากเท่าไหร่ ก็ยิ่งประมาณเคอร์เนลได้แม่นยำมากขึ้น และโดยทั่วไปจะเพิ่มความแม่นยำ แต่ก็แลกมาด้วยเวกเตอร์น้ำหนักที่กว้างขึ้น และการฝึกฝนที่ช้าลงในแต่ละชุดข้อมูล

วิธีการใช้เคอร์เนลแบบแม่นยำจะเปรียบเทียบจุดข้อมูลฝึกฝนทุกคู่ ดังนั้นค่าใช้จ่ายจึงเพิ่มขึ้นโดยประมาณตามกำลังสองของจำนวนตัวอย่าง ฟีเจอร์ฟูริเยร์แบบสุ่มจะหลีกเลี่ยงปัญหานี้โดยการประมาณเคอร์เนลด้วยการฉายภาพที่มีความกว้างคงที่แทน

วิธีการเคอร์เนลจะแก้ไขแผนที่ฟีเจอร์ping เรียนรู้ค่าน้ำหนักเชิงเส้นล่วงหน้าเท่านั้น จึงฝึกฝนได้อย่างรวดเร็วแม้กับข้อมูลจำนวนไม่มาก เครือข่ายประสาท เรียนรู้การแสดงผลของตัวเอง ซึ่งปรับขนาดได้ดีกว่าสำหรับชุดข้อมูลขนาดใหญ่ที่ไม่มีโครงสร้าง เช่น รูปภาพ

สรุปโพสต์นี้ด้วย: