股票量化交易軟件;直推和主動(dòng)機(jī)器學(xué)習(xí)中的梯度提升
半監(jiān)督學(xué)習(xí)或直推學(xué)習(xí)使用未標(biāo)記的數(shù)據(jù),使模型能夠更好地理解一般的數(shù)據(jù)結(jié)構(gòu)。這和我們的思考方法很相似。只要記住一些圖像,人腦就能夠把這些圖像的知識(shí)概括地外推到新的物體上,而不必關(guān)注無(wú)關(guān)緊要的細(xì)節(jié)。這樣可以減少過(guò)度擬合,并獲得更好的泛化效果。 赫茲股票量化交易軟件
直推是由支持向量機(jī)(SVM)的共同發(fā)明者弗拉基米爾·瓦普尼克(Vladimir Vapnik)提出的。他認(rèn)為,直推比歸納法更可取,因?yàn)闅w納法需要先解決更一般的問(wèn)題(推斷函數(shù)),然后再解決更具體的問(wèn)題(計(jì)算新案例的輸出)。?赫茲股票量化交易軟件
?"在解決感興趣的問(wèn)題時(shí),不要把解決更一般的問(wèn)題作為中間步驟。試著得到你真正需要的答案,而不是更籠統(tǒng)的答案。"?
瓦普尼克的這一假設(shè)與伯特蘭·羅素(Bertrand Russell)早些時(shí)候的觀察結(jié)果相似:
"我們將得出這樣一個(gè)結(jié)論:蘇格拉底是凡人,如果我們把我們的論證純粹歸納起來(lái),而不是用“人人都是凡人”的方式,然后用演繹的方式,那么蘇格拉底就更接近于確定性".赫茲股票量化交易軟件
從長(zhǎng)遠(yuǎn)來(lái)看,無(wú)監(jiān)督學(xué)習(xí)(使用未標(biāo)記的數(shù)據(jù))將變得更加重要。無(wú)監(jiān)督學(xué)習(xí)通常是人和動(dòng)物的典型特征:他們通過(guò)觀察發(fā)現(xiàn)世界的結(jié)構(gòu),而不是通過(guò)識(shí)別每個(gè)物體的名稱。?赫茲股票量化交易軟件
因此,半監(jiān)督學(xué)習(xí)結(jié)合了這兩個(gè)過(guò)程:監(jiān)督學(xué)習(xí)發(fā)生在少量的標(biāo)記數(shù)據(jù)上,然后模型將其知識(shí)外推到一個(gè)大的未標(biāo)記區(qū)域。?赫茲股票量化交易軟件
使用未標(biāo)記數(shù)據(jù)意味著與底層數(shù)據(jù)分布有某種聯(lián)系。必須至少滿足以下假設(shè)之一:
連續(xù)性假設(shè)。彼此接近的點(diǎn)更有可能共享一個(gè)標(biāo)簽。在有監(jiān)督學(xué)習(xí)中也假設(shè)了這一點(diǎn),并且產(chǎn)生了一種偏好,即分離類的幾何簡(jiǎn)單邊界。在半監(jiān)督學(xué)習(xí)的情況下,平滑性假設(shè)在低密度區(qū)域中產(chǎn)生偏好,在低密度區(qū)域中,很少有點(diǎn)彼此接近,但在不同的類中。
集群假設(shè)。數(shù)據(jù)往往會(huì)形成離散的簇,同一簇中的點(diǎn)更有可能共享一個(gè)標(biāo)簽(盡管共享一個(gè)標(biāo)簽的數(shù)據(jù)可以分布在多個(gè)簇中)。這是光滑性假設(shè)的一個(gè)特例,導(dǎo)致使用聚類算法進(jìn)行學(xué)習(xí)。
流形假設(shè)。數(shù)據(jù)大致位于比輸入空間低得多的維數(shù)的流形上。在這種情況下,使用標(biāo)記和未標(biāo)記的數(shù)據(jù)學(xué)習(xí)流形可以避免維數(shù)災(zāi)難。然后利用流形上定義的距離和密度繼續(xù)學(xué)習(xí)。赫茲股票量化交易軟件
更多詳細(xì)信息
半監(jiān)督學(xué)習(xí)的主要方法是偽標(biāo)記,其實(shí)現(xiàn)如下:
一些鄰近度量(例如,歐幾里德距離)用于基于標(biāo)記的數(shù)據(jù)區(qū)域(偽標(biāo)簽)標(biāo)記其余的數(shù)據(jù),
訓(xùn)練標(biāo)簽與偽標(biāo)簽和符號(hào)相結(jié)合。
模型在整個(gè)數(shù)據(jù)集上進(jìn)行訓(xùn)練。
研究人員認(rèn)為,將標(biāo)記數(shù)據(jù)與未標(biāo)記數(shù)據(jù)結(jié)合使用可以顯著提高模型的精度。我在
中使用了類似的想法,其中我使用了對(duì)標(biāo)記數(shù)據(jù)分布的概率密度的估計(jì),并從這個(gè)分布中采樣。但是新數(shù)據(jù)的分布可能不同,因此半監(jiān)督學(xué)習(xí)可以提供一些好處,本文的實(shí)驗(yàn)將說(shuō)明這一點(diǎn)。主動(dòng)學(xué)習(xí)是半監(jiān)督學(xué)習(xí)的某種邏輯延續(xù),它是一個(gè)迭代的過(guò)程,以這樣一種方式標(biāo)記新數(shù)據(jù),從而使分隔類的邊界處于最佳位置。
主動(dòng)學(xué)習(xí)的主要假設(shè)是,學(xué)習(xí)算法可以選擇要學(xué)習(xí)的數(shù)據(jù)。與傳統(tǒng)方法相比,該方法的訓(xùn)練數(shù)據(jù)顯著減少。這里的傳統(tǒng)方法指的是使用標(biāo)記數(shù)據(jù)的傳統(tǒng)監(jiān)督學(xué)習(xí),這種訓(xùn)練可以稱為被動(dòng)訓(xùn)練。該模型只需對(duì)標(biāo)記數(shù)據(jù)進(jìn)行訓(xùn)練,數(shù)據(jù)越多越好。被動(dòng)學(xué)習(xí)中最耗時(shí)的問(wèn)題之一是數(shù)據(jù)收集和標(biāo)記。在許多情況下,收集額外數(shù)據(jù)或適當(dāng)標(biāo)記可能會(huì)受到限制。?赫茲股票量化交易軟件
主動(dòng)學(xué)習(xí)有三種最流行的場(chǎng)景,其中學(xué)習(xí)模型將從未標(biāo)記區(qū)域請(qǐng)求新的類實(shí)例標(biāo)簽:
成員查詢綜合. 在這種情況下,模型從某個(gè)分布中生成一個(gè)實(shí)例,該分布對(duì)所有示例都是公共的。這可能是一個(gè)帶有附加噪聲的類實(shí)例,也可能只是所討論空間中的一個(gè)似是而非的點(diǎn)。這個(gè)新點(diǎn)被送到先知(oracle)那里培訓(xùn),Oracle 是估值函數(shù)的傳統(tǒng)名稱,用于評(píng)估模型的給定功能實(shí)例的值。赫茲股票量化交易軟件
基于流的采樣. 根據(jù)這個(gè)場(chǎng)景,每次檢查一個(gè)未標(biāo)記的數(shù)據(jù)點(diǎn),然后 Oracle 根據(jù)某種信息標(biāo)準(zhǔn)選擇是要查詢這個(gè)點(diǎn)的類標(biāo)簽還是拒絕它。?赫茲股票量化交易軟件
基于池的采樣. 在這個(gè)場(chǎng)景中,有大量未標(biāo)記的示例,就像前面的例子一樣,實(shí)例是根據(jù)信息量從池中選擇的,從池中選擇信息量最大的實(shí)例。這是活躍的學(xué)習(xí)愛(ài)好者中最流行的情景。將對(duì)所有未標(biāo)記的實(shí)例進(jìn)行排序,然后選擇信息量最大的實(shí)例。赫茲股票量化交易軟件
每個(gè)場(chǎng)景都可以基于特定的查詢策略。如上所述,主動(dòng)學(xué)習(xí)和被動(dòng)學(xué)習(xí)的主要區(qū)別在于基于過(guò)去的查詢和模型響應(yīng)從未標(biāo)記區(qū)域查詢實(shí)例的能力。因此,所有查詢都需要某種程度的信息性。赫茲股票量化交易軟件?
最流行的查詢策略如下:
不確定度抽樣(最小置信度)。根據(jù)這個(gè)策略,我們選擇模型最不確定的實(shí)例。例如,將標(biāo)簽分配給某個(gè)類的概率低于某個(gè)邊界。
邊際抽樣. 第一種策略的缺點(diǎn)是它只決定屬于一個(gè)標(biāo)簽的概率,而忽略屬于其他標(biāo)簽的概率。邊際抽樣策略選擇兩個(gè)最可能的標(biāo)簽之間的最小概率差。
熵采樣. 對(duì)每個(gè)實(shí)例應(yīng)用熵公式,查詢出最大值的實(shí)例。
與半監(jiān)督學(xué)習(xí)類似,主動(dòng)學(xué)習(xí)過(guò)程包括幾個(gè)步驟:
該模型是在標(biāo)記數(shù)據(jù)上訓(xùn)練的。赫茲股票量化交易軟件
同樣的模型用于標(biāo)記未標(biāo)記的數(shù)據(jù)以預(yù)測(cè)概率(偽標(biāo)記)。
選擇新實(shí)例查詢策略。
根據(jù)信息量從數(shù)據(jù)池中選取N個(gè)實(shí)例加入訓(xùn)練樣本。?赫茲股票量化交易軟件
重復(fù)此循環(huán),直到達(dá)到某個(gè)停止標(biāo)準(zhǔn)。停止標(biāo)準(zhǔn)可以是迭代次數(shù)或?qū)W習(xí)誤差的估計(jì),也可以是其他外部準(zhǔn)則。
主動(dòng)學(xué)習(xí)
讓我們直接進(jìn)入主動(dòng)學(xué)習(xí),用我們的數(shù)據(jù)測(cè)試它的有效性。赫茲股票量化交易軟件
Python語(yǔ)言中有幾個(gè)用于主動(dòng)學(xué)習(xí)的庫(kù),其中最流行的是:
?是一個(gè)非常簡(jiǎn)單易學(xué)的包,它是流行的機(jī)器學(xué)習(xí)庫(kù)的一完全兼容)。該軟件讓我們使用以下方案來(lái)考慮上述過(guò)程,不需要進(jìn)一步解釋:
關(guān)于這個(gè)庫(kù)的最大優(yōu)點(diǎn)是你可以使用任何 sciket-learn 分類器。以下示例演示如何使用隨機(jī)森林作為學(xué)習(xí)模型:
from modAL.models import ActiveLearner from modAL.uncertainty import entropy_sampling from sklearn.ensemble import RandomForestClassifier learner = ActiveLearner( ????estimator=RandomForestClassifier(), ????query_strategy=entropy_sampling, ????X_training=X_training, y_training=y_training )
這里的隨機(jī)森林充當(dāng)學(xué)習(xí)模型和評(píng)估器,允許根據(jù)查詢策略(例如,基于熵,如本例中所示)從未標(biāo)記數(shù)據(jù)中選擇新樣本。接下來(lái),將由少量標(biāo)記數(shù)據(jù)組成的數(shù)據(jù)集傳遞給模型,這是用于初步培訓(xùn)的。?
modAL 庫(kù)支持查詢策略的簡(jiǎn)單組合,并允許從中生成復(fù)合加權(quán)策略:
from modAL.utils.combination import make_linear_combination, make_product from modAL.uncertainty import classifier_uncertainty, classifier_margin # creating new utility measures by linear combination and product # linear_combination will return 1.0*classifier_uncertainty + 1.0*classifier_margin linear_combination = make_linear_combination( ????classifier_uncertainty, classifier_margin, ????weights=[1.0, 1.0] ) # product will return (classifier_uncertainty**0.5)*(classifier_margin**0.1) product = make_product( ????classifier_uncertainty, classifier_margin, ????exponents=[0.5, 0.1] )
生成查詢后,將使用 multi_argmax 或 weighted_randm 選擇器從未標(biāo)記的數(shù)據(jù)區(qū)域中選擇符合查詢條件的實(shí)例:赫茲股票量化交易軟件
from modAL.utils.selection import multi_argmax # defining the custom query strategy, which uses the linear combination of # classifier uncertainty and classifier margin def custom_query_strategy(classifier, X, n_instances=1): ????utility = linear_combination(classifier, X) ????query_idx = multi_argmax(utility, n_instances=n_instances) ????return query_idx, X[query_idx] custom_query_learner = ActiveLearner( ????estimator=GaussianProcessClassifier(1.0 * RBF(1.0)), ????query_strategy=custom_query_strategy, ????X_training=X_training, y_training=y_training )
查詢策略
有三種主要的查詢策略,所有的策略都是基于分類的不確定性,這就是為什么它們被稱為不確定性度量。讓我們看看它們是如何工作的。赫茲股票量化交易軟件
在一個(gè)簡(jiǎn)單的情況下,分類不確定性被評(píng)估為U(x)=1?P(x^ | x),其中x是要預(yù)測(cè)的情況,而x^是最可能的預(yù)測(cè)。例如,如果有三個(gè)類別和三個(gè)樣本項(xiàng),則相應(yīng)的不確定度可計(jì)算如下:
[[0.1 , 0.85, 0.05], [0.6 , 0.3 , 0.1 ], [0.39, 0.61, 0.0 ]] 1 - proba.max(axis=1) [0.15, 0.4 , 0.39]
因此,第二個(gè)例子將被選為最不確定的例子。
分類裕度是第一個(gè)和第二個(gè)最可能查詢的概率之差。根據(jù)以下公式確定差異:M(x)=P(x1^ | x)?P(x2^ | x),其中x1^和x2^是第一和第二最可能的類別。赫茲股票量化交易軟件
這種查詢策略選擇兩個(gè)最有可能的類的概率之間的間隔最小的實(shí)例,因?yàn)榻獾拈g隔越小,不確定性就越大。
>>> import numpy as np >>> proba = np.array([[0.1 , 0.85, 0.05], ...?????????????????? [0.6 , 0.3 , 0.1 ], ...?????????????????? [0.39, 0.61, 0.0 ]]) >>> >>> proba array([[0.1 , 0.85, 0.05], ?????? [0.6 , 0.3 , 0.1 ], ?????? [0.39, 0.61, 0.??]]) >>> part = np.partition(-proba, 1, axis=1) >>> part array([[-0.85, -0.1 , -0.05], ?????? [-0.6 , -0.3 , -0.1 ], ?????? [-0.61, -0.39, -0.??]]) >>> part[:, 0] array([-0.85, -0.6 , -0.61]) >>> part[:, 1] array([-0.1 , -0.3 , -0.39]) >>> margin = - part[:, 0] + part[:, 1] >>> margin array([0.75, 0.3 , 0.22])
在這種情況下,將選擇第三個(gè)樣本(數(shù)組的第三行),因?yàn)樵搶?shí)例的概率余量最小。
分類熵使用信息熵公式計(jì)算:H(x)=-∑kpklog(pk),其中pk是樣本屬于第k類的概率。分布越接近均勻,熵越高。在我們的例子中,第二個(gè)例子得到了最大熵。
[0.51818621, 0.89794572, 0.66874809]
看起來(lái)并不難,這個(gè)描述似乎足以理解三種主要的查詢策略。有關(guān)更多詳細(xì)信息,請(qǐng)學(xué)習(xí)軟件因?yàn)槲抑惶峁┗疽c(diǎn)。
批量查詢策略赫茲股票量化交易軟件
一次查詢一個(gè)元素并重新訓(xùn)練模型并不總是有效的。一個(gè)更有效的解決方案是一次從未標(biāo)記的數(shù)據(jù)中標(biāo)記和選擇多個(gè)實(shí)例,對(duì)此有許多查詢。其中最流行的是基于相似函數(shù)(如余弦距離)的排序集抽樣(Ranked Set Sampling)。此方法估計(jì)在x(未標(biāo)記實(shí)例)附近對(duì)特征空間的探索程度。評(píng)估后,具有最高等級(jí)的實(shí)例被添加到訓(xùn)練集中,并從未標(biāo)記的數(shù)據(jù)池中移除。然后重新計(jì)算等級(jí)并再次添加最佳實(shí)例,直到實(shí)例數(shù)達(dá)到指定的大?。ㄅ看笮。?赫茲股票量化交易軟件
信息密度查詢
上面描述的簡(jiǎn)單查詢策略不評(píng)估數(shù)據(jù)結(jié)構(gòu),這可能導(dǎo)致次優(yōu)查詢。為了改進(jìn)采樣,您可以使用信息密度度量來(lái)幫助正確選擇未標(biāo)記數(shù)據(jù)的元素。它使用余弦或歐氏距離。信息密度越高,所選實(shí)例與其他實(shí)例的相似性就越高。?赫茲股票量化交易軟件
分類委員會(huì)查詢赫茲股票量化交易軟件
這種查詢類型消除了簡(jiǎn)單查詢類型的一些缺點(diǎn)。例如,由于特定分類器的特性,元素的選擇往往是有偏差的??赡苋鄙僖恍┲匾牟蓸釉?。通過(guò)同時(shí)存儲(chǔ)多個(gè)假設(shè)并選擇存在分歧的查詢,可以消除這種影響。因此,分類器委員會(huì)根據(jù)自己的樣本副本學(xué)習(xí)每個(gè)分類器,然后對(duì)結(jié)果進(jìn)行加權(quán)。其他類型的分類器委員會(huì)學(xué)習(xí)包括打包(bagging)和引導(dǎo)(bootstrapping)。
這個(gè)簡(jiǎn)短的描述幾乎完全涵蓋了庫(kù)的功能。有關(guān)詳細(xì)信息,請(qǐng)參閱文檔。
主動(dòng)學(xué)習(xí)
我選擇了批量查詢策略,以及分類器委員會(huì)查詢,并進(jìn)行了一系列的實(shí)驗(yàn)。批量查詢策略在新數(shù)據(jù)上沒(méi)有表現(xiàn)出良好的性能,但是,通過(guò)將它生成的數(shù)據(jù)集提交給GMM,我開(kāi)始得到有趣的結(jié)果。?
考慮一個(gè)實(shí)現(xiàn)批量主動(dòng)學(xué)習(xí)函數(shù)的示例:
def active_learner(data, labeled_size, unlabeled_size, batch_size, max_depth): ????X_raw = data[data.columns[1:-1]].to_numpy() ????y_raw = data[data.columns[-1]].to_numpy() ????# Isolate our examples for our labeled dataset. ????training_indices = np.random.randint(low=0, high=X_raw.shape[0] + 1, size=labeled_size) ????X_train = X_raw[training_indices] ????y_train = y_raw[training_indices] ????# fit the model on all data ????cl = AdaBoostClassifier(DecisionTreeClassifier(max_depth=max_depth), n_estimators=50, learning_rate = 0.01) ????cl.fit(X_raw, y_raw) ????print('Score for the passive learning: ', cl.score(X_raw, y_raw), ' with train size: ', data.shape[0]) ????# Isolate the non-training examples we'll be querying. ????X_pool = np.delete(X_raw, training_indices, axis=0) ????y_pool = np.delete(y_raw, training_indices, axis=0) ????# Pre-set our batch sampling to retrieve 3 samples at a time. ????preset_batch = partial(uncertainty_batch_sampling, n_instances=batch_size) ????# Specify our core estimator along with its active learning model. ????cl = AdaBoostClassifier(DecisionTreeClassifier(max_depth=3), n_estimators=50, learning_rate = 0.03) ????learner = ActiveLearner(estimator=cl, query_strategy=preset_batch, X_training=X_train, y_training=y_train)
以下是函數(shù)的輸入:帶標(biāo)簽的數(shù)據(jù)集、帶標(biāo)簽的實(shí)例數(shù)、未標(biāo)記的實(shí)例數(shù)、批次標(biāo)簽查詢的批次大小和最大樹(shù)深度。
從標(biāo)記的數(shù)據(jù)集中隨機(jī)選擇指定數(shù)量的標(biāo)記實(shí)例進(jìn)行模型預(yù)訓(xùn)練。數(shù)據(jù)集的其余部分形成一個(gè)池,從中查詢實(shí)例。我使用 AdaBoost 作為基本分類器,它類似于 CatBoost。然后,對(duì)模型進(jìn)行迭代訓(xùn)練:
????# Allow our model to query our unlabeled dataset for the most ????# informative points according to our query strategy (uncertainty sampling). ????N_QUERIES = unlabeled_size // batch_size ????for index in range(N_QUERIES): ????????query_index, query_instance = learner.query(X_pool) ????????# Teach our ActiveLearner model the record it has requested. ????????X, y = X_pool[query_index], y_pool[query_index] ????????learner.teach(X=X, y=y) ????????# Remove the queried instance from the unlabeled pool. ????????X_pool, y_pool = np.delete( ????????????X_pool, query_index, axis=0), np.delete(y_pool, query_index) ????????# Calculate and report our model's accuracy. ????????model_accuracy = learner.score(X_raw, y_raw) ????????print('Accuracy after query {n}: {acc:0.4f}'.format( ????????????n=index + 1, acc=model_accuracy)) ????????# Save our model's performance for plotting. ????????performance_history.append(model_accuracy) ????print('Score for the active learning with train size: ', ??????????learner.X_training.shape)????
由于這種半監(jiān)督學(xué)習(xí)的結(jié)果是任何事情都可能發(fā)生的,因此結(jié)果可以是任意的。但是,在對(duì)學(xué)習(xí)者設(shè)置進(jìn)行了一些操作之后,我得到了與上一篇文章相當(dāng)?shù)慕Y(jié)果。?
理想情況下,主動(dòng)學(xué)習(xí)者對(duì)少量標(biāo)記數(shù)據(jù)的分類精度應(yīng)超過(guò)對(duì)所有數(shù)據(jù)進(jìn)行標(biāo)記的類似分類器的精度。
>>> learned = active_learner(pr, 1000, 1000, 50) Score for the passive learning:??0.5991245668429692??with train size:??5483 Accuracy after query 1: 0.5710 Accuracy after query 2: 0.5836 Accuracy after query 3: 0.5749 Accuracy after query 4: 0.5847 Accuracy after query 5: 0.5829 Accuracy after query 6: 0.5823 Accuracy after query 7: 0.5650 Accuracy after query 8: 0.5667 Accuracy after query 9: 0.5854 Accuracy after query 10: 0.5836 Accuracy after query 11: 0.5807 Accuracy after query 12: 0.5907 Accuracy after query 13: 0.5944 Accuracy after query 14: 0.5865 Accuracy after query 15: 0.5949 Accuracy after query 16: 0.5873 Accuracy after query 17: 0.5833 Accuracy after query 18: 0.5862 Accuracy after query 19: 0.5902 Accuracy after query 20: 0.6002 Score for the active learning with train size:??(2000, 8)
根據(jù)該報(bào)告,在所有標(biāo)記數(shù)據(jù)上訓(xùn)練的分類器的準(zhǔn)確率低于只訓(xùn)練了2000個(gè)實(shí)例的主動(dòng)學(xué)習(xí)者,這可能很好。?赫茲股票量化交易軟件
現(xiàn)在,可以將這個(gè)樣本發(fā)送到GMM模型,然后訓(xùn)練 CatBoost 分類器。
# prepare data for CatBoost catboost_df = pd.DataFrame(learned.X_training) catboost_df['labels'] = learned.y_training # perform GMM clusterization over dataset X = catboost_df.copy() gmm = mixture.GaussianMixture( ????n_components=75, max_iter=500, covariance_type='full', n_init=1).fit(X) # sample new dataset generated = gmm.sample(10000) # make labels gen = pd.DataFrame(generated[0]) gen.rename(columns={gen.columns[-1]: "labels"}, inplace=True) gen.loc[gen['labels'] >= 0.5, 'labels'] = 1 gen.loc[gen['labels'] < 0.5, 'labels'] = 0 X = gen[gen.columns[:-1]] y = gen[gen.columns[-1]] pr = pd.DataFrame(X) pr['labels'] = y # fit CatBoost model and test it model = fit_model(pr) test_model(model, TEST_START, END_DATE)
這個(gè)過(guò)程可以重復(fù)幾次,因?yàn)樵跀?shù)據(jù)處理的每個(gè)階段都有不確定性因素,不允許建立明確的模型。在所有迭代之后(訓(xùn)練期為1年,然后是5年的測(cè)試期),測(cè)試器獲得了以下圖表:
當(dāng)然,這些結(jié)果并不是基準(zhǔn),它們只表明可以獲得有利可圖的(基于新數(shù)據(jù)的)模型。?
現(xiàn)在讓我們?cè)诜诸惼魑瘑T會(huì)上實(shí)現(xiàn)學(xué)習(xí)功能,看看會(huì)發(fā)生什么:
def active_learner_committee(data, learners_number, labeled_size, unlabeled_size, batch_size): ????X_pool = data[data.columns[1:-1]].to_numpy() ????y_pool = data[data.columns[-1]].to_numpy() ????cl = AdaBoostClassifier(DecisionTreeClassifier(max_depth=3), n_estimators=50, learning_rate = 0.05) ????cl.fit(X_pool, y_pool) ????print('Score for the passive learning: ', cl.score( ????????X_pool, y_pool), ' with train size: ', data.shape[0]) ????# initializing Committee members ????learner_list = list() ????# Pre-set our batch sampling to retrieve 3 samples at a time. ????preset_batch = partial(uncertainty_batch_sampling, n_instances=batch_size) ???? ????for member_idx in range(learners_number): ????????# initial training data ????????train_idx = np.random.choice(range(X_pool.shape[0]), size=labeled_size, replace=False) ????????X_train = X_pool[train_idx] ????????y_train = y_pool[train_idx] ????????# creating a reduced copy of the data with the known instances removed ????????X_pool = np.delete(X_pool, train_idx, axis=0) ????????y_pool = np.delete(y_pool, train_idx) ????????# initializing learner ????????learner = ActiveLearner( ????????????estimator=AdaBoostClassifier(DecisionTreeClassifier(max_depth=2), n_estimators=50, learning_rate = 0.05), ????????????query_strategy=preset_batch, ????????????X_training=X_train, y_training=y_train ????????) ????????learner_list.append(learner) ????# assembling the committee ????committee = Committee(learner_list=learner_list) ????unqueried_score = committee.score(X_pool, y_pool) ????performance_history = [unqueried_score] ????N_QUERIES = unlabeled_size // batch_size ????for idx in range(N_QUERIES): ????????query_idx, query_instance = committee.query(X_pool) ????????committee.teach( ????????????X=X_pool[query_idx].reshape(1, -1), ????????????y=y_pool[query_idx].reshape(1, ) ????????) ????????model_accuracy = committee.score(X_pool, y_pool) ????????performance_history.append(model_accuracy) ????????print('Accuracy after query {n}: {acc:0.4f}'.format( ????????????n=idx + 1, acc=model_accuracy)) ????????# remove queried instance from pool ????????X_pool = np.delete(X_pool, query_idx, axis=0) ????????y_pool = np.delete(y_pool, query_idx) ????return committee