В этой части 3 мы исследуем использование объяснений моделей машинного обучения, таких как LIME:



Почему я должен вам доверять?: Объяснение прогнозов любого классификатора
Несмотря на широкое распространение, модели машинного обучения остаются в основном черными ящиками. Понимание причин… arxiv.org »



Эти объяснения позволяют нам заглянуть во внутреннюю работу модели машинного обучения. Такая возможность полезна во многих отношениях, она вызывает доверие к модели и может также предоставить руководства по устранению неполадок, когда что-то идет не так, как ожидалось. Я считаю, что его также можно развернуть для улучшения качества наборов данных, которые приблизительно помечены с использованием таких методов, как текстовые шаблоны и частота слов и n-грамм.

Подобно частям 1 и 2 этой статьи, мы импортируем наборы данных в фрейм данных. В этой части 3 мы рассмотрим, как модель машинного обучения может принять решение о присвоении веса различным элементам наборов данных, которые она представляет.

Опять же, результирующий фрейм данных имеет 2 столбца. Столбец «предложение» содержит образец текста, а столбец «полярность» представляет тип возмещения. 0 - это возмещение, предоставляемое пользователем, а 1 - возмещение, предоставляемое владельцем.

Для кодирования слов мы будем использовать частотный векторизатор обратного документа, предоставляемый scikit-learn. Таким образом, этот векторизатор подсчитывает слова, появляющиеся в текстовом образце из пакета, но также снижает акцент на словах, которые появляются во многих текстовых образцах в пакете.
Интуиция заключается в том, что если несколько слов встречаются в образце текста много раз, то эти слова могут указывать на предмет этого образца текста.
Например, если мы обнаружим, что слова «банан» и «торт» встречаются много раз в абзаце, мы можем сделать вывод, что этот абзац может быть рецептом банановых пирожных. Однако такие слова, как «the», «и», «of», которые встречаются почти в каждом образце из партии, могут мало что сказать о том, о чем идет речь в конкретном образце. Фактически, это называется стоп-словами и обычно полностью удаляется.

Далее обычное разделение на набор для обучения и проверки.

from sklearn.model_selection import train_test_split
_train_vectors, _test_vectors = train_test_split(train_df, test_size=0.2)
vectorizer = 
sklearn.feature_extraction.text.TfidfVectorizer(lowercase=False, ngram_range=(2,4), stop_words=stopwds)
train_vectors = vectorizer.fit_transform(_train_vectors['sentence'])
test_vectors = vectorizer.transform(_test_vectors['sentence'])

Мы будем использовать случайные леса для классификации текста, поскольку он обеспечивает большую точность на основе своего алгоритма опроса независимых логических потоков принятия решений («деревьев решений»).

rf = sklearn.ensemble.RandomForestClassifier(n_estimators=500)
rf.fit(train_vectors, _train_vectors['polarity'])

pred = rf.predict(test_vectors)
sklearn.metrics.f1_score(_test_vectors['polarity'], pred, average='binary')
0.9600000000000001

Мы видим, что этот классификатор достигает 0,96 балла F1.

Мы сделаем прогноз и попросим LIME объяснить, как обрабатывается образец.

from lime import lime_text
from sklearn.pipeline import make_pipeline
c = make_pipeline(vectorizer, rf)
#Predict
print(c.predict_proba([_licensor_indem[17][1]])[0,1])
0.984

Выше показано, что модель случайного леса определила, что вероятность принадлежности выборки к классу 1 составляет 98%, что кажется правильным.

Теперь мы создаем объяснительный объект.

from lime.lime_text import LimeTextExplainer
explainer = LimeTextExplainer(class_names=target_names)

Затем мы генерируем объяснение, содержащее не более 15 характеристик образца.

exp = explainer.explain_instance(_licensor_indem[17][1], c.predict_proba, num_features=15)
print('Probability(licensor_indem) =', c.predict_proba([_licensor_indem[17][1]])[0,1])
#print('True class: %s' % target_names[])

Объяснение представлено ниже в виде списка взвешенных характеристик.

exp.as_list()

Визуализация объяснений

Объяснения могут быть возвращены в виде штрихового графика matplotlib:

%matplotlib inline
fig = exp.as_pyplot_figure()

Давайте представим объяснение в этой записной книжке.

exp.show_in_notebook(text=True)

Это объяснение фактически приближается к шаблону регулярных выражений, которые я использовал, чтобы пометить образцы. Шаблон ключа примерно (лицензиар | владелец | XXX) освобождает (пользователь | лицензиат | заказчик | клиент). Этот шаблон перевернут для компенсации пользователю. XXX - это имя лицензиара или владельца программного обеспечения, но часто бывает непросто точно определить имя объекта, хотя у меня был ограниченный успех с наборами именованных объектов NLTK.

Выводы:. Объясняющие классификацию, такие как LIME, я считаю, полезны для помощи в процессе нечеткой маркировки. Это особенно важно в тех случаях, когда вероятность того, к какой категории этикеток принадлежит образец, находится в среднем диапазоне. После этого мы сможем увидеть веса слов «за» и «против», чтобы настроить наши нечеткие теги.

This notebook is based on the one found here: https://github.com/marcotcr/lime/blob/master/doc/notebooks/Lime%20-%20basic%20usage%2C%20two%20class%20case.ipynb under the following license: https://github.com/marcotcr/lime/blob/master/LICENSE This notebook itself and associated materials are free for personal academic research use and are provided as-is and without warranty of any sort.
Author: Kok Mun Loon, 25 June 2019.