[Перевод] Как включить в модель знания предметной области
Зачем это нужно?
Представьте, что вам дали размеченный набор данных, и ваша задача — предсказать новый. Что вы будете делать? Вероятно, сперва вы попробуете обучить модель машинного обучения поиску правил для разметки новых данных. А что дальше? Подробности — к старту нашего флагманского курса по науке о данных.
Модель машинного обучения удобна, но при ML сложно понять, почему модель делает именно такое предсказание. Вы также не можете использовать в такой модели знания предметной области.
Есть ли другой способ установить правила разметки данных на основе ваших знаний, кроме того, чтобы полагаться на предсказания модели машинного обучения?
Вот здесь и пригодится 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)
Обучите модель 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))
Качество предсказания довольно хорошее. Однако неизвестно, как модель делает эти прогнозы. Давайте посмотрим, можно ли сделать разметку новых данных согласно простым правилам.
Модель на основе правил
Вот четыре шага создания правил разметки данных. Нужно:
- Выдвинуть гипотезу.
- Изучить данные для подтверждения гипотезы.
- Начать с простых правил, которые основаны на наблюдениях.
- Усовершенствовать правила.
Выдвигаем гипотезу
Свет в комнате — важный показатель того, занято ли помещение. Таким образом, можно предположить, что, чем светлее в помещении, тем больше вероятность того, что оно занято.
Давайте посмотрим на данные и проверим, так ли это.
Изучаем данные
Для проверки предположения воспользуемся диаграммой размаха (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)
Видно значительную разницу медианы между занятым и пустым помещениями.
Начинаем с простых правил
Теперь создадим правила определения занятости помещения по его освещенности. Например, если количество света превышает определённое значение, то Occupancy=1, в противном случае Occupancy=0.
Но какое пороговое значение выбрать? Начнём со значения 100
и посмотрим, что получится:
Чтобы создать с помощью 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))
Точность модели [на основе правил] выше точности RandomForestClassifier
!
Улучшаем правила
Теперь посмотрим, сможем ли мы добиться точности выше, поэкспериментировав с пороговыми значениями. Для анализа взаимосвязи между конкретным значением освещённости и занятостью помещения используем параллельные координаты.
from hulearn.experimental.interactive import parallel_coordinates
parallel_coordinates(train, label=target, height=200)
Визуализация в параллельных координатах показывает, что вероятность занятости помещения с освещённостью более 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
Теперь отразим это значение на диаграмме размаха:
Используем модель с наилучшим пороговым значением для прогнозирования тестового набора данных:
human_preds = grid.predict(val_X)
print(classification_report(val_y, human_preds))
Пороговое значение 365 даёт точность выше, чем пороговое значение 100.
Объединение модели машинного обучения и модели на основе правил
Для создания модели на основе правил обратиться к знаниям предметной области неплохо, однако у подхода есть недостатки:
- сложно обобщать модель на недоступные данные;
- трудно придумать правила для сложных данных;
- нет обратной связи для улучшения модели.
Поэтому комбинация модели на основе правил и модели машинного обучения поможет дата-сайентистам масштабировать и улучшать модель, сохраняя при этом возможность использовать экспертные знания предметной области.
Один из простых способов объединить эти две модели — решить, нужно ли нам уменьшить ложно отрицательные прогнозы (False Negative — FN), или ложно положительные прогнозы (False Positive — FP).
Уменьшение числа ложно отрицательных прогнозов
Вероятно, вам стоит уменьшить FN в таком случае, как прогнозирование наличия у пациента рака (лучше ошибиться, сообщив пациентам, что у них рак, чем не обнаружить его, [чем наоборот: сообщить, что рака нет, когда он есть]).
Чтобы уменьшить FN, выберите положительные прогнозы, где две модели дают разные ответы:
Уменьшение числа ложно положительных прогнозов
Вероятно, вам стоит уменьшить количество FP в таких случаях, как рекомендация детям видео со сценами жестокости (лучше ошибиться, не рекомендуя детям видео для детей, чем рекомендовать детям видео для взрослых).
Чтобы уменьшить количество FP, выберите отрицательные прогнозы, где две модели дают разные ответы.
Для принятия решения о выборе прогноза можно использовать и другие, более сложные стратегии
Чтобы узнать подробности о том, как объединять модель машинного обучения с моделями на основе правил, рекомендую посмотреть отличное видео Джереми Джордана:
Заключение
Поздравляю! Вы только что узнали, что такое модель на основе правил и как объединить её с моделью машинного обучения. Надеюсь, что эта статья даст вам знания, необходимые для разработки вашей собственной модели на основе правил.
Добавляйте в избранное этот репозиторий, если хотите попробовать код к моим статьям.
Источник данных:
Точное определение занятости офисного помещения по данным освещённости, температуры, влажности и концентрации углекислого газа с помощью статистических моделей обучения. Luis M. Candanedo, Véronique Feldheim. Energy and Buildings. Том 112, 15 января 2016 г., стр. 28–39.
А мы научим вас аккуратно работать с данными, чтобы вы прокачали карьеру и стали востребованным IT-специалистом.
Data Science и Machine Learning
Python, веб-разработка
Мобильная разработка
Java и C#
От основ — в глубину
А также