220 lines
62 KiB
HTML
220 lines
62 KiB
HTML
<!DOCTYPE html> <html lang="en-US"> <head prefix="og:http://ogp.me/ns#"> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="mobile-web-app-capable" content="yes" /> <meta name="p:domain_verify" content="74b28158c46b8035f8f4a5ba032e51b2" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="application-name" content="Klise Theme" /> <meta name="apple-mobile-web-app-status-bar-style" content="#fff" /> <meta name="apple-mobile-web-app-title" content="Klise Theme" /> <title> Python Notes from Intro to Machine Learning - Klise Theme </title> <link rel="alternate" href="http://localhost:4000/python-notes-from-Intro-to-machine-learning/" hreflang="en-US" /> <link rel="canonical" href="http://localhost:4000/python-notes-from-Intro-to-machine-learning/" /> <meta name="description" content="Notes and code snippets of Python that I've been collecting so far throughout the "Intro to Machine Learning" course." /> <meta name="referrer" content="no-referrer-when-downgrade" /> <meta property="fb:app_id" content="" /> <meta property="og:site_name" content="Python Notes from Intro to Machine Learning | username" /> <meta property="og:title" content="Python Notes from Intro to Machine Learning | username" /> <meta property="og:type" content="website" /> <meta property="og:url" content="http://localhost:4000/python-notes-from-Intro-to-machine-learning/" /> <meta property="og:description" content="Notes and code snippets of Python that I've been collecting so far throughout the "Intro to Machine Learning" course." /> <meta property="og:image" content="http://localhost:4000/assets/img/ogp.png" /> <meta property="og:image:width" content="640" /> <meta property="og:image:height" content="640" /> <meta name="twitter:card" content="summary" /> <meta name="twitter:title" content="Python Notes from Intro to Machine Learning | username" /> <meta name="twitter:url" content="http://localhost:4000/python-notes-from-Intro-to-machine-learning/" /> <meta name="twitter:site" content="@username" /> <meta name="twitter:creator" content="@username" /> <meta name="twitter:description" content="Notes and code snippets of Python that I've been collecting so far throughout the "Intro to Machine Learning" course." /> <meta name="twitter:image" content="http://localhost:4000/assets/img/ogp.png" /> <link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="Klise Theme" /> <link rel="apple-touch-icon" sizes="180x180" href="/assets/favicons/apple-touch-icon.png" /> <link rel="icon" type="image/png" sizes="96x96" href="/assets/favicons/android-chrome-96x96.png" /> <link rel="icon" type="image/png" sizes="32x32" href="/assets/favicons/favicon-32x32.png" /> <link rel="icon" type="image/png" sizes="16x16" href="/assets/favicons/favicon-16x16.png" /> <link rel="manifest" href="/assets/favicons/site.webmanifest" /> <link rel="mask-icon" href="/assets/favicons/safari-pinned-tab.svg" color="#5bbad5" /> <meta name="apple-mobile-web-app-title" content="Mahendrata" /> <meta name="application-name" content="Mahendrata" /> <meta name="msapplication-TileColor" content="#da532c" /> <meta name="theme-color" content="#2c2c2c" /> <link rel="stylesheet" href="/assets/css/style.css" /> </head> <body> <header class="navbar" role="navigation"> <nav class="menu"> <input type="checkbox" id="menu-trigger" class="menu-trigger" /> <label for="menu-trigger"> <span class="menu-icon"> <svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 512 512'><path d='M64,384H448V341.33H64Zm0-106.67H448V234.67H64ZM64,128v42.67H448V128Z'/></svg> </span> </label> <a id="mood"> <svg class="mood-sunny" xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 512 512'><title>LIGHT</title><line x1='256' y1='48' x2='256' y2='96' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='256' y1='416' x2='256' y2='464' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='403.08' y1='108.92' x2='369.14' y2='142.86' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='142.86' y1='369.14' x2='108.92' y2='403.08' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='464' y1='256' x2='416' y2='256' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='96' y1='256' x2='48' y2='256' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='403.08' y1='403.08' x2='369.14' y2='369.14' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='142.86' y1='142.86' x2='108.92' y2='108.92' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><circle cx='256' cy='256' r='80' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/></svg> <svg class="mood-moon" xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 512 512'><title>DARK</title><line x1='256' y1='48' x2='256' y2='96' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='256' y1='416' x2='256' y2='464' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='403.08' y1='108.92' x2='369.14' y2='142.86' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='142.86' y1='369.14' x2='108.92' y2='403.08' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='464' y1='256' x2='416' y2='256' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='96' y1='256' x2='48' y2='256' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='403.08' y1='403.08' x2='369.14' y2='369.14' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><line x1='142.86' y1='142.86' x2='108.92' y2='108.92' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/><circle cx='256' cy='256' r='80' style='stroke-linecap:round;stroke-miterlimit:10;stroke-width:32px'/></svg> </a> <div class="trigger"> <div class="trigger-container"> <a class="menu-link" href="/">home</a> <a class="menu-link" href="/about/">about</a> <a class="menu-link" href="/notes/">notes</a> <a class="menu-link rss" href="/feed.xml"> <svg xmlns='http://www.w3.org/2000/svg' width='17' height='17' viewBox='0 0 512 512' fill='#ED812E'><title>RSS</title><path d='M108.56,342.78a60.34,60.34,0,1,0,60.56,60.44A60.63,60.63,0,0,0,108.56,342.78Z'/><path d='M48,186.67v86.55c52,0,101.94,15.39,138.67,52.11s52,86.56,52,138.67h86.66C325.33,312.44,199.67,186.67,48,186.67Z'/><path d='M48,48v86.56c185.25,0,329.22,144.08,329.22,329.44H464C464,234.66,277.67,48,48,48Z'/></svg> </a> </div> </nav> </header> <div class="wrapper post"> <main class="page-content" aria-label="Content"> <article itemscope itemtype="https://schema.org/BlogPosting"> <header class="header"> <div class="tags"> <span itemprop="keywords"> <a class="tag" href="/tags/#python">PYTHON</a>, <a class="tag" href="/tags/#machine-learning">MACHINE-LEARNING</a> </span> </div> <h1 class="header-title" itemprop="headline">Python Notes from Intro to Machine Learning</h1> <div class="post-meta"> <time datetime="2018-04-14T10:00:00+07:00" itemprop="datePublished"> Apr 14, 2018 </time> <span itemprop="author" itemscope itemtype="https://schema.org/Person"> <span itemprop="name">Klisé Theme</span> </span> <time hidden datetime="" itemprop="dateModified"> Apr 14, 2018 </time> <span hidden itemprop="publisher" itemtype="Person">Klisé Theme</span> <span hidden itemprop="image"></span> <span hidden itemprop="mainEntityOfPage"><h5 id="this-article-is-for-demo-purpose">This article is for Demo purpose</h5> </span> </div> </header> <div class="page-content" itemprop="articleBody"> <h5 id="this-article-is-for-demo-purpose"> This article is for Demo purpose </h5> <p>The article was originally on <a href="https://github.com/risan/risanb.com/blob/master/content/posts/python-notes-from-intro-to-machine-learning/index.md">this repo</a></p> <p>I rarely use Python. I only have one repository at Github that is written in Python: <a href="https://github.com/risan/iris-flower-classifier">iris-flower-classifier</a>. And it was written two years ago!</p> <p>A few days ago I took this free course from Udacity: <a href="https://eu.udacity.com/course/intro-to-machine-learning--ud120">Intro to Machine Learning</a>. The machine learning related codes are quite easy to grasp since it simply uses the <a href="http://scikit-learn.org/">scikit-learn</a> modules. But most of the supporting Python modules that are provided by this course were like a black-box to me. I had no idea how to download a file in Python or what’s the difference between a list, a tuple and a dictionary.</p> <p>That’s why I decided to read all of the provided Python modules and implement it myself. I ended up refactor most of the code so it’s easier to understand: <a href="https://github.com/risan/intro-to-machine-learning">github.com/risan/intro-to-machine-learning</a>.</p> <p>So here are some notes and snippets of Python that I’ve been collecting so far (I’m not even halfway through the course 😝). Also, note that the codes here are still using Python version 2.7.</p> <h2 id="table-of-contents"> <a href="#table-of-contents" class="anchor-head"></a> Table of Contents </h2> <h2 id="modules-classes-and-functions"> <a href="#modules-classes-and-functions" class="anchor-head"></a> Modules Classes and Functions </h2> <h3 id="main-entry-file"> <a href="#main-entry-file" class="anchor-head"></a> Main Entry File </h3> <p>Suppose our Python project is stored in <code class="highlighter-rouge">/foo/bar</code> directory. And this application has one file that serves as the single entry point. We can name this file <code class="highlighter-rouge">__main__.py</code> so we can run this project simply be referencing its directory path:</p> <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Referencing its directory.</span>
|
||
<span class="nv">$ </span>python /foo/bar
|
||
|
||
<span class="c"># It's equivalent to this.</span>
|
||
<span class="nv">$ </span>python /foo/bar/__main__.py
|
||
</code></pre></div></div> <h3 id="import-python-module-dynamically"> <a href="#import-python-module-dynamically" class="anchor-head"></a> Import Python Module Dynamically </h3> <p>Suppose we would like to import a Python module dynamically based on a variable value. We can achieve this through the <a href="https://docs.python.org/2/library/functions.html#__import__"><code class="highlighter-rouge">__import__</code></a> function:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">module_name</span> <span class="o">=</span> <span class="s">"numpy"</span>
|
||
|
||
<span class="nb">__import__</span><span class="p">(</span><span class="n">module_name</span><span class="p">)</span>
|
||
</code></pre></div></div> <h3 id="multiple-returns-in-python"> <a href="#multiple-returns-in-python" class="anchor-head"></a> Multiple Returns in Python </h3> <p>In Python, it’s possible for a function or a method to return multiple values. We can do this simply by separating each return value by a comma:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
|
||
<span class="k">return</span> <span class="mi">100</span><span class="p">,</span> <span class="s">"foo"</span>
|
||
|
||
<span class="n">someNumber</span><span class="p">,</span> <span class="n">someString</span> <span class="o">=</span> <span class="n">test</span><span class="p">()</span>
|
||
</code></pre></div></div> <h3 id="importing-modules-outside-of-the-directory"> <a href="#importing-modules-outside-of-the-directory" class="anchor-head"></a> Importing Modules Outside of the Directory </h3> <p>In order to import a module from outside of the directory, we need to add that module’s directory path into the current file with <code class="highlighter-rouge">sys.path.append</code>. Suppose we have the following directory structure:</p> <div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>|--foo
|
||
| |-- bar.py
|
||
|
|
||
|-- tools
|
||
| |-- speak_yoda.py
|
||
</code></pre></div></div> <p>If we want to use the <code class="highlighter-rouge">speak_yoda.py</code> module within the <code class="highlighter-rouge">bar.py</code>, we can do the following:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># /foo/bar.py
|
||
</span><span class="kn">import</span> <span class="nn">os</span>
|
||
|
||
<span class="c1"># Use relative path to tools directory.
|
||
</span><span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"../tools"</span><span class="p">)</span>
|
||
|
||
<span class="kn">import</span> <span class="nn">speak_yoda</span>
|
||
</code></pre></div></div> <p>However, this won’t work if we run the <code class="highlighter-rouge">baz.py</code> file from outside of its <code class="highlighter-rouge">foo</code> directory:</p> <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># It works inside of the /foo directory.</span>
|
||
<span class="nv">$ </span><span class="nb">cd</span> /foo
|
||
<span class="nv">$ </span>python bar.py
|
||
|
||
<span class="c"># But it won't work if the code runs from outside of /foo directory.</span>
|
||
<span class="nv">$ </span>python foo/bar.py
|
||
</code></pre></div></div> <p>To solve this problem we can refer to the <code class="highlighter-rouge">tools</code> directory using its absolute path.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># /foo/bar.py
|
||
</span><span class="kn">import</span> <span class="nn">os</span>
|
||
<span class="kn">import</span> <span class="nn">sys</span>
|
||
|
||
<span class="c1"># Get the directory name for this file.
|
||
</span><span class="n">current_dirname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="n">__file__</span><span class="p">))</span>
|
||
|
||
<span class="c1"># Use the absolute path to the tools directory
|
||
</span><span class="n">tools_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">abspath</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">dirname</span><span class="p">,</span> <span class="s">"../tools"</span><span class="p">))</span>
|
||
<span class="n">sys</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tools_path</span><span class="p">)</span>
|
||
|
||
<span class="kn">import</span> <span class="nn">speak_yoda</span>
|
||
</code></pre></div></div> <h2 id="output"> <a href="#output" class="anchor-head"></a> Output </h2> <h3 id="print-the-emojis"> <a href="#print-the-emojis" class="anchor-head"></a> Print The Emojis </h3> <p>It turns out you can’t just print an emoji or any other Unicode characters to the console. You need to specify the encoding type beforehand:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># coding: utf8
|
||
</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="s">"😅"</span><span class="p">)</span>
|
||
</code></pre></div></div> <h3 id="pretty-print"> <a href="#pretty-print" class="anchor-head"></a> Pretty Print </h3> <p>We can use the <code class="highlighter-rouge">pprint</code> module to pretty-print Python data structure with a configurable indentation:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pprint</span>
|
||
<span class="n">pp</span> <span class="o">=</span> <span class="n">pprint</span><span class="o">.</span><span class="n">PrettyPrinter</span><span class="p">(</span><span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
|
||
<span class="n">pp</span><span class="o">.</span><span class="n">pprint</span><span class="p">(</span><span class="n">people</span><span class="p">)</span>
|
||
</code></pre></div></div> <h2 id="working-with-pathname"> <a href="#working-with-pathname" class="anchor-head"></a> Working with Pathname </h2> <p>Read more about pathname manipulations in the <a href="https://docs.python.org/2/library/os.path.html"><code class="highlighter-rouge">os.path</code> documentation</a>.</p> <h3 id="get-filename-from-url"> <a href="#get-filename-from-url" class="anchor-head"></a> Get Filename From URL </h3> <p>Suppose the last segment of the URL contains a filename that we would like to download. We can extract this filename with the following code:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
|
||
<span class="kn">from</span> <span class="nn">urlparse</span> <span class="kn">import</span> <span class="n">urlparse</span>
|
||
|
||
<span class="n">url</span> <span class="o">=</span> <span class="s">"https://example.com/foo.txt"</span>
|
||
|
||
<span class="n">url_components</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
|
||
|
||
<span class="n">filename</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">url_components</span><span class="o">.</span><span class="n">path</span><span class="p">)</span> <span class="c1"># foo.txt
|
||
</span></code></pre></div></div> <h3 id="check-if-file-exists"> <a href="#check-if-file-exists" class="anchor-head"></a> Check if File Exists </h3> <p>To check whether the given file path exists or not:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
|
||
|
||
<span class="n">is_exists</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="s">"foo.txt"</span><span class="p">)</span>
|
||
</code></pre></div></div> <h3 id="create-a-directory-if-it-does-not-exists"> <a href="#create-a-directory-if-it-does-not-exists" class="anchor-head"></a> Create a Directory if It Does Not Exists </h3> <p>To create a directory only if it does not exist:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
|
||
<span class="kn">import</span> <span class="nn">errno</span>
|
||
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">directory_path</span><span class="p">)</span>
|
||
<span class="k">except</span> <span class="nb">OSError</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">errno</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EEXIST</span><span class="p">:</span>
|
||
<span class="k">raise</span>
|
||
</code></pre></div></div> <h2 id="working-with-files"> <a href="#working-with-files" class="anchor-head"></a> Working with Files </h2> <h3 id="downloading-a-file"> <a href="#downloading-a-file" class="anchor-head"></a> Downloading a File </h3> <p>We can use the <code class="highlighter-rouge">urllib</code> module to download a file in Python. The first argument is the file URL that we would like to download. The second argument is the optional filename that will be used to store the file.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">urllib</span>
|
||
|
||
<span class="n">urllib</span><span class="o">.</span><span class="n">urlretrieve</span><span class="p">(</span><span class="s">"https://example.com/foo.txt"</span><span class="p">,</span> <span class="s">"foo.txt"</span><span class="p">)</span>
|
||
</code></pre></div></div> <h3 id="extracting-tar-file"> <a href="#extracting-tar-file" class="anchor-head"></a> Extracting Tar File </h3> <p>There’s a built-in <code class="highlighter-rouge">tarfile</code> module that we can use to work with Tar file in Python. To extract the <code class="highlighter-rouge">tar.gz</code> file we can use the following code:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">tarfile</span>
|
||
|
||
<span class="c1"># Open the file.
|
||
</span><span class="n">tfile</span> <span class="o">=</span> <span class="n">tarfile</span><span class="o">.</span><span class="nb">open</span><span class="p">(</span><span class="s">"foo.tar.gz"</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Extract the file to the given path.
|
||
</span><span class="n">tfile</span><span class="o">.</span><span class="n">extractall</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
|
||
</code></pre></div></div> <p>We can pass the <code class="highlighter-rouge">mode</code> argument to the <code class="highlighter-rouge">open</code> method. By default, the <code class="highlighter-rouge">mode</code> would be <code class="highlighter-rouge">r</code>—reading mode with transparent compression. There are also other mode options that we can use:</p> <ul> <li><code class="highlighter-rouge">r:gz</code>: Reading mode with gzip compression.</li> <li><code class="highlighter-rouge">r:</code>: Reading mode without compression.</li> <li><code class="highlighter-rouge">a</code>: Appending mode without compression.</li> <li><code class="highlighter-rouge">w</code>: Writting mode without compression.</li> <li>Checkout other available options in <a href="https://docs.python.org/2/library/tarfile.html">tarfile documentation</a>.</li> </ul> <h2 id="working-with-list"> <a href="#working-with-list" class="anchor-head"></a> Working with List </h2> <h3 id="generate-a-list-of-random-numbers"> <a href="#generate-a-list-of-random-numbers" class="anchor-head"></a> Generate a List of Random Numbers </h3> <p>Use the <code class="highlighter-rouge">for..in</code> syntax to generate a list of random numbers in a one-liner style.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">random</span>
|
||
|
||
<span class="c1"># Initialize internal state of random generator.
|
||
</span><span class="n">random</span><span class="o">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Generate random points.
|
||
</span><span class="n">randomNumbers</span> <span class="o">=</span> <span class="p">[</span><span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">)]</span>
|
||
<span class="c1"># [0.6394267984578837, 0.025010755222666936, 0.27502931836911926, ...]
|
||
</span></code></pre></div></div> <h3 id="pair-values-from-two-lists"> <a href="#pair-values-from-two-lists" class="anchor-head"></a> Pair Values from Two Lists </h3> <p>The built-in <code class="highlighter-rouge">zip</code> function can pair values from two lists. However, this <code class="highlighter-rouge">zip</code> function will return a list of tuples instead. To get a list of value pairs, we can combine it with <code class="highlighter-rouge">for..in</code> syntax:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">coordinates</span> <span class="o">=</span> <span class="p">[[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">([</span><span class="mi">5</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="mi">15</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">])]</span>
|
||
<span class="c1"># [[5, 0], [10, 1], [15, 0]]
|
||
</span></code></pre></div></div> <h3 id="splitting-a-list"> <a href="#splitting-a-list" class="anchor-head"></a> Splitting a List </h3> <p>We can easily split a list in Python by specifying the starting index and it’s ending index. Note that the ending index is excluded from the result.</p> <p>We can also specify a negative index. And also note that both of these indices are optional!</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">]</span>
|
||
|
||
<span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="c1"># 0,1,2
|
||
</span><span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span> <span class="c1"># 1,2
|
||
</span><span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span> <span class="c1"># 2,3,4,5
|
||
</span><span class="n">a</span><span class="p">[:</span><span class="mi">3</span><span class="p">]</span> <span class="c1"># 0,1,2
|
||
</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]</span> <span class="c1"># 0,1,2,3
|
||
</span><span class="n">a</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">:]</span> <span class="c1"># 4,5
|
||
</span><span class="n">a</span><span class="p">[:]</span> <span class="c1"># 0,1,2,3,4,5
|
||
</span></code></pre></div></div> <h3 id="filtering-a-list-in-one-line"> <a href="#filtering-a-list-in-one-line" class="anchor-head"></a> Filtering a List In One Line </h3> <p>We can easily filter a list in Python by combining the <code class="highlighter-rouge">for..in</code> and the <code class="highlighter-rouge">if</code> syntax together:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numbers</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">11</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Filter even numbers only.
|
||
</span><span class="p">[</span><span class="n">numbers</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">numbers</span><span class="p">))</span> <span class="k">if</span> <span class="n">numbers</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
|
||
<span class="c1"># [2, 4, 6, 8, 10]
|
||
</span></code></pre></div></div> <h3 id="sorting-a-list-in-ascending-order"> <a href="#sorting-a-list-in-ascending-order" class="anchor-head"></a> Sorting a List in Ascending Order </h3> <p>In Python, we can sort a list in ascending order simply by calling the <code class="highlighter-rouge">sort</code> method like so:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">people</span> <span class="o">=</span> <span class="p">[</span><span class="s">"John"</span><span class="p">,</span> <span class="s">"Alice"</span><span class="p">,</span> <span class="s">"Poe"</span><span class="p">]</span>
|
||
<span class="n">people</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="n">people</span><span class="p">)</span> <span class="c1"># ["Alice", "John", "Poe"]
|
||
</span></code></pre></div></div> <h3 id="using-filter-function-with-a-list"> <a href="#using-filter-function-with-a-list" class="anchor-head"></a> Using Filter Function with a List </h3> <p>Just like its name, we can use the <code class="highlighter-rouge">filter</code> function to filter out our list:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">numbers</span> <span class="o">=</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>
|
||
|
||
<span class="n">even_numbers</span> <span class="o">=</span> <span class="nb">filter</span><span class="p">(</span><span class="k">lambda</span> <span class="n">number</span><span class="p">:</span> <span class="n">number</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">,</span> <span class="n">numbers</span><span class="p">)</span>
|
||
<span class="c1"># [2, 4, 6, 8, 10]
|
||
</span></code></pre></div></div> <p>We can break the above statement into two parts:</p> <ul> <li><code class="highlighter-rouge">lambda number: statement</code>: The first part is the function that we would like to run to every item on the list. <code class="highlighter-rouge">number</code> is the variable name we’d like to use in this function to refer to a single item from the <code class="highlighter-rouge">numbers</code> list. The following function body must evaluate to truthy/falsy value—falsy means the current item will be removed from the final result.</li> <li><code class="highlighter-rouge">numbers</code>: The second parameter is the list that we’d like to filter.</li> </ul> <h3 id="using-reduce-with-a-list-of-dictionary"> <a href="#using-reduce-with-a-list-of-dictionary" class="anchor-head"></a> Using Reduce with a List of Dictionary </h3> <p>We can use the <code class="highlighter-rouge">reduce</code> function to calculate the total of a particular key in a list of a dictionary:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">items</span> <span class="o">=</span> <span class="p">[{</span><span class="n">value</span><span class="p">:</span><span class="mi">10</span><span class="p">},</span> <span class="p">{</span><span class="n">value</span><span class="p">:</span><span class="mi">20</span><span class="p">},</span> <span class="p">{</span><span class="n">value</span><span class="p">:</span><span class="mi">50</span><span class="p">}]</span>
|
||
|
||
<span class="c1"># Calculate the total of value key.
|
||
</span><span class="n">totalValues</span> <span class="o">=</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">total</span><span class="p">,</span> <span class="n">item</span><span class="p">:</span> <span class="n">total</span> <span class="o">+</span> <span class="n">item</span><span class="p">[</span><span class="s">"value"</span><span class="p">],</span> <span class="n">items</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="c1"># 80
|
||
</span></code></pre></div></div> <p>It can be broken down into 4 parts:</p> <ul> <li><code class="highlighter-rouge">lambda total</code>: It’s the variable name that we’d like to use in the function body to refer to the carried or the accumulative value that will finally be returned.</li> <li><code class="highlighter-rouge">item: statement</code>: <code class="highlighter-rouge">item</code> is the name of the variable we’d like to use within the function body to refer to the single item in the <code class="highlighter-rouge">items</code> list. The following function body will be executed in order to define the accumulative value of <code class="highlighter-rouge">total</code> for the next iteration.</li> <li><code class="highlighter-rouge">items</code>: It’s the list of item that we would like to “reduce”.</li> <li><code class="highlighter-rouge">0</code>: The last parameter is optional and it’s the initial accumulative value for the first iteration.</li> </ul> <p>We can also use this <code class="highlighter-rouge">reduce</code> function to find a single item from the list. Here’s an example of code to find the person with the biggest <code class="highlighter-rouge">total_payments</code> within the given list of <code class="highlighter-rouge">people</code> dictionary.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">people</span> <span class="o">=</span> <span class="p">[</span>
|
||
<span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"John"</span><span class="p">,</span> <span class="s">"total_payments"</span><span class="p">:</span> <span class="mi">100</span><span class="p">},</span>
|
||
<span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"Alice"</span><span class="p">,</span> <span class="s">"total_payments"</span><span class="p">:</span> <span class="mi">1000</span><span class="p">},</span>
|
||
<span class="p">{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"Poe"</span><span class="p">,</span> <span class="s">"total_payments"</span><span class="p">:</span> <span class="mi">800</span><span class="p">}</span>
|
||
<span class="p">]</span>
|
||
|
||
<span class="n">person_biggest_total_payments</span> <span class="o">=</span> <span class="nb">reduce</span><span class="p">(</span><span class="k">lambda</span> <span class="n">paid_most</span><span class="p">,</span> <span class="n">person</span><span class="p">:</span> <span class="n">person</span> <span class="k">if</span> <span class="n">person</span><span class="p">[</span><span class="s">"total_payments"</span><span class="p">]</span> <span class="o">></span> <span class="n">paid_most</span><span class="p">[</span><span class="s">"total_payments"</span><span class="p">]</span> <span class="k">else</span> <span class="n">paid_most</span><span class="p">,</span> <span class="n">people</span><span class="p">,</span> <span class="p">{</span> <span class="s">"total_payments"</span><span class="p">:</span> <span class="mi">0</span> <span class="p">})</span>
|
||
<span class="c1"># {'name': 'Alice', 'total_payments': 1000}
|
||
</span></code></pre></div></div> <h2 id="working-with-dictionary"> <a href="#working-with-dictionary" class="anchor-head"></a> Working with Dictionary </h2> <h3 id="loop-through-dictionary"> <a href="#loop-through-dictionary" class="anchor-head"></a> Loop Through Dictionary </h3> <p>We can use the <code class="highlighter-rouge">itervalues</code> method to loop through a dictionary:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">people</span><span class="o">.</span><span class="n">itervalues</span><span class="p">():</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">[</span><span class="s">"email_address"</span><span class="p">])</span>
|
||
</code></pre></div></div> <p>We can also use the <code class="highlighter-rouge">iteritems</code> method if we want to access the key too:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">people</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="n">person</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s">": "</span> <span class="o">+</span> <span class="n">person</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="s">"email_address"</span><span class="p">])</span>
|
||
</code></pre></div></div> <h3 id="calculate-total-of-particular-dictionary-key"> <a href="#calculate-total-of-particular-dictionary-key" class="anchor-head"></a> Calculate Total of Particular Dictionary Key </h3> <p>Suppose we would like to calculate the total amount of <code class="highlighter-rouge">salary</code> key on a <code class="highlighter-rouge">people</code> dictionary. We can extract the <code class="highlighter-rouge">salary</code> key and use the <code class="highlighter-rouge">sum</code> function to get the total:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">total_salary</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">([</span><span class="n">person</span><span class="p">[</span><span class="s">"salary"</span><span class="p">]</span> <span class="k">for</span> <span class="n">person</span> <span class="ow">in</span> <span class="n">people</span><span class="o">.</span><span class="n">itervalues</span><span class="p">()])</span>
|
||
</code></pre></div></div> <h2 id="working-with-numpy"> <a href="#working-with-numpy" class="anchor-head"></a> Working with Numpy </h2> <h3 id="numpy-create-range-of-values-with-the-given-interval"> <a href="#numpy-create-range-of-values-with-the-given-interval" class="anchor-head"></a> Numpy Create Range of Values with The Given Interval </h3> <p>Use the <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html"><code class="highlighter-rouge">arange</code></a> method to create an array with an evenly spaced interval.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
|
||
|
||
<span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
|
||
<span class="c1"># array([0,1,2,3,4])
|
||
</span>
|
||
<span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span>
|
||
<span class="c1"># array([1. , 1.5, 2. , 2.5, 3. , 3.5])
|
||
</span></code></pre></div></div> <h3 id="numpy-create-coordinate-matrices-from-coordinate-vectors"> <a href="#numpy-create-coordinate-matrices-from-coordinate-vectors" class="anchor-head"></a> Numpy Create Coordinate Matrices from Coordinate Vectors </h3> <p>We can use the Numpy <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html"><code class="highlighter-rouge">meshgrid</code></a> method to make coordinate matrices from one-dimentional coordinate arrays.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
|
||
|
||
<span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">7</span><span class="p">])</span>
|
||
<span class="c1"># [
|
||
# array([[1,2,3], [1,2,3]]),
|
||
# array([[0,0,0], [7,7,7]])
|
||
# ]
|
||
</span></code></pre></div></div> <h3 id="flatten-numpy-array"> <a href="#flatten-numpy-array" class="anchor-head"></a> Flatten Numpy Array </h3> <p>When we have a multi-dimensional Numpy array, we can easily flatten it with the <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html"><code class="highlighter-rouge">ravel</code></a> method:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
|
||
|
||
<span class="n">arr</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]])</span>
|
||
<span class="n">arr</span><span class="o">.</span><span class="n">ravel</span><span class="p">()</span>
|
||
<span class="c1"># array([1, 2, 3, 4])
|
||
</span></code></pre></div></div> <h3 id="pairing-array-values-with-second-axis"> <a href="#pairing-array-values-with-second-axis" class="anchor-head"></a> Pairing Array Values with Second Axis </h3> <p>We can use Numpy <code class="highlighter-rouge">c_</code> function to pair array values with another array that will be it’s second axis. Read the <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.c_.html"><code class="highlighter-rouge">numpy.c_</code> documentation</a>.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
|
||
|
||
<span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span>
|
||
<span class="n">y</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span><span class="mi">20</span><span class="p">]</span>
|
||
|
||
<span class="n">np</span><span class="o">.</span><span class="n">c_</span><span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span>
|
||
<span class="c1"># array([1,10], [2,20])
|
||
</span></code></pre></div></div> <h3 id="generate-coordinates-across-the-grid"> <a href="#generate-coordinates-across-the-grid" class="anchor-head"></a> Generate Coordinates Across The Grid </h3> <p>With the knowledge of Numpy <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.arange.html"><code class="highlighter-rouge">arange</code></a>, <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.meshgrid.html"><code class="highlighter-rouge">meshgrid</code></a>, <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel.html"><code class="highlighter-rouge">ravel</code></a> and <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.c_.html"><code class="highlighter-rouge">c_</code></a> methods, we can easily generate an evenly spaced coordinates across the grid so we can pass it to the classifier and plot the decision surface.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
|
||
|
||
<span class="c1"># Generate an evenly spaced coordinates.
|
||
</span><span class="n">x_points</span><span class="p">,</span> <span class="n">y_points</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">meshgrid</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">x_min</span><span class="p">,</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">step</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">y_min</span><span class="p">,</span> <span class="n">y_max</span><span class="p">,</span> <span class="n">step</span><span class="p">))</span>
|
||
|
||
<span class="c1"># Pair the x and y points.
|
||
</span><span class="n">test_coordinates</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">c_</span><span class="p">[</span><span class="n">x_points</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">y_points</span><span class="o">.</span><span class="n">ravel</span><span class="p">()]</span>
|
||
</code></pre></div></div> <h2 id="plotting-the-data"> <a href="#plotting-the-data" class="anchor-head"></a> Plotting the Data </h2> <h3 id="plot-the-surface-decision"> <a href="#plot-the-surface-decision" class="anchor-head"></a> Plot The Surface Decision </h3> <p>We can pass an evenly spaced coordinates across the grid to the classifier to predict the output on each of that coordinate. We can then use <a href="https://matplotlib.org/api/pyplot_api.html"><code class="highlighter-rouge">matplotlib.pyplot</code></a> to plot the surface decision.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
|
||
<span class="kn">import</span> <span class="nn">pylab</span> <span class="k">as</span> <span class="n">pl</span>
|
||
|
||
<span class="c1"># Pass coordinates across the grid.
|
||
</span><span class="n">predicted_labels</span> <span class="o">=</span> <span class="n">classifier</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">test_coordinates</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Don't forget to reshape the output array dimension.
|
||
</span><span class="n">predicted_labels</span> <span class="o">=</span> <span class="n">predicted_labels</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_points</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Set the axes limit.
|
||
</span><span class="n">plt</span><span class="o">.</span><span class="n">xlim</span><span class="p">(</span><span class="n">x_points</span><span class="o">.</span><span class="nb">min</span><span class="p">(),</span> <span class="n">x_points</span><span class="o">.</span><span class="nb">max</span><span class="p">())</span>
|
||
<span class="n">plt</span><span class="o">.</span><span class="n">ylim</span><span class="p">(</span><span class="n">y_points</span><span class="o">.</span><span class="nb">min</span><span class="p">(),</span> <span class="n">y_points</span><span class="o">.</span><span class="nb">max</span><span class="p">())</span>
|
||
|
||
<span class="c1"># Plot the decision boundary with seismic color map.
|
||
</span><span class="n">plt</span><span class="o">.</span><span class="n">pcolormesh</span><span class="p">(</span><span class="n">x_points</span><span class="p">,</span> <span class="n">y_points</span><span class="p">,</span> <span class="n">predicted_labels</span><span class="p">,</span> <span class="n">cmap</span> <span class="o">=</span> <span class="n">pl</span><span class="o">.</span><span class="n">cm</span><span class="o">.</span><span class="n">seismic</span><span class="p">)</span>
|
||
</code></pre></div></div> <p>The classifier output would be a one-dimensional array, so don’t forget to <a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html"><code class="highlighter-rouge">reshape</code></a> it back into a two-dimensional array before plotting. The <code class="highlighter-rouge">cmap</code> is an optional parameter for the color map. Here we use the <code class="highlighter-rouge">seismic</code> color map from <code class="highlighter-rouge">pylab</code> module. It has the red-blue colors.</p> <h3 id="scatter-plot"> <a href="#scatter-plot" class="anchor-head"></a> Scatter Plot </h3> <p>We need to separate the test points based on its predicted label (the speed). So we can plot the test points with two different colors.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Separate fast (label = 0) & slow (label = 1) test points.
|
||
</span><span class="n">grade_fast</span> <span class="o">=</span> <span class="p">[</span><span class="n">features_test</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">features_test</span><span class="p">))</span> <span class="k">if</span> <span class="n">labels_test</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
|
||
<span class="n">bumpy_fast</span> <span class="o">=</span> <span class="p">[</span><span class="n">features_test</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">features_test</span><span class="p">))</span> <span class="k">if</span> <span class="n">labels_test</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
|
||
<span class="n">grade_slow</span> <span class="o">=</span> <span class="p">[</span><span class="n">features_test</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">features_test</span><span class="p">))</span> <span class="k">if</span> <span class="n">labels_test</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span>
|
||
<span class="n">bumpy_slow</span> <span class="o">=</span> <span class="p">[</span><span class="n">features_test</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">features_test</span><span class="p">))</span> <span class="k">if</span> <span class="n">labels_test</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="mi">1</span><span class="p">]</span>
|
||
|
||
<span class="c1"># Plot the test points based on its speed.
|
||
</span><span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">grade_fast</span><span class="p">,</span> <span class="n">bumpy_fast</span><span class="p">,</span> <span class="n">color</span> <span class="o">=</span> <span class="s">"b"</span><span class="p">,</span> <span class="n">label</span> <span class="o">=</span> <span class="s">"fast"</span><span class="p">)</span>
|
||
<span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">grade_slow</span><span class="p">,</span> <span class="n">bumpy_slow</span><span class="p">,</span> <span class="n">color</span> <span class="o">=</span> <span class="s">"r"</span><span class="p">,</span> <span class="n">label</span> <span class="o">=</span> <span class="s">"slow"</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Show the plot legend.
|
||
</span><span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
|
||
|
||
<span class="c1"># Add the axis labels.
|
||
</span><span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s">"grade"</span><span class="p">)</span>
|
||
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s">"bumpiness"</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Show the plot.
|
||
</span><span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
|
||
</code></pre></div></div> <p>If we want to save the plot into an image, we can use the <code class="highlighter-rouge">savefig</code> method instead:</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="s">'scatter_plot.png'</span><span class="p">)</span>
|
||
</code></pre></div></div> <h2 id="dealing-with-data"> <a href="#dealing-with-data" class="anchor-head"></a> Dealing with Data </h2> <h3 id="deserializing-python-object"> <a href="#deserializing-python-object" class="anchor-head"></a> Deserializing Python Object </h3> <p>We can use <a href="https://docs.python.org/2/library/pickle.html"><code class="highlighter-rouge">pickle</code></a> module for serializing and deserializing Python object. There’s also the <code class="highlighter-rouge">cPickle</code>—the faster C implementation. We use both of these modules to deserialize the email text and author list.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pickle</span>
|
||
<span class="kn">import</span> <span class="nn">cPickle</span>
|
||
|
||
<span class="c1"># Unpickling or deserializing the texts.
|
||
</span><span class="n">texts_file_handler</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">texts_file</span><span class="p">,</span> <span class="s">"r"</span><span class="p">)</span>
|
||
<span class="n">texts</span> <span class="o">=</span> <span class="n">cPickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">texts_file_handler</span><span class="p">)</span>
|
||
<span class="n">texts_file_handler</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
||
|
||
<span class="c1"># Unpickling or deserializing the authors.
|
||
</span><span class="n">authors_file_handler</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">authors_file</span><span class="p">,</span> <span class="s">"r"</span><span class="p">)</span>
|
||
<span class="n">authors</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">authors_file_handler</span><span class="p">)</span>
|
||
<span class="n">authors_file_handler</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
|
||
</code></pre></div></div> <h3 id="split-data-for-training-and-testing"> <a href="#split-data-for-training-and-testing" class="anchor-head"></a> Split Data for Training and Testing </h3> <p>We can use the built-in <a href="http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html"><code class="highlighter-rouge">train_test_split</code></a> function from scikit-learn to split the data both for training and testing.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">sklearn.model_selection</span> <span class="kn">import</span> <span class="n">train_test_split</span>
|
||
|
||
<span class="n">features_train</span><span class="p">,</span> <span class="n">features_test</span><span class="p">,</span> <span class="n">labels_train</span><span class="p">,</span> <span class="n">labels_test</span> <span class="o">=</span> <span class="n">train_test_split</span><span class="p">(</span><span class="n">texts</span><span class="p">,</span> <span class="n">authors</span><span class="p">,</span> <span class="n">test_size</span> <span class="o">=</span> <span class="mf">0.1</span><span class="p">,</span> <span class="n">random_state</span> <span class="o">=</span> <span class="mi">42</span><span class="p">)</span>
|
||
</code></pre></div></div> <p>The <code class="highlighter-rouge">test_size</code> argument is the proportion of data to split into the test, in our case we split 10% for testing.</p> <h3 id="vectorized-the-strings"> <a href="#vectorized-the-strings" class="anchor-head"></a> Vectorized the Strings </h3> <p>When working with a text document, we need to vectorize the strings into a list of numbers so it’s easier and more efficient to process. We can use the <a href="http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html"><code class="highlighter-rouge">TfidfVectorizer</code></a> class to vectorize the strings into a matrix of TF-IDF features.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">sklearn.feature_extraction.text</span> <span class="kn">import</span> <span class="n">TfidfVectorizer</span>
|
||
|
||
<span class="n">vectorizer</span> <span class="o">=</span> <span class="n">TfidfVectorizer</span><span class="p">(</span><span class="n">sublinear_tf</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">max_df</span> <span class="o">=</span> <span class="mf">0.5</span><span class="p">,</span> <span class="n">stop_words</span> <span class="o">=</span> <span class="s">"english"</span><span class="p">)</span>
|
||
<span class="n">features_train_transformed</span> <span class="o">=</span> <span class="n">vectorizer</span><span class="o">.</span><span class="n">fit_transform</span><span class="p">(</span><span class="n">features_train</span><span class="p">)</span>
|
||
<span class="n">features_test_transformed</span> <span class="o">=</span> <span class="n">vectorizer</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">features_test</span><span class="p">)</span>
|
||
</code></pre></div></div> <p>Word with a frequency higher than the <code class="highlighter-rouge">max_df</code> will be ignored. Stop words are also ignored—stop words are the most common words in a language (e.g. a, the, has).</p> <h3 id="feature-selection"> <a href="#feature-selection" class="anchor-head"></a> Feature Selection </h3> <p>Text can have a lot of features thus it may slow to compute. We can use scikit <a href="http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectPercentile.html"><code class="highlighter-rouge">SelectPercentile</code></a> class to select only the important features.</p> <div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">selector</span> <span class="o">=</span> <span class="n">SelectPercentile</span><span class="p">(</span><span class="n">f_classif</span><span class="p">,</span> <span class="n">percentile</span> <span class="o">=</span> <span class="mi">10</span><span class="p">)</span>
|
||
<span class="n">selector</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">features_train_transformed</span><span class="p">,</span> <span class="n">labels_train</span><span class="p">)</span>
|
||
<span class="n">selected_features_train_transformed</span> <span class="o">=</span> <span class="n">selector</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">features_train_transformed</span><span class="p">)</span><span class="o">.</span><span class="n">toarray</span><span class="p">()</span>
|
||
<span class="n">selected_features_test_transformed</span> <span class="o">=</span> <span class="n">selector</span><span class="o">.</span><span class="n">transform</span><span class="p">(</span><span class="n">features_test_transformed</span><span class="p">)</span><span class="o">.</span><span class="n">toarray</span><span class="p">()</span>
|
||
</code></pre></div></div> <p>The <code class="highlighter-rouge">percentile</code> is the percentage of features that we’d like to select based on its highest score.</p> <h5 id="this-article-is-for-demo-purpose-1"> This article is for Demo purpose </h5> <p>The article was originally on <a href="https://github.com/risan/risanb.com/blob/master/content/posts/python-notes-from-intro-to-machine-learning/index.md">this repo</a></p> </div> </article> </main> <nav class="post-nav"> <a class="post-nav-item post-nav-prev" href="/react-component-with-dot-notation/" > <div class="nav-arrow">Previous</div> <span class="post-title">React Component with Dot Notation</span> </a> <a class="post-nav-item post-nav-next" href="/how-this-site-was-made/"> <div class="nav-arrow">Next</div> <span class="post-title">How this site was born 👶</span> </a> </nav> </div> <footer class="footer"> <a class="footer_item" href="/thanks">ack.</a> <a class="footer_item" href="/resume">resume</a> <a class="footer_item" href="/feed.xml">rss</a> <span class="footer_item">© 2020</span> <small class="footer_theme-copyright"> <!-- Klisé Theme: https://github.com/piharpi/jekyll-klise --> <a href="https://github.com/piharpi/jekyll-klise" target="_blank">klisé</a> theme on <a href="https://jekyllrb.com" target="_blank">jekyll</a> </small> </footer> <script src="/assets/js/main.js" defer="defer"></script> <script src="/assets/js/galite.js"></script> <script> var galite = galite || {}; galite.UA = ""; </script> </body> </html>
|