Какво означава показател за качество в машинното обучение? Обучение за класиране

Относно изтичането на клиенти на телекомуникационен оператор.


Нека заредим необходимите библиотеки и да разгледаме данните

импортирайте панди като pd импортирайте matplotlib.pyplot като plt от matplotlib.pylab импортирайте rc, plot импортирайте seaborn като sns от sklearn.preprocessing импортирайте Labelmblencoder, OneHotEncoder от sklearn.model_selection импортирайте cross_val_score от sklearn. от sklearn.metrics импортирайте precision_recall_curve, classification_report от sklearn.model_selection импортирайте train_test_split df = pd.read_csv ("../../ data / telecom_churn.csv")


df.head (5)

Предварителна обработка на данни

# Да направим съпоставяне на двоични колони # и да кодираме състоянието с фиктивно кодиране (за простота е по-добре да не правим това за дървени модели) d = ("Да": 1, "Не": 0) df ["Международен план" "] = df [" Международен план "]. Карта (d) df [" План за гласова поща "] = df [" План за гласова поща "]. Карта (d) df [" Избърсване "] = df [" Изливане "] Astype (" int64 " ) le = LabelEncoder () df ["State"] = le.fit_transform (df ["State"]) ohe = OneHotEncoder (sparse = False) encoded_state = ohe.fit_transform (df ["State"] . values.reshape (- 1, 1)) tmp = pd.DataFrame (encoded_state, columns = ["state" + str (i) for i in range (encoded_state.shape)]) df = pd.concat (, axis = 1)

Точност, прецизност и припомняне

Преди да преминем към самите метрики, е необходимо да се въведе важна концепция за описване на тези показатели от гледна точка на грешки при класификацията - матрица на объркване(матрица за грешки).
Да предположим, че имаме два класа и алгоритъм, който предвижда принадлежността на всеки обект към един от класовете, тогава матрицата на класификацията на грешките ще изглежда така:


Истински положителен (TP) Фалшиво положителни (FP)
Фалшиво отрицателен (FN) Истински отрицателни (TN)

Ето отговора на алгоритъма върху обекта и е истинският етикет на класа на този обект.
По този начин има два вида грешки при класифицирането: Фалшиво отрицателни (FN) и Фалшиво положителни (FP).


Обучение на алгоритъм и изграждане на матрицата на грешките

X = df.drop ("Churn", axis = 1) y = df ["Churn"] # Разделете извадката на влак и тест, всички показатели ще бъдат оценени в тестовия набор от данни X_train, X_test, y_train, y_test = train_test_split ( X, y , stratify = y, test_size = 0.33, random_state = 42) # Обучете естествената логистична регресия lr = LogisticRegression (random_state = 42) lr.fit (X_train, y_train) # Използвайте функцията за конструиране на матрицата за грешки от sklearn документация def plot_confusion_matrix (cm, класове, нормализиране = False, title = "(! LANG: Матрица на объркване", cmap=plt.cm.Blues): """ This function prints and plots the confusion matrix. Normalization can be applied by setting `normalize=True`. """ plt.imshow(cm, interpolation="nearest", cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) if normalize: cm = cm.astype("float") / cm.sum(axis=1)[:, np.newaxis] print("Normalized confusion matrix") else: print("Confusion matrix, without normalization") print(cm) thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape), range(cm.shape)): plt.text(j, i, cm, horizontalalignment="center", color="white" if cm > thresh else "black") plt.tight_layout() plt.ylabel("True label") plt.xlabel("Predicted label") font = {"size" : 15} plt.rc("font", **font) cnf_matrix = confusion_matrix(y_test, lr.predict(X_test)) plt.figure(figsize=(10, 8)) plot_confusion_matrix(cnf_matrix, classes=["Non-churned", "Churned"], title="Матрица на объркване") plt.savefig("conf_matrix.png") plt.show()!}


Точност

Интуитивен, очевиден и почти неизползван показател е точността - процентът на правилните отговори на алгоритъма:



Тази метрика е безполезна при проблеми с неравни класове и е лесно да се покаже с пример.


Да приемем, че искаме да оценим ефективността на филтър за спам поща. Имаме 100 имейла без спам, 90 от които нашият класификатор е идентифицирал правилно (Вярно отрицателно = 90, Фалшиво положително = 10), и 10 спам имейла, 5 от които класификаторът също е идентифицирал правилно (Вярно положителен = 5, Фалшиво отрицателен = 5 ).
Тогава точност:



Въпреки това, ако просто предвидим всички имейли като неспам, ще получим по-висока точност:



В същото време нашият модел няма абсолютно никаква предсказваща сила, тъй като първоначално искахме да идентифицираме спам съобщения. За да преодолеем това, ще ни помогне преминаването от обща метрика за всички класове към отделни показатели за качеството на класовете.

Прецизност, изземване и F-мярка

За да оценим ефективността на алгоритъма за всеки от класовете поотделно, въвеждаме метриките за прецизност и извикване.




Прецизността може да се интерпретира като съотношението на обектите, посочени от класификатора като положителни и в същото време наистина положителни, а припомнянето показва каква част от обектите от положителен клас от всички обекти от положителен клас е открил алгоритъмът.



Именно въвеждането на прецизност не ни позволява да запишем всички обекти в един клас, тъй като в този случай получаваме увеличение на фалшиво положително ниво. Извикването демонстрира способността на алгоритъма да открива този класкато цяло и прецизността е способността да се разграничава този клас от другите класове.


Както отбелязахме по-рано, има два вида грешки в класификацията: фалшиво положителни и фалшиво отрицателни. В статистиката първият тип грешка се нарича грешка тип I, а вторият се нарича грешка тип II. В нашия проблем за определяне на оттока на абонати, грешката от първия вид ще бъде приемането на лоялен абонат за изходящ, тъй като нашата нулева хипотеза е, че никой от абонатите не напуска и ние отхвърляме тази хипотеза. Съответно грешка от втория вид ще бъде "пропускането" на изходящия абонат и погрешното приемане на нулевата хипотеза.


Точността и извикването не зависят, за разлика от точността, от съотношението на класовете и следователно са приложими в условия на небалансирани проби.
Често в реалната практика задачата е да се намери оптималният (за клиента) баланс между тези два показателя. Класически пример е проблемът с определянето на оттока на клиенти.
Очевидно не можем да намерим от всичкиизходящи клиенти и самотехен. Но след като идентифицирахме стратегията и ресурса за задържане на клиенти, можем да изберем необходимите прагове за прецизност и изземване. Например, можете да се съсредоточите върху задържането само на клиенти с висока доходност или тези, за които е по-вероятно да напуснат, защото разполагаме с ограничени ресурси на кол центъра.


Обикновено, когато се оптимизират хиперпараметрите на алгоритъм (например в случай на итерация върху мрежа GridSearchCV), се използва един показател, чието подобрение очакваме да видим в тестовата проба.
Има няколко различни начиникомбинират прецизност и припомняне в обобщен критерий за качество. F -мярка (като цяло) - хармонична средна точност и извикване:



В този случай той определя тежестта на точността в метриката и когато това е средното хармонично (с коефициент 2, така че в случай на точност = 1 и припомняне = 1 да има)
F-мярката достига своя максимум, когато пълнотата и прецизността са равни на единица, и е близка до нула, ако един от аргументите е близо до нула.
Sklearn има удобна функция _metrics.classification доклад, който връща извикване, прецизност и F-мярка за всеки от класовете, както и броя на екземплярите на всеки клас.


отчет = класификационен отчет (y_test, lr.predict (X_test), target_names = ["Non-churned", "Churned"]) печат (отчет)
клас точност припомням си f1-резултат поддържа
Неразбити 0.88 0.97 0.93 941
Разбъркан 0.60 0.25 0.35 159
средно/общо 0.84 0.87 0.84 1100

Тук трябва да се отбележи, че в случай на проблеми с небалансирани класове, които преобладават в реалната практика, често е необходимо да се прибягва до техниките на изкуствена модификация на набора от данни за изравняване на съотношението на класовете. Има много от тях и няма да ги засягаме, можете да разгледате някои методи и да изберете този, който отговаря на вашата задача.

AUC-ROC и AUC-PR

Когато преобразуваме реалния отговор на алгоритъма (като правило, вероятността за принадлежност към клас, вижте SVM отделно) в двоичен етикет, трябва да изберем някакъв праг, при който 0 става 1. Праг, равен на 0,5, изглежда естествен и близък , но не винаги се оказва оптимален, например при споменатата по-горе липса на класов баланс.


Един от начините за оценка на модела като цяло, без да се обвързва с конкретен праг, е AUC-ROC (или ROC AUC) - площ ( Ареа У nder ° С urve) под кривата на грешката ( Rприемник Оопериране ° Схарактерна крива). Тази крива е линия от (0,0) до (1,1) в координати на истинската положителна скорост (TPR) и фалшиво положителна скорост (FPR):




Вече знаем TPR, това е пълнота, а FPR показва каква част от обектите от отрицателния клас алгоритъмът е предвидил неправилно. В идеалния случай, когато класификаторът не прави грешки (FPR = 0, TPR = 1), получаваме площта под кривата, равна на единица; в противен случай, когато класификаторът изведе произволно вероятности за класове, AUC-ROC ще се стреми към 0,5, тъй като класификаторът ще изведе същия брой TP и FP.
Всяка точка от графиката съответства на избора на определен праг. Площта под кривата в този случай показва качеството на алгоритъма (повече е по-добре), освен това, стръмността на самата крива е важна - ние искаме да увеличим максимално TPR чрез минимизиране на FPR, което означава, че нашата крива в идеалния случай трябва да клони към точката (0,1).


Код за чертане на ROC крива

sns.set (font_scale = 1.5) sns.set_color_codes ("заглушен") plt.figure (figsize = (10, 8)) fpr, tpr, thresholds = roc_curve (y_test, lr.predict_proba (X_test) [:, 1], pos_label = 1) lw = 2 plt.plot (fpr, tpr, lw = lw, label = "ROC curve") plt.plot (,) plt.xlim () plt.ylim () plt.xlabel ("False Positive Rate") ") plt.ylabel (" Истински положителен процент ") plt.title (" ROC крива ") plt.savefig (" ROC.png ") plt.show ()



Критерият AUC-ROC е устойчив на небалансирани класове (спойлер: уви, не всичко е толкова недвусмислено) и може да се тълкува като вероятността случайно избран положителен обект да бъде класиран по-високо от класификатора (ще има по-голяма вероятност да бъде положителен ) отколкото произволно избран отрицателен обект ...


Помислете за следния проблем: трябва да изберем 100 подходящи документа от 1 милион документа. Усвоихме два алгоритъма:

  • Алгоритъм 1връща 100 документа, 90 от които са релевантни. Поради това,

  • Алгоритъм 2връща 2000 документа, 90 от които са релевантни. Поради това,


Най-вероятно ще изберем първия алгоритъм, който произвежда много малко фалшиви положителни резултати в сравнение с неговия конкурент. Но разликата в процента на фалшиви положителни резултати между тези два алгоритма изключителномалък - само 0,0019. Това се дължи на факта, че AUC-ROC измерва съотношението на фалшиво положително спрямо вярно отрицателно и при проблеми, при които вторият (по-голям) клас не е толкова важен за нас, може да не даде напълно адекватна картина при сравняване на алгоритми.


За да коригираме ситуацията, нека се върнем към пълнотата и точността:

  • Алгоритъм 1

  • Алгоритъм 2


Тук вече се забелязва значителна разлика между двата алгоритма – 0,855 в точността!


Прецизността и извикването също се използват за конструиране на кривата и, подобно на AUC-ROC, за намиране на площта под нея.



Тук може да се отбележи, че при малки масиви от данни площта под PR-кривата може да бъде прекалено оптимистична, тъй като се изчислява по трапецовиден метод, но обикновено има достатъчно данни в такива задачи. За подробности относно връзката между AUC-ROC и AUC-PR вижте тук.

Логистична загуба

Функцията за логистична загуба се отделя, дефинирана като:



тук е отговорът на алгоритъма на -тия обект, е истинският етикет на класа на -тия обект и размерът на извадката.


Подробности за математическата интерпретация на функцията на логистичната загуба вече са написани в рамките на публикацията за линейни модели.
Този показател рядко се появява в бизнес изискванията, но често в задачи на kaggle.
Интуитивно минимизирането на logloss може да се разглежда като задача за максимизиране на точността чрез санкциониране на неправилни прогнози. Трябва обаче да се отбележи, че logloss наказва изключително силно за доверието на класификатора в грешен отговор.


Нека разгледаме пример:


def logloss_crutch (y_true, y_pred, eps = 1e-15): return - (y_true * np.log (y_pred) + (1 - y_true) * np.log (1 - y_pred)) print ("Logloss с несигурна класификация% f "% logloss_crutch (1, 0.5)) >> Logloss с несигурна класификация 0.693147 печат (" Logloss с уверена класификация и правилен отговор% f "% logloss_crutch (1, 0.9)) >> Logloss с уверена класификация и правилен отговор 0.105361 печат (" Logloss с уверена класификация и грешен отговор% f "% logloss_crutch (1, 0.1)) >> Logloss с уверена класификация и грешен отговор 2.302585

Забележете как логлосът е нараснал драстично с неправилен отговор и уверена класификация!
Следователно, грешка в един обект може да доведе до значително влошаване на общата грешка на извадката. Такива обекти често са извънредни, които трябва да се запомнят, за да бъдат филтрирани или разгледани отделно.
Всичко си идва на мястото, ако нарисувате графика на logloss:



Може да се види, че колкото по -близо до нулата е отговорът на алгоритъма с основна истина = 1, толкова по -висока е стойността на грешката и колкото по -стръмна е кривата.

Нека обобщим:

  • В случай на многокласова класификация, трябва внимателно да наблюдавате показателите на всеки от класовете и да следвате логиката на решението задачивместо да оптимизира метриката
  • В случай на неравностойни класове е необходимо да изберете баланса на класовете за обучение и показател, който правилно ще отразява качеството на класификацията
  • и madrugado за помощ с тази статия.

Здравей, Хабр!

В задачите машинно обучениеМетриките се използват за оценка на качеството на моделите и сравняване на различни алгоритми, а техният избор и анализ е незаменима част от работата на сатанистите на данни.

В тази статия ще разгледаме някои критерии за качество в проблемите с класификацията, ще обсъдим какво е важно при избора на показател и какво може да се обърка.

Показатели в проблемите на класификацията

За демонстрация полезни функции sklearnи визуално представяне на показателите, ще използваме нашия набор от данни за оттока на клиенти на телекомуникационен оператор, с който се запознахме в първата статия от курса.

Нека заредим необходимите библиотеки и да разгледаме данните

Импортирайте панди като pd импортирайте matplotlib.pyplot като plt от matplotlib.pylab импортирайте rc, plot импортирайте seaborn като sns от sklearn.preprocessing import Labelmblencoder, OneHotEncoder от sklearn.model_selection импортирайте cross_val_score от sklearn_val_score от sklearn. от sklearn.metrics импортирайте precision_recall_curve, classification_report от sklearn.model_selection импортирайте train_test_split df = pd.read_csv ("../../ data / telecom_churn.csv")

Df.head (5)

Предварителна обработка на данни

# Да направим съпоставяне на двоични колони # и да кодираме състоянието с фиктивно кодиране (за простота е по-добре да не правим това за дървени модели) d = ("Да": 1, "Не": 0) df ["Международен план" "] = df [" Международен план "]. Карта (d) df [" План за гласова поща "] = df [" План за гласова поща "]. Карта (d) df [" Изхвърляне "] = df [" Изхвърляне "] Astype (" int64 " ) le = LabelEncoder () df ["State"] = le.fit_transform (df ["State"]) ohe = OneHotEncoder (sparse = False) encoded_state = ohe.fit_transform (df ["State"] . values.reshape (- 1, 1)) tmp = pd.DataFrame (encoded_state, колони = ["state" + str (i) for i in range (encoded_state.shape)]) df = pd.concat (, axis = 1)

Точност, прецизност и припомняне

Преди да преминем към самите показатели, е необходимо да се въведе важна концепция за описване на тези показатели по отношение на грешките в класификацията - матрица на объркване(матрица за грешки).
Да предположим, че имаме два класа и алгоритъм, който предсказва принадлежността на всеки обект към един от класовете, тогава матрицата на грешките в класификацията ще изглежда така:

Истински положителен (TP) Фалшиво положителни (FP)
Фалшиво отрицателен (FN) Истински отрицателни (TN)

това е реакцията на алгоритъма върху обекта и

Истинският етикет на класа на този обект.
По този начин има два вида грешки при класифицирането: Фалшиво отрицателни (FN) и Фалшиво положителни (FP).

Обучение на алгоритъм и изграждане на матрицата на грешките

X = df.drop ("Churn", axis = 1) y = df ["Churn"] # Разделете извадката на влак и тест, всички показатели ще бъдат оценени в набора от тестови данни X_train, X_test, y_train, y_test = train_test_split ( X, y , stratify = y, test_size = 0.33, random_state = 42) # Обучете естествената логистична регресия lr = LogisticRegression (random_state = 42) lr.fit (X_train, y_train) # Използвайте функцията, за да изградите матрицата за грешки от sklearn документация def plot_confusion_matrix (cm, класове , normalize = False, title = "(! LANG: Объркваща матрица", cmap=plt.cm.Blues): """ This function prints and plots the confusion matrix. Normalization can be applied by setting `normalize=True`. """ plt.imshow(cm, interpolation="nearest", cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) if normalize: cm = cm.astype("float") / cm.sum(axis=1)[:, np.newaxis] print("Normalized confusion matrix") else: print("Confusion matrix, without normalization") print(cm) thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape), range(cm.shape)): plt.text(j, i, cm, horizontalalignment="center", color="white" if cm > thresh else "black") plt.tight_layout() plt.ylabel("True label") plt.xlabel("Predicted label") font = {"size" : 15} plt.rc("font", **font) cnf_matrix = confusion_matrix(y_test, lr.predict(X_test)) plt.figure(figsize=(10, 8)) plot_confusion_matrix(cnf_matrix, classes=["Non-churned", "Churned"], title="Матрица на объркване") plt.savefig("conf_matrix.png") plt.show()!}

Точност

Интуитивен, очевиден и почти неизползван показател е точността - процентът на правилните отговори на алгоритъма:

Тази метрика е безполезна при проблеми с неравни класове и е лесно да се покаже с пример.

Да приемем, че искаме да оценим ефективността на филтър за спам поща. Имаме 100 имейла, които не са спам, 90 от които нашият класификатор идентифицира правилно (Истински отрицателен = 90, фалшиво положителен = 10) и 10 спам имейла, 5 от които класификаторът също идентифицира правилно (Истински положителен = 5, фалшив отрицателен = 5) .
Тогава точност:

Въпреки това, ако просто предвидим всички имейли като неспам, ще получим по-висока точност:

В същото време нашият модел няма никаква предсказваща сила, тъй като първоначално искахме да идентифицираме спам съобщения. За да се преодолее това, ще ни помогне преходът от обща метрика за всички класове към отделни показатели за качеството на класовете.

Прецизност, изземване и F-мярка

За да оценим ефективността на алгоритъма за всеки от класовете поотделно, въвеждаме метриките за прецизност и извикване.

Прецизността може да се интерпретира като съотношението на обектите, посочени от класификатора като положителни и в същото време наистина положителни, а припомнянето показва каква част от обектите от положителен клас от всички обекти от положителен клас е открил алгоритъмът.

Въвеждането на прецизност не ни позволява да запишем всички обекти в един клас, тъй като в този случай получаваме увеличение на нивото на фалшиво положително. Припомнянето демонстрира способността на алгоритъма да открие даден клас като цяло, а прецизността демонстрира способността да разграничава този клас от другите класове.

Както отбелязахме по-рано, има два вида грешки в класификацията: фалшиво положителни и фалшиво отрицателни. В статистиката първият тип грешка се нарича грешка тип I, а вторият се нарича грешка тип II. В нашия проблем за определяне на отпадането на абонатите грешката от първи вид ще бъде приемането на лоялен абонат за изходящ, тъй като нашата нулева хипотеза е, че никой от абонатите не напуска и ние отхвърляме тази хипотеза. Съответно, грешка от втори вид ще бъде „прескачането“ на изходящия абонат и погрешното приемане на нулевата хипотеза.

Точността и извикването не зависят, за разлика от точността, от съотношението на класовете и следователно са приложими в условия на небалансирани проби.
Често в реалната практика задачата е да се намери оптималният (за клиента) баланс между тези два показателя. Класически пример е проблемът с определянето на оттока на клиенти.
Очевидно не можем да намерим от всичкиизходящи клиенти и самотехен. Но след като идентифицирахме стратегията и ресурса за задържане на клиенти, можем да изберем необходимата прецизност и прагове за изземване. Например, можете да се съсредоточите върху задържането само на клиенти с висока доходност или тези, които е по-вероятно да докладват, тъй като сме ограничени от ресурса на кол центъра.

Обикновено, когато се оптимизират хиперпараметрите на алгоритъм (например в случай на итерация върху мрежа GridSearchCV), се използва един показател, чието подобрение очакваме да видим в тестовата проба.
Има няколко различни начина за комбиниране на прецизност и извикване в обобщена мярка за качество. F-мярка (като цяло

) - хармонична средна прецизност и извикване:

в този случай определя тежестта на точността в метриката и за

това е средното хармонично (с множител 2, така че в случай на точност = 1 и припомняне = 1, имаме

)
F-мярката достига своя максимум, когато пълнотата и точността са равни на единица и е близка до нула, ако един от аргументите е близо до нула.
Sklearn има удобна функция _metrics.classification докладвръщане на извикване, точност и F-мярка за всеки от класовете, както и броя на случаите на всеки клас.

Отчет = classification_report (y_test, lr.predict (X_test), target_names = ["Non-churned", "Churned"]) print (report)

клас точност припомням си f1-резултат поддържа
Неразбити 0.88 0.97 0.93 941
Разбъркан 0.60 0.25 0.35 159
средно/общо 0.84 0.87 0.84 1100

Тук трябва да се отбележи, че в случай на проблеми с небалансирани класове, които преобладават в реалната практика, често е необходимо да се прибягва до техниките на изкуствена модификация на набора от данни за изравняване на съотношението на класовете. Има много от тях и няма да ги докосваме, можете да разгледате някои методи и да изберете този, който отговаря на вашата задача.

AUC-ROC и AUC-PR

Когато преобразуваме реалния отговор на алгоритъма (като правило, вероятността за принадлежност към клас, вижте SVM отделно) в двоичен етикет, трябва да изберем някакъв праг, при който 0 става 1. Праг, равен на 0,5, изглежда естествен и близък , но не винаги се оказва оптимален, например при споменатата по-горе липса на класов баланс.

Един от начините за оценка на модела като цяло, без да се обвързва с конкретен праг, е AUC-ROC (или ROC AUC) - площ ( Ареа У nder ° С urve) под кривата на грешката ( Rприемник Оопериране ° Схарактерна крива). Тази крива е линия от (0,0) до (1,1) в координати на истинската положителна скорост (TPR) и фалшиво положителна скорост (FPR):

Вече знаем TPR, това е пълнота и FPR показва каква част от обектите от отрицателния клас алгоритъмът е предсказал неправилно. В идеалния случай, когато класификаторът не прави грешки (FPR = 0, TPR = 1), ще получим площта под кривата, равна на единица, в противен случай, когато класификаторът изведе произволно вероятностите за класа, AUC-ROC ще клони към 0,5, тъй като класификаторът ще издаде същото количество TP и FP.
Всяка точка от графиката съответства на избора на определен праг. Площта под кривата в този случай показва качеството на алгоритъма (повече е по -добре), освен това е важна стръмността на самата крива - искаме да максимизираме TPR чрез минимизиране на FPR, което означава, че нашата крива в идеалния случай трябва да се стреми да точката (0,1).

Код за чертане на ROC крива

Sns.set (font_scale = 1.5) sns.set_color_codes ("заглушен") plt.figure (figsize = (10, 8)) fpr, tpr, thresholds = roc_curve (y_test, lr.predict_proba (X_test) [:, 1], pos_label = 1) lw = 2 plt.plot (fpr, tpr, lw = lw, label = "ROC curve") plt.plot (,) plt.xlim () plt.ylim () plt.xlabel ("False Positive Rate") ") plt.ylabel (" Истински положителен процент ") plt.title (" ROC крива ") plt.savefig (" ROC.png ") plt.show ()

Критерият AUC-ROC е устойчив на небалансирани класове (спойлер: уви, но не всичко е толкова недвусмислено) и може да се тълкува като вероятността произволно избран положителен обект да бъде класиран по-високо от класификатора (ще има по-голяма вероятност да бъде положителен), отколкото произволно избран отрицателен обект.

Помислете за следния проблем: трябва да изберем 100 подходящи документа от 1 милион документа. Усвоихме два алгоритъма:

  • Алгоритъм 1връща 100 документа, 90 от които са релевантни. Поради това,
  • Алгоритъм 2връща 2000 документа, 90 от които са релевантни. Поради това,

Най-вероятно ще изберем първия алгоритъм, който произвежда много малко фалшиви положителни резултати в сравнение с неговия конкурент. Но разликата в процента на фалшиви положителни резултати между тези два алгоритма изключителномалък - само 0,0019. Това се дължи на факта, че AUC-ROC измерва съотношението на фалшиво положително спрямо вярно отрицателно и при проблеми, при които вторият (по-голям) клас не е толкова важен за нас, може да не даде напълно адекватна картина при сравняване на алгоритми.

За да коригираме ситуацията, нека се върнем към пълнотата и точността:

  • Алгоритъм 1
  • Алгоритъм 2

Тук вече се забелязва значителна разлика между двата алгоритма – 0,855 в точността!

Прецизността и извикването също се използват за конструиране на кривата и, подобно на AUC-ROC, за намиране на площта под нея.

Тук може да се отбележи, че при малки масиви от данни площта под PR-кривата може да бъде прекалено оптимистична, тъй като се изчислява по трапецовиден метод, но обикновено има достатъчно данни в такива задачи. За подробности относно връзката между AUC-ROC и AUC-PR вижте тук.

Логистична загуба

Функцията за логистична загуба се отделя, дефинирана като:

това е отговорът на алгоритъма

ом обект,

истински етикет на клас е включен

Ом обект и

размер на извадката.

Подробности за математическата интерпретация на функцията на логистичната загуба вече са написани в рамките на публикацията за линейни модели.
Този показател рядко се появява в бизнес изискванията, но често в задачи на kaggle.
Интуитивно минимизирането на logloss може да се разглежда като задача за максимизиране на точността чрез санкциониране на погрешни прогнози. Трябва обаче да се отбележи, че logloss санкционира изключително силно за увереността на класификатора в грешен отговор.

Нека разгледаме пример:

Def logloss_crutch (y_true, y_pred, eps = 1e -15): return - (y_true * np.log (y_pred) + (1 - y_true) * np.log (1 - y_pred)) print ("Logloss с несигурна класификация% f "% logloss_crutch (1, 0.5)) >> Logloss с несигурна класификация 0.693147 печат (" Logloss с уверена класификация и правилен отговор% f "% logloss_crutch (1, 0.9)) >> Logloss с уверена класификация и правилен отговор 0.105361 печат (" Logloss с уверена класификация и грешен отговор% f "% logloss_crutch (1, 0.1)) >> Logloss с уверена класификация и грешен отговор 2,302585

Забележете как логлосът е нараснал драстично с неправилен отговор и уверена класификация!
Следователно, грешка в един обект може да доведе до значително влошаване на общата грешка на извадката. Такива обекти често са извънредни, които трябва да се запомнят, за да бъдат филтрирани или разглеждани отделно.
Всичко си идва на мястото, ако нарисувате графика на logloss:

Може да се види, че колкото по -близо до нулата е отговорът на алгоритъма с основна истина = 1, толкова по -висока е стойността на грешката и колкото по -стръмна е кривата.

Обобщаване:

  • В случай на многокласова класификация, трябва внимателно да наблюдавате показателите на всеки от класовете и да следвате логиката на решението задачивместо да оптимизира метриката
  • В случай на неравностойни класове е необходимо да изберете баланса на класовете за обучение и показател, който правилно ще отразява качеството на класификацията
  • Изборът на показател трябва да се извършва с фокус върху предметната област, предварителна обработка на данните и евентуално сегментиране (както в случая на разделяне на богати и бедни клиенти)

полезни връзки

  1. Курс на Евгений Соколов: Семинар за избор на модели (има информация за метриките на проблемите с регресия)
  2. Проблеми по AUC-ROC от A.G. Дяконова
  3. Можете да прочетете повече за други показатели на kaggle. Към описанието на всеки показател е добавена връзка към състезанието, където е използван
  4. Презентация на Богдан Мелник aka ld86 за обучение на небалансирани проби

Тази глава представя популярни методи за оценка на качеството на класификационния модел, които, наред с други неща, се използват в други трудове по тази тема. Дадени са тяхното описание и обосновка на използваните за тази оценка показатели.

Показатели за оценка на качеството

Пълна точност

Тази метрика е една от най-простите и в същото време универсални метрики за оценка на ефективността на алгоритмите за класификация. Стойността на този коефициент се изчислява като съотношението на правилно класифицираните обекти от общия брой обекти в извадката. Този показател е популярен поради своята простота и възможността да се разшири до произволен брой класове. Основният недостатък на тази метрика е, че приписва една и съща тежест на всички документи, което може да е неправилно в случай на силно изместване на документи в набора за обучение към един или повече класове. Този показател може да има висока стойност, но класификатор в рамките на един клас може да покаже изключително ниско качестворабота. В същото време показателят не сигнализира за това по никакъв начин.

Прецизност, пълнота и F-мярка

Показатели като прецизност и припомняне бяха за първи път широко използвани при оценка на производителността на системи, решаващи проблеми с извличането на информация. Точността на системата в рамките на един клас е съотношението на обектите, които наистина принадлежат към определен клас, спрямо всички обекти, приписани от системата към този клас. Пълнотата се изразява като съотношението на обектите, намерени от класификатора, принадлежащи към даден клас спрямо всички обекти от този клас. Таблица 4 е таблица за непредвидени обстоятелства от отделен клас, където TP (истинска положителна) е вярно положително решение, TN (истинска отрицателна) е вярно-отрицателно решение, FP (фалшиво положително) е фалшиво положително решение, а FN (фалшиво отрицателно) е фалшиво -отрицателно решение.

Таблица 1 - Таблица на непредвидени обстоятелства за клас обекти

По този начин точността и пълнотата се изчисляват като:

F-мярката комбинира информация за точността и пълнотата на оценявания алгоритъм. Изчислява се като хармонична средна стойност на показателите за точност и пълнота:

Поради факта, че F-мярката се изчислява отделно за всеки клас, е удобно да се използва за търсене и анализ на специфични грешки на алгоритъма, за оценка на класификация с няколко класа. Освен това в случай на голям брой класове е необходима характеристика, която да обобщава пълнотата и точността за всички класове и да характеризира цялостното поведение на системата. В тази работа за тази цел се използват следните обобщени стойности: макропрецизност, която се изчислява като средноаритметично на точността за всички класове, макро извикване, което се изчислява като средно аритметично на пълнотата за всички класове, и макро F-мярка (Macro F-score), която е средната хармонична стойност между тях.

Кръстосано валидиране

Кръстосаното валидиране е един от най-често срещаните методи за провеждане на пълно тестване и оценка на ефективността на различни алгоритми за машинно обучение. За независима извадка този метод позволява да се получи безпристрастна оценка на вероятността за грешка, за разлика от средната грешка на обучената извадка, която може да бъде предубедена оценка на вероятността за грешка поради пренастройване на алгоритъма. Друго предимство на тази процедура е възможността да се получи оценка на вероятността от грешка в алгоритъма, при липса на специално проектирана контролна проба за тестване.

Нека приемем, че това е набор от характеристики на обекти, на които е посочена крайна извадка от случаи на използване, където е краен набор от класове. Дадено е съпоставяне, което присвоява алгоритъм на произволен избор от случаи на използване. Тогава качеството на алгоритъма за произволна извадка от прецеденти се оценява с помощта на функционала за качество:

където е някаква неотрицателна функция, която връща стойността на грешката на алгоритъма с правилния етикет на класа.

Всеки учен по данни работи с големи количества данни ежедневно. Смята се, че около 60% - 70% от времето се заема от първия етап от работния процес: почистване, филтриране и трансформиране на данните във формат, подходящ за прилагане на алгоритми за машинно обучение. На втория етап се извършва предварителна обработка и директно обучение на моделите. В днешната статия ще се съсредоточим върху втората стъпка от процеса и ще разгледаме различните техники и препоръки, дошли от моето участие в над 100 състезания за машинно обучение. Въпреки факта, че описаните понятия са с доста общ характер, те ще бъдат полезни за решаване на много специфични проблеми.

Всички примери за код са написани на Python!

Данни

Преди да приложите алгоритми за машинно обучение, данните трябва да бъдат преобразувани в таблично представяне. Този процес, показан на фигурата по-долу, е най-трудният и отнема много време.

Данни в база данни - данни в базата данни. Data Munging - филтриране на данни. Полезни данни - полезни данни. Преобразуване на данни - преобразуване на данни. Таблични данни - таблични данни. Данни - независими променливи (знаци). Етикети - зависими променливи (целеви променливи).

След като данните бъдат преобразувани в таблично представяне, те могат да се използват за обучение на модели. Табличният изглед е най-често срещаният изглед на данни в машинното обучение и извличането на данни. Редовете на таблицата са отделни обекти (наблюдения). Колоните на таблицата съдържат независими променливи (знаци), обозначени хи зависими (целеви) променливи, обозначени y... В зависимост от класа на проблема, целевите променливи могат да бъдат представени с една или няколко колони.

Типове променливи за насочване

Целевите променливи определят класа на проблема и могат да бъдат представени с една от следните опции:

  • Единична колона с двоични стойности: проблем с двоична класификация, всеки обект принадлежи само на един клас.
  • Една колона с реални стойности: Проблем с регресията, една прогнозирана стойност.
  • Множество колони с двоични стойности: проблем с многокласова класификация, всеки обект принадлежи само на един клас.
  • Множество колони с реални стойности: Проблем с регресията, предвиждат се множество стойности.
  • Множество двоични колони: Проблем с класификация с множество етикети, един обект може да принадлежи към множество класове.

Метрика

При решаване на всеки проблем с машинно обучение е необходимо да можете да оцените резултата, тоест е необходима метрика. Например, за проблем с класификация от два класа, площта под ROC кривата (ROC AUC) обикновено се използва като метрика. В случай на многокласова класификация обикновено се прилага категорична кръстосана ентропия. В случай на регресия, средната квадратична грешка (MSE).

Няма да разглеждаме подробно показателите, тъй като те могат да бъдат доста разнообразни и са избрани за конкретна задача.

Библиотеки

Първата стъпка е да инсталирате базовите библиотеки, необходими за извършване на изчисленията, като напр numpyи scipy... След това можете да започнете да инсталирате най-популярните библиотеки за анализ на данни и машинно обучение:

  • Проучване и трансформация на данни: панди(http://pandas.pydata.org/).
  • Широка гама от различни алгоритми за машинно обучение: scikit-научи(http://scikit-learn.org/stable/).
  • Най-добра реализация за повишаване на градиента: xgboost(https://github.com/dmlc/xgboost).
  • Невронни мрежи: keras(http://keras.io/).
  • Визуализация: matplotlib(http://matplotlib.org/).
  • Индикатор за напредък: tqdm(https://pypi.python.org/pypi/tqdm).

Трябва да се каже, че не използвам Анаконда(https://www.continuum.io/downloads). Анакондакомбинира повечето от популярните библиотеки и значително опростява процеса на инсталиране, но имам нужда от повече свобода. Ти решаваш. 🙂

Рамка за машинно обучение

През 2015 г. представих концепцията за автоматизирана рамка за машинно обучение. Системата все още се разработва, но скоро ще бъде пусната. Структурата на рамката, която ще служи като основа за по-нататъшно представяне, е показана на фигурата по-долу.

Чертеж от публикация: Thakur A., ​​Cron-Grimberg A. AutoCompete: Рамка за състезания за машинно обучение. (A. Thakur и A. Krohn-Grimberghe, AutoCompete: A Framework for Machine Learning Competitions.)

На входа рамката получава данни, които преди това са били преобразувани в изглед на таблица. Розовите линии показват посоката за най-простия случай.

Първата стъпка е да се определи класа на проблема. Това може да стане чрез анализ на целевата променлива. Проблемът може да бъде класификация или регресия, класификацията може да бъде двукласова или многокласова, класовете могат да се припокриват или не. След като класът на задачите е дефиниран, ние разделяме първоначалния набор от данни на две части и получаваме набор за обучение и набор за валидиране, както е показано на фигурата по -долу.

В случай, че имаме работа с класификация, разделянето на данните трябва да се извърши по такъв начин, че в получените набори съотношението на броя на обектите, принадлежащи към различни класове, да съответства на това съотношение за оригиналния набор от данни (стратифицирано разделяне). Това може лесно да се направи с помощта на класа StratifiedKFoldбиблиотеки scikit-научи.

За проблема с регресията, обичайното разделяне с помощта на класа KFoldкойто също е достъпен в библиотеката scikitуча.

В допълнение, за проблема с регресията има по-сложни методи за разделяне на данни, които осигуряват същото разпределение на целевата променлива в резултантните набори. Тези подходи са оставени за независимото разглеждане на читателя.

В горния примерен код размерът на набора за проверка ( eval_size) е 10% от оригиналния набор от данни. Тази стойност трябва да бъде избрана въз основа на количеството изходни данни.

След разделяне на данните всички операции, приложени към набора за обучение, трябва да бъдат запазени и след това приложени към набора за валидиране. Комплект за валидиране никога не трябва да се комбинира с комплект за обучение. Ако направим това, ще получим много добри оценки, докато нашите модели ще бъдат безполезни поради силното прекомерно монтиране.

В следващата стъпка определяме типовете черти. Трите най -често срещани типа са числови, категорични и текстови. Нека да разгледаме набор от данни от популярния проблем с пътниците на Титаник (https://www.kaggle.com/c/titanic/data).

В този набор от данни колоната оцеляванесъдържа целевата променлива. В предишната стъпка вече отделихме целевата променлива от функциите. Знаци pcclass, секси качи сеса категорични. Знаци възраст, sibsp, парчи други подобни са числови. Знак имее текст. Не мисля обаче, че името на пътника ще бъде полезно за прогнозиране дали този пътник е оцелял или не.

Цифровите знаци не се нуждаят от преобразуване. Такива функции в оригиналния си вид са готови за нормализиране и обучение на модели.

Не забравяйте това преди употреба OneHotEncoder, трябва да преобразувате категории в числа с помощта на LabelEncoder.

Тъй като данните от състезанието "Титаник" не съдържат добър пример за текстов таг, нека посочим общо правилотрансформация на текстови знаци. Можем да комбинираме всички текстови знаци в един и след това да приложим подходящите алгоритми за преобразуване на текста в числово представяне.

Характеристиките на текста могат да се комбинират, както следва:

След това можем да направим преобразуването с помощта на класа CountVectorizerили TfidfVectorizerбиблиотеки scikit-научи.

обикновено, TfidfVectorizerосигурява по-добър резултат от CountVectorizer... На практика открих, че следните стойности на параметъра TfidfVectorizerса оптимални в повечето случаи:

Ако прилагате векторизатора само към набора за обучение, не забравяйте да го запишете на диск, за да можете по-късно да го приложите към набора за валидиране.

На следващата стъпка характеристиките, получени в резултат на описаните по-горе трансформации, се прехвърлят в стекера. Този рамков възел комбинира всички трансформирани функции в една матрица. Имайте предвид, че в нашия случай говорим за стекер с функции, който не трябва да се бърка с моделен стекер, който е друга популярна технология.

Можете да комбинирате характеристики с помощта на функцията hstackбиблиотеки numpy(в случай на плътни характеристики) или с помощта на функцията hstackот модул рядкобиблиотеки scipy(в случай на оскъдни характеристики).

В случай, че се извършват други етапи на предварителна обработка, например намаляване на размерността или избор на характеристики (ще бъдат обсъдени по-долу), комбинацията от получените характеристики може да се извърши ефективно с помощта на класа FeatureUnionбиблиотеки scikitуча.

След като всички характеристики се комбинират в една матрица, можем да започнем да обучаваме моделите. Тъй като характеристиките не са нормализирани, на този етап трябва да се използват само ансамблови алгоритми, базирани на дървета на решения:

  • RandomForestClassifier
  • RandomForestRegressor
  • ExtraTreesClassifier
  • ExtraTreesRegressor
  • XGBClassifier
  • XGBRegressor

За да се прилагат линейни модели, е необходимо да се извърши нормализиране на характеристики с помощта на класовете Нормализаторили StandardScalerбиблиотеки scikit-научи.

Тези методи за нормализиране осигуряват добри резултати само в случай на плътни характеристики. За да кандидатствате StandardScalerза редки характеристики, като параметър, който трябва да посочите with_mean = Невярно.

Ако стъпките по-горе ни предоставят „добър“ модел, можем да преминем към настройка на хиперпараметрите. Ако моделът не ни удовлетворява, можем да продължим да работим с функциите. По-специално, можем да приложим различни методи за намаляване на размерността като допълнителни стъпки.

За да опростим нещата, няма да разглеждаме линеен дискриминантен анализ (LDA) и квадратичен дискриминантен анализ (QDA). Като цяло, анализът на основните компоненти (PCA) се използва за намаляване на размера на данните. Когато работите с изображения, трябва да започнете с 10-15 компонента и да увеличите тази стойност, докато резултатът се подобри значително. Когато работите с други типове данни, можете да започнете с 50-60 компонента.

За текстови данни, след като преобразувате текста в рядка матрица, можете да приложите разлагане на единична стойност (SVD). Изпълнение на разграждане на единична стойност Пресечен SSDна разположение в библиотеката scikit-научи.

Броят на компонентите за декомпозиция на единични стойности, които по правило осигуряват добър резултат в случай на характеристики, получени в резултат на трансформация с помощта на CountVectorizerили TfidfVectorizer, е 120 - 200. Голямо количествокомпонентът ви позволява леко да подобрите резултата с цената на значителни изчислителни разходи.

След като завършите описаните стъпки, не забравяйте да нормализирате характеристиките, за да можете да прилагате линейни модели. След това можем или да използваме подготвените функции за обучение на моделите, или да извършим избор на функция.

Има различни методи за избор на характеристики. Един от популярните методи е алгоритъмът за избор на функции. Алчният алгоритъм следва схемата, описана по-долу. Стъпка 1: обучете и оценете модела по всяка от първоначалните характеристики; изберете една характеристика, която осигурява най-добрата оценка. Стъпка 2: обучение и оценка на модела по двойки характеристики, състоящ се от най-добрата характеристика, избрана в предишната стъпка, и всяка от останалите характеристики; изберете най-добрата характеристика от останалите. Повтаряме подобни стъпки, докато изберем необходимия брой функции или докато не бъде изпълнен някакъв друг критерий. Вариант на реализация на този алгоритъм, където площта под ROC кривата се използва като метрика, е достъпна на следния линк: https://github.com/abhishekkrthakur/greedyFeatureSelection. Трябва да се отбележи, че тази реализация не е идеална и изисква определени модификации за конкретна задача.

Друг по-бърз метод за избор на характеристики е изборът с помощта на един от алгоритмите за машинно обучение, които оценяват важността на функциите. Например, можете да използвате логистична регресия или Освен това избраните функции могат да се използват за обучение на други алгоритми.

Когато избирате характеристики с помощта на произволна гора, не забравяйте, че броят на дърветата трябва да е малък и освен това не трябва да извършвате сериозна настройка на хиперпараметри, в противен случай може да възникне прекомерно монтиране.

Изборът на характеристики може също да се извърши с помощта на алгоритми за повишаване на градиента. Препоръчително е да използвате библиотеката xgboostвместо съответната реализация от scikit-научиот внедряването xgboostмного по-бърз и по-мащабируем.

Алгоритми RandomForestClassifier, RandomForestRegressorи xgboostсъщо така ви позволява да извършвате избор на функции в случай на оскъдни данни.

Друга популярна техника за избор на неотрицателни характеристики е подборът хи-квадрат. Реализация на този метод също е налична в библиотеката scikit-научи.

В кода по-горе ние използваме класа ИзберетеKBestзаедно с теста хи-квадрат ( чи2 ), за да изберете 20-те най-добри функции. Броят на характеристиките, които трябва да бъдат извадени, всъщност е хиперпараметър, който трябва да бъде оптимизиран, за да се подобри резултатът от модела.

Не забравяйте да запазите всички трансдюсери, които сте приложили към тренировъчния комплект. Те ще са необходими за оценка на моделите в набора за валидиране.

Следващата стъпка е избор на алгоритъм за машинно обучение и настройка на хиперпараметри.

Като цяло, когато избирате алгоритъм за машинно обучение, трябва да вземете предвид следните опции:

  • Класификация:
    • Случайна гора.
    • Логистична регресия
    • Наивен Байес.
    • Метод на най-близките съседи.
  • регресия:
    • Случайна гора.
    • Усилване на градиента
    • Линейна регресия
    • Ридж регресия.
    • Ласо регресия
    • Поддържаща векторна машина.

Таблицата по-долу показва основните хиперпараметри на всеки алгоритъм и диапазоните на техните оптимални стойности.

Етикет RS *в таблицата означава, че не е възможно да се посочат оптималните стойности и трябва да се извърши произволно търсене.

Нека ви напомня още веднъж, не забравяйте да запазите всички приложени конвертори:

И не забравяйте да ги приложите към набора за валидиране:

Подходът, който разгледахме, и рамката, базирана на него, показаха добри резултати при повечето набори от данни, с които съм работил. Разбира се, при решаване на много сложни проблеми, тази техника не винаги дава добър резултат. Нищо не е перфектно, но учейки се, ние се подобряваме. Точно както е в машинното обучение.

На елементите във всеки списък. Частичният ред обикновено се посочва чрез посочване на оценка за всеки елемент (например „уместно“ или „неподходящо“; възможни са повече от две оценки). Целта на модела за класиране е да апроксимира и обобщи по най-добрия начин (в известен смисъл) метода за класиране в набора за обучение за нови данни.

Обучението по класиране все още е доста млада, бързо развиваща се област на изследване, която се появи през 2000-те с появата на интерес в областта на извличането на информация при прилагането на методи за машинно обучение към проблемите на класирането.

Колегиален YouTube

  • 1 / 5

    По време на обучението на модела за класиране и по време на неговата работа, всяка двойка документ-заявка се преобразува в числов вектор от характеристики на класиране (наричани още фактори за класиране или сигнали), характеризиращи свойствата на документа, заявката и тяхната връзка. Такива знаци могат да бъдат разделени на три групи:

    Следват някои примери за характеристики за класиране, използвани в набора от данни LETOR, добре известен в областта:

    • Стойности на мерките TF, TF-IDF, BM25 и езиковия модел за съвпадение на заявката на различни области на документа (заглавие, URL, основният текст, текст на връзката);
    • Дължини и IDF-суми на зоните за документи;
    • Ранговете на документи, получени чрез различни варианти на алгоритми за класиране на връзки, като PageRank и HITS.

    Показатели за качество на класирането

    Има няколко метрики, чрез които ефективността на алгоритмите за класиране на извадка се оценява и сравнява с оценителите. Често параметрите на модела за класиране са склонни да се коригират по такъв начин, че да максимизират стойността на един от тези показатели.

    Примери за показатели:

    Класификация на алгоритмите

    В своята статия „Да се ​​научим да се класираме за извличане на информация“ и изказвания на тематични конференции, Tai-Yang Liu от Microsoft Research Asia анализира съществуващите методи за решаване на проблема с класирането на преподаването и предложи тяхната класификация в три подхода, в зависимост от използваното представяне на входа . данни и наказателни функции:

    Точков подход

    Бележки (редактиране)

    1. Tie-Yan Liu (2009), Научете се да класирате за извличане на информация, Основи и тенденции в извличането на информация: бр. 3: No 3, стр. 225-331, ISBN 978-1-60198-244-5, DOI 10.1561 / 1500000016... Налични са слайдове от речта на T. Lew на WWW 2009.


Свързани статии: