خانه / مقالات / داده کاوی و هوش مصنوعی / SVM Classification در Matlab و Weka

SVM Classification در Matlab و Weka

در مقاله های قبلی با مفهوم کلاسیفایر SVM  و طرز کار آن بر روی مجموعه های دلخواه داده در نرم افزار متلب آشنا شدید. در این مقاله هدف این است که با استفاده از نرم افزارهای Weka و Matlab الگوریتم SVM را بر روی دیتاست معروف FisherIris اجرا کرده و نحوه کار این الگوریتم را بر روی داده های این دیتا ست مشاهده نماییم.
دیتاست Iris  شاید یکی از معروف ترین دیتابیس های شناخته شده در شناسایی الگو باشد که توسط Fisher ارائه شده است. این دیتاست حاوی ۱۵۰ نمونه (سطر)و ۴ مشخصه (ستون) و یک کلاس برای گونه های گل زنبق است. یعنی ۳ کلاس (setosa, versicolor,virginica)  که هر یک حاوی ۵۰ نمونه هستند و هر کلاس به نوعی گیاه زنبق یا Iris اشاره می کند. یک کلاس از دو کلاس دیگر بصورت خطی جدایی پذیر است؛ دو کلاس دیگر بصوررت خطی جدایی پذیر نیستند.
ویژگی های پیش بینی شده: ۳ کلاس گیاه زنبق
-Iris Setosa
-Iris Versicolour
-Iris Virginica

سایر ویژگی ها
۱٫ طول کاسبرگ به سانتی متر یا sepal length
۲٫ عرض کاسبرگ به سانتی متر  یا sepal width
۳٫ طول گلبرگ به سانتی متر یا petal length
۴٫ عرض گلبرگ به سانتی متر یا petal width
۵٫ Class سه کلاس نام برده شده در بالا
بنابراین داده هاي Iris شامل پنجاه اندازه گيري از چهار ويژگي سه نوع گل زنبق به نام هاي و Versicolour ، Setosa و Virginica است. اين ويژگيها عبارتند از: طول كاسبرگ، عرض كاسبرگ، طول گلبرگ و عرض گلبرگ. بنابراين، در اين مسأله سه كلاس موجود است و هركلاس داراي پنجاه الگو با بردارهاي ويژگي چهار بعدي است.
اجرای الگوریتم ماشین بردار پشتیبان بر Fisher Iris Dataset
در اینجا و  در مرحله اول اجرا برای اینکه بتوانیم از showplot استفاده کنیم از دو کلاس استفاده می کنیم و داده های کلاس setosa را در نظر نمی گیریم.  در داده های iris همان طور که در ادامه در تصاویر مشاهده می کنید کلاس setosa کاملا از دو کلاس دیگر مجزا است و بصورت خطی قابل جداسازی می باشد ولی دو کلاس دیگر یعنی virginica و  versicolor جدایی پذیر خطی نیستند.  در اینجا ابتدا جداسازی خطی بر روی داده های این دو کلاس انجام می دهیم سپس از سایر کرنل های svm بر روی این دو کلاس استفاده کرده و نتیجه را مشاهده می کنیم:
clear all;
close all;
clc;

load fisheriris

xdata = meas(51:end,3:4);
group = species(51:end);

figure;

svmStruct = svmtrain(xdata,group,›kernel_function›,›linear›,›ShowPlot›,true);

Xnew = [5 2; 4 1.5];
species = svmclassify(svmStruct,Xnew,›ShowPlot›,true);

hold on;
plot(Xnew(:,1),Xnew(:,2),›ro›,›MarkerSize›,۱۲);
hold off
نتایج اجرای فاز آموزش کد Svm در حالت خطی:
همان طور که مشاهده می شود در اینجا از دو کلاس versicolor و virginica استفاده شده که با تعدادی داده نویزی با یک خط از هم جدا شده اند. داده های virginica با ستاره  در قسمت بالا و داده های versicolour با علامت +   در پایین خط قرار گرفته اند.

نتیجه اجرای فاز تست (svmclassify):
Svmclassify هر سطر از داده های موجود در Xnew، ماتریسی از داده ها، را که در اینجا Xnew = [5 2; 4 1.5]; در نظر گرفته شده، با استفاده از اطلاعات موجود در کلاسیفایر SVMStruct ماشین بردار پشتیبان که با استفاده از تابع svmtrain و آموزش دیتاست گل زنبق تولید شده، دسته بندی می کند. مانند داده های آموزشی مورد استفاده در ایجاد SVMStruct، Xnew نیز ماتریسی است که در آن هر سطر متناظر با یک مشاهده یا تکرار است و هر ستون متناظر با یک ویژگی یا متغیر می باشد. بنابراین Xnew باید همان تعداد ستونی را داشته باشد که داده های آموزشی دارند. به این دلیل که تعداد ستون ها نشان دهنده و تعریف کننده تعداد ویژگی هاست.  Species نشان دهنده گروهی است که هر سطر از xnew به آن اشاره می کند.
Group = svmclassify(SVMStruct,Sample,›Showplot›,true)
یا در مورد کدی که در بالا نشان داده شد:
species = svmclassify(svmStruct,Xnew,›ShowPlot›,true);
داده sample یا Xnew را در شکلی که با استفاده از showplot شاخته می شود ترسیم می کند. این پلات تنها زمانی ظاهر می شود که داده دو بعدی باشد. ‹ShowPlot› از یک دستور منطقی پیروی می کند : true برای رسم پلات، false نمایش ندادن شکل.

کلاسیفای کردن یک مشاهده با استفاده از یک SVM Classifier آموزش داده شده:

خطی را که داده های Fisher iris را در گونه های versicolor و virginica با توجه به اندازه های طول و عرض گلبرگ جدا می کند، می یابیم. این دو گونه در سطرهای ۵۱ و بالاتر در دیتاست هستند و طول و عرض گلبرگ ستون های سوم و چهارم هستند.

در ابتدا همان طور که گفته شد فاز آموزش انجام می شود:
load fisheriris
xdata = meas(51:end,3:4);
group = species(51:end);
figure;
svmStruct = svmtrain(xdata,group,›ShowPlot›,true);

حال دو گل جدید به این الگوریتم می دهیم و آنها را دسته بندی می کنیم یعنی Xnew = [5 2; 4 1.5];
یکی از این گل ها طول گلبرگ ۵ و عرض ۲ و دیگری طول گلبرگ ۴ و عرض گلبرگ ۱٫۵ دارد.
حال فاز تست اجرا می شود یعنی:
Xnew = [5 2; 4 1.5];
species = svmclassify(svmStruct,Xnew,›ShowPlot›,true)
hold on;
plot(Xnew(:,1),Xnew(:,2),›ro›,›MarkerSize›,۱۲);
hold off
ما در این مرحله از کلاسیفایر خطی svm استفاده کردیم که همان طور که در شکل می توان مشاهده کرد دو گونه را با یک خط از هم مجزا می کند. در شکل نقاط سبز گونه virginica و قرمز versicolor هستند داده های تستی که به آن داده شده نیز همان طور که مشاهده می شود یکی در گونه versicolor دیگری در گونه virginica قرار گرفته اند.
حال همین فرآیند را با کرنل های دیگر SVM  امتحان می کنیم.

در صورتی که بخواهیم داده هایی که غیر جدایی پذیر خطی هستند را با این الگوریتم جدا کنیم باید در دستور Svmtrain تغییراتی بدهیم و کرنل فانکشن مربوطه را تنظیم کنیم. در واقع Svm برای اینکه داده های غیر خطی را از هم تفکیک کند باید از کرنل استفاده کند. برای این کار دیگر در فضای دو بعدی کار نمی کند بلکه داده ها به فضایی با ابعاد بیشتر map می شوند یا نگاشت پیدا می کنند تا بتوان آنها را در این فضای جدید بصورت خطی جدا نمود. در واقع ایده اصلی ماشین بردار پشتیبان این است که ابر صفحه هایی در فضا رسم می کند که عمل تمایر نمونه های مختلف داده ها را بطور بهینه انجام می دهند و ابرصفحه ای را که بیشترین حاشیه جداسازی را دارد پیدا می کند و نزدیک ترین داده های آموزشی به ابر صفحه جداکننده بردارهای پشتیبان نامیده می شوند. در مواقعی که داده ها جدایی پذیر خطی نیستند متغیرهای کمبود یا اسلک تعریف می شوند که نشان دهنده تعداد نمونه هایی هستند که غلط ارزیابی شده اند. وقتی فضای ویژگی را به ابعاد بالاتر می بریم تا بتوانیم داده ها را جدایی پذیر خطی کنیم  انجام محاسبات در این ابعاد می تواند بسیار پیچیده و پر هزینه باشد برای غلبه بر این مشکل از kernel استفاده میکنیم.

کرنل mlp
clear all;
close all;
clc;

load fisheriris

xdata = meas(51:end,3:4);
group = species(51:end);
figure;
svmStruct = svmtrain(xdata,group,›kernel_function›,›mlp›,›ShowPlot›,true);
Xnew = [5 2; 4 1.5];
species = svmclassify(svmStruct,Xnew,›ShowPlot›,true);
hold on;
plot(Xnew(:,1),Xnew(:,2),›ro›,›MarkerSize›,۱۲);
hold off
کرنل polynomial

svmStruct = svmtrain(xdata,group,›kernel_function›,›polynomial›,›ShowPlot›,true);
کرنل rbf
svmStruct = svmtrain(xdata,group,›kernel_function›,›rbf›,›ShowPlot›,true);

کرنل quadratic
svmStruct = svmtrain(xdata,group,›kernel_function›,›quadratic›,›ShowPlot›,true);
همان طور که مشاهده می شود تمام کرنل های SVM با پارامترهای پیش فرض، جداسازی تقریبا یکسانی از این دیتاست ارائه کرده اند و در تمام موارد کمی نویز دیده می شود. ولی جداسازی کرنلهای polynomial و mlp نسبت به بقیه بهتر بوده و فضای مربوط به گونه versicolor را کمتر محدود کرده است. در ادامه خواهیم دید که با کاهش پارامتر سیگما در کرنل rbf دقت این کرنل بسیار بالاتر رفته و خط بسیار دقیقی در جداسازی کلاس پایینی ترسیم می کند.

اکنون که دستور مربوط به SVM دو کلاسه را در متلب مشاهده نمودید، دستور مربوط به دسته بندی داده های Iris در svm ولی برای هر ۳ کلاس داده یعنی گونه های Setosa، versicolor و Virginica را بررسی می کنیم:
clc; clear all;

load fisheriris
[g, gn]                 = grp2idx(species);     % Nominal class to numeric

% Split training and testing sets
[trainIdx, testIdx]     = crossvalind(‹HoldOut›, species, 1/3);

pairwise                = nchoosek(1:length(gn),2);            % ۱-vs-1 pairwise models
svmModel                = cell(size(pairwise,1),1);            % Store binary-classifers
predTest                = zeros(sum(testIdx),numel(svmModel)); % Store binary predictions

%# classify using one-against-one approach, SVM with 3rd degree poly kernel
for k=1:numel(svmModel)
%# get only training instances belonging to this pair
idx                     = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );

%# train
svmModel{k}             = svmtrain(meas(idx,:), g(idx), …
‹BoxConstraint›,۲e-1, ‹Kernel_Function›,›polynomial›, ‹Polyorder›,۳);

%# test
predTest(:,k)           = svmclassify(svmModel{k}, meas(testIdx,:));
end
pred = mode(predTest,2);   % Voting: clasify as the class receiving most votes

%# performance
cmat                        = confusionmat(g(testIdx),pred);
acc                         = ۱۰۰*sum(diag(cmat))./sum(cmat(:));
fprintf(‹SVM (1-against-1):naccuracy = %.2f%%n›, acc);
fprintf(‹Confusion Matrix:n›), disp(cmat)
همان طور که در کد فوق مشاهده می شود از کرنل چند جمله ای درجه ۳ و رویکرد one-against-one استفاده شده که در ادامه توضیح داده خواهد شد.
در نهایت خروحی که در command window در متلب نمایش داده می شود دقت ۹۷٫۹۲ درصد را نمایش می دهد و در confusion matrix به دست آمده می توان دید که داده های کلاس setosa به درستی و بدون هیچ خطایی دسته بندی شده اند. در داده های کلاس دوم یعنی versicolor 15 داده صحیح دسته بندی شده و ۱ خطا داریم و داده های کلاس سوم یعنی virginica نیز بدون خطا و به درستی دسته بندی شده اند. پس کرنل polynomial این دسته بندی را با این دقت انجام می دهد.
همان طور که در شکل بالا مشاهده می شود کرنل مورد استفاده را به rbf تغییر دادیم ولی تنظیماتی روی سیگمای این کرنل انجام ندادیم نتیجه دقت ۹۵٫۸۳  درصد را نشان می دهد و در confusion matrix هم مشاهده می شود که در گونه versicolor دو خطا داریم. پس نسبت به کرنل چند جمله ای درجه ۳ دسته بندی ضعیف تر است.
در شکل فوق مشاهده می شود که کرنل را به mlp  تغییر دادیم و نتیجه بسیار ضعیفی به دست آمد. دقت به ۸۵ درصد کاهش پیدا کرد و در گونه virginica ، ۶ داده غلط دسته بندی شده اند.
کدی که در ادامه آورده شده مشابه کد اول است  با این تفاوت که در اینجا پس از استفاده از کرنل rbf تنظیماتی  بر روی سیگما انجام شده است و می توان مشاهده کرد که با کاهش سیگما منحنی رسم جمع شده و مرز کلاس را با دقت بسیار بیشتری مشخص کرده است. البته این موضوع احتمال overfit شدن را افزایش می دهد. به این معنی که این دسته بندی برای داده های فعلی به خوبی عمل می کند ولی با وارد نمودن داده جدید احتمال اینکه داده در این محدوده قرار نگیرد و اشتباه دسته بندی شود بیشتر می شود.

%% select diffrent sigma
close all
svmstruct=svmtrain(x,group,›showplot›,true,›kernel_function›,›rbf›,›rbf_sigma›,۰٫۱);

پیاده سازی SVM بر روی داده های Iris در نرم افزار Weka
در این قسمت نتایج به دست آمده از اجرای الگوریتم ماشین بردار پشتیبان را در نرم افزار Weka و بر روی دیتاست های Iris بررسی خواهیم کرد.

در Weka ابتدا داده های مربوط به Iris را از دایرکتوری نصب Weka و از پوشه data لود می کنیم. در صفحه explorer همان طور که در شکل زیر نشان داده شده است مشخصات مربوط به این دیتا ست نمایش داده می شود. در سمت چپ صفحه attributeهای آن که این ۵ دسته را قبلا نام بردیم یعنی طول و پهنای گلبرگ ها و کاسبرگ ها و کلاسی که شامل سه دسته گل زنبق می شود را می توان مشاهده کرد . در زیر آنها یک دکمه remove قرار داده شده که می توان با استفاده از آن برخی از این ویژگی ها را حذف کرد تا در مرحله بعدی دسته بندی تنها روی ویژگی های دلخواه انجام شود. روی هر یک از این ویژگی ها که کلیک نمایید در سمت راست صفحه مشخصات مربوط به آن ویژگی و شمای گرافیکی مربوط به آن را می توانید مشاهده نمایید. مثلا با انتخاب class در سمت راست صفحه می توان دید که سه دسته از انواع گل زنبق و تعداد نمونه های هریک که ۵۰ عدد می باشد لیبل گذاری شده است. و در گوشه پایین سمت راست نیز می توان شمای گرافیکی مربو ط به آن ویژگی را مشاهده کرد. مثلا در شکل زیر می توان شکل سه کلاس و رنگ اختصاص داده شده به هر یک را مشاهده نمود.
در شکل زیر می توان شمای گرافیکی مربوط به طول کاسبرگ های هر یک از انواع گل ها را مشاهده کرد. رنگ آبی مربوط به گیاه setosa ، قرمز مربوط به versicolor و آبی کم رنگ یا لاجوردی مربوط به virginica می باشد.
شکل زیر شمای گرافیکی مربوط به عرض کاسبرگ هاست:
شکل زیر مربوط به شمای گرافیکی طول گلبرک هاست:
شکل زیر شمای گرافیکی مربوط به پهنای گلبرگ های هر سه گونه را نمایش می دهد:
با استفاده از دکمهall  visualize که در بالای این شکل ها قرار دارد می توان همه آنها را در کنار هم بصورت گرافیکی مشاهده نمود. بصورت شکل زیر:
با استفاده از دکمه visualize که در نوار ابزار بالای صفحه قرار دارد می توان اشکالی شبیه به شکل زیر را مشاهده کرد. در شکل زیر در محور افقی پراکندگی پهنای گلبرگ و در محور عمودی پراکندگی طول گلبرگ های هر سه گونه به تفکیک رنگ نمایش داده شده است. همان طور که در اینجا نیز می توان مشاهده نمود گونه setosa کاملا مجزا از دو گونه دیگر است و به صورت خطی جدایی پذیر می باشد. ولی داده های مربوط به دو گونه دیگر overlap داشته و بصورت خطی جدایی پذیر نیستند.

۱- weka.classifiers.functions.SMO
در اینجا از الگوریتم SMO (Sequential Minimal Optimization) برای آموزش یک کلاسیفایر بردار پشتیبان استفاده می شود. این پیاده سازی به صورت کلی همهmissing valueها را جایگزین کرده و nominal attributeها را به باینری تبدیل میکند. همه  attributeها را نرمال نیز می کند (در این حالت coefficientهای خروجی بر اساس داده نرمال شده، می باشند، نه داده اصلی و این برای تفسیر کلاسیفایر مهم است.)
برخی از پارامترهایی که در این تابع استفاده می شوند عبارتند از:
checksTurnedOff : بررسی های زمان بر را خاموش می کند که باید با احتیاط استفاده شود.
Debug: اگر روی true تنظیم شود، کلاسیفایر اطلاعات بیشتری به کنسول به عنوان خروجی خواهد داد.
Epsilon: اپسیلون برای خطای round-off (نباید تغییر داده شود).
filterType: تعیین می کند که داده چطور تبدیل شود و اصلا باید تبدیل شود یا خیر.
Kernel: کرنل مورد استفاده.
numFolds: تعداد fold ها برای cross-validation مورد استفاده برای تولید داده آموزشی برای مدل های منطقی.
randomSeed: تعداد تصادفی seed ها برای cross-validation.
toleranceParameter: پارامتر مقاومت یا tolerance (نباید تغییر داده شود).

اجرای SMO با انتخاب همه ویژگی ها:
همان طور که در شکل زیر مشاهده می شود در تب classify و در سمت چپ صفحه قسمتی به نام test options وجود دارد. با انتخاب گزینه use training set ماهیت آزمایش تغییر می کند و نتایج این قسمت با نتایج گزینه های دیگری که در زیر این گزینه وجود دارد در واقع قابل مقایسه نیستند. این تغییر به شما نشان می دهد که مدل برای داده ای که روی آن آموزش دیده چقدر خوب عمل می کند و از قبل جواب را می داند. اگر به دنبال یک مدل توصیفی باشید این گزینه مفید است ولی برای استفاده در مدل هایی که از آنها انتظار پیش بینی دارید مفید نمی باشد. برای اینکه بدانیم مدل برای پیش بینی چقدر خوب عمل می کند، باید آن را روی داده هایی که تا کنون ندیده و جدید هستند تست کنیم که بدین ترتیب پیش بینی هایی انجام می دهد که می توانیم آن را با داده های اصلی مقایسه کنیم. در حقیقت گزینه Cross validation این کار را برای ما انجام می دهد که بصورت پیش فرض روی ۱۰ تنظیم شده است یعنی این کار را ۱۰ بار انجام می دهد. زمانی که الگوریتم با ۱۰ fold cross validation اجرا می شود به این معناست که این فرصت به آن داده شده تا برای هر نمونه از دیتاست (با لایه های آموزشی متفاوت) پیش بینی انجام دهد و نتایج نمایش داده شده خلاصه ای از این پیش بینی هاست.
تعداد نمونه هایی که با این روش به درستی دسته بندی می شوند ۱۴۵ نمونه از ۱۵۰ نمونه کلی است که با توجه به confusion matrix نمایش داده شده در شکل فوق یک نمونه اشتباه در دسته versicolor و ۴ نمونه اشتباه در دسته virginica داریم. دقت دسته بندی با این روش ۹۶٫۶۶۷ درصد است.

اجرای SMO با percentage split 80%
استفاده از percentage split هشتاد درصد به این معنا است که این الگوریتم این بار مدل اولیه یا فرمول خود را بر اساس ۱۲۰ تا از ۱۵۰ نمونه یعنی ۸۰ درصد از نمونه ها می سازد و بعد از اینکه مدل ساخته شد آن را روی ۳۰ نمونه باقی مانده اجرا می کند تا دقت آن را تست کند. همان طور که مشاهده می شود ۱ نمونه از بین ۳۰ نمونه به درستی دسته بندی نشده که مربوط به کلاس virginica می باشد و دقت دسته بندی در این حالت ۹۶٫۶۶۶۷ درصد است.

اجرای اگوریتم SMO با استفاده از کرنل RBF
با یکبار کلیک چپ در کادر سفید رنگ یا کلیک راست روی نام کلاسیفایر انتخاب شده یعنی SMO می توان گزینه properties را انتخاب کرده و مطابق با شکل بالا کرنل مورد استفاده را تغییر داد. در حالت دیفالت از کرنل polynomial استفاده می شود که خروجی آن را در بالا مشاهده کردیم در این جا این کرنل را به rbf تغییر می دهیم.
در این قسمت خروجی اجرای SMO با کرنل RBF دیده می شود . لازم به ذکر است که در سربرگ preprocess هیچ attribute ای حذف نشده و از هر ۵ ویژگی در این دسته بندی ها استفاده شده است. همان طور که مشاهده می شود ۱۳۹ نمونه از ۱۵۰ نمونه به درستی دسته بندی شده و ۱۱ نمونه اشتباه دسته بندی شده اند و دقت دسته بندی به ۹۲٫۶۶۶۷ درصد کاهش پیدا کرده در نتیجه دسته بندی polynomial که به  دقت ۹۶٫۶۶۶۷ درصد رسیده  و ۵ داده را اشتباه دسته بندی کرده بود بهتر بود.
در اینجا در قسمت preprocess با استفاده از دکمه remove دو ویژگی مربوط به طول و عرض کاسبرگ را حذف کردیم. حال دسته بندی را تنها با استفاده از ویژگی های باقی مانده انجام می دهیم.
ابتدا با استفاده از کرنل polynomial
همان طور که مشاهده می شود تعداد نمونه هایی که با این روش اشتباه دسته بندی شده اند ۶ نمونه است که در حالت قبلی یعنی زمانی که از همه ویژکی ها برای آموزش استفاده کردیم این تعداد ۵ نمونه و دقت دسته بندی ۹۶٫۷۷۷۶ درصد بود که در اینجا به ۹۶ درصد کاهش پیدا کرده است. حال کرنل را به rbf تغییر می دهیم و با همین ویژگی ها مجددا بررسی می کنیم:
همان طور که مشاهده می شود در این حالت دقت از ۹۲ درصد به ۹۶ درصد افزایش پیدا کرد و تعداد نمونه های اشتباه دسته بندی شده از ۱۱ عدد به ۶ نمونه کاهش پیدا کرد. پس کاهش attribute ها برای آموزش در کرنل rbf تاثیر مثبت داشت ولی در کرنل polynomial تاثیر منفی گذاشت.

Weka libsvm function
یکی دیگر از توابعی که در Weka برای پیاده سازی SVM  تعریف شده تابع libsvm است که برای استفاده از آن باید کتابخانه libsvm یا libsvm.jar را نیز دانلود کرده و در classpath جاری قرار دهید در غیر این صورت هنگام اجرا با پیغام libsvm classes not in CLASSPATH! روبرو می شوید. کلاسیفایر libsvm تنها یک wrapper است و برای کامپایل به کلاس های libsvm نیاز ندارد و از Reflection استفاده می کند.
با استفاده از کتابخانه libsvm می توان multi class SVM را پیاده سازی کرد. libsvm از الگوریتم SMO برای کرنلایز کردن ماشین بردار پشتیبان استفاده می کند. libsvm استراتژی one against one را برای پیاده سازی multiclass استفاده می کند. به استراتژی one against one اسامی دیگری هم نسبت می دهند: pairwise coupling، all pairs یا round robin. این استراتژی تشکیل شده است از ساخت یک SVM برای هر جفت کلاس. بنابراین برای مسئله ای که c کلاس دارد،  c(c-1)/2 ماشین بردار پشتیبان برای تمییز دادن نمونه های یک کلاس از کلاس دیگر آموزش داده خواهد شد. دسته بندی یک الگوی ناشناخته بر اساس رای ماکزیمم که در آن هر SVM برای یک کلاس رای می دهد انجام می شود.
برای ساخت یک ابرصفحه بهینه، SVM از یک الگوریتم آموزش تکرار شونده استفاده می کند که برای حداقل کردن error function استفاده می شود.
براساس ایجاد error function مدل های SVM  را می توان به  دسته های مجزای classification زیر تقسیم کرد:
Classification SVM Type 1 (که با نام C-SVM classification نیز شناخته می شود)، Classification SVM Type 2 (که با نام nu -SVM classification نیز شناخته می شود) و نوع سوم one- class svm classification است.
در ادامه دو مورد اول این الگوریتم ها تست می شود و کارایی آنها با هم مقایسه خواهد شد. در حالت دیفالت زمانی که libsvm را انتخاب می کنیم از c-svm و کرنل rbf استفاده می کند.
نوع دیگر kernel type است. که در دیتاست های multi class از kernel trick استفاده می کند. در اینجا ۴ تابع کرنل برای انتخاب وجود دارد. کرنل فانکشن Radial basis یکی از معروف ترین و مورد استفاده ترین کرنل هاست. کرنل های مختلف همان طور که قبلا مشاهده شد confusion matrix متفاوتی ایجاد می کنند. این کرنل بصورت غیر خطی نمونه ها را به فضایی با ابعاد بالاتر نگاشت می دهد که بدین ترتیب می تواند بر خلاف کرنل خطی مواردی را که ارتباط میان class label ها و attribute ها غیر خطی می باشد را نیز دسته بندی نماید.
در ادامه ابتدا libsvm را انتخاب می کنیم سپس آن را با انتخاب گزینه use training set روی داده های گل زنبق اجرا می نماییم. در اینجا از هر پنج attribute استفاده می نماییم.
همان طور که مشاهده می شود دقت این دسته بندی ۹۸٫۶۶۶۷ بوده و تنها ۲ نمونه درست دسته بندی نشده اند. در این دسته بندی از c-svm و کرنل rbf استفاده شده است.

Cross validation 10 fold
با این روش دقت به ۹۶٫۶۶۶۷ کاهش یافت و تعداد نمونه هایی که درست دسته بندی نشده اند به ۵ نمونه افزایش پیدا کرد.

حذف سه ویژگی
در این قسمت تنها از دو ویژگی class و petal length استفاده می کنیم. مشاهده می شود که دقت به ۹۵٫۳۳۳ درصد کاهش پیدا کرد و تعداد نمونه هایی که اشتباه دسته بندی شده اند ۷ نمونه هستند.
Visualize classifier errors
در شکل فوق می توان شمای گرافیکی خطاهای دسته بندی انجام شده را مشاهده نمود.
Visualize threshold curve: iris setosa
در شکل فوق منحنی آستانه کلاس Setosa نمایش داده شده است.
Visualize threshold curve: iris virginica
در شکل فوق منحنی آستانه کلاس virginica نمایش داده شده است.
Visualize threshold curve: iris versicolor
در شکل فوق منحنی آستانه کلاس versicolor نمایش داده شده است.

استفاده از nu-svm و دو ویژگی طول و عرض گلبرگ:
قبل از اجرای این حالت برای اینکه بتوانیم nu-svm و c-svm را مقایسه کنیم یکبار دیگر هر دو را با تنظیمات مشابه اجرا کرده و نتیجه اجرای آنها را در اینجا نمایش می دهیم.
اجرای c-svm با انتخاب دو attribute طول و عرض گلبرگ:
با توجه به شکل می توان میزان دقت و خطاهای بدست آمده را مشاهده کرد.

اجرای nu-svm با انتخاب دو attribute طول و عرض گلبرگ:
در اینجا نیز از همان کرنل rbf استفاده شده است. با مقایسه دو شکل بالا مشخص خواهد شد که c-SVM کارایی بهتری نسبت به nu-SVM دارد. Mean absolute error و Mean square error در C-SVM به ترتیب ۰٫۰۲۲ و ۰٫۱۴۹ هستند در حالی که در nu-SVM این مقدار به ترتیب ۰٫۰۲۶ و ۰٫۱۶ می باشد. تعداد نمونه های اشتباه نیز در c-svm  برابر با ۵ و در nu-svm برابر با ۶ نمونه می باشد.

 

————

هدی ابیضی

3 دیدگاه

  1. متشکرم من برای ارزیابی خوشه بندی مشکل دارم و وقت کمی دارم کد آماده ای در این خصوص وجود ندارد .

  2. سلام . دو تا الگوریتم درخت تصمیم گیری و جنگل تصادفی کدوم الگوریتم می باشند ؟ ایا همون SVM , KNN من در وکا نتونستم پیدا کنم ؟ امکانش هست راهنمایی بفرمائید.

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نخواهد شدعلامتدارها لازمند *

*

x

شاید بپسندید

داده کاوی و الگوریتم خوشه بندی kmeans

داده کاوی و الگوریتم خوشه بندی kmeans در این مقاله قصد داریم ...