3

當m是特徵的數量,n是樣本的數量時,python scikit-learn站點(http://scikit-learn.org/stable/modules/tree.html)指出構建二叉決策樹的運行時間爲mnlog(n)。爲什麼運行時構造決策樹mnlog(n)?

我知道log(n)來自分裂後樹的平均高度。我明白,在每次拆分時,都必須查看每個特徵(m)並選擇最佳的拆分。我知道這是通過計算每個樣本在該節點(n)的「最佳度量」(在我的情況下,基尼雜質)完成的。但是,要找到最佳分割,這是否意味着您不得不看每種可能的方式來分割每個特徵的樣本?那不是像2^n-1 * m那樣的東西,而不僅僅是mn?我在想這個錯嗎?任何建議都會有幫助。謝謝。

回答

6

建立一個決策樹是,在每一個點,做這樣的事情的一種方式:

  • 對於每個可能的功能分割上:
    • 查找,最好的可能分裂特徵。
    • 確定這種適合的「優點」。
  • 在以上嘗試的所有選項中,採取最佳措施並將其用於拆分。

問題是如何執行每一步。如果您有連續的數據,尋找最佳可能分割的常用技術是將數據按照該數據點升序排序,然後考慮這些數據點之間的所有可能的分割點並採用最小化熵的分割點。這個排序步驟需要花費時間O(n log n),這主導了運行時。由於我們正在爲每個O(m)特徵執行此操作,因此運行時最終將解決每個節點完成的總工作量O(mn log n)。

+0

即使排序,找不到最佳分割仍需要2 * n次爲每個功能?既然你將不得不檢查每種可能的方式來分割數據?這比n log n增長得更快,所以我認爲這將主導運行時。 – iltp38

+0

@ iltp38雖然說得對,有兩個不同的數據分區分成兩組,但請記住,通過構建一些簡單的規則來構建決策樹,您可以使用該規則來確定要進入哪個子樹。在你所描述的決策樹的背景下,這通常是通過選擇一些簡單的分裂標準來完成的,比如「選擇某個特徵,選擇一個閾值,並將這些點分成'低於閾值'和'上面的那些閾值「。」這大大減少了可能的分裂數量。 (續...) – templatetypedef

+0

@ iltp38它也確保樹可用。畢竟,當你得到一個新的測試點時,你需要知道你將如何確定每個點要走哪個方向,並且如果你選擇了節點上的任意聚類,你不一定知道哪個分區要下降成。 – templatetypedef