دسته بندی دودویی (Binary Classification) — راهنمای کاربردی

۵۴۱ بازدید
آخرین به‌روزرسانی: ۰۶ تیر ۱۴۰۲
زمان مطالعه: ۱۰ دقیقه
دسته بندی دودویی (Binary Classification) — راهنمای کاربردی

در این مطلب، روش انجام دسته بندی دودویی (Binary Classification) در پایتون و با استفاده از کتابخانه یادگیری عمیق کرس (Keras) مورد بررسی قرار گرفته است. «کرس» (Keras) یک کتابخانه «پایتون» (Python Programming Language) برای «یادگیری عمیق» (Deep Learning) است که کتابخانه‌های عددی موثر «تنسورفلو» (TensorFlow) و «ثینو» (Theano) را پوشش می‌دهد. کرس این امکان را فراهم می‌کند که به سادگی و با سرعت، مدل‌های «شبکه‌های عصبی مصنوعی» (Artificial Neural Networks) و یادگیری عمیق را آموزش دهد. در این مطلب، چگونگی استفاده موثر از کتابخانه کرس در پروژه «یادگیری ماشین» (Machine Learning) برای «دسته‌بندی دودویی» (Binary Classification) شرح داده شده است. در ادامه، سرفصل‌های زیر مورد بررسی قرار گرفته‌اند:

  • روش بارگذاری داده‌های آموزش و در دسترس قرار دادن آن برای کرس
  • روش طراحی و آموزش یک شبکه عصبی برای داده‌های جدولی
  • روش ارزیابی کارایی یک مدل شبکه عصبی روی داده‌های دیده نشده
  • روش انجام آماده‌سازی داده‌ها برای بهبود کار هنگام استفاده از شبکه‌های عصبی
  • چگونگی تنظیم توپولوژی و پیکربندی یک شبکه عصبی در کرس

توضیحات پیرامون مجموعه داده

«مجموعه داده‌ای» (Data Set) که در اینجا استفاده شده است، مجموعه داده «Sonar» [+] است. مجموعه داده سونار (Sonar) توسط «گورمن» (Gorman) و «سجنووسکی» (Sejnowski) طی مطالعاتی که پیرامون دسته‌بندی سیگنال‌های سونار با استفاده از شبکه‌های عصبی مصنوعی داشته‌اند، استفاده شده است. هدف از پژوهش‌های انجام شده توسط این دو پژوهشگر، آموزش دادن یک شبکه برای ایجاد تمایز بین سیگنال‌های سونار گسیل شده از یک استوانه فلزی و مواردی است که از صخره‌های تقریبا استوانه‌ای گسیل شده‌اند.

در واقع، این مجموعه داده، آواهای ردیابی شده‌ای که سیگنال‌های گسیل شده گوناگون را باز می‌گرداند، توصیف می‌کند. ۶۰ متغیر ورودی، موارد بازگردانده شده را از زوایای گوناگون قوت می‌بخشند. این یک مسئله دسته‌بندی دودویی است و نیاز به آن دارد که مدل صخره‌ها را از استوانه‌های فلزی تفکیک کند. این مجموعه داده را می‌توان به صورت رایگان دانلود و در پوشه کاری جاری با اسم sonar.csv ذخیره کرد. مجموعه داده سونار به خوبی قابل درک است. همه متغیرها پیوسته و عموما در طیف بین ۰ و ۱ هستند. متغیر خروجی، رشته «M» برای «Mine» و رشته «R» برای «Rock» است که به اعداد صحیح ۰ و ۱ تبدیل خواهد شد.

مزیت استفاده از این مجموعه آن است که یک مساله بنچ‌مارک استاندارد محسوب می‌شود. با استفاده از «اعتبارسنجی متقابل» (Cross-Validation) یک شبکه عصبی باید قادر باشد کارایی در حدود ٪۸۴ را با یک کران بالای در حدود ٪۸۸ روی صحت برای مدل‌های سفارشی به دست آورد.

مدل شبکه عصبی خط مبنا برای دسته بندی دودویی

در ادامه، یک شبکه عصبی خط مبنا و نتایج آن برای این مسئله، ساخته خواهد شد.

کار با «وارد کردن» (Import | ایمپورت) همه دسته‌ها و توابعی که مورد نیاز است آغاز می‌شود.

1import pandas
2from keras.models import Sequential
3from keras.layers import Dense
4from keras.wrappers.scikit_learn import KerasClassifier
5from sklearn.model_selection import cross_val_score
6from sklearn.preprocessing import LabelEncoder
7from sklearn.model_selection import StratifiedKFold
8from sklearn.preprocessing import StandardScaler
9from sklearn.pipeline import Pipeline
10...

اکنون می‌توان مجموعه داده را با استفاده از «پانداس» (Pandas) و ستون‌ها را در ۶۰ متغیر ورودی (X) و یک متغیر خروجی (Y) بارگذاری کرد.

از پانداس برای بارگذاری این داده‌ها استفاده می‌شود زیرا به خوبی رشته‌ها را مدیریت می‌کند (متغیر خروجی)، در حالیکه تلاش برای بارگذاری داده‌ها به طور مستقیم با استفاده از «نام‌پای» (NumPy) دشوارتر خواهد بود.

1...
2# load dataset
3dataframe = pandas.read_csv("sonar.csv", header=None)
4dataset = dataframe.values
5# split into input (X) and output (Y) variables
6X = dataset[:,0:60].astype(float)
7Y = dataset[:,60]

متغیر خروجی، مقادیر رشته است. کاربر باید آن‌ها را به مقادیر صحیح ۰ و ۱ تبدیل کند. می‌توان این کار را با استفاده از کلاس LabelEncoder از «سایکیت‌لرن» (Scikit-Learn) انجام داد. این کلاس، کدبندی مورد نیاز برای استفاده در کل مجموعه داده را با استفاده از تابع fit()‎ فراهم می‌کند. سپس، کدبندی برای ساخت متغیر خروجی جدید با استفاده از تابع transform()‎ انجام می‌شود.

1...
2# encode class values as integers
3encoder = LabelEncoder()
4encoder.fit(Y)
5encoded_Y = encoder.transform(Y)

اکنون، زمان آن رسیده که مدل شبکه عصبی با استفاده از کرس ساخته شود. در ادامه، از سایکیت‌لرن برای ارزیابی مدل با استفاده از «اعتبارسنجی متقاطع k-لایه» (K-Fold Cross Validation) طبقه‌بندی شده، استفاده شده است. این یک روش «بازنمونه‌گیری» (Re-Sampling) است که تخمینی از کارایی مدل فراهم می‌کند.

روش اعتبارسنجی متقابل، این کار را با تقسیم کردن داده‌ها به k بخش و آموزش دادن مدل روی همه بخش‌ها به جز یکی که به عنوان تست نگه داشته شده است تا کارایی مدل را ارزیابی کند، انجام می‌دهد. این فرایند، K بار تکرار می‌شود و امتیاز میانگین در همه مدل‌های ساخته شده به عنوان یک تخمین مستحکم از کارایی است. این روش طبقه‌بندی شده است، بدین معنا که به مقادیر خروجی نگاه می‌کند و تلاش می‌کند تا تعداد نمونه‌هایی که به هر کلاس در K بخش از داده‌ها تعلق دارند را موازنه کند.

برای استفاده از مدل‌های کرس با سایکیت‌لِرن، باید از پوشش‌دهنده KerasClassifier استفاده شود. این کلاس، تابعی را دریافت می‌کند که مدل شبکه عصبی را می‌سازد و باز می‌گرداند. همچنین، آرگومان‌هایی را دریافت می‌کند که در کنار فراخوانی به fit()‎ پاس می‌دهد؛ از این جمله می‌توان به تعداد «دوره‌ها» (Epochs) و سایز دسته اشاره کرد.

کار با تعریف تابعی آغاز می‌شود که مدل مبنا را می‌سازد. مدل یک لایه کاملا متصل پنهان را با تعداد مشابهی از نورون‌ها به عنوان متغیرهای ورودی می‌سازد. این مورد، به عنوان یک نقطه شروع پیش‌فرض خوب در هنگام ساخت شبکه‌های عصبی است.

وزن‌ها با استفاده از یک عدد تصادفی گاوسی کوچک مقداردهی اولیه می‌شوند. در اینجا، تابع فعال‌سازی «یکسوساز» (Rectifier) مورد استفاده قرار گرفته است. لایه خروجی، حاوی یک نورون یکتا به منظور انجام پیش‌بینی است. این مورد، از تابع «فعال‌سازی سیگموئید» (Sigmoid Activation Function) به منظور تولید خروجی احتمالی در طیف از ۰ و ۱ استفاده می‌کند که می‌تواند به راحتی و به صورت خودکار به مقادیر کلاس کریسپ تبدیل شود.

در نهایت، از تابع زیان لگاریتمی (binary_crossentropy) در طول آموزش استفاده می‌شود، که تابع زیان ترجیح داده شده برای مساله دسته‌بندی دودویی است. مدل همچنین از الگوریتم بهینه‌سازی موثر «آدام» (Adam Optimization) برای «گرادیان کاهشی» (Gradient Descent) استفاده می‌کند و سنجه‌های صحت هنگامی گردآوری می‌شوند که مدل آموزش دید.

1# baseline model
2def create_baseline():
3	# create model
4	model = Sequential()
5	model.add(Dense(60, input_dim=60, activation='relu'))
6	model.add(Dense(1, activation='sigmoid'))
7	# Compile model
8	model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
9	return model

اکنون، زمان آن فرا رسیده که این مدل را با استفاده از اعتبارسنجی متقابل طبقه‌بندی شده در چارچوب سایکیت‌لرن ارزیابی کرد. عدد دوره‌های آموزش مجددا با استفاده از مقادیر پیش‌فرض مناسب، به KerasClassifier پاس داده می‌شود. همچنین، خروجی طولانی نیز خاموش می‌شود که موجب می‌شود مدل ۱۰ بار برای انجام شدن اعتبارسنجی متقاطع ۱۰ لایه ساخته شود.

1...
2# evaluate model with standardized dataset
3estimator = KerasClassifier(build_fn=create_baseline, epochs=100, batch_size=5, verbose=0)
4kfold = StratifiedKFold(n_splits=10, shuffle=True)
5results = cross_val_score(estimator, X, encoded_Y, cv=kfold)
6print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

با قرار دادن کلیه این موارد در کنار هم، مثال کامل به صورت زیر حاصل می‌شود.

1# Binary Classification with Sonar Dataset: Baseline
2from pandas import read_csv
3from keras.models import Sequential
4from keras.layers import Dense
5from keras.wrappers.scikit_learn import KerasClassifier
6from sklearn.model_selection import cross_val_score
7from sklearn.preprocessing import LabelEncoder
8from sklearn.model_selection import StratifiedKFold
9# load dataset
10dataframe = read_csv("sonar.csv", header=None)
11dataset = dataframe.values
12# split into input (X) and output (Y) variables
13X = dataset[:,0:60].astype(float)
14Y = dataset[:,60]
15# encode class values as integers
16encoder = LabelEncoder()
17encoder.fit(Y)
18encoded_Y = encoder.transform(Y)
19# baseline model
20def create_baseline():
21	# create model
22	model = Sequential()
23	model.add(Dense(60, input_dim=60, activation='relu'))
24	model.add(Dense(1, activation='sigmoid'))
25	# Compile model
26	model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
27	return model
28# evaluate model with standardized dataset
29estimator = KerasClassifier(build_fn=create_baseline, epochs=100, batch_size=5, verbose=0)
30kfold = StratifiedKFold(n_splits=10, shuffle=True)
31results = cross_val_score(estimator, X, encoded_Y, cv=kfold)
32print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

با اجرای قطعه کد بالا، خروجی زیر تولید می‌شود که میانگین و انحراف معیار صحت تخمین زده شده از مدل روی داده‌های دیده نشده را نشان می‌دهد.

تذکر: خروجی‌های حاصل در دفعات مختلف اجرا ممکن است متفاوت باشند. دلیل این امر، ماهیت تصادفی الگوریتم یادگیری مورد استفاده است. باید این موضوع را در نظر داشت که الگوریتم را باید چندین بار اجرا و میانگین خروجی‌ها را محاسبه کرد.

Baseline: 81.68% (7.26%)

این یک امتیاز خوب است که بدون انجام دادن کارهای سخت، حاصل شد.

اجرای مجدد مدل مبنا با آماده‌سازی داده‌ها

آماده سازی داده‌ها پیش از مدل‌سازی یک اقدام مثبت و لازم است. مدل‌های شبکه‌های عصبی به طور خاص برای داشتن مقادیر ورودی سازگار، هم در مقیاس و هم توزیع، مناسب هستند. یک شمای آماده‌سازی داده‌های موثر برای داده‌های جدولی هنگام ساخت مدل‌های شبکه عصبی، استانداردسازی است. این جایی است که داده‌ها دوباره مقیاس‌دهی شده‌اند، به طوری که مقدار میانگین برای هر خصیصه برابر با ۰ و انحراف معیار ۱ است. این امر، توزیع گاوسی و شبه گاوسی را حفظ می‌کند، ضمن اینکه معیارهای مرکزی را برای هر خصیصه نرمال‌سازی می‌کند.

می‌توان از سایکیت‌لرن برای انجام استانداردسازی مجموعه داده Sonar با استفاده از کلاس StandardScaler استفاده کرد. به جای انجام استانداردسازی روی کل مجموعه داده، بهتر است سعی شود که روال استانداردسازی روی داده‌های آموزش، در طول اجرای اعتبارسنجی متقابل  آموزش داده شود و از استانداردسازی آموزش دیده برای آماده‌سازی لایه تست «دیده نشده» استفاده شود. این امر موجب می‌شود استانداردسازی یک گام در آماده‌سازی مدل در فرایند اعتبارسنجی متقابل باشد و از آنکه الگوریتم دانشی پیرامون «داده‌های دیده نشده» در طول ارزیابی داشته باشد، جلوگیری می‌کند؛ دانشی که ممکن است از شمای آموزش داده‌ها همچون توزیعی خرد، پاس داده شود.

می‌توان این خواسته را با استفاده از «پایپ‌لاین» (Pipeline) کتابخانه سایکیت‌لرن به دست آورد. این پایپ‌لاین، پوششی است که یک یا تعداد بیشتری مدل را درون یک پاس از روال اعتبارسنجی متقابل اجرا کند. در  اینجا، می‌توان پایپ‌لاینی را با StandardScaler که به وسیله مدل شبکه عصبی دنبال می‌شود، تعریف کرد.

1...
2# evaluate baseline model with standardized dataset
3estimators = []
4estimators.append(('standardize', StandardScaler()))
5estimators.append(('mlp', KerasClassifier(build_fn=create_baseline, epochs=100, batch_size=5, verbose=0)))
6pipeline = Pipeline(estimators)
7kfold = StratifiedKFold(n_splits=10, shuffle=True)
8results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
9print("Standardized: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

با قرار دادن کلیه این موارد در کنار یکدیگر، خروجی به صورت زیر خواهد بود.

1# Binary Classification with Sonar Dataset: Standardized
2from pandas import read_csv
3from keras.models import Sequential
4from keras.layers import Dense
5from keras.wrappers.scikit_learn import KerasClassifier
6from sklearn.model_selection import cross_val_score
7from sklearn.preprocessing import LabelEncoder
8from sklearn.model_selection import StratifiedKFold
9from sklearn.preprocessing import StandardScaler
10from sklearn.pipeline import Pipeline
11# load dataset
12dataframe = read_csv("sonar.csv", header=None)
13dataset = dataframe.values
14# split into input (X) and output (Y) variables
15X = dataset[:,0:60].astype(float)
16Y = dataset[:,60]
17# encode class values as integers
18encoder = LabelEncoder()
19encoder.fit(Y)
20encoded_Y = encoder.transform(Y)
21# baseline model
22def create_baseline():
23	# create model
24	model = Sequential()
25	model.add(Dense(60, input_dim=60, activation='relu'))
26	model.add(Dense(1, activation='sigmoid'))
27	# Compile model
28	model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
29	return model
30# evaluate baseline model with standardized dataset
31estimators = []
32estimators.append(('standardize', StandardScaler()))
33estimators.append(('mlp', KerasClassifier(build_fn=create_baseline, epochs=100, batch_size=5, verbose=0)))
34pipeline = Pipeline(estimators)
35kfold = StratifiedKFold(n_splits=10, shuffle=True)
36results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
37print("Standardized: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

با اجرای مثال بالا، نتایج زیر حاصل می‌شود.

تذکر: نتایج ممکن است به دلیل ماهیت تصادفی الگوریتم در اجراهای مختلف متفاوت باشد. بنابراین، بهتر است که چندین بار خروجی گرفته شود و کارایی میانگین در نظر گرفته شود. می‌توان بهبود اندک اما خیلی خوبی را در صحت میانگین مشاهده کرد.

Standardized: 84.56% (5.74%)

تنظیم لایه‌ها و تعداد نورون‌ها در مدل

چیزهای زیادی وجود دارد که باید در یک شبکه عصبی تنظیم شوند که از این جمله می‌توان به مقداردهی اولیه وزن‌ها، تابع فعال‌سازی، روال بهینه‌سازی و دیگر موارد اشاره کرد. جنبه‌ای که ممکن است یک تاثیر بزرگ داشته باشد، ساختار خود شبکه است که به آن، توپولوژی شبکه گفته می‌شود. در این بخش، نگاهی به دو تجربه روی ساختار شبکه انداخته می‌شود: بزرگ‌تر کردن و کوچک‌تر کردن آن. این‌ها تجربیات خوبی برای اجرا در هنگام تنظیم شبکه روی مسئله هستند.

ارزیابی یک شبکه کوچک‌تر

به نظر می‌رسد که «افزونگی» (Redundancy) زیادی در متغیرهای ورودی برای مسئله وجود دارد. داده‌ها سیگنال مشابهی را از زوایای گوناگون توصیف می‌کنند. ممکن است برخی از این زوایا نسبت به دیگر موارد مرتبط‌تر باشند. می‌توان نوعی از استخراج ویژگی را در شبکه با محدود کردن فضای بازنمایی در اولین لایه پنهان انجام داد.

در این آزمایش، مدل مبنا با ۶۰ نورون در لایه پنهان و کاهش آن به ۳۰ گرفته می‌شود. این موجب می‌شود در طول آموزش، فشار روی شبکه قرار بگیرد تا مهم‌ترین ساختارها در داده‌های ورودی برای مدل انتخاب شوند.

همچنین، داده‌ها در آزمایش پیشین با آماده‌سازی داده‌ها استانداردسازی می‌شوند و تلاش می‌شود تا از مزایای آن در بالا رفتن جزئی در کارایی استفاده شود.

1...
2# smaller model
3def create_smaller():
4	# create model
5	model = Sequential()
6	model.add(Dense(30, input_dim=60, activation='relu'))
7	model.add(Dense(1, activation='sigmoid'))
8	# Compile model
9	model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
10	return model
11estimators = []
12estimators.append(('standardize', StandardScaler()))
13estimators.append(('mlp', KerasClassifier(build_fn=create_smaller, epochs=100, batch_size=5, verbose=0)))
14pipeline = Pipeline(estimators)
15kfold = StratifiedKFold(n_splits=10, shuffle=True)
16results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
17print("Smaller: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

با آزمودن کلیه این موارد با یکدیگر، مثال کامل به صورت زیر خواهد بود.

1# Binary Classification with Sonar Dataset: Standardized Smaller
2from pandas import read_csv
3from keras.models import Sequential
4from keras.layers import Dense
5from keras.wrappers.scikit_learn import KerasClassifier
6from sklearn.model_selection import cross_val_score
7from sklearn.preprocessing import LabelEncoder
8from sklearn.model_selection import StratifiedKFold
9from sklearn.preprocessing import StandardScaler
10from sklearn.pipeline import Pipeline
11# load dataset
12dataframe = read_csv("sonar.csv", header=None)
13dataset = dataframe.values
14# split into input (X) and output (Y) variables
15X = dataset[:,0:60].astype(float)
16Y = dataset[:,60]
17# encode class values as integers
18encoder = LabelEncoder()
19encoder.fit(Y)
20encoded_Y = encoder.transform(Y)
21# smaller model
22def create_smaller():
23	# create model
24	model = Sequential()
25	model.add(Dense(30, input_dim=60, activation='relu'))
26	model.add(Dense(1, activation='sigmoid'))
27	# Compile model
28	model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
29	return model
30estimators = []
31estimators.append(('standardize', StandardScaler()))
32estimators.append(('mlp', KerasClassifier(build_fn=create_smaller, epochs=100, batch_size=5, verbose=0)))
33pipeline = Pipeline(estimators)
34kfold = StratifiedKFold(n_splits=10, shuffle=True)
35results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
36print("Smaller: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

اجرای این مثال، نتایج زیر را به دست می‌دهد. می‌توان مشاهده کرد که تقویت جزئی در صحت میانگین تخمین زده شده و کاهش مهمی در «انحراف معیار» (Standard Deviation) (توزیع میانگین) از امتیاز صحت برای مدل اتفاق افتاده است.

نکته: نتایج در اجراهای مختلف ممکن است به دلیل ماهیت تصادفی الگوریتم یادگیری، متفاوت باشد. بنابراین، توصیه می‌شود که چندین اجرا گرفته و کارایی میانگین در نظر گرفته شود. این نتیجه خوبی است زیرا کار با شبکه‌ای با اندازه نصف، بهتر است و در نتیجه، نیمی زمان برای آموزش شبکه می‌برد.

Smaller: 86.04% (4.00%)

ارزیابی یک شبکه بزرگ‌تر

توپولوژی شبکه عصبی با لایه‌های بیشتر منجر به فرصت‌های بیشتری برای شبکه عصبی به منظور استخراج ویژگی‌های کلیدی و ترکیب مجدد آن‌ها در راه‌های مفید غیر خطی می‌شود. می‌توان ارزیابی کرد که افزودن لایه‌های بیشتر به شبکه، کارایی را به سادگی با انجام پیچش ناچیزی در تابع مورد استفاده برای ساخت مدل بهبود داد. در اینجا، یک لایه جدید (یک خط) به شبکه اضافه می‌شود که لایه پنهان دیگری با ۳۰ نورون را پس از لایه اول، معرفی می‌کند. شبکه اکنون دارای توپولوژی زیر است.

60 inputs -> [60 -> 30] -> 1 output

ایده در اینجا آن است که به شبکه فرصت آن که همه متغیرهای ورودی را پیش از قرار گرفتن در تنگنا و نصف کردن ظرفیت ارائه شود، مدل کند؛ درست مانند آنچه در مثال بالا و با شبکه کوچک‌تر انجام شد. به جای فشرده‌سازی نمایش خود ورودی‌ها، لایه پنهان دیگری وجود دارد تا در فرایند کمک کند.

1...
2# larger model
3def create_larger():
4	# create model
5	model = Sequential()
6	model.add(Dense(60, input_dim=60, activation='relu'))
7	model.add(Dense(30, activation='relu'))
8	model.add(Dense(1, activation='sigmoid'))
9	# Compile model
10	model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
11	return model
12estimators = []
13estimators.append(('standardize', StandardScaler()))
14estimators.append(('mlp', KerasClassifier(build_fn=create_larger, epochs=100, batch_size=5, verbose=0)))
15pipeline = Pipeline(estimators)
16kfold = StratifiedKFold(n_splits=10, shuffle=True)
17results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
18print("Larger: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

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

1# Binary Classification with Sonar Dataset: Standardized Larger
2from pandas import read_csv
3from keras.models import Sequential
4from keras.layers import Dense
5from keras.wrappers.scikit_learn import KerasClassifier
6from sklearn.model_selection import cross_val_score
7from sklearn.preprocessing import LabelEncoder
8from sklearn.model_selection import StratifiedKFold
9from sklearn.preprocessing import StandardScaler
10from sklearn.pipeline import Pipeline
11# load dataset
12dataframe = read_csv("sonar.csv", header=None)
13dataset = dataframe.values
14# split into input (X) and output (Y) variables
15X = dataset[:,0:60].astype(float)
16Y = dataset[:,60]
17# encode class values as integers
18encoder = LabelEncoder()
19encoder.fit(Y)
20encoded_Y = encoder.transform(Y)
21# larger model
22def create_larger():
23	# create model
24	model = Sequential()
25	model.add(Dense(60, input_dim=60, activation='relu'))
26	model.add(Dense(30, activation='relu'))
27	model.add(Dense(1, activation='sigmoid'))
28	# Compile model
29	model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
30	return model
31estimators = []
32estimators.append(('standardize', StandardScaler()))
33estimators.append(('mlp', KerasClassifier(build_fn=create_larger, epochs=100, batch_size=5, verbose=0)))
34pipeline = Pipeline(estimators)
35kfold = StratifiedKFold(n_splits=10, shuffle=True)
36results = cross_val_score(pipeline, X, encoded_Y, cv=kfold)
37print("Larger: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))

با اجرای مثال بالا، خروجی‌های زیر حاصل می‌شوند.

تذکر: به دلیل ماهیت تصادفی الگوریتم یادگیری،‌ ممکن است نتایج در اجراهای مختلف متفاوت باشند. در نتیجه، باید مثال را چندین بار اجرا کرد و کارایی میانگین را در نظر گرفت.

Larger: 83.14% (4.52%)

با تنظیمات بیشتر جنبه‌هایی مانند الگوریتم بهینه‌سازی و تعداد دوره‌های آموزش، انتظار می‌رود که بهبودهای بیشتری امکان‌پذیر باشند.

اگر مطلب بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شود:

^^

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Machine Learning Mastery
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *