هدف این آموزش این است که یک مجموعه داده رو به صورت خطی جدا کنیم و به دو قسمت تقسیم میشه
در قسمت اول در مورد ایده پشت یک دسته بند کرنل آشنا میشیم و در قسمت دوم ازش استفاده می کنیم. از مجموعه داده بزرگسالان استفاده می کنیم و هدف اینه ک درآمد رو زیر و بالای 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 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)
آموزش مدل
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 مدل رو بسازیم.
برای ساخت مدل باید قدم های زیر رو برداریم
مرحله الف) تنظیم تابع کرنل
مجموعه داده کنونی ۱۴ ویژگی داره که می خواییم به بعد بالاتر ۵۰۰۰ تبدیل کنیم.
### 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)
خلاصه
کرنل ابزار مناسبی برای تبدیل داده های غیر خطی به داده های خطی هست که عملی زمان بر هست.