मशीन लर्निंग में गॉसियन कर्नेल: Python कर्नेल विधियाँ

⚡ स्मार्ट सारांश

गॉसियन कर्नेल विधियाँ उच्च-आयामी फ़ीचर मैप बनाए बिना ही अविभाज्य डेटा को रैखिक रूप से विभाज्य बना देती हैं। यह विवरण बहुपद मानचित्र को दर्शाता है।ping पहले मैन्युअल रूप से, फिर टेन्सरफ्लो में एक रैंडम फूरियर कर्नेल क्लासिफायर को प्रशिक्षित करता है।

  • 🔘 पृथक्करणीयता समस्या: जब भी मूल फीचर स्पेस में वर्गों को विभाजित करने वाली कोई सीधी रेखा नहीं होती है, तो लीनियर क्लासिफायर विफल हो जाते हैं।
  • बहुपद मानचित्रping: x वर्ग, वर्गमूल दो xy और y वर्ग में रूपांतरण दो आयामों को तीन आयामों में बदल देता है और नमूना डेटा को अलग करता है।
  • कर्नेल ट्रिक: कर्नेल सीधे मैप किए गए वैक्टरों का डॉट प्रोडक्ट लौटाता है, इसलिए कोई विस्तारित फीचर मैप कभी भी संग्रहीत नहीं किया जाता है।
  • 🧪 तीन मुख्य भाग: लीनियर टेक्स्ट क्लासिफिकेशन के लिए उपयुक्त है, पॉलीनोमियल फीचर इंटरैक्शन को कैप्चर करता है, और गॉसियन आरबीएफ दूरी-आधारित समानता को मापता है।
  • टेन्सरफ्लो बिल्ड: KernelLinearClassifier को Ftrl ऑप्टिमाइज़र के साथ प्रशिक्षित करने से पहले RandomFourierFeatureMapper 14 विशेषताओं को 5,000 आयामों में प्रोजेक्ट करता है।
  • 📈 मापा गया परिणाम: कर्नेल क्लासिफायर की सटीकता 0.83975184 है, जबकि लॉजिस्टिक बेसलाइन की सटीकता 0.82353663 है।

मशीन लर्निंग में गॉसियन कर्नेल

इस ट्यूटोरियल का उद्देश्य डेटासेट को रैखिक रूप से अलग करना है। ट्यूटोरियल को दो भागों में विभाजित किया गया है:

  1. सुविधा परिवर्तन
  2. 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()

एक डेटासेट का स्कैटर प्लॉट जिसमें दो वर्ग ओवरलैप करते हैं और कोई सीधी रेखा उन्हें अलग नहीं करती है।

ऊपर दिए गए चित्र का डेटा एक द्विआयामी तल में स्थित है और इसे अलग-अलग नहीं किया जा सकता है। आप इस डेटा को त्रिआयामी रूप में रूपांतरित करने का प्रयास कर सकते हैं, जिसका अर्थ है कि आप तीन अक्षों वाला एक चित्र बना सकते हैं।

हमारे गॉसियन कर्नेल उदाहरण में, हम एक बहुपद मानचित्र लागू करेंगे।ping अपने डेटा को तीसरे आयाम में लाने के लिए। डेटा को रूपांतरित करने का सूत्र इस प्रकार है।

बहुपद मानचित्रping x और y का सूत्र फाई = x वर्ग, वर्गमूल दो गुना xy, y वर्ग

आप गॉसियन कर्नेल में एक फ़ंक्शन परिभाषित करते हैं Python नए फीचर मैप बनाने के लिए।

आप का उपयोग कर सकते हैं Numpy उपरोक्त सूत्र को कोड करने के लिए। नीचे दी गई प्रत्येक पंक्ति मानचित्र के एक पद को जोड़ती है।ping इसे उत्पन्न करने वाले ऐरे एक्सप्रेशन के साथ, और छोटी छवि दो के वर्गमूल के गुणनखंड को दर्शाती है।

सूत्र समतुल्य NumPy कोड
x एक्स[:,0]
y एक्स[:,1]
x[:,0]**2
बहुपद मानचित्र से दो गुणनखंडों का वर्गमूलping एनपी.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)

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

वही त्रि-आयामी प्लॉट समतल घुमा दिया गया है, जहाँ एक ही समतल दो वर्गों को विभाजित करता है।

यदि आपको किसी बड़े डेटासेट को संसाधित करना है और दो से अधिक आयाम बनाने हैं, तो उपरोक्त विधि से आपको बड़ी समस्या का सामना करना पड़ेगा। दरअसल, आपको सभी डेटा बिंदुओं को रूपांतरित करना होगा, जो स्पष्ट रूप से टिकाऊ नहीं है। इसमें आपको बहुत समय लगेगा और आपके कंप्यूटर की मेमोरी भी खत्म हो सकती है।

इस समस्या को दूर करने का सबसे आम तरीका कर्नेल का उपयोग करना है।

मशीन लर्निंग में कर्नेल क्या है?

इसका उद्देश्य उच्च-आयामी विशेषता स्थान का उपयोग करके डेटा को लगभग रैखिक रूप से अलग करने योग्य बनाना है, जैसा कि ऊपर दिए गए चित्र में दिखाया गया है।

ऐसे कई उच्च आयामी स्थान हैं जो डेटा बिंदुओं को वियोज्य बनाते हैं। उदाहरण के लिए, हमने दिखाया है कि बहुपद मानचित्रping एक बेहतरीन शुरुआत है.

हमने यह भी प्रदर्शित किया है कि बड़ी मात्रा में डेटा के साथ, ये रूपांतरण कुशल नहीं होते हैं। इसके बजाय, आप मशीन लर्निंग में कर्नेल फ़ंक्शन का उपयोग करके नए फ़ीचर प्लेन पर जाए बिना डेटा को संशोधित कर सकते हैं।

कर्नेल का जादू एक ऐसा फ़ंक्शन ढूंढना है जो उच्च-आयामी गणना से उत्पन्न होने वाली सभी परेशानियों से बच सके। कर्नेल का परिणाम एक अदिश राशि होता है, या दूसरे शब्दों में कहें तो, हम एक-आयामी स्थान पर वापस आ जाते हैं।

इस फ़ंक्शन को ढूंढने के बाद, आप इसे मानक लीनियर क्लासिफायर में प्लग कर सकते हैं।

यहां एक उदाहरण दिया गया है जो कर्नेल मशीन लर्निंग की अवधारणा को स्पष्ट करता है। आपके पास दो सदिश 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.        ]]

डॉट उत्पाद की गणना करें

आप ऑब्जेक्ट डॉट का उपयोग कर सकते हैं 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

कर्नेल विधियों के प्रकार

कई अलग-अलग कर्नेल तकनीकें उपलब्ध हैं। सबसे सरल है लीनियर कर्नेल। यह फ़ंक्शन टेक्स्ट वर्गीकरण के लिए काफी अच्छा काम करता है। अन्य कर्नेल इस प्रकार हैं:

  • बहुपद कर्नेल
  • गॉसियन कर्नेल

नीचे दी गई तालिका में प्रत्येक उपकरण के कार्य और चिकित्सकों द्वारा इसके उपयोग के समय का सारांश दिया गया है।

गुठली यह क्या गणना करता है विशिष्ट उपयोग
रैखिक मूल फ़ीचर स्पेस में प्लेन डॉट उत्पाद पहले से ही पृथक करने योग्य डेटा और उच्च-आयामी पाठ विशेषताएँ
बहुपद डॉट प्रोडक्ट को p डिग्री तक बढ़ाया गया, जो फीचर इंटरैक्शन को कैप्चर करता है। जब अंतःक्रियाओं का महत्व ज्ञात हो तो घुमावदार सीमाएँ
गॉसियन (आरबीएफ) दूरी पर आधारित समानता जो बिंदुओं के एक दूसरे से दूर जाने पर शून्य की ओर घटती जाती है सीमा का आकार अज्ञात होने पर आमतौर पर पहला विकल्प यही होता है।

TensorFlow के उदाहरण में, हम रैंडम फूरियर फ़ीचर का उपयोग करेंगे। TensorFlow में नए फ़ीचर स्पेस की गणना करने के लिए एक अंतर्निहित एस्टीमेटर है। रैंडम फूरियर फ़ीचर मैपर नीचे दिखाए गए गॉसियन कर्नेल फ़ंक्शन का एक सन्निकटन है।

गॉसियन कर्नेल सूत्र: e की घात - x - y के वर्ग मानदंड को दो सिग्मा वर्ग से विभाजित करने पर प्राप्त मान

गॉसियन फ़िल्टरिंग फ़ंक्शन बहुत उच्च आयामी स्थान में डेटा बिंदुओं के बीच समानता की गणना करता है।

सिद्धांत स्पष्ट हो जाने के बाद, इस विस्तृत प्रक्रिया के शेष भाग में एक वास्तविक डेटासेट पर गॉसियन कर्नेल का उपयोग किया जाएगा।

TensorFlow के साथ Gaussian Kernel क्लासिफायर को प्रशिक्षित करें

इस एल्गोरिथ्म का उद्देश्य 50 हजार से अधिक या कम आय वाले परिवारों को वर्गीकृत करना है।

सबसे पहले, आप एक बेंचमार्क मॉडल बनाने के लिए लॉजिस्टिक रिग्रेशन का मूल्यांकन करेंगे। उसके बाद, आप बेहतर परिणाम प्राप्त करने के लिए कर्नेल क्लासिफायर को प्रशिक्षित करेंगे।

आप वयस्क डेटासेट से निम्नलिखित चर का उपयोग करते हैं:

  • उम्र
  • वर्कक्लास
  • एफएनएलडब्ल्यूजीटी
  • शिक्षा
  • शिक्षा_संख्या
  • वैवाहिक
  • व्यवसाय
  • संबंध
  • दौड़
  • लिंग
  • पूंजी_लाभ
  • पूंजी_हानि
  • घंटे_सप्ताह
  • जन्मभूमि
  • लेबल

मॉडल को प्रशिक्षित और मूल्यांकन करने से पहले आप निम्न प्रकार से आगे बढ़ेंगे:

  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 आउटपुट लेयर के साथ, या scikit-learn से RBFSampler और SGDClassifier जोड़ी के साथ समान पाइपलाइन बनाएं।

चरण 1) लाइब्रेरीज़ आयात करें

कर्नेल मॉडल को आयात और प्रशिक्षित करने के लिए Artificial Intelligenceआपको TensorFlow आयात करने की आवश्यकता है। पांडा और नम्पी।

#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 = {&#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

ट्रांसफॉर्मर फ़ंक्शन तैयार है, इसलिए आप डेटासेट को परिवर्तित कर सकते हैं और 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 एस्टिमेटर 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 में उपलब्ध दो पूर्व-निर्धारित अनुमानकों की आवश्यकता होगी:

  • रैंडमफूरियरफीचरमैपर
  • कर्नेललीनियरक्लासिफायर

आपने पहले भाग में सीखा कि कर्नेल फ़ंक्शन का उपयोग करके निम्न आयाम को उच्च आयाम में परिवर्तित करना आवश्यक है। अधिक सटीक रूप से, आप रैंडम फूरियर विशेषताओं का उपयोग करेंगे, जो गॉसियन फ़ंक्शन का अनुमान लगाती हैं। TensorFlow 1.x वह मैप प्रदान करता है।ping इसे RandomFourierFeatureMapper के रूप में उपयोग किया जा सकता है, और मॉडल को KernelLinearClassifier एस्टीमेटर का उपयोग करके प्रशिक्षित किया जा सकता है।

मॉडल बनाने के लिए, आपको इन चरणों का पालन करना होगा:

  1. उच्च आयाम कर्नेल फ़ंक्शन सेट करें
  2. L2 हाइपरपैरामीटर सेट करें
  3. मॉडल बनाएं
  4. मॉडल को प्रशिक्षित करें
  5. मॉडल का मूल्यांकन करें

चरण A) उच्च आयामी कर्नेल फ़ंक्शन सेट करें

वर्तमान डेटासेट में 14 विशेषताएँ हैं जिन्हें आप एक नए 5,000-आयामी वेक्टर में रूपांतरित करेंगे। रूपांतरण के लिए आप रैंडम फूरियर विशेषताओं का उपयोग करेंगे। यदि आपको गॉसियन कर्नेल सूत्र याद है, तो आपने देखा होगा कि इसमें एक मानक विचलन पैरामीटर परिभाषित किया जाता है। यह पैरामीटर वर्गीकरण के दौरान उपयोग किए जाने वाले समानता माप को नियंत्रित करता है: एक छोटा मानक विचलन कर्नेल को केवल बहुत निकट बिंदुओं को समान मानने देता है, जबकि एक बड़ा मानक विचलन निर्णय सीमा को सुगम बनाता है।

आप RandomFourierFeatureMapper में सभी पैरामीटर्स को निम्न प्रकार से ट्यून कर सकते हैं:

  • इनपुट_डिम = 14
  • आउटपुट_डिम = 5000
  • मानक विचलन = 4
### Prep Kernel
kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name=&#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)

चरण C) मॉडल बनाएं

अगला चरण लीनियर क्लासिफिकेशन के समान है। आप बिल्ट-इन एस्टीमेटर 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) मॉडल को प्रशिक्षित करें

अब जबकि कर्नेल क्लासिफायर बन चुका है, आप इसे प्रशिक्षित करने के लिए तैयार हैं। आप मॉडल को 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 लौटाता है, जो कि स्पष्ट त्रि-आयामी रूपांतरण द्वारा उत्पन्न मान के समान है।

नहीं। TensorFlow 2.0 में tf.contrib और 2.16 में tf.estimator को हटा दिया गया था, इसलिए real_valued_column, RandomFourierFeatureMapper और KernelLinearClassifier अब उपलब्ध नहीं हैं। Dense आउटपुट के साथ tf.keras.layers.experimental.RandomFourierFeatures लेयर का उपयोग करें, या SGDClassifier के साथ RBFSampler का उपयोग करें।

स्वचालित खोज उपकरण समानांतर परीक्षणों में कर्नेल प्रकार, डिग्री, गामा या मानक विचलन और नियमितीकरण शक्ति की जांच करते हैं, और फिर उन्हें क्रॉस-वैलिडेटेड स्कोर के आधार पर रैंक करते हैं। वे कर्नेल चयन को एक सटीक तुलना में बदल देते हैं, हालांकि खोज बजट और स्कोरिंग मीट्रिक आप ही निर्धारित करते हैं।

यह ढांचा जल्दी तैयार कर देता है: फ़ीचर स्केलिंग, मैपर कॉल, एस्टीमेटर और मूल्यांकन लूप। सुझावों को पहले चरण के रूप में मानें, क्योंकि गिटहब कोपिलॉट यह आसानी से उन हटाए गए TensorFlow 1.x API को पुन: उत्पन्न करता है जो वर्तमान रिलीज़ पर अब आयात नहीं होते हैं।

यह समानता बेल की चौड़ाई निर्धारित करता है। कम मानक विचलन (stddev) होने पर केवल बहुत निकट स्थित बिंदुओं को ही समान माना जाता है, जिससे एक तंग, टेढ़ी-मेढ़ी सीमा बनती है जो ओवरफिटिंग का कारण बन सकती है। अधिक मानक विचलन (stddev) सीमा को चिकना करता है और मॉडल को रैखिक फिट की ओर वापस ले जाता है।

यह गॉसियन कर्नेल का अनुमान लगाने के लिए उपयोग किए जाने वाले रैंडम फूरियर फीचर्स की संख्या है। अधिक फीचर्स कर्नेल का अधिक सटीक अनुमान लगाते हैं और आमतौर पर सटीकता बढ़ाते हैं, लेकिन इसके बदले में वेट वेक्टर का दायरा बढ़ जाता है और प्रत्येक बैच पर ट्रेनिंग धीमी हो जाती है।

एक सटीक कर्नेल विधि प्रशिक्षण बिंदुओं के प्रत्येक जोड़े की तुलना करती है, इसलिए लागत लगभग नमूना संख्या के वर्ग के अनुपात में बढ़ती है। रैंडम फूरियर विशेषताएँ इसके बजाय एक निश्चित चौड़ाई वाले प्रक्षेपण के साथ कर्नेल का अनुमान लगाकर इस समस्या से बच जाती हैं।

एक कर्नेल विधि फीचर मैप को ठीक करती हैping यह पहले से ही रैखिक भार सीखता है, इसलिए यह कम डेटा पर भी तेजी से प्रशिक्षित होता है। तंत्रिका नेटवर्क यह अपना खुद का प्रतिनिधित्व सीखता है, जो छवियों जैसे बहुत बड़े, असंरचित डेटासेट के लिए बेहतर ढंग से काम करता है।

इस पोस्ट को संक्षेप में इस प्रकार लिखें: