[Перевод] Как включить в модель знания предметной области

Зачем это нужно?

Представьте, что вам дали размеченный набор данных, и ваша задача — предсказать новый. Что вы будете делать? Вероятно, сперва вы попробуете обучить модель машинного обучения поиску правил для разметки новых данных. А что дальше? Подробности — к старту нашего флагманского курса по науке о данных.

-rm8flbydf39bfbncd9a4rqbodg.png

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

Есть ли другой способ установить правила разметки данных на основе ваших знаний, кроме того, чтобы полагаться на предсказания модели машинного обучения?

8ogole4-kt21pqduuauzn32hbug.png

Вот здесь и пригодится human-learn.


Что такое human-learn?

human-learn — это пакет Python для создания систем на основе простых в построении и совместимых со scikit-learn правил.

Чтобы установить human-learn, выполните команду:

pip install human-learn

Мы узнаем, как создать модель с помощью простой функции. Пробовать и форкать исходный код для этой статьи можно по этой ссылке:

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


Модель машинного обучения

В качестве примера воспользуемся набором данных Occupation Detection Dataset из репозитория UCI Machine Learning Repository.

Наша задача — спрогнозировать, занято ли помещение, помещения по температуре, влажности, освещённости и концентрации углекислого газа. Помещение свободно, если Occupancy=0, и занято, если Occupancy=1 .

После загрузки распакуйте архив и считайте данные:

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

# Get train and test data
train = pd.read_csv("occupancy_data/datatraining.txt").drop(columns="date")
test = pd.read_csv("occupancy_data/datatest.txt").drop(columns="date")

# Get X and y
target = "Occupancy"
train_X, train_y = train.drop(columns=target), train[target]
val_X, val_y = test.drop(columns=target), test[target]

Посмотрите на первые десять записей набора данных train:

train.head(10)

1*AFFl4y0quzVg_y53-aWoxg.png

Обучите модель RandomForestClassifier [классификатор случайного леса] из scikit-learn на обучающем наборе данных и используйте эту модель для предсказания тестового набора данных:

# Train
forest_model = RandomForestClassifier(random_state=1)

# Preduct
forest_model.fit(train_X, train_y)
machine_preds = forest_model.predict(val_X)

# Evalute
print(classification_report(val_y, machine_preds))

_orcfxm_eqecjoqeypymtefihzs.png

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


Модель на основе правил

Вот четыре шага создания правил разметки данных. Нужно:


  1. Выдвинуть гипотезу.
  2. Изучить данные для подтверждения гипотезы.
  3. Начать с простых правил, которые основаны на наблюдениях.
  4. Усовершенствовать правила.


Выдвигаем гипотезу

Свет в комнате — важный показатель того, занято ли помещение. Таким образом, можно предположить, что, чем светлее в помещении, тем больше вероятность того, что оно занято.

Давайте посмотрим на данные и проверим, так ли это.


Изучаем данные

Для проверки предположения воспользуемся диаграммой размаха (box plot), чтобы найти разницу между освещённостью в занятом (Occupancy=1) и пустом (Occupancy=0) помещениях.

import plotly.express as px
import plotly.graph_objects as go

feature = "Light"
px.box(data_frame=train, x=target, y=feature)

qgrmcxrk1httq--8qsfsnzvjjbm.png

Видно значительную разницу медианы между занятым и пустым помещениями.


Начинаем с простых правил

Теперь создадим правила определения занятости помещения по его освещенности. Например, если количество света превышает определённое значение, то Occupancy=1, в противном случае Occupancy=0.

xovvgfr7qtp3mabspebltzk01e4.png

Но какое пороговое значение выбрать? Начнём со значения 100 и посмотрим, что получится:

dsbxv3nqp28c8kas4u3p9l7i3pq.png

Чтобы создать с помощью human-learn модель на основе правил, мы:


  • напишем в Python простую функцию, которая задаёт правила;
  • воспользуемся FunctionClassifier, чтобы превратить эту функцию в модель scikit-learn.
import numpy as np
from hulearn.classification import FunctionClassifier

def create_rule(data: pd.DataFrame, col: str, threshold: float=100):
    return np.array(data[col] > threshold).astype(int)

mod = FunctionClassifier(create_rule, col='Light')

Сделаем предсказание тестового набора данных и оценим прогноз:

mod.fit(train_X, train_y)
preds = mod.predict(val_X)
print(classification_report(val_y, preds))

mvffioee2lzazeslnux6vxq_qim.png

Точность модели [на основе правил] выше точности RandomForestClassifier!


Улучшаем правила

Теперь посмотрим, сможем ли мы добиться точности выше, поэкспериментировав с пороговыми значениями. Для анализа взаимосвязи между конкретным значением освещённости и занятостью помещения используем параллельные координаты.

from hulearn.experimental.interactive import parallel_coordinates

parallel_coordinates(train, label=target, height=200)

ody6wadfr1c8xsq2sfqkqf6wqzu.gif

Визуализация в параллельных координатах показывает, что вероятность занятости помещения с освещённостью более 250 люксов высока. Оптимальное пороговое значение, отделяющее занятую комнату от пустой, по-видимому, находится где-то между 250 и 750 люксами.

Найдём наилучшее пороговое значение в этом диапазоне при помощи GridSearch из scikit-learn.

from sklearn.model_selection import GridSearchCV

grid = GridSearchCV(mod, cv=2, param_grid={"threshold": np.linspace(250, 750, 1000)})
grid.fit(train_X, train_y)

Получаем наилучшее пороговое значение:

best_threshold = grid.best_params_["threshold"]
best_threshold
> 364.61461461461465

Теперь отразим это значение на диаграмме размаха:

8kfi9wwsh_cm-lvrwjmcqihz6vs.png

Используем модель с наилучшим пороговым значением для прогнозирования тестового набора данных:

human_preds = grid.predict(val_X)
print(classification_report(val_y, human_preds))

0qhz3ysil5qsn6_4pkxadrhjqyo.png

Пороговое значение 365 даёт точность выше, чем пороговое значение 100.


Объединение модели машинного обучения и модели на основе правил

Для создания модели на основе правил обратиться к знаниям предметной области неплохо, однако у подхода есть недостатки:


  • сложно обобщать модель на недоступные данные;
  • трудно придумать правила для сложных данных;
  • нет обратной связи для улучшения модели.

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

Один из простых способов объединить эти две модели — решить, нужно ли нам уменьшить ложно отрицательные прогнозы (False Negative — FN), или ложно положительные прогнозы (False Positive — FP).


Уменьшение числа ложно отрицательных прогнозов

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

Чтобы уменьшить FN, выберите положительные прогнозы, где две модели дают разные ответы:

bclbzpozsm2kkj91bky4bkrrvfa.png


Уменьшение числа ложно положительных прогнозов

Вероятно, вам стоит уменьшить количество FP в таких случаях, как рекомендация детям видео со сценами жестокости (лучше ошибиться, не рекомендуя детям видео для детей, чем рекомендовать детям видео для взрослых).

Чтобы уменьшить количество FP, выберите отрицательные прогнозы, где две модели дают разные ответы.

tnbtzhvxy9giziyca77jrw8iy6e.png

Для принятия решения о выборе прогноза можно использовать и другие, более сложные стратегии

Чтобы узнать подробности о том, как объединять модель машинного обучения с моделями на основе правил, рекомендую посмотреть отличное видео Джереми Джордана:


Заключение

Поздравляю! Вы только что узнали, что такое модель на основе правил и как объединить её с моделью машинного обучения. Надеюсь, что эта статья даст вам знания, необходимые для разработки вашей собственной модели на основе правил.

Добавляйте в избранное этот репозиторий, если хотите попробовать код к моим статьям.

Источник данных:


Точное определение занятости офисного помещения по данным освещённости, температуры, влажности и концентрации углекислого газа с помощью статистических моделей обучения. Luis M. Candanedo, Véronique Feldheim. Energy and Buildings. Том 112, 15 января 2016 г., стр. 28–39.

А мы научим вас аккуратно работать с данными, чтобы вы прокачали карьеру и стали востребованным IT-специалистом.

j2_ogfhj6eyshhs0_viq_hce12i.png


Краткий каталог курсов

Data Science и Machine Learning

Python, веб-разработка

Мобильная разработка

Java и C#

От основ — в глубину

А также


© Habrahabr.ru