Метрики при проблеми с машинното обучение. Съвременни проблеми на науката и образованието Какво означава метрика на качеството в машинното обучение

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

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

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

Метрики в задачите за класификация

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

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

Импортиране на pandas като pd импортиране matplotlib.pyplot като plt от matplotlib.pylab импортиране на rc, импортиране на графика като sns от sklearn.preprocessing импортиране на LabelEncoder, OneHotEncoder от sklearn.model_selection импортиране на cross_val_score от sklearn.linear_model импортиране на LogisticRegression от sklearn.ensemble импортиране на RandomForestClassif ier, GradientBoostingClassifier от sklearn.metrics import precision_recall_curve, classification_report от sklearn.model_selection import train_test_split df = pd.read_csv("../../data/telecom_churn.csv")

Df.head(5)

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

# Нека картографираме двоичните колони # и фиктивно кодираме персонала (за по-лесно е по-добре да не правите това за дървени модели) d = ("Да" : 1, "Не" : 0) df["Международен план"] = df [" Международен план"].map(d) df["План за гласова поща"] = df["План за гласова поща"].map(d) df["Churn"] = df["Churn"].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, класове, normalize=False, title="Матрица на объркване)", 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-мярка

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

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

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

Както отбелязахме по-рано, има два вида класификационни грешки: фалшиво положителни и фалшиво отрицателни. В статистиката първият тип грешка се нарича грешка тип 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) - площ ( Ареа U nder ° С urve) под кривата на грешката ( Рприемник О perating ° Схарактеристична крива). Тази крива е линия от (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("muted") 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 крива ") plt.plot(, ) plt.xlim() plt.ylim() plt.xlabel("Коефициент на фалшиви положителни резултати ") 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 измерва дела на False Positive спрямо True Negative и в задачи, където вторият (по-голям) клас не е толкова важен за нас, може да не даде напълно адекватна картина при сравняване на алгоритми.

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

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

Тук вече се забелязва значителна разлика между двата алгоритъма - точно 0.855!

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

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

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

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

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

О, обект,

истински клас етикет на

о, обект, и

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

Математическата интерпретация на функцията на логистичните загуби вече е описана подробно в публикацията за линейни модели.
Този показател рядко се появява в бизнес изискванията, но често в задачите на kaggle.
Интуитивно може да се мисли за минимизиране на логаритмичните загуби като проблем за максимизиране на точността чрез санкциониране на неправилни прогнози. Все пак трябва да се отбележи, че 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 print("Logloss с уверена класификация и правилен отговор %f" % logloss_crutch(1, 0.9)) >> Logloss с уверена класификация и правилен отговор 0.105361 print(" Logloss с уверена класификация и ГРЕШЕН отговор %f" % logloss_crutch(1, 0.1)) >> Logloss с уверена класификация и ГРЕШЕН отговор 2.302585

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

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

Да обобщим:

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

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

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

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

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

Данни

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

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

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

Видове целеви променливи

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

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

Метрика

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

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

библиотеки

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

  • Изследване и трансформация на данни: панди(http://pandas.pydata.org/).
  • Широка гама от различни алгоритми за машинно обучение: scikit-learn(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., ​​​​Krohn-Grimberge A. AutoCompete: рамка за състезания по машинно обучение. (A. Thakur и A. Krohn-Grimberghe, AutoCompete: Рамка за състезания по машинно обучение.)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • RandomForestClassifier
  • RandomForestRegressor
  • ExtraTreesClassifier
  • ExtraTreesRegressor
  • XGB Класификатор
  • XGBRegressor

За да приложите линейни модели, трябва да нормализирате функции с помощта на класове Нормализаторили StandardScalerбиблиотеки scikit-learn.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1

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

машинно обучение

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

реконструкция

обработка на изображение

1. Гасталдо П. Решения за машинно обучение за обективна визуална оценка на качеството / 6-ти международен семинар за видео обработка и качествени показатели за потребителска електроника, VPQM. - том. 12. - 2012 г.

2. Bertalmio M., Bertozzi A., Sapiro G. Navier-Stokes, динамика на флуидите и рисуване на изображения и видео / Хавай: Proc. IEEE компютърно зрение и разпознаване на образи (CVPR). - 2001.–PP. 213–226.

3. Criminisi A., Perez P., Toyama K. Запълване на региони и премахване на обект чрез рисуване на изображения на базата на екземпляр / IEEE Trans. Процес на изображение. - 13 (9). - 2004. - PP. 28–34.

4. Vijay M., Cheung, S.S. Проследяване на очите, базирано на перцептивно изображение при анализ на качеството на рисуване/Обработка на изображения (ICIP), 17-та международна конференция на IEEE по IEEE. - 2010. - PP. 1109 - 1112.

5. Ardis P.A., Singhal A. Метрики за визуална значимост за рисуване на изображения / SPIE Electronic Imaging. Международно общество за оптика и фотоника. - 2009 г.

6. Cheung S.S., Zhao J., Venkatesh V. Ефективно обектно-базирано видео рисуване / Обработка на изображения, 2006 IEEE International Conference on. - 2006. - PP. 705-708.

7. Перетягин Г.И. Представяне на изображения чрез Гаусови случайни полета / Автометрия. – № 6. – 1984. – С. 42 – 48.

8. Франц В.А., Ворони В.В., Марчук В.И., Шерстобитов А.И., Агаян С., Егиазарян К. Подход за машинно обучение за обективна оценка на качеството на рисуване/ Proc. SPIE 9120, Мобилна мултимедия/обработка на изображения, сигурност и приложения. – кн. 91200S. – 2014 г.

9. Пол А., Сингхал А. и. Brown C. Inpainting оценка на качеството / Journal of Electronic Imaging. – кн. 19. – 2010. – PP. 011002-011002.

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

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

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

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

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

Математически модел

Статията използва обозначения, подобни на тези, приети в работата. Цялото изображение се състои от две отделни области: реконструираната област и известната област. Фигура 1 показва пример за местоположението на тези зони.

Фигура 1. Модел на изображението

Изображението и областта Ω вътре в него са известни. Задачата за реконструкция е да се модифицират стойностите на пикселите на изображение в рамките на регион Ω, така че регионът да не се откроява от фона на околното изображение. Целта на реконструкцията може да бъде възстановяване на повредени части от изображение (като драскотини и пукнатини в стари снимки) или премахване на нежелани обекти в изображение. Регионът Ω, показан на фигура 1, винаги е дефиниран от потребителя, т.е. дефинирането на региона Ω не е част от проблема за реконструкцията.

Алгоритъм за оценка на качеството на възстановяване на изображението

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

1. Дефиниране на пространството от характеристики, които служат за описание на входните сигнали.

2. Избор на функция за картографиране от пространството на характеристиките към пространството за оценка на качеството.

3. Трениране на системата и проверка на нейната стабилност (проверка за претрениране и др.).

Блоковата схема на избрания подход е представена на фигура 2 и съдържа следните стъпки:

1. Избор на област на интерес (с помощта на карта на вниманието);

2. Изчисляване на характеристиките на изображението от ниско ниво;

3. Изграждане на дескриптор на възстановената зона въз основа на характеристики от ниско ниво;

4. Решаване на регресионния проблем с цел получаване на числена оценка на качеството въз основа на резултантния дескрипторен вектор.

Ориз. 2. Блок-схема на алгоритъма

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

За да получим карти на вниманието, ние използваме Saliency Toolbox, описан в работата. Този инструментариум използва модел на човешката зрителна система. Важно е да се отбележи, че няма смисъл да се сравнява реконструираната област в оригиналните и реконструираните изображения, тъй като общото съдържание може да се промени значително. За да изберете области на интерес, се препоръчва да използвате следния израз:

.

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

Спектралните представяния се използват като характеристики на ниско ниво на локални области. След това предлагаме анализ на следните бази на Фурие, Уолш и Хаар, използвайки вектора на ефективност. За да се изчислят правилно компонентите на критерия за ефективност на системата при наличие на смущения и изкривявания, е необходимо използването на статистическо осредняване.

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

За даден клас от двумерни процеси се приема, че е известна вероятността на всеки от подкласовете, където индексът е номерът на подкласа с някои общи свойства и е номерът на изпълнение на процеса от подклас. Ще сравним определен набор от основни системи Развиване в обобщен ред на Фурие в ,та базисна система в общ изгледима формата: .

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

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

.

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

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

Средният риск се определя чрез осредняване на условния риск в подкласовете сигнали:

,

където е вероятността за тития подклас сигнали.

В съответствие с критерия за минимален среден риск от базите се избира този, за който средният риск е минимален.

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

Като пример в статията се разглежда представянето на случайни реализации с различни корелационни функции в базисите на тригонометрични функции (Фурие), Уолш и Хаар. Нека да извършим анализа в избраните бази за създадените модели изображения с размери 256 на 256 пиксела. Нека също дефинираме три типа вероятностни разпределения на подкласове: 1) равномерно: ; 2) намаляващи: ;
3) увеличаване: . Нека изберем функция на разходите във формата: .

Средният риск се определя чрез осредняване на условния риск в подкласовете сигнали, като се използват приетите априорни вероятности на подкласовете сигнали; изчислените стойности са представени в таблица 1.

маса 1

Средни рискови стойности

Видове вероятностни разпределения

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

Въз основа на анализа ще изберем база на Хаар, за да представим локални области на изображения. Трябва да се отбележи, че размерът на реконструираната област варира за различните изображения. В тази връзка, въз основа на характеристики на ниско ниво, трябва да се формира представяне на високо ниво с фиксиран размер. Подходът на торбата с думи се използва като представяне на високо ниво. Процедурата за конструиране на дескриптор (сигнатура) на реконструираната площ се състои от две стъпки. Първата стъпка е да се създаде речник. Това се прави с помощта на характеристики на ниско ниво, извлечени от всички изображения в комплекта изображения за обучение. За да се изгради речникът, извлечените характеристики се разделят на 100 класа, като се използва алгоритъм за групиране на k-средства. Всеки елемент от речника представлява центроид за един от класовете, открити от процедурата за клъстериране. Всяка дума в речника представлява трансформация на Хаар в блок с изображение 8x8. Полученият речник се използва на втория етап при конструирането на честотни хистограми за думите от речника като признаков вектор - дескриптор на реконструираната област (фиг. 3). Полученият набор от дескриптори се използва за обучение на регресионна машина (Support Vector Regression). За да се получи хистограма на честотите на думата, всички визуално изпъкващи области (изпъкналостта се определя с помощта на карти на вниманието) на конкретно изображение се извличат от речника. След това трансформацията на Хаар се прилага към всеки от извлечените блокове и се извършва класификация според получения речник въз основа на евклидово разстояние.

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

Фиг.3. Изграждане на хистограма

Оценка на ефективността на алгоритъм за оценка на качеството на възстановяване на изображението

За да се оцени ефективността на разработената метрика, беше използван набор от тестови изображения. Комплектът се състои от 300 изображения. Като методи за възстановяване бяха избрани следните подходи: метод, базиран на търсене на самоподобни области, метод, базиран на спектрални трансформации, метод, базиран на изчисляване на частни производни. За всяко изображение е направена експертна оценка, в която са участвали 30 души. Резултатите бяха разделени на два набора, които не се припокриваха. Първият беше използван за обучение, а вторият - за тестване на резултата.

Експертите оцениха качеството по скала, в която 5 съответства на „Отлично“, а 1 съответства на „Много лошо“. За да се оцени ефективността на получената метрика, се използва коефициентът на корелация между векторите, получени с помощта на обективната метрика и експертния метод за оценка на качеството. Анализът на получените резултати в таблица 2 показва, че предложеният подход превъзхожда известните показатели за качество на избрания набор от тестови данни.

таблица 2

Коефициент на корелация за различни методи за изчисляване на целта
показатели за качество на изображението

Предложен подход

Заключение

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

Работата е подкрепена от Министерството на образованието и науката на Русия в рамките на Федералната целева програма „Научноизследователска и развойна дейност в приоритетните области на развитие на научно-техническия комплекс на Русия за 2014-2020 г.“ (споразумение № 14.586.21.0013 ).

Рецензенти:

Федосов V.P., доктор на техническите науки, професор, ръководител на катедрата за напреднали разработки, инженерна и технологична академия на Южния федерален университет, Ростов на Дон;

Марчук V.I., доктор на техническите науки, професор, ръководител на катедрата по радиоелектронни и електрически системи и комплекси на ISOiP (клон на DSTU), Шахти.

Библиографска връзка

Воронин В.В. ОЦЕНКА НА КАЧЕСТВОТО НА ВЪЗСТАНОВЯВАНЕ НА ИЗОБРАЖЕНИЕ НА БАЗА НА МАШИННО ОБУЧЕНИЕ // Съвременни проблеми на науката и образованието. – 2014. – № 6.;
URL: http://science-education.ru/ru/article/view?id=16294 (дата на достъп: 01.02.2020 г.). Предлагаме на вашето внимание списания, издадени от издателство "Академия за естествени науки"

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

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

Метрики в задачите за класификация

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

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

Импортиране на pandas като pd импортиране matplotlib.pyplot като plt от matplotlib.pylab импортиране на rc, импортиране на графика като sns от sklearn.preprocessing импортиране на LabelEncoder, OneHotEncoder от sklearn.model_selection импортиране на cross_val_score от sklearn.linear_model импортиране на LogisticRegression от sklearn.ensemble импортиране на RandomForestClassif ier, GradientBoostingClassifier от sklearn.metrics import precision_recall_curve, classification_report от sklearn.model_selection import train_test_split df = pd.read_csv("../../data/telecom_churn.csv")

Df.head(5)


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

# Нека картографираме двоичните колони # и фиктивно кодираме персонала (за по-лесно е по-добре да не правите това за дървени модели) d = ("Да" : 1, "Не" : 0) df["Международен план"] = df [" Международен план"].map(d) df["План за гласова поща"] = df["План за гласова поща"].map(d) df["Churn"] = df["Churn"].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, класове, normalize=False, title="Матрица на объркване)", 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-мярка

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

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

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

Както отбелязахме по-рано, има два вида класификационни грешки: фалшиво положителни и фалшиво отрицателни. В статистиката първият тип грешка се нарича грешка тип 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) - площ ( Ареа U nder ° С urve) под кривата на грешката ( Рприемник О perating ° Схарактеристична крива). Тази крива е линия от (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("muted") 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 крива ") plt.plot(, ) plt.xlim() plt.ylim() plt.xlabel("Коефициент на фалшиви положителни резултати ") 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 измерва дела на False Positive спрямо True Negative и в задачи, където вторият (по-голям) клас не е толкова важен за нас, може да не даде напълно адекватна картина при сравняване на алгоритми.

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

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

Тук вече се забелязва значителна разлика между двата алгоритъма - точно 0.855!

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


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

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

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

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

Математическата интерпретация на функцията на логистичните загуби вече е описана подробно в публикацията за линейните модели.
Този показател рядко се появява в бизнес изискванията, но често в задачите на kaggle.
Интуитивно може да се мисли за минимизиране на логаритмичните загуби като проблем за максимизиране на точността чрез санкциониране на неправилни прогнози. Все пак трябва да се отбележи, че 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 print("Logloss с уверена класификация и правилен отговор %f" % logloss_crutch(1, 0.9)) >> Logloss с уверена класификация и правилен отговор 0.105361 print(" Logloss с уверена класификация и ГРЕШЕН отговор %f" % logloss_crutch(1, 0.1)) >> Logloss с уверена класификация и ГРЕШЕН отговор 2.302585

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


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

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

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

На база отлив на клиенти на телеком оператор.


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

import pandas като pd import matplotlib.pyplot като plt от matplotlib.pylab import rc, plot import seaborn като sns от sklearn.preprocessing import LabelEncoder, OneHotEncoder from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassif ier, GradientBoostingClassifier от sklearn.metrics import precision_recall_curve, classification_report от sklearn.model_selection import train_test_split df = pd.read_csv("../../data/telecom_churn.csv")


df.head(5)

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

# Нека картографираме двоичните колони # и фиктивно кодираме персонала (за по-лесно е по-добре да не правите това за дървени модели) d = ("Да" : 1, "Не" : 0) df["Международен план"] = df [" Международен план"].map(d) df["План за гласова поща"] = df["План за гласова поща"].map(d) df["Churn"] = df["Churn"].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, класове, normalize=False, title="Матрица на объркване)", 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-мярка

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




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



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


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


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


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



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


report = 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) - площ ( Ареа U nder ° С urve) под кривата на грешката ( Рприемник О perating ° Схарактеристична крива). Тази крива е линия от (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("muted") 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 крива ") plt.plot(, ) plt.xlim() plt.ylim() plt.xlabel("Коефициент на фалшиви положителни резултати ") 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 измерва дела на False Positive спрямо True Negative и в задачи, където вторият (по-голям) клас не е толкова важен за нас, може да не даде напълно адекватна картина при сравняване на алгоритми.


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

  • Алгоритъм 1

  • Алгоритъм 2


Тук вече се забелязва значителна разлика между двата алгоритъма - точно 0.855!


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



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

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

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



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


Математическата интерпретация на функцията на логистичните загуби вече е описана подробно в публикацията за линейните модели.
Този показател рядко се появява в бизнес изискванията, но често в задачите на kaggle.
Интуитивно може да се мисли за минимизиране на логаритмичните загуби като проблем за максимизиране на точността чрез санкциониране на неправилни прогнози. Все пак трябва да се отбележи, че 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 print("Logloss с уверена класификация и правилен отговор %f" % logloss_crutch(1, 0.9)) >> Logloss с уверена класификация и правилен отговор 0.105361 print(" Logloss с уверена класификация и ГРЕШЕН отговор %f" % logloss_crutch(1, 0.1)) >> Logloss с уверена класификация и ГРЕШЕН отговор 2.302585

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



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

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

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