最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

教你用c++從頭開始實現(xiàn)決策樹

 更新時間:2021年05月25日 10:18:36   作者:deephub  
從頭實現(xiàn)一個分類決策樹分類器似乎是一個適當?shù)奶魬?zhàn)。這已經(jīng)被證明是一個測試但有益的學習旅程,我想分享一些我在這個過程中的主要經(jīng)驗,對c++實現(xiàn)決策樹相關知識感興趣的朋友一起看看吧

Python已經(jīng)成為數(shù)據(jù)科學的語言之王。大多數(shù)新的數(shù)據(jù)科學家和程序員繼續(xù)學習Python作為他們的第一門語言。這是有充分理由的;Python具有較淺的學習曲線、強大的社區(qū)和豐富的數(shù)據(jù)科學庫生態(tài)系統(tǒng)。

我用Python開始了我的數(shù)據(jù)科學之旅,它仍然是我解決數(shù)據(jù)科學問題最常用的工具。我很想更好地理解Python從您那里抽象出了什么,以及用性能更高的語言編寫更快代碼的成本與好處。

為了有代表性地介紹c++,我需要一個代表性的應用程序,c++將是一個合適的選擇。從頭實現(xiàn)一個分類決策樹分類器似乎是一個適當?shù)奶魬?zhàn)。這已經(jīng)被證明是一個測試但有益的學習旅程,我想分享一些我在這個過程中的主要經(jīng)驗。

關鍵經(jīng)驗:

  • c++很少提供代碼提示或保護
  • 盡早做出好的架構決策
  • 從長遠來看,編寫測試將為您節(jié)省時間
  • 語言的在線社區(qū)非常有價值
  • 可移植性是一個重要的考慮因素

在Python中,你可以做很多事情。您可以創(chuàng)建一個變量,隨心所欲地改變它的類型,然后不必擔心如何處理它。這能讓你在執(zhí)行過程中改變想法。非常適合動態(tài)迭代原型設計。

在c++中,您必須預先決定您希望您的變量是什么類型。您還必須預先決定希望函數(shù)返回的類型。如果您聲明錯誤,例如試圖從一個已經(jīng)聲明為返回整數(shù)的函數(shù)返回一個字符串,那么您的進程將會停止。在這種情況下,編譯器將阻止您編譯程序,通常帶有一個令人費解的錯誤消息。令人沮喪的是,編譯器是您的朋友,它會在這個問題導致后續(xù)問題之前預先提醒您。在Python中,只有在太晚的時候才發(fā)現(xiàn)問題是很常見的,比如在代碼投入生產(chǎn)之后。

在上面的示例中,編譯器捕獲定義為返回試圖返回字符串的整數(shù)的函數(shù)。

也有編譯器不支持您的情況。訪問一個被認為存儲在特定內(nèi)存地址的變量時,可能只收到一個垃圾值,因為該變量已經(jīng)被刪除了。在這里,您通常不會在編譯時收到錯誤,而且很容易在代碼中留下錯誤,而您對此卻渾然不覺。

在上面的示例中,即使我們試圖訪問已被刪除的變量的內(nèi)存地址的值,編譯也不會給出錯誤。

盡早做出好的架構決策

在Python中,很容易在嘗試解決問題的早期階段就開始編寫解決方案。由于c++的靈活性和較慢的開發(fā)速度,這種方法在使用c++時不能很好地工作。

在這個項目中,我最初使用的是我的python方法,即只編寫代碼,而不繪制端到端解決方案。最后,我坐下來,想出了一個解決這個問題的總體架構。

下面列出了在實現(xiàn)決策樹分類器中開發(fā)的關鍵對象。它們包括一個Node類和一個Tree類,以及它們相關的屬性和方法,并且大部分可以在編寫任何代碼之前定義:

Node
- Node constructor
- Node destuctor
- Attributes
   - children nodes
   - data
   - best split feature chosen
   - best split category chosen
- Methods
   - giniImpurity() - metric for scoring quality of split
   - bestSplit() - best split feature and category

Tree
- Tree constructor
- Tree destructor
- Attributes
   - root node of tree
- Methods
   - traverse() - traverse nodes of tree
   - fit() - fit tree to dataset
   - predict() - make predictions classes with unseen data
   - CSVReader() - read a csv

決策樹項目的核心文件(不包括測試文件)如下所示,以供參考。

. 
├── CMakeLists.txt 
├── CSVReader.cpp 
├── CSVReader.hpp 
├── DecisionTree.cpp 
├── DecisionTree.hpp 
├── Main.cpp 
├── Node.cpp 
├── Node.hpp 
└── README.md

一旦該體系結構就位,解決方案自然就會遵循。對類及其成員函數(shù)(類和函數(shù)參數(shù)以及返回的對象)的接口進行前瞻性設計也可以使事情變得更加容易。

從長遠來看,編寫測試將為您節(jié)省時間

由于c++缺乏安全性,所以測試代碼的每個部分是否都成功地完成了預期的功能是至關重要的。用于c++的谷歌Test測試框架很適合這個項目,它使用CMake構建。

以可測試的方式編寫代碼可以更容易地識別和隔離bug。方法是為實現(xiàn)的類編寫靜態(tài)定義的成員函數(shù)。靜態(tài)定義的成員函數(shù)可以在沒有父類實例化的情況下獨立執(zhí)行。這使得為完成決策樹業(yè)務邏輯的一個方面的每一個功能編寫特定的、獨立的測試用例成為可能。

上面顯示了在終端中通過測試的谷歌Test的輸出。

語言的在線社區(qū)非常有價值

Python開發(fā)人員有一個開發(fā)人員社區(qū),使用像Stack Overflow和博客這樣的工具為集體知識做出貢獻。此資源是Python數(shù)據(jù)科學的命脈。c++沒有等價的社區(qū)。在谷歌上搜索開發(fā)c++代碼時遇到的許多問題和錯誤消息,往往會得到?jīng)]有幫助的結果。一種語言的社區(qū)價值很大。

從上面我們可以看到,現(xiàn)在每個月被回答的與Python相關的問題比c++多4倍。在這里查看這些統(tǒng)計數(shù)據(jù)的當前狀態(tài)。

可移植性是一個重要的考慮因素

在Python中,你可以確信任何安裝了Python解釋器的系統(tǒng)都能夠執(zhí)行你的Python程序。而在c++中,你就沒有這種特權了。由于c++是一種編譯語言,在運行程序之前必須先編譯程序,而且必須針對要運行程序的宿主的體系結構來編譯它。

當嘗試使用Github Actions遠程測試代碼時,這成為一個重要的問題。由于主機是不同的操作系統(tǒng)和架構,因此需要在虛擬機上測試代碼之前編譯代碼。這是部署代碼時需要管理的額外開銷。

總結

學習像c++這樣的低級語言可以讓你接觸到許多快速程序所需的核心概念,如內(nèi)存管理、數(shù)據(jù)結構和編譯語言。它讓人們意識到Python中預先實現(xiàn)的數(shù)據(jù)結構,比如Pandas DataFrames,將擁有處理內(nèi)存管理的系統(tǒng),這些系統(tǒng)必須做出一系列假設,因此有局限性。

在實踐中,不太可能有很多數(shù)據(jù)科學家會使用c++來解決實驗性的數(shù)據(jù)科學問題,但是Python不再是最好的工具,例如編寫快速的數(shù)據(jù)解析器或?qū)崿F(xiàn)昂貴的算法。即使在這種情況下,我也將探索現(xiàn)代低級語言,如Go-lang和Rust,而不是c++。c++的語法讓人感覺很冗長,而且它缺乏許多可以從這些現(xiàn)代語言中獲得的安全特性。

您可以在這里從頭看到c++決策樹分類器的完整源代碼。您還可以在這里找到一個示例jupiter notebook,它直接從Python調(diào)用已實現(xiàn)的決策樹分類器,并在Titanic數(shù)據(jù)集上訓練決策樹。https://github.com/hlamotte/decision-tree

到此這篇關于教你用c++從頭開始實現(xiàn)決策樹的文章就介紹到這了,更多相關c++實現(xiàn)決策樹內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)任意四則運算表達式求值算法

    java實現(xiàn)任意四則運算表達式求值算法

    這篇文章主要介紹了java實現(xiàn)任意四則運算表達式求值算法,實例分析了基于java實現(xiàn)表達式四則運算求值的原理與技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C語言中的malloc使用詳解

    C語言中的malloc使用詳解

    這篇文章主要介紹了C語言中的malloc的使用,包括用其動態(tài)申請二維數(shù)組等功能,需要的朋友可以參考下
    2015-08-08
  • C++基礎入門篇之強制轉(zhuǎn)換

    C++基礎入門篇之強制轉(zhuǎn)換

    這篇文章主要給大家介紹了關于C++基礎入門篇之強制轉(zhuǎn)換的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C++實現(xiàn)LeetCode(119.楊輝三角之二)

    C++實現(xiàn)LeetCode(119.楊輝三角之二)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(119.楊輝三角之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 基于Matlab繪制洛倫茲吸引子相圖

    基于Matlab繪制洛倫茲吸引子相圖

    洛倫茲吸引子(Lorenz attractor)是由MIT大學的氣象學家Edward Lorenz在1963年給出的。本文將利用Matlab實現(xiàn)洛倫茲吸引子相圖的繪制,感興趣的可以了解一下
    2022-04-04
  • 利用C++如何覆蓋或刪除指定位置的文件內(nèi)容

    利用C++如何覆蓋或刪除指定位置的文件內(nèi)容

    這篇文章主要給大家介紹了關于利用C++如何覆蓋或刪除指定位置的文件內(nèi)容,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。
    2017-08-08
  • C++中多才多藝的 const

    C++中多才多藝的 const

    在C++中,關鍵字const可以用來修飾任何作用域內(nèi)的變量、函數(shù)參數(shù)、函數(shù)本體、函數(shù)返回值、成員函數(shù)、迭代器,也可以用來修飾指針本身和指針目標,可謂多才多藝,我們要詳細了解其內(nèi)部細節(jié),以及邏輯奧秘,讓這把多功能瑞士軍刀盡情發(fā)揮其作用,需要的朋友可以參考一下
    2021-09-09
  • C語言的三種條件判斷語句你都了解嗎

    C語言的三種條件判斷語句你都了解嗎

    這篇文章主要為大家詳細介紹了C語言的三種條件判斷語句,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++子類父類成員函數(shù)的覆蓋和隱藏實例詳解

    C++子類父類成員函數(shù)的覆蓋和隱藏實例詳解

    這篇文章主要介紹了C++子類父類成員函數(shù)的覆蓋和隱藏實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • OpenCV實現(xiàn)幀間差分法詳解

    OpenCV實現(xiàn)幀間差分法詳解

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)幀間差分法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

大方县| 苍南县| 东丽区| 台前县| 通榆县| 北海市| 西峡县| 海城市| 财经| 昌都县| 丽江市| 怀仁县| 龙口市| 甘孜县| 瑞丽市| 扎囊县| 美姑县| 攀枝花市| 旅游| 勃利县| 天门市| 神木县| 富川| 平阴县| 廊坊市| 金山区| 通州区| 于田县| 文山县| 迁西县| 油尖旺区| 九寨沟县| 安乡县| 英德市| 舒城县| 镇沅| 杭州市| 泰顺县| 永顺县| 扎鲁特旗| 兰西县|