使用Scikit-Multiflow進行增量(在線)學習

使用scikit-multiflow在Python中進行增量學習的實用介紹

使用Scikit-Multiflow進行增量(在線)學習

介紹

數據無處不在。 無論是個人資料圖片,微博,傳感器應用程序,信用卡交易,電子郵件還是新聞提要,數據都在這裡……而且它以驚人的速度生成。 利用這些看似無限的數據流,關鍵挑戰之一就是創建輕量級模型,這些模型隨時可以預測並適應數據分佈的變化。 在這種情況下,傳統機器學習方法的侷限性導致了在線學習(也稱為增量學習)方法的發展。

在這篇文章中,我們將通過使用scikit-multiflow(一個用於數據流學習的Python框架)的簡單在線分類器的實際實現,來逐步介紹增量學習。

什麼是增量學習?

在每次迭代中,模型都會預測一個類標籤,顯示出真實的標籤,然後進行更新

增量學習指的是一系列可擴展算法,可以學習從無限數據流中順序更新模型¹。 在"傳統"機器學習中,我們獲得了由(輸入,輸出)對組成的完整數據集,而在增量學習中,創建模型時並沒有所有可用數據。 取而代之的是,數據點一次到達一個,我們必須建立一個"活得"模型,該模型可以隨著數據的到來而學習和適應。 增量模型具有以下特徵²:

  • 它可以隨時預測
  • 它可以適應概念漂移-即數據分佈的變化。 舉一個具體的例子,如果我們有興趣建立一個模型來預測銀行應該借多少錢,那麼金融危機可能會改變金額或需要考慮的因素。 在這種情況下,模型需要重新學習很多信息。
  • 它能夠處理具有有限資源(時間和內存)的無限數據流。 這意味著它無法像典型的機器學習方法那樣存儲所有訓練數據。

在Python中使用數據流

現在,我們已經討論了增量學習是什麼,讓我們在Scikit-Multiflow(一個用於數據流學習的免費Python框架)中創建一個簡單的例子。

我們要做的第一件事是安裝scikit-multiflow。

<code>pip install -U scikit-multiflow/<code>

導入數據生成器很容易,可以使用以下命令完成:

<code>from skmultiflow.data import SEAGenerator/<code>

在這裡,我們將使用SEA生成器,但還有許多其他可用的選項(有關詳細信息,請參見文檔: SEA生成器允許您生成具有6個輸入和2個輸出的無限數據流。 這個特定的數據流包含頻繁,突然的概念漂移。

使用Generator非常容易。 我們需要做的第一件事是將其初始化如下:

<code>stream = SEAGenerator() # create a stream
stream.prepare_for_use() # prepare the stream for use/<code>

然後,如果我們希望獲得數據樣本,我們要做的就是

<code>X,Y = stream.next_sample()/<code>

其中X是輸入,是6維np.array,而Y是輸出,是2維np.array。

簡單的在線分類器

現在,讓我們為SEA數據流創建一個簡單的分類器。 scikit-multiflow提供了許多增量模型,其中最流行的一種是霍夫丁樹。

霍夫丁樹

Hoeffding樹³是使用決策樹學習器(VFDT)構建的,VFDT是一個隨時可用的系統,每個示例均使用恆定內存和恆定時間來構建決策樹。 它由Pedro Domingos和Geoff Hulten於2000年引入,它利用眾所周知的統計結果Hoeffding界線,以確保其輸出與傳統學習器的輸出漸近相同。

在scikit-multiflow中,創建Hoeffding樹的步驟如下

<code>from skmultiflow.trees import HoeffdingTree
tree = HoeffdingTree()/<code>


訓練Hoeffding樹進行分類

如果我們想在SEA數據流上訓練樹,則可以遍歷想要的許多數據點。

<code>correctness_dist = []
for i in range(nb_iters):
X, Y = stream.next_sample() # get the next sample
prediction = tree.predict(X) # predict Y using the tree
if Y == prediction: # check the prediction
correctness_dist.append(1)
else:
correctness_dist.append(0)

tree.partial_fit(X, Y) # update the tree/<code>


使用" correctness_dist",由一和零組成的數組,取決於學習者是否對輸入的樣本進行了準確分類,我們可以繪製隨時間變化的準確性

<code>import matplotlib.pyplot as plttime = [i for i in range(1, nb_iters)]
accuracy = [sum(correctness_dist[:i])/len(correctness_dist[:i])
for i in range(1, nb_iters)]
plt.plot(time, accuracy)/<code>


使用Scikit-Multiflow進行增量(在線)學習

Accuracy over time for a Hoeffding tree modeling the SEA generator

Scikit-Multiflow的替代方法

在scikit-multiflow中,有一種內置的方法可以用更少的代碼完成完全相同的事情。 我們可以做的是導入EvaluatePrequential類:

然後,我們可以如下設置"評估者"

<code>evaluator=EvaluatePrequential(show_plot=True,max_samples=nb_iters)/<code>

設置show_plot = True選項將允許彈出窗口顯示分類精度的實時圖。

現在已經設置了評估程序,我們可以使用它以與以前相同的方式在SEA數據流上增量訓練Hoeffding樹:

<code>evaluator.evaluate(stream=stream, model=tree)/<code>


結論

希望本教程可以幫助您瞭解增量學習的基礎。 此外,我希望您現在掌握如何將scikit-multiflow用於基本的數據流學習任務。

參考文獻

[1] Doyen Sahoo等人,"在線深度學習:動態學習深度神經網絡"(2017),1711.03705

[2] Jesse Read等人,"動態和不斷髮展的數據中的批次增量與實例增量學習"(2012),978–3–642–34156–4_29

[3] Pedro Domingos和Geoff Hulten,"挖掘高速數據流"(2000年),347090.347107

[4] Maayan Harel等人,"通過重採樣進行概念漂移檢測"(2014年),citation.cfm


(本文翻譯自Louis de Benoist的文章《Incremental (Online) Learning with Scikit-Multiflow》,參考:https://towardsdatascience.com/incremental-online-learning-with-scikit-multiflow-6b846913a50b)


分享到:


相關文章: