خب تا اینجا ما یک آزمایشگاه ساختیم و دیتاستمون رو اضافه و یکسری نمایشهای آماری و نموداری ازش دادیم. تو ادامه میخواییم که بریم و الگوریتمهای مختلف رو ارزیابی کنیم تا بتونیم بهترین الگوریتم رو انتخاب کنیم .
قبل از اینکه بریم و مدلها رو پیاده سازی کنیم ما باید یک تغییر کوچیک تو دیتاستمون بدیم. بدین شکل که از مجموع دیتاستهامون که 150 تا نمونه بودند 80 درصدشون رو برای قسمت آموزش استفاده کنیم و 20 درصدشون هم برای بخش تست. یا داده های آموزشی مدلهامون رو آموزش میدیم و با قسمت تست مدلهامون رو تست میکنیم تا بتونیم بهترین مدل رو انتخاب کنیم.
...
# Split-out validation dataset array = dataset.values X = array[:,0:4] y = array[:,4] X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1)
با توجه به کد x_train و y-train داده های مربوط به آموزش و x-validation و y-validation برای داده های تست می باشد.همچنین random-state بدین منظور است که هر مدل دقیقا همان قسمت از داده را آموزش و تست ببیند و الگوریتمهای مختلف ، داده های مختلف را نگیرند.
در این بخش به ایجاد مدل می پردازیم. در اینجا ما نمیدونیم که کدوم مدل روی دیتاست ما بهتر جواب میده و برای این منظور 6 مدل رو پیاده سازی و بررسی میکنیم .
مدلهایی که در این مثال میخواییم بررسی کنیم :
برای پیاده سازی این 6 مدل کد زیر را به پروژه خود اضافه میکنیم :
...
# Spot Check Algorithms models = [] models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr'))) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) models.append(('CART', DecisionTreeClassifier())) models.append(('NB', GaussianNB())) models.append(('SVM', SVC(gamma='auto'))) # evaluate each model in turn results = [] names = [] for name, model in models: kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True) cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy') results.append(cv_results) names.append(name) print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std()))
با توجه به کد بالا نوع اعتبار سنجی ما از نوع اعتبار سنجی متقابل kfold هستش و تقسیم بندیمونم 10 هستش.یعتی دیتا رو به 10 قسمت تقسیم میکنیم. 9 تاش آموزش و 1 یکی برای تست و سپس تکرار و تکرار.
با اجرای کد تا این مرحله تصویر زیر رو داریم :
نتایجی که شما میگیرید ممکن این ارقام نباشه چون بستگی به سیستم هم داره.
با توجه به نتایج از شکل بالا گزینه آخر یعنی الگوریتم بردار پشتیبان یا SVM نتایج بهتری رو داره و 98 درصد عملکرد داشته.
برای مقایسه شیک تر میتونیم یک نمودار هم برای نتایج مدلهامون ایجاد کنیم :
...
# Compare Algorithms pyplot.boxplot(results, labels=names) pyplot.title('Algorithm Comparison') pyplot.show()
که خروجی زیر رو خواهیم داشت :
خب آمار و ارقام و نمودارها نشون میدن که الگوریتم بردار پشتیبان یا همون svm بهترین و آخرین گزینه برای ما می باشد .برای ایجاد مدل نهایی کد زیر رو به پروژه اضافه میکنیم :
...
# Make predictions on validation dataset model = SVC(gamma='auto') model.fit(X_train, Y_train) predictions = model.predict(X_validation)
خب حالا که مدلمون رو ایجاد کردیم میتونیم نتایج مورد انتظارمون اعتبارسنجی بکنیم و سپس دقت طبقه بندی و ماتریس درهم ریختگی را محاسبه و گزارش نتایج ارایه بدیم.خب برای این کار هم از کد زیر استفاده میکنیم :
# Evaluate predictions print(accuracy_score(Y_validation, predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions))
خروجی نهایی ما :
دقت رو که 96درصد نشون میده . ماتریس درهم ریختگی هم تعداد خطاها رو نشون میده و گزارش نتایج هم نشون دهنده ارزیابی نتایج براساس معیارهای مختلف هست.
بطور کلی با توجه به نتایج با وجود اینکه تعداد نمونه امون کم بوده اما نتایج خوبی رو داشتیم.
سورس کد کامل هر آنچه تو سه قسمت گفته شد :
# Load libraries from pandas import read_csv from pandas.plotting import scatter_matrix from matplotlib import pyplot from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score from sklearn.model_selection import StratifiedKFold from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC # Load dataset mydataset = "C:\\Users\\USER\\Desktop\\machine\\iris.csv" names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] dataset = read_csv(mydataset, names=names) # shape print(dataset.shape) # head print(dataset.head(5)) # descriptions print(dataset.describe()) # class distribution print(dataset.groupby('class').size()) # box and whisker plots dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) pyplot.show() # histograms dataset.hist() pyplot.show() # scatter plot matrix scatter_matrix(dataset) pyplot.show() # Split-out validation dataset array = dataset.values X = array[:,0:4] y = array[:,4] X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1) # Spot Check Algorithms models = [] models.append(('LR', LogisticRegression(solver='liblinear', multi_class='ovr'))) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) models.append(('CART', DecisionTreeClassifier())) models.append(('NB', GaussianNB())) models.append(('SVM', SVC(gamma='auto'))) # evaluate each model in turn results = [] names = [] for name, model in models: kfold = StratifiedKFold(n_splits=10, random_state=1, shuffle=True) cv_results = cross_val_score(model, X_train, Y_train, cv=kfold, scoring='accuracy' results.append(cv_results) names.append(name) print('%s: %f (%f)' % (name, cv_results.mean(), cv_results.std())) # Compare Algorithms pyplot.boxplot(results, labels=names) pyplot.title('Algorithm Comparison') pyplot.show() # Make predictions on validation dataset model = SVC(gamma='auto') model.fit(X_train, Y_train) predictions = model.predict(X_validation) # Evaluate predictions print(accuracy_score(Y_validation, predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions))
سورس کد فقط مدل نهاییمون (بردار پشتیبان) بدون تست و ارزیابی سایر مدلها:
# make predictions from pandas import read_csv from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score from sklearn.svm import SVC # Load dataset mydataset = "C:\\Users\\USER\\Desktop\\machine\\iris.csv" names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] dataset = read_csv(mydataset, names=names) # Split-out validation dataset array = dataset.values X = array[:,0:4] y = array[:,4] X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1) # Make predictions on validation dataset model = SVC(gamma='auto') model.fit(X_train, Y_train) predictions = model.predict(X_validation) # Evaluate predictions print(accuracy_score(Y_validation, predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions))
تمام