Files
BayesNet/docs/manual/_boost_8cc_source.html

361 lines
45 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.11.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>BayesNet: /Users/rmontanana/Code/BayesNet/bayesnet/ensembles/Boost.cc Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<script type="text/javascript" src="clipboard.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="logo_small.png"/></td>
<td id="projectalign">
<div id="projectname">BayesNet<span id="projectnumber">&#160;1.0.5</span>
</div>
<div id="projectbrief">Bayesian Network Classifiers using libtorch from scratch</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.11.0 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() { codefold.init(0); });
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function(){initNavTree('_boost_8cc_source.html',''); initResizable(true); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">Boost.cc</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// ***************************************************************</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// SPDX-FileCopyrightText: Copyright 2024 Ricardo Montañana Gómez</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// SPDX-FileType: SOURCE</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">// SPDX-License-Identifier: MIT</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">// ***************************************************************</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;folding.hpp&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &quot;bayesnet/feature_selection/CFS.h&quot;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="preprocessor">#include &quot;bayesnet/feature_selection/FCBF.h&quot;</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &quot;bayesnet/feature_selection/IWSS.h&quot;</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#include &quot;Boost.h&quot;</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="keyword">namespace </span>bayesnet {</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> Boost::Boost(<span class="keywordtype">bool</span> predict_voting) : Ensemble(predict_voting)</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> {</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> validHyperparameters = { <span class="stringliteral">&quot;order&quot;</span>, <span class="stringliteral">&quot;convergence&quot;</span>, <span class="stringliteral">&quot;convergence_best&quot;</span>, <span class="stringliteral">&quot;bisection&quot;</span>, <span class="stringliteral">&quot;threshold&quot;</span>, <span class="stringliteral">&quot;maxTolerance&quot;</span>,</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> <span class="stringliteral">&quot;predict_voting&quot;</span>, <span class="stringliteral">&quot;select_features&quot;</span>, <span class="stringliteral">&quot;block_update&quot;</span> };</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> }</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keywordtype">void</span> Boost::setHyperparameters(<span class="keyword">const</span> nlohmann::json&amp; hyperparameters_)</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> {</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> <span class="keyword">auto</span> hyperparameters = hyperparameters_;</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;order&quot;</span>)) {</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> std::vector&lt;std::string&gt; algos = { Orders.ASC, Orders.DESC, Orders.RAND };</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> order_algorithm = hyperparameters[<span class="stringliteral">&quot;order&quot;</span>];</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> <span class="keywordflow">if</span> (std::find(algos.begin(), algos.end(), order_algorithm) == algos.end()) {</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid order algorithm, valid values [&quot;</span> + Orders.ASC + <span class="stringliteral">&quot;, &quot;</span> + Orders.DESC + <span class="stringliteral">&quot;, &quot;</span> + Orders.RAND + <span class="stringliteral">&quot;]&quot;</span>);</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> }</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> hyperparameters.erase(<span class="stringliteral">&quot;order&quot;</span>);</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> }</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;convergence&quot;</span>)) {</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> convergence = hyperparameters[<span class="stringliteral">&quot;convergence&quot;</span>];</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> hyperparameters.erase(<span class="stringliteral">&quot;convergence&quot;</span>);</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> }</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;convergence_best&quot;</span>)) {</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> convergence_best = hyperparameters[<span class="stringliteral">&quot;convergence_best&quot;</span>];</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> hyperparameters.erase(<span class="stringliteral">&quot;convergence_best&quot;</span>);</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> }</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;bisection&quot;</span>)) {</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> bisection = hyperparameters[<span class="stringliteral">&quot;bisection&quot;</span>];</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> hyperparameters.erase(<span class="stringliteral">&quot;bisection&quot;</span>);</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> }</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;threshold&quot;</span>)) {</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> threshold = hyperparameters[<span class="stringliteral">&quot;threshold&quot;</span>];</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> hyperparameters.erase(<span class="stringliteral">&quot;threshold&quot;</span>);</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> }</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;maxTolerance&quot;</span>)) {</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> maxTolerance = hyperparameters[<span class="stringliteral">&quot;maxTolerance&quot;</span>];</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keywordflow">if</span> (maxTolerance &lt; 1 || maxTolerance &gt; 4)</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid maxTolerance value, must be greater in [1, 4]&quot;</span>);</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> hyperparameters.erase(<span class="stringliteral">&quot;maxTolerance&quot;</span>);</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> }</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;predict_voting&quot;</span>)) {</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> predict_voting = hyperparameters[<span class="stringliteral">&quot;predict_voting&quot;</span>];</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> hyperparameters.erase(<span class="stringliteral">&quot;predict_voting&quot;</span>);</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> }</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;select_features&quot;</span>)) {</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keyword">auto</span> selectedAlgorithm = hyperparameters[<span class="stringliteral">&quot;select_features&quot;</span>];</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> std::vector&lt;std::string&gt; algos = { SelectFeatures.IWSS, SelectFeatures.CFS, SelectFeatures.FCBF };</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> selectFeatures = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> select_features_algorithm = selectedAlgorithm;</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keywordflow">if</span> (std::find(algos.begin(), algos.end(), selectedAlgorithm) == algos.end()) {</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid selectFeatures value, valid values [&quot;</span> + SelectFeatures.IWSS + <span class="stringliteral">&quot;, &quot;</span> + SelectFeatures.CFS + <span class="stringliteral">&quot;, &quot;</span> + SelectFeatures.FCBF + <span class="stringliteral">&quot;]&quot;</span>);</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> }</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> hyperparameters.erase(<span class="stringliteral">&quot;select_features&quot;</span>);</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> }</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keywordflow">if</span> (hyperparameters.contains(<span class="stringliteral">&quot;block_update&quot;</span>)) {</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> block_update = hyperparameters[<span class="stringliteral">&quot;block_update&quot;</span>];</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> hyperparameters.erase(<span class="stringliteral">&quot;block_update&quot;</span>);</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> }</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> Classifier::setHyperparameters(hyperparameters);</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> }</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordtype">void</span> Boost::buildModel(<span class="keyword">const</span> torch::Tensor&amp; weights)</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> {</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="comment">// Models shall be built in trainModel</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> models.clear();</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> significanceModels.clear();</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> n_models = 0;</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="comment">// Prepare the validation dataset</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keyword">auto</span> y_ = dataset.index({ -1, <span class="stringliteral">&quot;...&quot;</span> });</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordflow">if</span> (convergence) {</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="comment">// Prepare train &amp; validation sets from train data</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keyword">auto</span> fold = folding::StratifiedKFold(5, y_, 271);</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keyword">auto</span> [train, test] = fold.getFold(0);</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keyword">auto</span> train_t = torch::tensor(train);</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="keyword">auto</span> test_t = torch::tensor(test);</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="comment">// Get train and validation sets</span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> X_train = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), train_t });</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> y_train = dataset.index({ -1, train_t });</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> X_test = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), test_t });</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> y_test = dataset.index({ -1, test_t });</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> dataset = X_train;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> m = X_train.size(1);</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keyword">auto</span> n_classes = states.at(className).size();</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="comment">// Build dataset with train data</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> buildDataset(y_train);</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> metrics = Metrics(dataset, features, className, n_classes);</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="comment">// Use all data to train</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> X_train = dataset.index({ torch::indexing::Slice(0, dataset.size(0) - 1), <span class="stringliteral">&quot;...&quot;</span> });</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> y_train = y_;</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> }</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> }</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> std::vector&lt;int&gt; Boost::featureSelection(torch::Tensor&amp; weights_)</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> {</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keywordtype">int</span> maxFeatures = 0;</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">if</span> (select_features_algorithm == SelectFeatures.CFS) {</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> featureSelector = <span class="keyword">new</span> CFS(dataset, features, className, maxFeatures, states.at(className).size(), weights_);</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (select_features_algorithm == SelectFeatures.IWSS) {</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keywordflow">if</span> (threshold &lt; 0 || threshold &gt;0.5) {</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid threshold value for &quot;</span> + SelectFeatures.IWSS + <span class="stringliteral">&quot; [0, 0.5]&quot;</span>);</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> }</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> featureSelector = <span class="keyword">new</span> IWSS(dataset, features, className, maxFeatures, states.at(className).size(), weights_, threshold);</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (select_features_algorithm == SelectFeatures.FCBF) {</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordflow">if</span> (threshold &lt; 1e-7 || threshold &gt; 1) {</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid threshold value for &quot;</span> + SelectFeatures.FCBF + <span class="stringliteral">&quot; [1e-7, 1]&quot;</span>);</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> }</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> featureSelector = <span class="keyword">new</span> FCBF(dataset, features, className, maxFeatures, states.at(className).size(), weights_, threshold);</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> }</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> featureSelector-&gt;fit();</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keyword">auto</span> featuresUsed = featureSelector-&gt;getFeatures();</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keyword">delete</span> featureSelector;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordflow">return</span> featuresUsed;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> }</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> std::tuple&lt;torch::Tensor&amp;, double, bool&gt; Boost::update_weights(torch::Tensor&amp; ytrain, torch::Tensor&amp; ypred, torch::Tensor&amp; weights)</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> {</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordtype">bool</span> terminate = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keywordtype">double</span> alpha_t = 0;</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keyword">auto</span> mask_wrong = ypred != ytrain;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keyword">auto</span> mask_right = ypred == ytrain;</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keyword">auto</span> masked_weights = weights * mask_wrong.to(weights.dtype());</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keywordtype">double</span> epsilon_t = masked_weights.sum().item&lt;<span class="keywordtype">double</span>&gt;();</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keywordflow">if</span> (epsilon_t &gt; 0.5) {</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="comment">// Inverse the weights policy (plot ln(wt))</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="comment">// &quot;In each round of AdaBoost, there is a sanity check to ensure that the current base </span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="comment">// learner is better than random guess&quot; (Zhi-Hua Zhou, 2012)</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> terminate = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keywordtype">double</span> wt = (1 - epsilon_t) / epsilon_t;</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> alpha_t = epsilon_t == 0 ? 1 : 0.5 * log(wt);</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="comment">// Step 3.2: Update weights for next classifier</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="comment">// Step 3.2.1: Update weights of wrong samples</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> weights += mask_wrong.to(weights.dtype()) * exp(alpha_t) * weights;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="comment">// Step 3.2.2: Update weights of right samples</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> weights += mask_right.to(weights.dtype()) * exp(-alpha_t) * weights;</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="comment">// Step 3.3: Normalise the weights</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordtype">double</span> totalWeights = torch::sum(weights).item&lt;<span class="keywordtype">double</span>&gt;();</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> weights = weights / totalWeights;</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> }</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keywordflow">return</span> { weights, alpha_t, terminate };</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> }</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> std::tuple&lt;torch::Tensor&amp;, double, bool&gt; Boost::update_weights_block(<span class="keywordtype">int</span> k, torch::Tensor&amp; ytrain, torch::Tensor&amp; weights)</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> {</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="comment">/* Update Block algorithm</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span><span class="comment"> k = # of models in block</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span><span class="comment"> n_models = # of models in ensemble to make predictions</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span><span class="comment"> n_models_bak = # models saved</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span><span class="comment"> models = vector of models to make predictions</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span><span class="comment"> models_bak = models not used to make predictions</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span><span class="comment"> significances_bak = backup of significances vector</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span><span class="comment"></span> </div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span><span class="comment"> Case list</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span><span class="comment"> A) k = 1, n_models = 1 =&gt; n = 0 , n_models = n + k</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span><span class="comment"> B) k = 1, n_models = n + 1 =&gt; n_models = n + k</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span><span class="comment"> C) k &gt; 1, n_models = k + 1 =&gt; n= 1, n_models = n + k</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span><span class="comment"> D) k &gt; 1, n_models = k =&gt; n = 0, n_models = n + k</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span><span class="comment"> E) k &gt; 1, n_models = k + n =&gt; n_models = n + k</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span><span class="comment"></span> </div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span><span class="comment"> A, D) n=0, k &gt; 0, n_models == k</span></div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span><span class="comment"> 1. n_models_bak &lt;- n_models</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span><span class="comment"> 2. significances_bak &lt;- significances</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span><span class="comment"> 3. significances = vector(k, 1)</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span><span class="comment"> 4. Dont move any classifiers out of models</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span><span class="comment"> 5. n_models &lt;- k</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span><span class="comment"> 6. Make prediction, compute alpha, update weights</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span><span class="comment"> 7. Dont restore any classifiers to models</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span><span class="comment"> 8. significances &lt;- significances_bak</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span><span class="comment"> 9. Update last k significances</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span><span class="comment"> 10. n_models &lt;- n_models_bak</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span><span class="comment"></span> </div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span><span class="comment"> B, C, E) n &gt; 0, k &gt; 0, n_models == n + k</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span><span class="comment"> 1. n_models_bak &lt;- n_models</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span><span class="comment"> 2. significances_bak &lt;- significances</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span><span class="comment"> 3. significances = vector(k, 1)</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span><span class="comment"> 4. Move first n classifiers to models_bak</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span><span class="comment"> 5. n_models &lt;- k</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span><span class="comment"> 6. Make prediction, compute alpha, update weights</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span><span class="comment"> 7. Insert classifiers in models_bak to be the first n models</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span><span class="comment"> 8. significances &lt;- significances_bak</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span><span class="comment"> 9. Update last k significances</span></div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span><span class="comment"> 10. n_models &lt;- n_models_bak</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span><span class="comment"> */</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="comment">//</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="comment">// Make predict with only the last k models</span></div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="comment">//</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> std::unique_ptr&lt;Classifier&gt; model;</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> std::vector&lt;std::unique_ptr&lt;Classifier&gt;&gt; models_bak;</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="comment">// 1. n_models_bak &lt;- n_models 2. significances_bak &lt;- significances</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keyword">auto</span> significance_bak = significanceModels;</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">auto</span> n_models_bak = n_models;</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="comment">// 3. significances = vector(k, 1)</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> significanceModels = std::vector&lt;double&gt;(k, 1.0);</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <span class="comment">// 4. Move first n classifiers to models_bak</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="comment">// backup the first n_models - k models (if n_models == k, don&#39;t backup any)</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; n_models - k; ++i) {</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> model = std::move(models[0]);</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> models.erase(models.begin());</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> models_bak.push_back(std::move(model));</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> }</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> assert(models.size() == k);</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="comment">// 5. n_models &lt;- k</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> n_models = k;</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="comment">// 6. Make prediction, compute alpha, update weights</span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="keyword">auto</span> ypred = predict(X_train);</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="comment">//</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <span class="comment">// Update weights</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="comment">//</span></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keywordtype">double</span> alpha_t;</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="keywordtype">bool</span> terminate;</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> std::tie(weights, alpha_t, terminate) = update_weights(y_train, ypred, weights);</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="comment">//</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="comment">// Restore the models if needed</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="comment">//</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="comment">// 7. Insert classifiers in models_bak to be the first n models</span></div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="comment">// if n_models_bak == k, don&#39;t restore any, because none of them were moved</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="keywordflow">if</span> (k != n_models_bak) {</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="comment">// Insert in the same order as they were extracted</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <span class="keywordtype">int</span> bak_size = models_bak.size();</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; bak_size; ++i) {</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> model = std::move(models_bak[bak_size - 1 - i]);</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> models_bak.erase(models_bak.end() - 1);</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> models.insert(models.begin(), std::move(model));</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> }</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> }</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <span class="comment">// 8. significances &lt;- significances_bak</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> significanceModels = significance_bak;</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="comment">//</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="comment">// Update the significance of the last k models</span></div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="comment">//</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="comment">// 9. Update last k significances</span></div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; k; ++i) {</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> significanceModels[n_models_bak - k + i] = alpha_t;</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> }</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> <span class="comment">// 10. n_models &lt;- n_models_bak</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> n_models = n_models_bak;</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keywordflow">return</span> { weights, alpha_t, terminate };</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> }</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span>}</div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_40070fdff85d618b4d1d3ab4ac4f79bb.html">bayesnet</a></li><li class="navelem"><a class="el" href="dir_2f68445c4ac4316280c650d0a13b2741.html">ensembles</a></li><li class="navelem"><b>Boost.cc</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.11.0 </li>
</ul>
</div>
</body>
</html>