بهتر است مبتدیان در یادگیری ماشین بر روی دیتاستهای (مجموعه داده های) کوچک دنیای واقعی تمرین کنند. به اصطلاح مجموعه داده های یادگیری ماشین استاندارد شامل مشاهدات واقعی هستند و به خوبی مورد مطالعه و درک قرار می گیرند. به این ترتیب افراد می توانند از آن ها برای آزمایش سریع، اکتشاف و تمرین تکنیک های آماده سازی داده ها و مدل سازی استفاده کنند.
مهارت های ایجاد شده، در مجموعه داده های یادگیری ماشین استاندارد، می تواند زمینه را برای انجام پروژه های بزرگتر و چالش برانگیز فراهم آورد.
در این مقاله دیتاست های استاندارد یادگیری ماشین برای طبقه بندی باینری را مطالعه خواهید کرد.
آنچه در این نوشته خواهیم داشت
ارزش دیتاستهای یادگیری ماشین کوچک
تعدادی دیتاست یادگیری ماشین کوچک برای طبقه بندی و مسائل مدل سازی پیش بینی رگرسیون وجود دارند که اغلب مورد استفاده قرار می گیرند. گاهی اوقات مجموعه داده ها به عنوان پایه ای برای نشان دادن روش یادگیری ماشین یا تکنیک تهیه داده استفاده می شود. در مواردی دیگر، از آنها به عنوان پایه ای برای مقایسه تکنیک های مختلف استفاده می گردد.
این داده ها در اوایل ظهور یادگیری ماشین جمع آوری و در دسترس عموم قرار گرفتند. پیدا کردن یک مدل خوب در یکی از این مجموعه داده ها به این معنی نیست که شما مشکل کلی را حل کرده اید. همچنین، برخی از مجموعه داده ها ممکن است حاوی اسامی یا نشانگرهایی باشند که ممکن است از نظر فرهنگی بحث برانگیز تلقی شوند. به این نوع مجموعه دادهها، مجموعه داده های “TOY” می گویند.
تعریف دیتاست یادگیری ماشین استاندارد
یک مجموعه داده استاندارد یادگیری ماشین دارای خصوصیات زیر است.
- کمتر از ١٠٠٠٠ردیف (نمونه).
- کمتر از ١٠٠ ستون (ویژگی).
- ستون آخر متغیر هدف است.
- در یک پرونده واحد با فرمت CSV و بدون خط Header ذخیره می شود.
- مقادیر ناموجود با یک علامت سؤال (“؟”) مشخص می شوند.
اکنون که تعریف واضحی از مجموعه داده داریم، ببینیم که یک نتیجه “خوب” به چه معنی است.
دیتاست یادگیری ماشین استاندارد
یک دیتاست یادگیری ماشین زمانی استاندارد است که مرتبا در کتاب ها، مقالات تحقیقاتی، آموزش ها، سخنرانی ها و موارد دیگر مورد استفاده قرار بگیرد. بهترین مخزن برای این مجموعه داده های به اصطلاح کلاسیک یا استاندارد یادگیری ماشین، مخزن یادگیری ماشین دانشگاه UCI است. این وب سایت مجموعه داده ها را براساس نوعشان طبقه بندی کرده و بارگیری داده ها و اطلاعات اضافی در مورد هر مجموعه داده و مقالات مربوطه را ارائه می دهد.
نتایج خوب برای مجموعه داده های استاندارد
چالش برای مبتدیان هنگام کار با مجموعه داده های یادگیری ماشین استاندارد این است که چه چیزی یک نتیجه خوب را رقم میزند. خوب به معنای پیش بینی های کامل نیست. همه مدل ها دارای خطاهای پیش بینی هستند و پیش بینی های کامل در مجموعه های داده های دنیای واقعی امکان پذیر نیست. تعریف نتایج “خوب” یا “عالی” برای یک مجموعه داده چالش برانگیز است؛ زیرا به طور کلی به روش ارزیابی مدل، نسخه های مجموعه داده و کتابخانه های مورد استفاده در ارزیابی بستگی دارد.
خوب به معنای “به اندازه کافی خوب” با توجه به منابع موجود است. غالباً ، این به معنای نمره مهارتی (skill score) بالاتر از ٨٠ یا ٩٠ درصد است.
نتایج برای مجموعه داده های طبقه بندی
طبقه بندی یک مساله مدل سازی پیش بینی است که با توجه به یک یا چند متغیر ورودی یک برچسب پیش بینی می کند.
خط مبنا در تسک های طبقه بندی مدلی است که برچسب اکثریت را پیش بینی می کند. در scikit-learn با استفاده از کلاس DummyClassifier با استراتژی ‘most_frequent learn. به عنوان مثال:
model = DummyClassifier(strategy='most_frequent'
ارزیابی استاندارد برای مدل های طبقه بندی، دقت طبقه بندی است.
دو نوع اصلی تسک طبقه بندی وجود دارد: طبقه بندی باینری (binary) و چند طبقه (multi-class).
دیتاست های طبقه بندی باینری
در این بخش، ما خط مبنا و عملکرد خوب را در دیتاستهای مدل سازی پیش بینی طبقه بندی باینری زیر بررسی خواهیم کرد:
- Ionosphere
- Pima Indian Diabetes
- Sonar
- Wisconsin Breast Cancer
- Horse Colic
Ionosphere
فایل های زیر را دانلود کنید:
مثال کامل کد برای دستیابی به خط مبنا و نتیجه خوب در این مجموعه داده در زیر آورده شده است.
#baseline and good result for Ionosphere from numpy import mean from numpy import std from pandas import read_csv from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler from sklearn.dummy import DummyClassifier from sklearn.svm import SVC #load dataset url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/ionosphere.csv' dataframe = read_csv(url, header=None) data = dataframe.values X, y = data[:, :-1], data[:, -1] print('Shape: %s, %s' % (X.shape,y.shape)) # minimally prepare dataset X = X.astype('float32') y = LabelEncoder().fit_transform(y.astype('str')) # evaluate naive naive = DummyClassifier(strategy='most_frequent') cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(naive, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Baseline: %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # evaluate model model = SVC(kernel='rbf', gamma='scale', C=10) steps = [('s',StandardScaler()), ('n',MinMaxScaler()), ('m',model)] pipeline = Pipeline(steps=steps) m_scores = cross_val_score(pipeline, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Good: %.3f (%.3f)' % (mean(m_scores), std(m_scores)))
با اجرای مثال، باید نتایج زیر را مشاهده کنید.
Shape: (351, 34), (351,) Baseline: 0.641 (0.006) Good: 0.948 (0.033)
Pima Indian Diabetes
فایل های زیر را دانلود کنید:
مثال کامل کد برای دستیابی به خط مبنا و نتیجه خوب در این مجموعه داده در زیر آورده شده است.
baseline and good result for Pima Indian Diabetes from numpy import mean from numpy import std from pandas import read_csv from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold from sklearn.dummy import DummyClassifier from sklearn.linear_model import LogisticRegression # load dataset url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.csv' dataframe = read_csv(url, header=None) d ata = dataframe.values X, y = data[:, :-1], data[:, -1] print('Shape: %s, %s' % (X.shape,y.shape)) # minimally prepare dataset X = X.astype('float32') y = LabelEncoder().fit_transform(y.astype('str')) # evaluate naive naive = DummyClassifier(strategy='most_frequent') cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(naive, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Baseline: %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # evaluate model model = LogisticRegression(solver='newton-cg',penalty='l2',C=1) m_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Good: %.3f (%.3f)' % (mean(m_scores), std(m_scores)))
با اجرای مثال، باید نتایج زیر را مشاهده کنید.
Shape: (768, 8), (768,) Baseline: 0.651 (0.003) Good: 0.774 (0.055)
Sonar
فایل های زیر را دانلود کنید:
مثال کامل کد برای دستیابی به خط مبنا و نتیجه خوب در این مجموعه داده در زیر آورده شده است.
#baseline and good result for Sonar from numpy import mean from numpy import std from pandas import read_csv from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold from sklearn.pipeline import Pipeline from sklearn.preprocessing import PowerTransformer from sklearn.dummy import DummyClassifier from sklearn.neighbors import KNeighborsClassifier # load dataset url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv' dataframe = read_csv(url, header=None) data = dataframe.values X, y = data[:, :-1], data[:, -1] print('Shape: %s, %s' % (X.shape,y.shape)) # minimally prepare dataset X = X.astype('float32') y = LabelEncoder().fit_transform(y.astype('str')) # evaluate naive naive = DummyClassifier(strategy='most_frequent') cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(naive, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Baseline: %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # evaluate model model = KNeighborsClassifier(n_neighbors=2, metric='minkowski', weights='distance') steps = [('p',PowerTransformer()), ('m',model)] pipeline = Pipeline(steps=steps) m_scores = cross_val_score(pipeline, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Good: %.3f (%.3f)' % (mean(m_scores), std(m_scores)))
با اجرای مثال، باید نتایج زیر را مشاهده کنید.
Shape: (208, 60), (208,) Baseline: 0.534 (0.012) Good: 0.882 (0.071)
Wisconsin Breast Cancer
فایل های زیر را دانلود کنید:
مثال کامل کد برای دستیابی به خط مبنا و نتیجه خوب در این مجموعه داده در زیر آورده شده است.
#baseline and good result for Wisconsin Breast Cancer from numpy import mean from numpy import std from pandas import read_csv from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold from sklearn.pipeline import Pipeline from sklearn.preprocessing import PowerTransformer from sklearn.impute import SimpleImputer from sklearn.dummy import DummyClassifier from sklearn.svm import SVC # load dataset url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/breast-cancer-wisconsin.csv' dataframe = read_csv(url, header=None, na_values='?') data = dataframe.values X, y = data[:, :-1], data[:, -1] print('Shape: %s, %s' % (X.shape,y.shape)) # minimally prepare dataset X = X.astype('float32') y = LabelEncoder().fit_transform(y.astype('str')) # evaluate naive naive = DummyClassifier(strategy='most_frequent') cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(naive, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Baseline: %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # evaluate model model = SVC(kernel='sigmoid', gamma='scale', C=0.1) steps = [('i',SimpleImputer(strategy='median')), ('p',PowerTransformer()), ('m',model)] pipeline = Pipeline(steps=steps) m_scores = cross_val_score(pipeline, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Good: %.3f (%.3f)' % (mean(m_scores), std(m_scores)))
با اجرای مثال، باید نتایج زیر را مشاهده کنید:
Shape: (699, 9), (699,) Baseline: 0.655 (0.003) Good: 0.973 (0.019)
Horse Colic
فایل های زیر را دانلود کنید:
مثال کامل کد برای دستیابی به خط مبنا و نتیجه خوب در این مجموعه داده در زیر آورده شده است.
#baseline and good result for Horse Colic from numpy import mean from numpy import std from pandas import read_csv from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedStratifiedKFold from sklearn.pipeline import Pipeline from sklearn.impute import SimpleImputer from sklearn.dummy import DummyClassifier from sklearn.ensemble import RandomForestClassifier # load dataset url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv' dataframe = read_csv(url, header=None, na_values='?') data = dataframe.values ix = [i for i in range(data.shape[1]) if i != 23] X, y = data[:, ix], data[:, 23] print('Shape: %s, %s' % (X.shape,y.shape)) # minimally prepare dataset X = X.astype('float32') y = LabelEncoder().fit_transform(y.astype('str')) # evaluate naive naive = DummyClassifier(strategy='most_frequent') cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) n_scores = cross_val_score(naive, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Baseline: %.3f (%.3f)' % (mean(n_scores), std(n_scores))) # evaluate model model = RandomForestClassifier(n_estimators=1000) imputer = SimpleImputer(strategy='median', add_indicator=True) pipeline = Pipeline(steps=[('i', imputer), ('m', model)]) m_scores = cross_val_score(pipeline, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise') print('Good: %.3f (%.3f)' % (mean(m_scores), std(m_scores)))
با اجرای مثال، باید نتایج زیر را مشاهده کنید.
Shape: (300, 27), (300,) Baseline: 0.637 (0.010) Good: 0.867 (0.055)