معیارهای ارزیابی در یادگیری ماشین

بخش دوم

ارزیابی الگوریتم یادگیری ماشین یکی از بخش‌های ضروری پروژه شماست. ممکن است شما تنها با به‌دست آوردن دقت برای مدلتان نتیجه رضایت بخشی دریافت کنید در حالی که با بررسی معیارهای دیگر مثل logarithmic_loss متوجه می‌شوید مدل شما ضعیف است. در بیش‌تر مواقع از دقت برای سنجش عملکرد مدل استفاده می‌کنیم اما بدانید برای قضاوت نهایی این معیار کافی نیست. در ادامه‌ی مقاله‌ی معیار برتری مدل در یادگیری ماشین در این مقاله به بررسی دیگر معیارها برای سنجش مدل یادگیری ماشین می‌پردازیم.

Logarithmic Loss

Log Loss، طبقه‌بندی‌های اشتباه را جریمه می‌کند و برای طبقه‌بندی چند کلاسه به خوبی کار می‌کند. هنگام کار با Log Loss، طبقه‌بندی کننده باید یک احتمال را به تمام کلاس‌ها به ازای تمامی نمونه‌ها اختصاص بدهد. فرض کنید نمونه‌های N متعلق به کلاس M هستند؛ سپس Log Loss به شرح زیر محاسبه می‌شود:

 

\[
\text {LogarithmicLoss}=\frac{-1}{N} \sum_{i=1}^{N} \sum_{j=1}^{M} y_{i j} * \log \left(p_{i j}\right)
\]

 

\(Y_{ij}\) مشخص می‌سازد نمونه‌ی i به کلاس j تعلق دارد یا خیر. \(P_{ij}\) احتمال تعلق نمونه‌ی i به کلاس j را مشخص می‌کند. log Loss محدودیتی روی کران بالا ندارد و بازه‌ی آن متعلق به صفر تا مثبت بی‌نهایت است. هرچه قدر مقدار log Loss به صفر نزدیک‌تر باشد نشان از دقت بالاتر دارد و هرچه مقدار log loss از صفر دورتر باشد نشان از دقت کم‌تر دارد.

به‌طورکلی به حداقل رساندن log loss، دقت بالاتری از طبقه‌بندی به ما می‌دهد. در زیر مثالی از به‌دست آوردن log loss برای پیش‌بینی logistic regression روی دیتاست دیابت کشور هند است:

import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression

url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)

array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7

kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LogisticRegression()
scoring = 'neg_log_loss'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)

print("Logloss: %.3f (%.3f)" % (results.mean(), results.std()))

خروجی Log loss

 

ناحیه زیر منحنی (Area Under Curve)

AUC یکی از رایج‌ترین معیارها برای ارزیابی است و برای مسائل طبقه‌بندی باینری استفاده می‌شود. AUC یک طبقه‌بند برابر احتمال این است که یک نمونه‌ی مثبت انتخاب‌شده‌ی تصادفی را بالاتر از یک نمونه‌ی منفی انتخاب‌شده‌ی تصادفی قرار دهد. قبل از تعریف دقیق‌تر AUC لازم است تا مفاهیم زیر یادآوری شود:

 

حساسیت یا نرخ مثبت واقعی (Recall or True Positive Rate)

برابر است با نسبت مثبت‌های واقعی بر روی تعداد کل مثبت‌ها.

 

\[
\text {TruePositive Rate}=\frac{\text {TruePositive}}{\text {FalseNegative}+\text {TruePositive}}
\]

 

نرخ منفی‌ واقعی (True Negative Rate or Specificity)

برابر است با نسبت منفی‌های واقعی بر روی تعداد کل منفی‌ها.

 

\[
\text {TrueNegativeRate}=\frac{\text {TrueNegative}}{\text {TrueNegative}+\text {FalsePositive}}
\]

 

نرخ مثبت کاذب (False Positive Rate)

برابر است با تعداد منفی‌هایی که به‌صورت اشتباه، مثبت در نظر گرفته‌شده‌اند(مثبت کاذب) بر روی تعداد کل منفی‌ها.

 

\[
\text {FalsePositiveRate}=\frac{\text {FalsePositive}}{\text {TrueNegative}+\text {FalsePositive}}
\]

 

نرخ‌های مثبت واقعی و مثبت کاذب هر دو در بازه‌ی (0,1] هستند. FPR و TPR هر دو در بازهی آستانه‌های مختلف مانند (0.00، 0.02، 0.04، …، 1.00) محاسبه می‌شوند و یک نمودار ترسیم می‌شود. AUC مساحت زیر نمودار نرخ مثبت کاذب در مقابل نرخ مثبت واقعی، در نقاط مختلف بین بازه‌ی (0,1] است. هرچه قدر که مقدار AUC بیش‌تر باشد مدل عملکرد بهتری دارد.

نمودار AUC
نمودار AUC

 

مثال زیر محاسبه AUC را نشان می‌دهد:

import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression

url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)

array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
seed = 7
kfold = model_selection.KFold(n_splits=10, random_state=seed)

model = LogisticRegression()
scoring = 'roc_auc'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)

print("AUC: %.3f (%.3f)" % (results.mean(), results.std()) )

AUC

 

Classification Report

Scikit-Learn یک گزارشی را در هنگام کار بر روی مشکلات طبقه‌بندی ارائه می‌دهد تا با استفاده از معیارها، ایده‌ای در مورد صحت مدل ارائه دهید. تابع classification_report()  دقت، حساسیت، امتیاز f1 و support را برای هر کلاس نشان می‌دهد. مثال زیر گزارشی از مسئله طبقه‌بندی باینری را نشان می‌دهد:

import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)

array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33
seed = 7

X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed)
model = LogisticRegression()
model.fit(X_train, Y_train)
predicted = model.predict(X_test)
report = classification_report(Y_test, predicted)

print(report)

 

از مثال فوق درصد خوبی را برای پیش‌بینی و حساسیت در خروجی زیر مشاهده می‌کنید:

 

r-output

 

معیارهای رگرسیون

 

میانگین خطای مطلق (Mean Absolute Error)

میانگین خطای مطلق یا MAE برابر است با میانگین تفاضل بین مقدار اصلی و مقدار پیش‌بینی‌شده. این معیار فاصله‌ی بین پیش‌بینی و خروجی واقعی را می‌سنجد:

 

\[
\text {Mean AbsoluteError}=\frac{1}{N} \sum_{j=1}^{N}\left|y_{j}-\hat{y}_{j}\right|
\]

 

import pandas
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = pandas.read_csv(url, delim_whitespace=True, names=names)

array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
seed = 7

kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LinearRegression()
scoring = 'neg_mean_absolute_error'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)

print("MAE: %.3f (%.3f)" % (results.mean(), results.std()) )

MAE

 

میانگین خطای مربعات (Mean Squared Error)

MSE کاملاً شبیه میانگین خطای مطلق است با این تفاوت که توان دوم این تفاضل را در نظر می‌گیریم. از مزایای MSE محاسبه‌ی آسان‌تر گرادیان است چراکه اگر برای محاسبه‌ی گرادیان از میانگین خطای مطلق استفاده کنیم نیاز به ابزار برنامه‌نویسی خطی پیچیده دارد. 

 

\[
\text {MeansquaredError}=\frac{1}{N} \sum_{j=1}^{N}\left(y_{j}-\hat{y}_{j}\right)^{2}
\]

 

مثال زیر محاسبه میانگین خطای مربع را نشان می‌دهد:

import pandas
from sklearn import model_selection
from sklearn.linear_model import LinearRegression

url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = pandas.read_csv(url, delim_whitespace=True, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
seed = 7

kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LinearRegression()
scoring = 'neg_mean_squared_error'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)

print("MSE: %.3f (%.3f)" % (results.mean(), results.std()) )

 

معیار \(R^2\)

معیار \(R ^ 2\) (یا R Squared) نشانه‌ای از خوب  فیت شدن مجموعه‌ای از پیش‌بینی‌ها نسبت به مقادیر واقعی را نشان می‌دهد. در ادبیات آماری، این معیار ضریب تعیین نامیده می‌شود. این مقدار بین 0 و 1 می‌باشد. مثال زیر نشانگر محاسبه میانگین \(R ^ 2\) برای مجموعه‌ای از پیش‌بینی‌ها است:

import pandas
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = pandas.read_csv(url, delim_whitespace=True, names=names)

array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
seed = 7

kfold = model_selection.KFold(n_splits=10, random_state=seed)
model = LinearRegression()
scoring = 'r2'
results = model_selection.cross_val_score(model, X, Y, cv=kfold, scoring=scoring)

print("R^2: %.3f (%.3f)" % (results.mean(), results.std()) )

r

 

بررسی صحت مدل شما قبل از محاسبه مقادیر پیش‌بینی‌شده بسیار مهم است. معیارهای ذکر شده در این مقاله از رایج‌ترین معیارهای ارزیابی در طبقه‌بندی و رگرسیون هستند.

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.