В этой части 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.