docs
Directory actions
More options
Directory actions
More options
docs
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
parent directory.. | ||||
<!DOCTYPE html> <html class="writer-html5" lang="en" > <head> <meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Ranking, Scoring, Decisions, and Optimization with XGBoost — improveai 8.0.0 documentation</title> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <link rel="stylesheet" href="_static/graphviz.css" type="text/css" /> <!--[if lt IE 9]> <script src="_static/js/html5shiv.min.js"></script> <![endif]--> <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script> <script src="_static/doctools.js"></script> <script src="_static/sphinx_highlight.js"></script> <script src="_static/js/theme.js"></script> <link rel="index" title="Index" href="genindex.html" /> <link rel="search" title="Search" href="search.html" /> <link rel="next" title="scorer.py module" href="improveai.scorer.html" /> <link rel="prev" title="Welcome to Improve AI python ranker documentation!" href="index.html" /> </head> <body class="wy-body-for-nav"> <div class="wy-grid-for-nav"> <nav data-toggle="wy-nav-shift" class="wy-nav-side"> <div class="wy-side-scroll"> <div class="wy-side-nav-search" > <a href="index.html" class="icon icon-home"> improveai </a> <div class="version"> 8.0 </div> <div role="search"> <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> </div> </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu"> <p class="caption" role="heading"><span class="caption-text">Readme:</span></p> <ul class="current"> <li class="toctree-l1 current"><a class="current reference internal" href="#">About Improve AI python ranker</a><ul> <li class="toctree-l2"><a class="reference internal" href="#installation">Installation</a></li> <li class="toctree-l2"><a class="reference internal" href="#instructions-for-chatgpt">Instructions for ChatGPT</a></li> <li class="toctree-l2"><a class="reference internal" href="#usage">Usage</a></li> <li class="toctree-l2"><a class="reference internal" href="#reward-assignment">Reward Assignment</a></li> <li class="toctree-l2"><a class="reference internal" href="#contextual-ranking-scoring">Contextual Ranking & Scoring</a></li> <li class="toctree-l2"><a class="reference internal" href="#resources">Resources</a></li> <li class="toctree-l2"><a class="reference internal" href="#help-improve-our-world">Help Improve Our World</a></li> </ul> </li> </ul> <p class="caption" role="heading"><span class="caption-text">Classes:</span></p> <ul> <li class="toctree-l1"><a class="reference internal" href="improveai.scorer.html">Scorer</a></li> <li class="toctree-l1"><a class="reference internal" href="improveai.ranker.html">Ranker</a></li> <li class="toctree-l1"><a class="reference internal" href="improveai.reward_tracker.html">RewardTracker</a></li> <li class="toctree-l1"><a class="reference internal" href="improveai.feature_encoder.html">FeatureEncoder</a></li> <li class="toctree-l1"><a class="reference internal" href="improveai.cythonized_feature_encoding.cythonized_feature_encoder.html">CythonizedFeatureEncoder</a></li> <li class="toctree-l1"><a class="reference internal" href="improveai.chooser.html">Chooser</a></li> </ul> <p class="caption" role="heading"><span class="caption-text">Utils:</span></p> <ul> <li class="toctree-l1"><a class="reference internal" href="improveai.settings.html">Settings</a></li> <li class="toctree-l1"><a class="reference internal" href="improveai.utils.general_purpose_tools.html">general purpose tools</a></li> <li class="toctree-l1"><a class="reference internal" href="improveai.utils.gzip_tools.html">gzip tools</a></li> <li class="toctree-l1"><a class="reference internal" href="improveai.utils.url_tools.html">URL tools</a></li> </ul> </div> </div> </nav> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" > <i data-toggle="wy-nav-top" class="fa fa-bars"></i> <a href="index.html">improveai</a> </nav> <div class="wy-nav-content"> <div class="rst-content"> <div role="navigation" aria-label="Page navigation"> <ul class="wy-breadcrumbs"> <li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li> <li class="breadcrumb-item active">Ranking, Scoring, Decisions, and Optimization with XGBoost</li> <li class="wy-breadcrumbs-aside"> <a href="_sources/readme.md.txt" rel="nofollow"> View page source</a> </li> </ul> <hr/> </div> <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> <section id="ranking-scoring-decisions-and-optimization-with-xgboost"> <h1>Ranking, Scoring, Decisions, and Optimization with XGBoost<a class="headerlink" href="#ranking-scoring-decisions-and-optimization-with-xgboost" title="Permalink to this heading"></a></h1> <p>Improve AI is a machine learning platform for quickly implementing app optimization, personalization, and recommendations for <a class="reference external" href="https://improve.ai/python-sdk/">Python</a>, <a class="reference external" href="https://improve.ai/ios-sdk/">iOS</a>, and <a class="reference external" href="https://improve.ai/android-sdk/">Android</a>.</p> <p>The SDKs provide simple APIs for AI <a class="reference external" href="https://improve.ai/decisions/">decisions</a>, <a class="reference external" href="https://improve.ai/ranking/">ranking</a>, and <a class="reference external" href="https://improve.ai/scoring/">scoring</a>, that execute immediately, in-process, with zero network latency. Items and their rewards are tracked with the <a class="reference external" href="https://github.com/improve-ai/tracker-trainer">Improve AI Tracker / Trainer</a> and updated models are trained regularly for continuous learning.</p> <section id="installation"> <h2>Installation<a class="headerlink" href="#installation" title="Permalink to this heading"></a></h2> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">pip3 install improveai</span> </pre></div> </div> </section> <section id="instructions-for-chatgpt"> <h2>Instructions for ChatGPT<a class="headerlink" href="#instructions-for-chatgpt" title="Permalink to this heading"></a></h2> <p>Paste the following into your ChatGPT prompt to have it write code against the Improve AI APIs:</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="sd">"""</span> <span class="sd">The following is the Python API documentation for ImproveAI, which is imported with </span> <span class="sd">'import improveai'. Simply respond with 'ImproveAI documentation imported':</span> <span class="sd">"""</span> <span class="k">class</span> <span class="nc">Ranker</span><span class="p">:</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> A utility for ranking items based on their scores. The Ranker struct takes</span> <span class="sd"> a ImproveAI model to evaluate and rank the given items.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">scorer</span><span class="p">:</span> <span class="n">Scorer</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">model_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Init Ranker with params. Either `scorer` or `model_url` must be provided.</span> <span class="sd"> If both are provided Scorer is preferred.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> scorer: Scorer</span> <span class="sd"> a Scorer object to be used with this Ranker</span> <span class="sd"> model_url: str</span> <span class="sd"> URL or local FS of a plain or gzip compressed Improve AI model resource</span> <span class="sd"> """</span> <span class="c1"># for true implementation please consult improveai/ranker.py</span> <span class="k">pass</span> <span class="k">def</span> <span class="nf">rank</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">items</span><span class="p">:</span> <span class="nb">list</span> <span class="ow">or</span> <span class="nb">tuple</span> <span class="ow">or</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="nb">object</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="nb">list</span> <span class="ow">or</span> <span class="nb">tuple</span> <span class="ow">or</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">:</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Ranks items and returns them ordered best to worst</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> items: list or tuple or np.ndarray</span> <span class="sd"> list of items to be ranked</span> <span class="sd"> context: object</span> <span class="sd"> any JSON encodable extra context info that will be used with each of</span> <span class="sd"> the item to get its score</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> list or tuple or np.ndarray</span> <span class="sd"> a collection of ranked items, sorted by their scores in descending order.</span> <span class="sd"> """</span> <span class="c1"># for true implementation please check out improveai/ranker.py</span> <span class="k">pass</span> <span class="k">class</span> <span class="nc">Scorer</span><span class="p">:</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Scores items with optional context using a Improve AI model</span> <span class="sd"> """</span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Init with params</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> model_url: str</span> <span class="sd"> URL or local FS of a plain or gzip compressed Improve AI model resource</span> <span class="sd"> """</span> <span class="c1"># for true implementation please check out improveai/scorer.py</span> <span class="k">pass</span> <span class="k">def</span> <span class="nf">score</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">items</span><span class="p">:</span> <span class="nb">list</span> <span class="ow">or</span> <span class="nb">tuple</span> <span class="ow">or</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="nb">object</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Uses the model to score a list of items with the given context</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> items: list or tuple or np.ndarray</span> <span class="sd"> list of items to be scored</span> <span class="sd"> context: object</span> <span class="sd"> any JSON encodable extra context info that will be used with each of</span> <span class="sd"> the item to get its score</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> np.ndarray</span> <span class="sd"> an array of float64 (double) values representing the scores of the items.</span> <span class="sd"> """</span> <span class="c1"># for true implementation please check out improveai/scorer.py</span> <span class="k">pass</span> <span class="k">class</span> <span class="nc">RewardTracker</span><span class="p">:</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Tracks items and rewards for training updated scoring models. When an item</span> <span class="sd"> becomes causal, pass it to the track() function, which will return a `reward_id`.</span> <span class="sd"> Use the `reward_id` to track future rewards associated with that item.</span> <span class="sd"> """</span> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">track_url</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">track_api_key</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">_threaded_requests</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Create a RewardTracker for a specific model.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> model_name: str</span> <span class="sd"> Name of the model, such as "songs" or "discounts", which either makes</span> <span class="sd"> the decisions or which decisions are being rewarded</span> <span class="sd"> track_url: str</span> <span class="sd"> The track endpoint URL that all tracked data will be sent to.</span> <span class="sd"> track_api_key: str</span> <span class="sd"> track endpoint API key (if applicable); Can be None</span> <span class="sd"> _threaded_requests: bool</span> <span class="sd"> flag indicating whether requests to AWS track endpoint should be</span> <span class="sd"> non-blockng / executed within sub-threads. True by default</span> <span class="sd"> """</span> <span class="c1"># for true implementation please check out improveai/reward_tracker.py</span> <span class="k">pass</span> <span class="k">def</span> <span class="nf">track</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">:</span> <span class="nb">object</span><span class="p">,</span> <span class="n">candidates</span><span class="p">:</span> <span class="nb">list</span> <span class="ow">or</span> <span class="nb">tuple</span> <span class="ow">or</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="nb">object</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">:</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Tracks the item selected from candidates and a random sample from the remaining items.</span> <span class="sd"> If `len(candidates) == 1` there is no sample.</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> item: object</span> <span class="sd"> any JSON encodable object chosen as best from candidates</span> <span class="sd"> candidates: list or tuple or np.ndarray</span> <span class="sd"> collection of items from which best is chosen</span> <span class="sd"> context: object</span> <span class="sd"> any JSON encodable extra context info that was used with each of the</span> <span class="sd"> item to get its score</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> str or None</span> <span class="sd"> reward_id of this track request or None if an error happened</span> <span class="sd"> """</span> <span class="c1"># for true implementation please check out improveai/reward_tracker.py</span> <span class="k">pass</span> <span class="k">def</span> <span class="nf">track_with_sample</span><span class="p">(</span> <span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">:</span> <span class="nb">object</span><span class="p">,</span> <span class="n">num_candidates</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">context</span><span class="p">:</span> <span class="nb">object</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span> <span class="n">sample</span><span class="p">:</span> <span class="nb">object</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">:</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Tracks the item selected and a specific sample.. Provided sample is</span> <span class="sd"> appended to track request (in contrary to `track(...)` where sample is</span> <span class="sd"> randomly selected from candidates).</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> item: object</span> <span class="sd"> any JSON encodable object chosen as best from candidates</span> <span class="sd"> num_candidates: int</span> <span class="sd"> total number of candidates, including the selected item</span> <span class="sd"> context: object</span> <span class="sd"> any JSON encodable extra context info that was used with each of the</span> <span class="sd"> item to get its score</span> <span class="sd"> sample: object</span> <span class="sd"> a random sample from the candidates</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> ste or None</span> <span class="sd"> reward_id of this track request or None if an error happened</span> <span class="sd"> """</span> <span class="c1"># for true implementation please check out improveai/reward_tracker.py</span> <span class="k">pass</span> <span class="k">def</span> <span class="nf">add_reward</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reward</span><span class="p">:</span> <span class="nb">float</span> <span class="ow">or</span> <span class="nb">int</span><span class="p">,</span> <span class="n">reward_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span> <span class="w"> </span><span class="sd">"""</span> <span class="sd"> Add reward for the provided reward_id</span> <span class="sd"> Parameters</span> <span class="sd"> ----------</span> <span class="sd"> reward: float or int</span> <span class="sd"> the reward to add; must be numeric (float, int ro bool), must not be</span> <span class="sd"> `None`, `np.nan` or +-`inf`</span> <span class="sd"> reward_id: str</span> <span class="sd"> the id that was returned from the track(...) / track_with_sample(...) methods</span> <span class="sd"> Returns</span> <span class="sd"> -------</span> <span class="sd"> str</span> <span class="sd"> message ID</span> <span class="sd"> """</span> <span class="c1"># for true implementation please check out improveai/reward_tracker.py</span> <span class="k">pass</span> </pre></div> </div> </section> <section id="usage"> <h2>Usage<a class="headerlink" href="#usage" title="Permalink to this heading"></a></h2> <p>Create a list of JSON encodable items and simply call <code class="docutils literal notranslate"><span class="pre">Ranker.rank(items)</span></code>.</p> <p>For instance, in a bedtime story app, you may have a list of Story dicts / objects:</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">story</span> <span class="o">=</span> <span class="p">{</span> <span class="s2">"title"</span><span class="p">:</span> <span class="s2">"<title string>"</span><span class="p">,</span> <span class="s2">"author"</span><span class="p">:</span> <span class="s2">"<author string>"</span><span class="p">,</span> <span class="s2">"page_count"</span><span class="p">:</span> <span class="mi">123</span> <span class="c1"># example integer representing number of pages for a given story</span> <span class="p">}</span> </pre></div> </div> <p>To obtain a ranked list of stories, use just one line of code:</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">ranked_stories</span> <span class="o">=</span> <span class="n">Ranker</span><span class="p">(</span><span class="n">model_url</span><span class="p">)</span><span class="o">.</span><span class="n">rank</span><span class="p">(</span><span class="n">stories</span><span class="p">)</span> </pre></div> </div> </section> <section id="reward-assignment"> <h2>Reward Assignment<a class="headerlink" href="#reward-assignment" title="Permalink to this heading"></a></h2> <p>Easily train your rankers using <a class="reference external" href="https://improve.ai/reinforcement-learning/">reinforcement learning</a>.</p> <p>First, track when an item is used:</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">tracker</span> <span class="o">=</span> <span class="n">RewardTracker</span><span class="p">(</span><span class="s2">"stories"</span><span class="p">,</span> <span class="n">track_url</span><span class="p">)</span> <span class="n">reward_id</span> <span class="o">=</span> <span class="n">tracker</span><span class="o">.</span><span class="n">track</span><span class="p">(</span><span class="n">story</span><span class="p">,</span> <span class="n">ranked_stories</span><span class="p">)</span> </pre></div> </div> <p>Later, if a positive outcome occurs, provide a reward:</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="n">purchased</span><span class="p">:</span> <span class="n">tracker</span><span class="o">.</span><span class="n">add_reward</span><span class="p">(</span><span class="n">profit</span><span class="p">,</span> <span class="n">reward_id</span><span class="p">)</span> </pre></div> </div> <p>Reinforcement learning uses positive rewards for favorable outcomes (a “carrot”) and negative rewards for undesirable outcomes (a “stick”). By assigning rewards based on business metrics, such as revenue or conversions, the system optimizes these metrics over time.</p> </section> <section id="contextual-ranking-scoring"> <h2>Contextual Ranking & Scoring<a class="headerlink" href="#contextual-ranking-scoring" title="Permalink to this heading"></a></h2> <p>Improve AI turns XGBoost into a contextual multi-armed bandit, meaning that context is considered when making ranking or scoring decisions.</p> <p>Often, the choice of the best variant depends on the context that the decision is made within. Let’s take the example of greetings for different times of the day:</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">greetings</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Good Morning"</span><span class="p">,</span> <span class="s2">"Good Afternoon"</span><span class="p">,</span> <span class="s2">"Good Evening"</span><span class="p">,</span> <span class="s2">"Buenos Días"</span><span class="p">,</span> <span class="s2">"Buenas Tardes"</span><span class="p">,</span> <span class="s2">"Buenas Noches"</span><span class="p">]</span> </pre></div> </div> <p>rank() also considers the context of each decision. The context can be any JSON-encodable data structure.</p> <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">ranked</span> <span class="o">=</span> <span class="n">ranker</span><span class="o">.</span><span class="n">rank</span><span class="p">(</span><span class="n">items</span><span class="o">=</span><span class="n">greetings</span><span class="p">,</span> <span class="n">context</span><span class="o">=</span><span class="p">{</span> <span class="s2">"day_time"</span><span class="p">:</span> <span class="mf">12.0</span><span class="p">,</span> <span class="s2">"language"</span><span class="p">:</span> <span class="s2">"en"</span> <span class="p">})</span> <span class="n">greeting</span> <span class="o">=</span> <span class="n">ranked</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> </pre></div> </div> <p>Trained with appropriate rewards, Improve AI would learn from scratch which greeting is best for each time of day and language.</p> </section> <section id="resources"> <h2>Resources<a class="headerlink" href="#resources" title="Permalink to this heading"></a></h2> <ul class="simple"> <li><p><a class="reference external" href="https://improve.ai/quick-start/">Quick Start Guide</a></p></li> <li><p><a class="reference external" href="https://github.com/improve-ai/tracker-trainer/">Tracker / Trainer</a></p></li> <li><p><a class="reference external" href="https://improve.ai/reinforcement-learning/">Reinforcement Learning</a></p></li> </ul> </section> <section id="help-improve-our-world"> <h2>Help Improve Our World<a class="headerlink" href="#help-improve-our-world" title="Permalink to this heading"></a></h2> <p>The mission of Improve AI is to make our corner of the world a little bit better each day. When each of us improve our corner of the world, the whole world becomes better. If your product or work does not make the world better, do not use Improve AI. Otherwise, welcome, I hope you find value in my labor of love.</p> <p>– Justin Chapweske</p> </section> </section> </div> </div> <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer"> <a href="index.html" class="btn btn-neutral float-left" title="Welcome to Improve AI python ranker documentation!" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a> <a href="improveai.scorer.html" class="btn btn-neutral float-right" title="scorer.py module" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a> </div> <hr/> <div role="contentinfo"> <p>© Copyright 2022, Improve AI.</p> </div> Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. </footer> </div> </div> </section> </div> <script> jQuery(function () { SphinxRtdTheme.Navigation.enable(true); }); </script> </body> </html>