تنسورفلو ۹‌ : متد های کرنل

هدف این آموزش این است که یک مجموعه داده رو به صورت خطی جدا کنیم و به دو قسمت تقسیم میشهتبدیل ویژگی هاآموزش یک دسته بندی با کرنل به وسیله تنسورفلودر قسمت اول در مورد ایده پشت یک دسته بند کرنل آشنا میشیم و در قسمت دوم ازش استفاده می کنیم. از مجموعه داده بزرگسالان استفاده می کنیم و هدف اینه ک درآمد رو زیر و بالای 50k تقسیم کنیم.چرا به متد های کرنل نیاز داریم?هدف هر دسته بند پیش بینی دسته به صورت درست هست. برای همین داده ها باید از هم جدا شده باشند. به نمودار زیر نگاه کنید خیلی ساده مشاهده می کنید که داده های بالای خط مربوط به یک دسته و داده های پایین مربوط به یک دسته دیگه هستند. البته این نمونه بیش از اندازه ساده هست و در واقعیت داده ها اینگونه جدا نیستند و دسته بندی رو برای رگرسیون منطقی سخت می کنند.یا مثلا داده های زیر رو نمیشه با یک خط صاف دسته بندی کردیک راه برای کنار اومدن با این مشکل تبدیل داده هاست .مثلا داده های بالا دو بعدی هست ولی اگه سه بعدی بشه احتمالا بتونیم با یه خط راست دسته بندی کنیمیک فرمول برای تبدیل داده هاخب الان بهتر شد ولی اگه جهت نمودار رو عوض کنیم جداگانه بودن نمودار بهتر قابل مشاهده هستبرای یک مجموعه داده بزرگ که احتمالا بیشتر از دو بعد داده داره مشکل بزرگی هست که به وسیله شیوه بالا داده ها تبدیل بشن و مشکلاتی از قبیل کمبود حافظه این کار رو عملا غیر ممکن کنهرایج ترین کار برای غلبه بر این مشکل استفاده از کرنل هستدر یادگیری ماشین کرنل چیست؟ایده ما این هست که از یک بعد بیشتر برای فضای ویژگی ها استفاده کنیم تا داده ها تقریبا خطی بشند مثل مثالی که در بالا نشان داده شد.قدرت کرنل این هست که یک تابعی پیدا کنه که تمام مشکلاتی که توسط محاسبات یک بعد بیشتر ایجاد میشه رو حل کنه. خروجی یک کرنل خطی هست یا به عبارتی بر می گردیم به تک بعد. بعد از این که این تابع رو پیدا کردید شما می تونید در دسته بند خطی استاندارد ازش استفاده کنید.انواع متد های کرنلانواع مختلفی از متد های کرنل وجود داره که ساده ترین کرنل خطی هست که برای دسته بندی متن ها خوب عمل می کنه و دو نوع دیگه:کرنل چند جمله ایکرنل گاوسیدر مثال با تنسورفلو از فوریه تصادفی استفاده می کنیم. تنسورفلو یک سری تخمین گر داره که فضای ویژگی های جدید را می سازه.یک تقریب از تابع کرنل گاوسی که شباهت را بین نقطه های داده ها در ابعاد بزرگتر پیدا می کنه.آموزش کرنل دسته بندی گاوسی با تنسورفلوهدف الگوریتم تخمین این که حقوق زیر ۵۰ ک هست یا بیشتر از آن.از رگرسیون خطی استفاده می کنیم و بعد از آن با استفاده از دسته بند کرنل سعی می کنیم نتایج بهتری بگیریممرحله ۱) ورود کتابخانه ها#import numpy as np from sklearn.model_selection import train_test_split import tensorflow as tf import pandas as pd import numpy as npمرحله ۲) ورود داده ها## 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)تغییر برچسب ها از متن به عدد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 مرحله ۳) آماده سازی داده هاداده ها ویژگی های پیوسته و گسسته دارند. یگ کار خوب استاندارد سازی مقادیر متغیر های پیوسته هست. از توابع سایکیت برای این کار استفاده می کنیم.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و اعمال تبدیل داده هاX_train, y_train = prep_data_str(df_train) X_test, y_test = prep_data_str(df_test) print(X_train.shape)مرحله ۴) ساخت مدل منطقی : مدل پایهساخت ستون ویژگی هاfeat_column = tf.contrib.layers.real_valued_column('features', dimension=14) ساخت برآوردگرestimator = tf.estimator.LinearClassifier(feature_columns=[feat_column],n_classes=2,model_dir = "kernel_log" )ساخت تابع ورود داده ها# Train the modeltrain_input_fn = tf.estimator.inputs.numpy_input_fn(x={"features": X_train}, y=y_train, batch_size=200, num_epochs=None,shuffle=True) آموزش مدلestimator.train(input_fn=train_input_fn, steps=1000)مرحل ۶) ارزیابی مدل# 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)دقت اولیه که بدست آوردیم ۸۲ درصد و خب سعی کنیم بهبودش بدیممرحله ۷) ساخت کرنل دسته بندیساخت برآوردکننده کرنل زیاد با ساخت دسته بند خطی فرق نداره.در قسمت اول یاد گرفتید که باید به وسیله تابع کرنل از بعد کم به بعد بیشتر تبدیل انجام بدید. قراره از تابع RandomFourierFeatureMapper استفاده کنیم و به وسیله KernelLinearClassifier مدل رو بسازیم.برای ساخت مدل باید قدم های زیر رو برداریمتعریف تابع کرنلتنظیم پارامتر L2ساخت مدلآموزش مدلارزیابی مدلمرحله الف) تنظیم تابع کرنلمجموعه داده کنونی ۱۴ ویژگی داره که می خواییم به بعد بالاتر ۵۰۰۰ تبدیل کنیم.### Prep Kernel kernel_mapper = tf.contrib.kernel_methods.RandomFourierFeatureMapper(input_dim=14, output_dim=5000, stddev=4, name='rffm') ### Map Kernel kernel_mappers = {feat_column: [kernel_mapper]} مرحله ب) تنطیم پارامتر L2 (برای مقابله با overfitting)optimizer = tf.train.FtrlOptimizer(learning_rate=5, l2_regularization_strength=0.1)مرحله پ) ساخت مدل### Prep estimator estimator_kernel = tf.contrib.kernel_methods.KernelLinearClassifier( n_classes=2, optimizer=optimizer, kernel_mappers=kernel_mappers, model_dir="kernel_train")مرحله ت) آموزش مدل### estimate estimator_kernel.fit(input_fn=train_input_fn, steps=2000)مرحله ث) ارزیابی مدلtest_input_fn = tf.estimator.inputs.numpy_input_fn( x={"features": X_test}, y=y_test, batch_size=16281, num_epochs=1, shuffle=False) # Evaluate and report metrics. eval_metrics = estimator_kernel.evaluate(input_fn=test_input_fn, steps=1)خلاصهکرنل ابزار مناسبی برای تبدیل داده های غیر خطی به داده های خطی هست که عملی زمان بر هست.