![1mfdZkWLPVKS39CyQxfL6OQ.png](https://quantinsightsnetwork.com/wp-content/uploads/2023/11/1mfdZkWLPVKS39CyQxfL6OQ-678x381.png)
Проблема понимания результатов работы моделей очень актуальна в машинном обучении. Одним из инструментов позволяющим исследовать результаты моделей машинного обучения и анализировать их поведение является What-If Tool.
“Цель What-If Tool — предоставить людям простой, интуитивно понятный и мощный способ изучения и исследования обученных моделей машинного обучения с помощью визуального интерфейса, абсолютно не требующего кода.”
What-If Tool позволяет визуализировать результаты обучения на большом наборе данных. С возможностью изменения данных через визуальный интерфейс или программно и отображения влияния изменений на результаты модели. Инструмент позволяет исследовать влияния данных на обученную модель классификации или регрессии в визуальном интерфейсе.
Первый пример. Визуализации Keras модели классификации.
Этот инструмент разработан командой Google Research[1] в первую очередь для использования c Tensor-Flow. Однако, инструмент возможно использовать и для визуализации других моделей. Разберу пример представленный в репозитории What-If Tool. [2] В данном примере сравниваются две модели Keras, обученные классифицировать токсичность комментариев.
Ниже будут представлены основные фрагменты кода для понимания процесса работы инструмена. Полный пример выполнения можно найти в google colab.[3]
#загрузка моделей
model1 = tf.keras.models.load_model('cnn_wiki_tox_v3_model.h5')
model2 = tf.keras.models.load_model('cnn_debias_tox_v3_model.h5')
Обе предобученные модели взяты из Conversational AI, [4] репозитория содержащего данные об ошибках речевых моделей.
# Convert list of tf.Examples to list of comment strings.
def examples_to_strings(examples):
texts = [ex.features.feature['comment'].bytes_list.value[0] for ex in examples]
if sys.version_info >= (3, 0):
texts = [t.decode('utf-8') for t in texts]
return texts# Get raw string out of tf.Example and prepare it for keras model input
def examples_to_model_in(examples, tokenizer):
texts = examples_to_strings(examples)
# Tokenize string into fixed length sequence of integer based on tokenizer
# and model padding
text_sequences = tokenizer.texts_to_sequences(texts)
model_ins = tf.keras.preprocessing.sequence.pad_sequences(
text_sequences, maxlen=PADDING_LEN)
return model_ins
# WIT predict functions:
def custom_predict_1(examples_to_infer):
model_ins = examples_to_model_in(examples_to_infer, tokenizer1)
preds = model1.predict(model_ins)
return preds
def custom_predict_2(examples_to_infer):
model_ins = examples_to_model_in(examples_to_infer, tokenizer2)
preds = model2.predict(model_ins)
return preds
Код выше предоставляет функции для интеграции моделей TensorFlow и Keras с What-If Tool (WIT), обеспечивая преобразование данных, входящих в модель, из tf.Example в строки, а также получение предсказаний от двух моделей (model1 и model2) для использования в WIT. Это позволяет проводить интерпретацию и визуализацию результатов работы моделей через интерфейс What-If Tool
Далее данные из формата csv преобразуются в tf.Example, который является протоколом в TensorFlow представляющем структуру данных, облегчающую сериализацию и передачу информации, и часто используется для представления входных данных в моделях машинного обучения.
И, наконец-то, вызов What-If-Tool.
#@title Invoke What-If Tool for the data and two models (Note that this step may take a while due to prediction speed of the toxicity model){display-mode: "form"}
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder
num_datapoints = 1000 #@param {type: "number"}
tool_height_in_px = 720 #@param {type: "number"}# Setup the tool with the test examples and the trained classifier
config_builder = WitConfigBuilder(examples[:num_datapoints]).set_custom_predict_fn(
custom_predict_1).set_compare_custom_predict_fn(custom_predict_2).set_custom_distance_fn(
universal_sentence_encoder_distance)
wv = WitWidget(config_builder, height=tool_height_in_px)
В результате этого вызова получаем возможность интерактивно взаимодействовать с инструментом. В случае сравнения вышеупомянутых моделей мы можем визуально распределить комментарии по длине, по метке токчисности (цветом, цифрой или расположением на экране).
Второй пример. Регрессия.
Следующий пример, регрессионная модель предсказания возраста[5].
Начинаем, с ипорта, и если нужно установки, witwidget. Далее описываем функции-помощники. Комментарии к ним, привожу в коде.
#функции-помощники# Функция преобразует dataframe и имена его колонок в формат фичеров tf
feature_spec = {}
if columns == None:
columns = df.columns.values.tolist()
for f in columns:
if df[f].dtype is np.dtype(np.int64) or df[f].dtype is np.dtype(np.int32):
feature_spec[f] = tf.io.FixedLenFeature(shape=(), dtype=tf.int64)
elif df[f].dtype is np.dtype(np.float64):
feature_spec[f] = tf.io.FixedLenFeature(shape=(), dtype=tf.float32)
else:
feature_spec[f] = tf.io.FixedLenFeature(shape=(), dtype=tf.string)
return feature_spec
# Функция создаёт числовые и категориальные фичи для колонок используя вывод предыдущей функции
def create_feature_columns(columns, feature_spec):
ret = []
for col in columns:
if feature_spec[col].dtype is tf.int64 or feature_spec[col].dtype is tf.float32:
ret.append(tf.feature_column.numeric_column(col))
else:
ret.append(tf.feature_column.indicator_column(
tf.feature_column.categorical_column_with_vocabulary_list(col, list(df[col].unique()))))
return ret
# Функция предоставляет входные данные в модель из tf.Examples
def tfexamples_input_fn(examples, feature_spec, label, mode=tf.estimator.ModeKeys.EVAL,
num_epochs=None,
batch_size=64):
def ex_generator():
for i in range(len(examples)):
yield examples[i].SerializeToString()
dataset = tf.data.Dataset.from_generator(
ex_generator, tf.dtypes.string, tf.TensorShape([]))
if mode == tf.estimator.ModeKeys.TRAIN:
dataset = dataset.shuffle(buffer_size=2 * batch_size + 1)
dataset = dataset.batch(batch_size)
dataset = dataset.map(lambda tf_example: parse_tf_example(tf_example, label, feature_spec))
dataset = dataset.repeat(num_epochs)
return dataset
# Парсинг Tf.Example в фичи для функции входных данных
def parse_tf_example(example_proto, label, feature_spec):
parsed_features = tf.io.parse_example(serialized=example_proto, features=feature_spec)
target = parsed_features.pop(label)
return parsed_features, target
# Преобразует dataframe в лист tf.Example
def df_to_examples(df, columns=None):
examples = []
if columns == None:
columns = df.columns.values.tolist()
for index, row in df.iterrows():
example = tf.train.Example()
for col in columns:
if df[col].dtype is np.dtype(np.int64) or df[col].dtype is np.dtype(np.int32):
example.features.feature[col].int64_list.value.append(int(row[col]))
elif df[col].dtype is np.dtype(np.float64):
example.features.feature[col].float_list.value.append(row[col])
elif row[col] == row[col]:
example.features.feature[col].bytes_list.value.append(row[col].encode('utf-8'))
examples.append(example)
return examples
# Преообазует колонку датафрейма в бинарные значения 0 и 1 в зависимости от результата теста.
# Преобразованные функцией колонки можно использовать в бинарном TF estimator.
def make_label_column_numeric(df, label_column, test):
df[label_column] = np.where(test(df[label_column]), 1, 0)
Далее, загружаем датасет из csv с помощью функций Pandas. Указываем, что целевая колонка — возраст “Age”.
label_column = 'Age'# Остальные колонки - это фичи
input_features = [
'Over-50K', 'Workclass', 'Education', 'Marital-Status', 'Occupation',
'Relationship', 'Race', 'Sex', 'Capital-Gain', 'Capital-Loss',
'Hours-per-week', 'Country']
# Лист содержащий все фичи и целевую колонку
features_and_labels = input_features + [label_column]
# Преобразуем датасет в tf.Example examples = df_to_examples(df)
Далее, определяем и обучаем регрессию:
# количество шагов обучения,
# текст комментария позволяет отображать переменную как параметр для ввоода в colab
num_steps = 200 #@param {type: "number"} # Создаём спицификтор фич для модель
feature_spec = create_feature_spec(df, features_and_labels)
# Определяем и обучаем модель
train_inpf = functools.partial(tfexamples_input_fn, examples, feature_spec, label_column)
regressor = tf.estimator.LinearRegressor(
feature_columns=create_feature_columns(input_features, feature_spec))
regressor.train(train_inpf, steps=num_steps)
Вызываем What-If tool для исследования данных и обученной модели
num_datapoints = 2000 #@param {type: "number"}
tool_height_in_px = 1000 #@param {type: "number"}from witwidget.notebook.visualization import WitConfigBuilder
from witwidget.notebook.visualization import WitWidget
# Загрузка тестового датасета
test_csv_path = 'https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test'
test_df = pd.read_csv(test_csv_path, names=csv_columns, skipinitialspace=True,
skiprows=1)
test_examples = df_to_examples(test_df[0:num_datapoints])
# Конфигурация Wit в соответствии с тестовыми данными и обученной моделью
config_builder = WitConfigBuilder(test_examples[0:num_datapoints]).set_estimator_and_feature_spec(
regressor, feature_spec).set_model_type('regression')
WitWidget(config_builder, height=tool_height_in_px)
В интерактивном формате мы можем посмотреть какие признаки (фичи) и как соотносятся к одним и тем же объектам данных. На картинке ниже показан вывод 200 объектов, цветовая визуализация в соответствии с уровнем образования, а числовая в соответствии с возрастом.
Мы можем увеличить количество отображаемых признаков. Добавим, по оси X разделение на группы по стране проживания. А по оси Y по семейному статусу.
Так же можно добавить дополнительные измерения (максимум 6) для лучшего сравнения признаков. В примере ниже каждый отдельный график определяет определённый род деятельности, цвет — страну, число по горизонтали — количество рабочих часов в неделю, а по вертикали — возраст.
- Статья “The What-If Tool: Interactive Probing of Machine Learning Models” https://ieeexplore.ieee.org/abstract/document/8807255
- Репозиторий инструмента what-if-tool. https://github.com/PAIR-code/what-if-tool
- WIT Классификация токсичных текстов. https://colab.research.google.com/github/pair-code/what-if-tool/blob/master/WIT_Toxicity_Text_Model_Comparison.ipynb#scrollTo=zZR3i6UZlZ96
- Репозиторий “Unintended ML Bias Analysis” https://github.com/conversationai/unintended-ml-bias-analysis
- WIT Age Regression https://colab.research.google.com/github/pair-code/what-if-tool/blob/master/WIT_Age_Regression.ipynb#scrollTo=NUQVro76e38Q
Be the first to comment