машинное обучение
June 20, 2021

Проверка корректности предсказаний AI модели

Как убедиться в правильности работы AI модели, интерпретация которой является делом крайне сложным, а зачастую невыполнимым. Самым простым способом является сравнение предсказаний с прошлыми результатами и определение точек с аномальными прогнозами.

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

Для сопоставления результатов со столбцом-ориентиром я пользуюсь простенькой функцией, которая возвращает сомнительные данные:

def checkpredcol(data, col_pred,col_check,part=1):
    susp_rows = []
    for ind, row in data.iterrows():
        if abs((row[col_pred]-row[col_check]))/min(abs(row[col_check]),abs(row[col_pred]))>part:
            susp_rows.append(ind)
    return data.loc[susp_rows], susp_rows

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

Для примера сформируем простенькую матрицу с предсказаниями в столбце с именем pred и 5 столбцами с историческими данными target-a:

Сравним результаты прогноза со столбцом 0:

Аномальное значение появилось лишь в последней строке.

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

Сгенерируем новый пример и покажем как сформировать такой целевой столбец:

col_l = [0,1,2,3,4]
df['Sum'] = df[col_l].sum(axis=1)
df['NN'] = df[col_l].astype(bool).sum(axis=1)
df['Mean'] = df['Sum'] / df['NN']
df