از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
دسته بندی گروه/رای گیری در پایتون با Scikit-Learn
سرفصلهای مطلب
معرفی
مدل های طبقه بندی مجموعه می توانند ابزارهای یادگیری ماشینی قدرتمندی باشند که قادر به دستیابی به عملکرد عالی و تعمیم خوبی به مجموعه داده های جدید و دیده نشده هستند.
ارزش یک طبقهبندیکننده گروهی در این است که با پیوستن به پیشبینیهای طبقهبندیکنندههای متعدد، میتواند خطاهای ایجاد شده توسط هر طبقهبندیکننده را تصحیح کند و به طور کلی به دقت بهتری منجر شود. بیایید نگاهی به روشهای مختلف طبقهبندی گروه بیندازیم و ببینیم چگونه میتوان این طبقهبندیکنندهها را در Scikit-Learn پیادهسازی کرد.
مدل های گروهی در یادگیری ماشینی چیست؟
اعتبار: پیکسابای
مدل های آنسامبل یک یادگیری گروهی روشی که الگوریتم های مختلف را با هم ترکیب می کند. از این نظر، این یک متاالگوریتم است تا یک الگوریتم. روش های یادگیری گروهی ارزشمند هستند زیرا می توانند عملکرد یک مدل پیش بینی را بهبود بخشند.
روشهای یادگیری گروهی از این ایده که گره زدن پیشبینیهای دستهبندیکنندههای متعدد با هم، با بهبود دقت پیشبینی یا کاهش جنبههایی مانند عملکرد بهتر، منتفی است. سوگیری و واریانس
به طور کلی، یک مدل مجموعه به یکی از دو دسته تقسیم می شود: رویکردهای متوالی و رویکردهای موازی.
آ گروه متوالی مدل با ایجاد متوالی یادگیرندگان/مدل های پایه عمل می کند. روشهای متوالی مجموعه معمولاً برای تلاش و افزایش عملکرد کلی استفاده میشوند، زیرا مدل مجموعه میتواند پیشبینیهای نادرست را با وزندهی مجدد نمونههایی که قبلاً به اشتباه طبقهبندی شدهاند، جبران کند. یک مثال قابل توجه در این مورد است AdaBoost.
آ مدل موازی همانطور که ممکن است بتوانید حدس بزنید، روش هایی است که متکی هستند روی ایجاد و آموزش زبان آموزان پایه به صورت موازی. هدف روشهای موازی کاهش میزان خطا با آموزش مدلهای متعدد به صورت موازی و میانگینگیری نتایج با هم است. یک مثال قابل توجه از روش موازی، طبقهبندی جنگل تصادفی است.
راه دیگر تفکر در این مورد، تمایز بین همگن و ناهمگون زبان آموزان در حالی که بیشتر روشهای یادگیری گروهی از یادگیرندگان پایه همگن استفاده میکنند (بسیاری از همان نوع یادگیرندگان)، برخی از روشهای گروهی از یادگیرندگان ناهمگن (الگوریتمهای مختلف یادگیری به هم پیوستهاند) استفاده میکنند.
برای جمع بندی:
- مدلهای متوالی سعی میکنند با وزندهی مجدد نمونهها، عملکرد را افزایش دهند و مدلها به ترتیب تولید میشوند.
- مدلهای موازی با میانگینگیری نتایج با هم پس از آموزش چندین مدل به طور همزمان کار میکنند.
اکنون روشهای مختلف استفاده از این مدلها را برای حل مشکلات طبقهبندی یادگیری ماشین پوشش میدهیم.
روش های مختلف طبقه بندی گروه
کوله بری
اعتبار: ویکیمدیا کامانز
کوله بری، همچنین به عنوان شناخته شده است جمع آوری بوت استرپ، یک روش طبقه بندی است که هدف آن کاهش واریانس تخمین ها با میانگین گیری چندین تخمین با هم است. Bagging زیرمجموعه هایی را از مجموعه داده اصلی ایجاد می کند که یادگیرندگان آموزش می بینند روی.
برای اینکه پیشبینیهای طبقهبندیکنندههای مختلف تجمیع شوند، یا از میانگینگیری برای رگرسیون استفاده میشود، یا از رویکرد رأیگیری برای طبقهبندی استفاده میشود (بر اساس روی تصمیم اکثریت).
یکی از نمونه های روش طبقه بندی کیسه ای است طبقه بندی جنگل های تصادفی. در مورد طبقهبندی جنگلهای تصادفی، تمام درختان منفرد آموزش داده میشوند روی نمونه متفاوتی از مجموعه داده
درخت همچنین با استفاده از انتخاب های تصادفی از ویژگی ها آموزش داده می شود. هنگامی که نتایج با هم میانگین می شوند، واریانس کلی کاهش می یابد و در نتیجه مدل بهتر عمل می کند.
افزایش
تقویت الگوریتم ها می توانند مدل های ضعیف و با عملکرد ضعیف را انتخاب کرده و آنها را به مدل های قوی تبدیل کنند. ایده پشت الگوریتمهای تقویت این است که شما مدلهای یادگیری ضعیف زیادی را به مجموعه دادهها اختصاص میدهید، و سپس وزنهای نمونههای طبقهبندیشده اشتباه در طول دورههای بعدی یادگیری بهینه میشوند.
پیشبینیهای طبقهبندیکنندهها تجمیع میشوند و سپس پیشبینیهای نهایی از طریق جمع وزنی (در مورد رگرسیون)، یا رای اکثریت وزنی (در مورد طبقهبندی) انجام میشود.
AdaBoost یکی از نمونههای روش طبقهبندی کننده تقویتی است، همانطور که Gradient Boosting نیز از الگوریتم فوق مشتق شده است.
اگر مایلید در مورد تقویت گرادیان و تئوری پشت آن بیشتر بخوانید، قبلاً در مقاله قبلی به آن پرداخته ایم.
پشتهسازی
اعتبار: ویکیمدیا کامانز
الگوریتم های انباشتگی یک روش یادگیری گروهی است که تصمیم گیری از الگوریتم های مختلف رگرسیون یا طبقه بندی را ترکیب می کند. مدل های اجزا آموزش دیده اند روی کل مجموعه داده آموزشی پس از آموزش این مدلهای اجزا، یک متا مدل از مدلهای مختلف مونتاژ میشود و سپس آموزش داده میشود. روی خروجی های مدل های جزء این رویکرد معمولاً یک مجموعه ناهمگن ایجاد می کند زیرا مدل های مؤلفه معمولاً الگوریتم های متفاوتی هستند.
نمونه اجراها
اکنون که روشهای مختلفی را بررسی کردهایم که میتوانیم از آنها برای ایجاد مدلهای مجموعه استفاده کنیم، بیایید نگاهی بیندازیم که چگونه میتوانیم یک طبقهبندی کننده را با استفاده از روشهای مختلف پیادهسازی کنیم.
اگرچه، قبل از اینکه بتوانیم نگاهی به روشهای مختلف پیادهسازی طبقهبندیکنندههای گروه بیندازیم، باید یک مجموعه داده را برای استفاده انتخاب کنیم و پیشپردازش مجموعه داده را انجام دهیم.
ما از مجموعه داده تایتانیک استفاده خواهیم کرد که می تواند باشد اینجا دانلود شده است. بیایید قبل از پردازش داده ها را انجام دهیم تا از مقادیر از دست رفته خلاص شویم و داده ها را در محدوده یکنواخت مقیاس کنیم. سپس میتوانیم به راهاندازی طبقهبندیکنندههای گروهی بپردازیم.
پیش پردازش داده ها
برای شروع، ما با وارد کردن تمام توابع مورد نیاز از کتابخانه های مربوطه شروع می کنیم. استفاده خواهیم کرد پانداها و ناامپی برای بارگذاری و تبدیل داده ها، و همچنین LabelEncoder
و StandardScaler
ابزار.
ما همچنین به معیارهای یادگیری ماشینی نیاز خواهیم داشت train_test_split
تابع. در نهایت، ما به طبقهبندیکنندههایی که میخواهیم استفاده کنیم نیاز داریم:
import pandas as pd
import numpy as np
import warnings
from sklearn.preprocessing import LabelEncoder, StandardScaler
from sklearn.metrics import accuracy_score, f1_score, log_loss
from sklearn.model_selection import train_test_split, KFold, cross_val_score
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import AdaBoostClassifier, RandomForestClassifier, ExtraTreesClassifier
ما با بارگیری داده های آموزشی و آزمایشی و سپس ایجاد یک تابع برای بررسی وجود مقادیر تهی شروع می کنیم:
training_data = pd.read_csv("train.csv")
testing_data = pd.read_csv("test.csv")
def get_nulls(training, testing):
print("Training Data:")
print(pd.isnull(training).sum())
print("Testing Data:")
print(pd.isnull(testing).sum())
get_nulls(training_data, testing_data)
همانطور که اتفاق می افتد، مقادیر زیادی از دست رفته در آن وجود دارد Age
و Cabin
دسته بندی ها.
Training Data:
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
Testing Data:
PassengerId 0
Pclass 0
Name 0
Sex 0
Age 86
SibSp 0
Parch 0
Ticket 0
Fare 1
Cabin 327
Embarked 0
dtype: int64
ما با حذف برخی از ستونهایی که احتمالاً بیفایده خواهند بود شروع میکنیم Cabin
ستون و Ticket
ستون این Cabin
ستون دارای مقادیر بسیار زیادی از دست رفته است Ticket
ستون به سادگی از دسته بندی های زیادی تشکیل شده است که مفید نیست.
پس از آن، ما باید مقداری از دست رفته را نسبت دهیم. وقتی این کار را انجام میدهیم، باید روش انحراف کمی مجموعه داده را در نظر بگیریم (سنین جوان کمی برجستهتر از سنین بزرگتر هستند). هنگامی که داده ها را درج می کنیم، از مقادیر میانه استفاده می کنیم، زیرا به دلیل مقادیر پرت بزرگ، گرفتن مقادیر متوسط، مقادیر ورودی را به ما می دهد که از مرکز مجموعه داده دور هستند:
training_data.drop(labels=('Cabin', 'Ticket', 'Name'), axis=1, inplace=True)
testing_data.drop(labels=('Cabin', 'Ticket', 'Name'), axis=1, inplace=True)
training_data("Age").fillna(training_data("Age").median(), inplace=True)
testing_data("Age").fillna(testing_data("Age").median(), inplace=True)
training_data("Embarked").fillna("S", inplace=True)
testing_data("Fare").fillna(testing_data("Fare").median(), inplace=True)
get_nulls(training_data, testing_data)
اکنون میتوانیم ببینیم که هیچ مقدار گمشده دیگری وجود ندارد:
Training Data:
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 0
SibSp 0
Parch 0
Fare 0
Embarked 0
dtype: int64
Testing Data:
PassengerId 0
Pclass 0
Name 0
Sex 0
Age 0
SibSp 0
Parch 0
Fare 0
Embarked 0
dtype: int64
اکنون باید داده های غیر عددی را رمزگذاری کنیم. بیایید راه اندازی کنیم LabelEncoder
و متناسب با آن روی را Sex
قابلیت و سپس تبدیل داده ها با رمزگذار. سپس مقادیر موجود در را جایگزین می کنیم Sex
ویژگی با آنهایی که کدگذاری شده اند و سپس همین کار را برای آن انجام دهید Embarked
ویژگی.
در نهایت، اجازه دهید داده ها را با استفاده از مقیاس بندی کنیم StandardScaler
، بنابراین نوسانات زیادی در ارزش ها وجود ندارد.
encoder_1 = LabelEncoder()
encoder_1.fit(training_data("Sex"))
training_sex_encoded = encoder_1.transform(training_data("Sex"))
training_data("Sex") = training_sex_encoded
test_sex_encoded = encoder_1.transform(testing_data("Sex"))
testing_data("Sex") = test_sex_encoded
encoder_2 = LabelEncoder()
encoder_2.fit(training_data("Embarked"))
training_embarked_encoded = encoder_2.transform(training_data("Embarked"))
training_data("Embarked") = training_embarked_encoded
testing_embarked_encoded = encoder_2.transform(testing_data("Embarked"))
testing_data("Embarked") = testing_embarked_encoded
ages_train = np.array(training_data("Age")).reshape(-1, 1)
fares_train = np.array(training_data("Fare")).reshape(-1, 1)
ages_test = np.array(testing_data("Age")).reshape(-1, 1)
fares_test = np.array(testing_data("Fare")).reshape(-1, 1)
scaler = StandardScaler()
training_data("Age") = scaler.fit_transform(ages_train)
training_data("Fare") = scaler.fit_transform(fares_train)
testing_data("Age") = scaler.fit_transform(ages_test)
testing_data("Fare") = scaler.fit_transform(fares_test)
اکنون که داده های ما از قبل پردازش شده است، می توانیم ویژگی ها و برچسب های خود را انتخاب کرده و سپس از آن استفاده کنیم train_test_split
عملکردی برای تقسیم کل داده های آموزشی ما به مجموعه های آموزشی و آزمایشی:
X_features = training_data.drop(labels=('PassengerId', 'Survived'), axis=1)
y_labels = training_data('Survived')
print(X_features.head(5))
X_train, X_val, y_train, y_val = train_test_split(X_features, y_labels, test_size=0.1, random_state=27)
ما اکنون آماده شروع پیاده سازی روش های طبقه بندی گروهی هستیم.
روش میانگین گیری ساده
قبل از اینکه به سه روش گروه بزرگی که قبلاً توضیح دادیم وارد شویم، اجازه دهید یک روش بسیار سریع و آسان برای استفاده از یک رویکرد گروهی را پوشش دهیم – پیش بینی های میانگین. ما به سادگی مقادیر مختلف پیشبینیشده طبقهبندیکنندههای انتخابی خود را با هم جمع میکنیم و سپس بر تعداد کل طبقهبندیکنندهها تقسیم میکنیم، با استفاده از تقسیم طبقه برای به دست آوردن یک مقدار کامل.
در این مورد آزمایشی ما از رگرسیون لجستیک، یک طبقهبندی درخت تصمیم و طبقهبندی بردار پشتیبانی استفاده خواهیم کرد. ما متناسب با طبقه بندی کننده ها هستیم روی داده ها و سپس پیش بینی ها را به عنوان متغیر ذخیره کنید. سپس به سادگی پیش بینی ها را با هم جمع کرده و تقسیم می کنیم:
LogReg_clf = LogisticRegression()
DTree_clf = DecisionTreeClassifier()
SVC_clf = SVC()
LogReg_clf.fit(X_train, y_train)
DTree_clf.fit(X_train, y_train)
SVC_clf.fit(X_train, y_train)
LogReg_pred = LogReg_clf.predict(X_val)
DTree_pred = DTree_clf.predict(X_val)
SVC_pred = SVC_clf.predict(X_val)
averaged_preds = (LogReg_pred + DTree_pred + SVC_pred)//3
acc = accuracy_score(y_val, averaged_preds)
print(acc)
دقتی که از این روش به دست آوردیم در اینجا آمده است:
0.8444444444444444
مثال طبقه بندی Voting\Stacking
وقتی نوبت به ایجاد یک طبقه بندی کننده انباشته/رای گیری می رسد، Scikit-Learn برخی از توابع مفید را در اختیار ما قرار می دهد که می توانیم برای انجام این کار از آنها استفاده کنیم.
این VotingClassifier فهرستی از برآوردگرهای مختلف را به عنوان استدلال و روش رای گیری در نظر می گیرد. این hard
روش رای گیری از برچسب های پیش بینی شده و سیستم قوانین اکثریت استفاده می کند، در حالی که soft
روش رای گیری یک برچسب را پیش بینی می کند روی argmax/بزرگترین مقدار پیش بینی شده مجموع احتمالات پیش بینی شده.
پس از اینکه طبقهبندیکنندههای مورد نظر را ارائه کردیم، باید شی طبقهبندیکننده مجموعهای را که به دست میآید برازش کنیم. سپس می توانیم پیش بینی ها را بدست آوریم و از معیارهای دقت استفاده کنیم:
voting_clf = VotingClassifier(estimators=(('SVC', SVC_clf), ('DTree', DTree_clf), ('LogReg', LogReg_clf)), voting='hard')
voting_clf.fit(X_train, y_train)
preds = voting_clf.predict(X_val)
acc = accuracy_score(y_val, preds)
l_loss = log_loss(y_val, preds)
f1 = f1_score(y_val, preds)
print("Accuracy is: " + str(acc))
print("Log Loss is: " + str(l_loss))
print("F1 Score is: " + str(f1))
در اینجا چیزی است که معیارها در مورد آن می گویند VotingClassifier
عملکرد:
Accuracy is: 0.8888888888888888
Log Loss is: 3.8376684749044165
F1 Score is: 0.8484848484848486
نمونه طبقه بندی کیسه
در اینجا روش اجرای طبقه بندی بسته بندی با Scikit-Learn آمده است. Sklearn’s BaggingClassifier یک مدل طبقهبندی انتخابی و همچنین تعداد تخمینگرهایی را که میخواهید استفاده کنید در نظر میگیرد – میتوانید از مدلی مانند رگرسیون لجستیک یا درختهای تصمیم استفاده کنید.
Sklearn همچنین دسترسی به RandomForestClassifier
و ExtraTreesClassifier
، که اصلاحات طبقه بندی درخت تصمیم هستند. این طبقهبندیکنندهها همچنین میتوانند در کنار ابزار اعتبارسنجی متقاطع K-folds استفاده شوند.
ما در اینجا چندین رویکرد مختلف طبقهبندی کیسهبندی را با هم مقایسه میکنیم و میانگین نتایج امتیاز اعتبارسنجی متقاطع K-fold را چاپ میکنیم:
logreg_bagging_model = BaggingClassifier(base_estimator=LogReg_clf, n_estimators=50, random_state=12)
dtree_bagging_model = BaggingClassifier(base_estimator=DTree_clf, n_estimators=50, random_state=12)
random_forest = RandomForestClassifier(n_estimators=100, random_state=12)
extra_trees = ExtraTreesClassifier(n_estimators=100, random_state=12)
def bagging_ensemble(model):
k_folds = KFold(n_splits=20, random_state=12)
results = cross_val_score(model, X_train, y_train, cv=k_folds)
print(results.mean())
bagging_ensemble(logreg_bagging_model)
bagging_ensemble(dtree_bagging_model)
bagging_ensemble(random_forest)
bagging_ensemble(extra_trees)
در اینجا نتایجی که از طبقه بندی کننده ها به دست آوردیم آمده است:
0.7865853658536585
0.8102439024390244
0.8002439024390245
0.7902439024390244
مثال تقویت طبقه بندی
در نهایت، روش استفاده از روش طبقه بندی تقویتی را بررسی خواهیم کرد. همانطور که گفته شد، یک مقاله جداگانه وجود دارد روی موضوع افزایش گرادیان را می توانید در اینجا بخوانید.
Scikit-Learn دارای یک داخلی است طبقه بندی AdaBoost، که تعداد معینی از برآوردگرها را به عنوان اولین آرگومان در نظر می گیرد. میتوانیم از یک حلقه for استفاده کنیم تا ببینیم عملکرد طبقهبندی چگونه در مقادیر مختلف تغییر میکند، و همچنین میتوانیم آن را با ابزار اعتبارسنجی متقاطع K-Folds ترکیب کنیم:
k_folds = KFold(n_splits=20, random_state=12)
num_estimators = (20, 40, 60, 80, 100)
for i in num_estimators:
ada_boost = AdaBoostClassifier(n_estimators=i, random_state=12)
results = cross_val_score(ada_boost, X_train, y_train, cv=k_folds)
print("Results for {} estimators:".format(i))
print(results.mean())
در اینجا نتایجی که به دست آوردیم آمده است:
Results for 20 estimators:
0.8015243902439024
Results for 40 estimators:
0.8052743902439025
Results for 60 estimators:
0.8053048780487805
Results for 80 estimators:
0.8040243902439024
Results for 100 estimators:
0.8027743902439024
جمع بندی
ما ایدههای پشت سه تکنیک طبقهبندی گروهی مختلف را پوشش دادهایم: رای دادن/انباشتن، بستهبندی و تقویت.
Scikit-Learn به شما این امکان را می دهد که به راحتی نمونه هایی از طبقه بندی کننده های گروه مختلف ایجاد کنید. این اشیاء مجموعه را می توان با سایر ابزارهای Scikit-Learn مانند اعتبارسنجی متقابل K-Folds ترکیب کرد.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-18 14:29:06