Точно так же ученики мало узнают, просто сидя на уроках и слушая учителей, запоминая заранее подготовленные задания и выплевывая ответы. Чтобы оказать существенное влияние, они должны делиться своим опытом обучения, говорить об этом, писать об этом (точно так же, как я делаю сегодня), относиться к полученному опыту. Активная учебная деятельность может проводиться группами, парами или всем классом.

Проверьте этот блокнот для примера активного обучения на основе QSAR.

В машинном обучении проблема обучения на небольших помеченных экземплярах данных
заключается в том, что традиционные алгоритмы контролируемого машинного обучения могут давать нежелательные результаты, поскольку экземпляры могут не отражать набор данных. Этот процесс значительно сокращает усилия по присвоению ярлыков, и исследования привели к двум методам обучения: i) полуконтролируемое обучение, ii) активное обучение.

AL хорошо работает с небольшим объемом размеченных данных, полностью используя огромный объем неразмеченных данных с помощью механизма запросов. Это снижает затраты на обучение и аннотирование данных. Активное обучение наиболее целесообразно, когда имеется множество немаркированных экземпляров данных, которые можно легко синтезировать, и можно ожидать, что многие из них придется пометить для обучения точной системы. Ключевое различие между активным и полууправляемым обучением заключается в том, что при активном обучении обучаемый выбирает экземпляры (запросы) из немаркированного набора данных, относительно которых функция выученной гипотезы наименее уверенно предсказывает их метку, в отличие от полууправляемого обучения. обучение, при котором выбираются наиболее определенные экземпляры. Этот выбор помогает уменьшить ошибку неправильной классификации / MSE, поскольку наименее определенные экземпляры вносят больший вклад в нее.

В литературе было предложено множество стратегий запросов для выбора немаркированного экземпляра в различных рабочих сценариях. Эти рабочие сценарии делятся на три основные категории: 1) на основе пула; 2)
на основе потока; 3) на основе синтеза запроса членства. Читатель может прочитать об этих методах, и вы можете проверить эту книгу по Burr Settles Active Learning.

Я попытался настроить пример, используя Active Learning с модальной библиотекой python в регрессии. При активном обучении количество запросов, необходимых для обучения хорошего классификатора/регрессора, меньше, чем количество помеченных экземпляров, необходимых в пассивной контролируемой настройке.

Если вы работаете над новой проблемой и хотите использовать активное обучение, чтобы уменьшить усилия по маркировке, вы явно хотите знать, какой алгоритм будет работать лучше всего. К сожалению, точно так же, как зная, какой набор функций или алгоритм обучения будет наиболее подходящим для вашей задачи (NNets, SVM, наивный байесовский алгоритм, форсированные деревья решений), нет никакого способа действительно узнать, какой активный алгоритм обучения будет наиболее подходящим для вашей задачи. априори. Большинство из этих алгоритмов, по-видимому, обеспечивают лучшие кривые обучения, чем пассивные базовые уровни обучения.

Я использовал структуру выбора запросов как запрос по комитету (QBC). В QBC учащийся выбирает непомеченный экземпляр для запроса, который имеет максимальную неоднозначность. Этот подход сводит к минимуму дисперсию во входном пространстве, запрашивая непомеченный экземпляр с максимальным вариативностью среди
членов комитета.

Пример использования

Я использовал данные TDC Data Caco2 для этого примера.

from tdc.single_pred import ADME
from tqdm import tqdm
from tdc.benchmark_group import admet_group
import numpy as np
from tdc.single_pred import Tox

data = ADME(name = 'Caco2_Wang')
split = data.get_split()
train,test = split['train'],split['test']

Сгенерируйте дескрипторы и не забудьте очистить данные с помощью Wash.py на моем github.

from warnings import filterwarnings
import numpy as np
from rdkit import Chem
from mordred import Calculator, descriptors 
calc = Calculator(descriptors, ignore_3D=True)
from wash import dataset_wash
from wash import NeutraliseCharges

def smile_to_modred(smile):
    return calc(Chem.MolFromSmiles(smile))

def get_modred(smiles):
    paws = []
    for smile in smiles:
        paws.append(np.asarray(smile_to_modred(smile)))
    return paws

train['Drug'] = train['Drug'].apply(NeutraliseCharges)
test['Drug'] = test['Drug'].apply(NeutraliseCharges)

trains = [Chem.MolFromSmiles(s) for s in train["Drug"]]
trDes = calc.pandas(trains)

## Convert strings to NaN
trDes = trDes.apply(pd.to_numeric,errors='coerce')
trDes.fillna(0,inplace=True)


trDes.replace([np.inf, -np.inf], np.nan, inplace=True)    
print(trDes.shape)

tests = [Chem.MolFromSmiles(s) for s in test["Drug"]]
teDes = calc.pandas(tests)

teDes = teDes.apply(pd.to_numeric,errors='coerce')
teDes.fillna(0,inplace=True)


teDes.replace([np.inf, -np.inf], np.nan, inplace=True)    
print(teDes.shape)

Удалите постоянные столбцы с отклонениями и сохраните данные обучения и тестирования одинаковыми. Это пример того, как можно использовать несколько методов фильтрации признаков, таких как корреляция, увеличение дисперсии и т. д.

tr_df = pd.DataFrame(trDes)
tr_df = tr_df.loc[:, tr_df.var() > 0.0] ## remove constant columns

tr_df.replace([np.inf, -np.inf], np.nan, inplace=True)
trdf = np.array(tr_df,dtype=float)


## Keep same number of columns for test and train for prediction
te_df = pd.DataFrame(teDes)
te_df = te_df[tr_df.columns]
tedf = np.array(te_df,dtype=float)

tr_y = np.array(train.Y)
te_y = np.array(test.Y)

Используйте модальную библиотеку и регрессоры sklearn в функции построения модели для ученика на основе комитета (committee_active_learner_qsar()), проверьте мой github на предмет используемой функции и, пожалуйста, измените, так как это очень интересно, производительность иногда улучшается для многих экземпляров запроса. Я использовал 5 итераций и построил результаты.

## Using 5 iterations to check model R2 
number_of_iterations = 5

#results = Parallel(n_jobs=2)(delayed(committee_active_learner)(X_train, Y_output, i) for i in range(number_of_iterations))

res = []
for i in range(number_of_iterations):
    
    results = committee_active_learner_qsar(trdf, tr_y,tedf,te_y, i) 
    res.append(results)
    
    
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [11, 7]
x1 = range(50)
y1 = res[0][2]
y2 = res[1][2]
y3 = res[2][2]
y4 = res[3][2]
y5 = res[4][2]
plt.plot(x1, y1,label ='Iter1')
plt.plot(x1, y2,label ='Iter2')
plt.plot(x1, y3,label ='Iter3')
plt.plot(x1, y4,label ='Iter4')
plt.plot(x1, y5,label ='Iter5')

plt.title('Query Performace name')
plt.xlabel('# Queries')
plt.ylabel('R2 value')
plt.legend()
plt.show()    

Результаты показывают набор тестов производительности caco2 R². На итерации 1 с 40 запросами была достигнута наилучшая производительность с R² 0,67, поэтому на итерации 2,3 с 50 экземплярами запросов.

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

Хотя активное обучение является довольно мощным, но все же проблемы остаются такими же,

  1. Также трудно найти, какую комбинацию стратегии запроса AL и классификатора производительности использовать, поскольку это зависит от задачи.
  2. Как справиться с шумным оракулом или экземпляром, который снижает производительность, вводя в заблуждение процесс AL?
  3. Как определить критерии выбора экземпляра в задаче AL в пакетном режиме?
  4. Как разработать информативные и репрезентативные критерии и объединить их для достижения лучших результатов?