<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Nicholas Parker on Medium]]></title>
        <description><![CDATA[Stories by Nicholas Parker on Medium]]></description>
        <link>https://medium.com/@njparker_8716?source=rss-76a19323c6b6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*0xx8HZhMpJYvA6a7</url>
            <title>Stories by Nicholas Parker on Medium</title>
            <link>https://medium.com/@njparker_8716?source=rss-76a19323c6b6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 15 May 2026 15:52:32 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@njparker_8716/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Visualizing High-Dimensional Microbiome Data]]></title>
            <link>https://medium.com/data-science/visualizing-high-dimensional-microbiome-data-eacf02526c3a?source=rss-76a19323c6b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/eacf02526c3a</guid>
            <category><![CDATA[genomics]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[bioinformatics]]></category>
            <category><![CDATA[microbiome]]></category>
            <category><![CDATA[data-science]]></category>
            <dc:creator><![CDATA[Nicholas Parker]]></dc:creator>
            <pubDate>Thu, 25 Jun 2020 02:59:45 GMT</pubDate>
            <atom:updated>2020-06-25T18:45:04.117Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7WRL6Wuh4dzihtDLzGrmJA.jpeg" /><figcaption>Source: <a href="https://wallpapercave.com/dna-background">wallpapercave.com/dna-background</a></figcaption></figure><h4>Part 2 — Genomic Data Science Series</h4><p>This article is part of a tutorial series on applying machine learning to bioinformatics data:</p><p><a href="https://towardsdatascience.com/analyzing-microbiome-data-320728b56b8e">Part 1 — Data Acquisition &amp; Preprocessing</a></p><p>Part 2 — Dimensionality Reduction</p><p>To follow along, you can either download our Jupyter notebook <a href="https://github.com/njparker1993/Microbiome_Machine_Learning/blob/master/geography_data_clustering_visualizations.ipynb">here</a>, or continue reading and typing in the following code as you proceed through the walkthrough.</p><h3>Introduction</h3><p>Unsupervised machine learning methods can allow us to understand and explore data in situations where we are not given explicit labels. One type of unsupervised machine learning methods falls under the family of clustering. Getting a general idea of groups or clusters of similar data points can inform us of any underlying structural patterns in our data, such as geography, functional similarities, or communities when we otherwise would not know this information beforehand.</p><p>We will be applying our dimensional reduction techniques to Microbiome data acquired from UCSD’s Qiita platform. If you haven’t already done so, see <a href="https://towardsdatascience.com/analyzing-microbiome-data-320728b56b8e">Part 1</a> of this tutorial series for how to acquire and preprocess your data, or alternatively download our notebook on that section <a href="https://github.com/njparker1993/Microbiome_Machine_Learning/blob/master/Microbiome_Data_Acquisition.ipynb">here</a>. We will be needing this before we move on. Basically, our microbiome dataset has columns that represent counts of bacterial DNA sequences present, and our rows represent samples of individual communities of bacteria. This type of data table can be created from Illumina NGS sequencing data after a variety of bioinformatic data cleaning and transformation. We expect samples from different environments to have a different microbial signature since bacteria communities are affected by their environment. The data we worked on for this article are samples take from Toronto, Flagstaff, and San Diego, which should be unique to each other. We hope to visualize this difference which is hidden somewhere in their bacterial composition.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T9gWWizCItrwHSId7CoW6A.png" /><figcaption>Bacterial communities are expected to be unique across the three different locations, and we hope to visualize that through the high-dimensional microbiome data. Image Source: Pexels, modified by user.</figcaption></figure><p>To visualize this complex, sparse, and high dimensional metagenomic data as something our eyes can interpret on a two-dimensional computer screen, we will be needing to drastically reduce our dimension size, or in other words, the number of features in our data. Rather than the 25,000 columns of our dataset which currently represent a portion of the genetic sequence of each organism and their counts in our microbiome, we instead would like a notion of “the most important features” to plot. This article explores 3 different dimensionality reduction and visualization techniques applied to microbiome data and explains what these visualizations can tell us about the structure inherent in our data.</p><p>All visualizations were produced in python with the Matplotlib and Seaborn plotting packages and pandas was used for data frame construction.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ba9a6f33c0cfc6e1e060b840855aeca3/href">https://medium.com/media/ba9a6f33c0cfc6e1e060b840855aeca3/href</a></iframe><p>For demonstration purposes, since we actually do have labels for this data set, we can confirm whether or not our data set produces nice visualizations by assigning a different color to each point corresponding to a different geographic location. In reality, you will often not have this if you are already taking the unsupervised machine learning approach.</p><h3>PCA</h3><p>Our first dimensionality reduction technique and one of the most commonly used ones is called Principal Component Analysis (PCA). PCA attempts to reduce the feature space down to representations of the variation found within the data. It does this by taking all of your data points and rotating to an axis that clearly shows the maximum amount of variability. That axis is known as your ‘first principal component’. Mathematically speaking, the placement of this line goes through the centroid of your data, while also minimizing the squared distance of each point to that line. It is also the axis with the most variation in the data. After re-aligning our data, we will then collapse all data points onto that dimension. Once this step is done, we rinse and repeat, keeping in mind that every time we find a new principal component, that new line will always be perpendicular to the previous principal component. See here (<a href="https://setosa.io/ev/principal-component-analysis/">https://setosa.io/ev/principal-component-analysis/</a>) for a nice visual explanation of PCA.</p><p>To do PCA we can run the following code on our previously built feature table from Part 1 of our series.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/dada6de6e6ae73e85023059810064af9/href">https://medium.com/media/dada6de6e6ae73e85023059810064af9/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*65hmrUakY63T3TYK" /><figcaption>Source: Image by author</figcaption></figure><p>And if we are given labels to check how our dimensionality reduction went (reminder that in reality this is not guaranteed), we can replot our PCA with colors:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/791d4aa44ffcd99a87a2c61ec97826c5/href">https://medium.com/media/791d4aa44ffcd99a87a2c61ec97826c5/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*EPcAPy0RtulBfeMt" /></figure><p>When we transform our data from 1,894 features down to 2, we can see two discernable dimensions the data is being placed into. However, once we look at the true meaning of the data after the geographic origin of the data has been revealed, we see that this visualization technique <em>doesn’t</em> give us a good representation of the geographic data. Unfortunately, this common technique falls apart when applied to the level of sparsity that microbiome data produces.</p><p>*It is important to note that after applying PCA we could get a variety of shapes for our plots. To interpret the different shapes you can get, we recommend you check out this post <a href="http://www.nxn.se/valent/2017/6/12/how-to-read-pca-plots">here</a>.</p><h3>t-SNE</h3><p>Another technique used to explore high-dimensional data like our microbiome data is to use something known as t-distributed stochastic neighbor embedding <a href="http://jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf">t-SNE</a>. Unlike PCA which works by trying to keep dissimilar data points far apart in our lower-dimensional representations using linear methods, t-SNE attempts to handle data that lie on non-linear lower-dimensional manifolds by trying to keep similar data points close together.</p><p>t-SNE works by minimizing the divergence between 2 distributions. The first distribution comes from our pairwise similarities of objects in our original high-dimensional input space. The second distribution is that of our pairwise similarities of objects in our corresponding lower-dimensional embedding. In essence, we are trying to minimize the divergence between these two distributions of our original high dimensional space and the corresponding lower-dimensional one.</p><p>To run t-SNE let’s use the implementation by scikit-learn and run that on our feature table from before:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a7ecfca23547243611b93962cb482459/href">https://medium.com/media/a7ecfca23547243611b93962cb482459/href</a></iframe><p>Before we move on, let’s bring up a few important points. One of our parameters for t-SNE is the metric we used to calculate the distances between our instances of our features. The default is <em>Euclidean</em> distance, but since we are using counts as our entries for each row, we will instead use a metric called the <em>Jaccard </em>distance. In essence, the Jaccard distance metric is the number of counts in two sets divided by the number in either set, multiplied by 100, and then subtracting this all from 1. It technically measures the dissimilarity between sample sets.</p><p>Another important hyperparameter that we can adjust in t-SNE is that of <em>perplexity</em>. In essence, perplexity allows us to balance how much we would like to emphasize our local vs. global relationships in our data. We chose to stick with the default setting of perplexity=30, however we highly recommend this exploration of t-SNE and perplexity <a href="https://distill.pub/2016/misread-tsne/">here</a>.</p><p>Let us plot the results from our t-SNE embedding, showing both a plot without labels (again, like how you would expect in real unsupervised scenarios) and a plot with our known labels:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a943ad658b21747626987a30927e0bec/href">https://medium.com/media/a943ad658b21747626987a30927e0bec/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*xH3BvlbW_poZTUjQ" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*rfY_I8ICuDg6CGZb" /></figure><p>When the labels are revealed, we can see that this embedding is a decent representation of the underlying geographic structure present in our microbiome genetic data as evidenced by the data points taken from the same geographic region is in their own quadrants. Next, we will move on to UMAP, a technique we found to be most effective on this type of data.</p><p>The last dimensionality reduction technique we will use to represent our high dimensional microbiome metagenomic data is called Uniform Approximation and Projection (UMAP). UMAP improves upon t-SNE’s performance by not only working better with larger datasets in a markedly shorter time but also by preserving much more of the original global structure of our data. For a nice in-depth comparison of t-SNE vs. UMAP, we recommend this tutorial <a href="https://towardsdatascience.com/how-exactly-umap-works-13e3040e1668">here</a>.</p><p>The mathematical underpinnings of UMAP center around first building a weighted graph, where edge weights represent the likelihood of a connection between points. This is determined by a radius that expands out from each point and connecting points with overlapping radii. As each point’s radius grows, its likelihood of connection decreases.</p><p>Similar to t-SNE, we can also tune the hyperparameters associated with UMAP to balance our local and global structure in our lower-dimensional embedding. Our <em>n_neighbors</em> parameter corresponds to the number of nearest neighboring points used to construct our original graph, with low values emphasizing local structure, and high values emphasizing global structure.</p><p>The second main parameter is that of <em>min_dist</em>. This parameter represents the minimum distance we would like between points in our lower-dimensional embedding, with low values giving us more closely packed groups of points, and larger values giving more loosely packed groups of points. We recommend playing around with the interactive visualizations <a href="https://pair-code.github.io/understanding-umap/">here</a> to get an intuitive feel for UMAP’s hyperparameters.</p><p>Let’s now create our new lower-dimensional embedding with UMAP:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3b9e8caa99ddb1ed006f6fd23a35e0b5/href">https://medium.com/media/3b9e8caa99ddb1ed006f6fd23a35e0b5/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*1-yBFX7kf7P4DqXA" /></figure><p>…and with labels:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ouIJbg9CDk9pzes2" /></figure><p>As we can see once we apply colors to reveal our labels, it seems that UMAP does a much better job at conveying the underlying geographic structure from our original high-dimensional metagenomic data set to the above lower-dimensional visualization, with each “spoke” or “petal” of the plot representing that area’s local community of microorganisms, also known as those microbiomes.</p><h3>Conclusion</h3><p>Microbiome data present a unique challenge due to its inherently high-dimensional and sparse nature. To reduce dimensionality we applied three techniques: PCA, t-SNE, and UMAP. In terms of grouping similar data such as microbial samples with a similar geographic origin, UMAP performed the best.</p><p>Following up on the above, we can use these 2D embeddings combined with our favorite clustering algorithms to infer classes from the data. Instead of specifying dimensionality reduction down to two dimensions, we can try to reduce it down to any number of dimensions and then apply clustering on top of that. Classifying microbiome data using clustering methods is a topic we may talk about in our next article.</p><p>The two co-authors of this tutorial series are <a href="https://medium.com/u/76a19323c6b6">Nicholas Parker</a> &amp; <a href="https://medium.com/u/65f1193d859e">Mundy Reimer</a>, both of whom are graduates of the <a href="https://www.usfca.edu/arts-sciences/graduate-programs/data-science">Masters in Data Science program from the University of San Francisco</a>.</p><p>If you would like to reach out, you can find us at:</p><p><strong>Mundy Reimer<br></strong><a href="https://www.linkedin.com/in/mundyreimer">Linkedin</a><br><a href="https://mundyreimer.github.io/">Personal Blog</a><br><a href="https://twitter.com/MondayRhymer">Twitter</a></p><p><strong>Nick Parker<br></strong><a href="https://www.linkedin.com/in/nicholas-j-parker">Linkedin</a><br><a href="https://medium.com/@njparker_8716">Personal Blog</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/0*50JNciHQlzylV8EF" /><figcaption>PCA, t-SNE, and UMAP. Image created by the user.</figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=eacf02526c3a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/data-science/visualizing-high-dimensional-microbiome-data-eacf02526c3a">Visualizing High-Dimensional Microbiome Data</a> was originally published in <a href="https://medium.com/data-science">TDS Archive</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Predicting the Oscars using Preferential Machine Learning]]></title>
            <link>https://medium.com/data-science/predicting-the-oscars-using-preferential-machine-learning-32f06ffbf427?source=rss-76a19323c6b6------2</link>
            <guid isPermaLink="false">https://medium.com/p/32f06ffbf427</guid>
            <category><![CDATA[random-forest]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[oscars]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[film]]></category>
            <dc:creator><![CDATA[Nicholas Parker]]></dc:creator>
            <pubDate>Mon, 03 Feb 2020 04:46:58 GMT</pubDate>
            <atom:updated>2020-02-06T22:02:10.132Z</atom:updated>
            <content:encoded><![CDATA[<h4>The Oscars and their preferential balloting led me to create a novel machine learning approach to mimic this voting system</h4><p>Last year was a great year for film, and if you are like me, basking in the afterglow of the Movie Pass craze and still seeing a lot of films in theaters, you know <em>Once Upon a Time in Hollywood</em>, <em>Parasite</em>, <em>1917</em> and many more films delivered unique cinematic experiences. Every year on Oscar Sunday, Hollywood gets together and gives itself a big pat on the back. The biggest prize of the night is the award for Best Picture, which can cement a movie in the annals of film history. Unlike the other 23 awards given out on Oscar Night, the coveted Best Picture award is chosen using a method called preferential balloting which is more complicated than a traditional vote. Preparing for this year’s Oscars, and learning about the preferential balloting led me to write some programs to mimic this voting system using machine learning.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xoFv-ch6tCF7JXIbxmU9ZA.png" /><figcaption>‘2020 Oscars’ Art by Reddit user u/Tillmann_S</figcaption></figure><p>In this article, I:</p><ul><li>Pick the data used to predict the Oscars with</li><li>Explore how preferential balloting works from a data science perspective</li><li>Demonstrate a method of my own design I call a <strong>Preferential Balloting Random Forest</strong></li><li>Simulate what is happening behind the scenes of the Best Picture vote</li><li>Predict this year’s best picture winner</li></ul><p>I don’t include any of my code in this article, but here is <a href="https://github.com/njparker1993/oscars_predictions">the repository with my notebooks used in this analysis</a></p><h3><strong>How to Predict the Oscars: The Dataset</strong></h3><p>To predict anything using machine learning, we need a meaningful dataset to train our model on. In the case of the Best Picture race, we have the nine 2019 films nominated for the award. As reverential as I am to the Oscars (I am interested enough to write this article, after all) I hold no reservations that the best movie of the year is the one which will win the Best Picture Oscar. The Academy is made up of thousands of members working throughout various areas of the film industry, and they each have biases which lead to their votes. Because there are real people behind the votes, we can’t rely on numerical indicators of film quality like box-office profits or aggregate critic scores. But you know what correlates well with filmmakers’ votes? Other filmmaker votes.</p><p>There are numerous other awards shows which make up “Awards Season”, and the voters for events like the Screen Actors Guild Awards and the Directors Guild Awards are often the same people which make up the voting body of the Academy Awards. Using the results of earlier awards shows like the SAGs, DGAs, PGAs, Golden Globes, and BAFTAs and combining that with Oscar info like nomination count, I can train a model on previous years best picture winners to predict this year’s. To get consistent movie data and naming conventions, I scraped the data for each awards show’s nominees and winners from Wikipedia’s and merged them all together into one dataset in Python using the Pandas and Beautiful Soup packages.</p><h3><strong>How Preferential Balloting Works</strong></h3><p>Preferential balloting, also called Instant Run-off Voting, is commonly used in situations where there are many candidates for only one winning spot. The Oscars has used this vote tallying system to decide the Best Picture race since 2009, when the field expanded from five nominees to up to ten. In preferential balloting, rather than voting for one film, voters submit a ballot with all the options ranked, and the #1 choices are tallied up as votes for that film. Then an iterative process begins in which the least popular film is eliminated and all ballots are re-ranked until a single film has greater than 50% of the #1 votes. After a film is eliminated from all ballots, the ballots which previously had the eliminated film at their #1 spot, now have their #2 move to the top spot, which increases the number of votes for the remaining films. This process continues until one film has greater than 50% of the #1 votes and then it is declared the winner. A simulation of this elimination process is shown below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/458/0*2I8AoetIRbZrGajX" /><figcaption>Figure 1: Simulation of preferential balloting elimination. Generated by my Preferential Random Forest</figcaption></figure><p>Critics of the preferential ballot method claim that it rewards easy-to-like or non-controversial films since non-controversial films will be around the middle of people’s rankings and controversial films may be at the top of some folks ballots but at the bottom of other’s, so they are prone to being eliminated. This effect was seen last year when the more artistic film <em>Roma</em> lost to the more generally-appealing film <em>Green Book</em>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/0*Vl5QFERMR_evSSQn" /><figcaption>Photo Credit: Left — Alfonso Cuarón/Netflix, Right — UNIVERSAL PICTURES/PARTICIPANT/DREAMWORKS</figcaption></figure><p><strong>Preferential Balloting Random Forest</strong></p><p>We’ve seen in the past that preferential balloting can change the result of the Best Picture race, and so I created a model that reflects this distinct vote-counting method. A Random Forest Classifier model makes predictions by using a number of decorrelated Decision Tree Classifiers. Here is an article focusing more on the specifics of how a traditional Random Forest works. Generally, a Random Forest counts each tree’s ‘vote’ as a score based on leaf size and picks a final label by which class has the most ‘votes’ amongst all the trees. For this Preferential Balloting Random Forest, we instead use the ProbA values for each film in the test set and use them to create 1st - 9th place rankings of the film. ProbA values are the likelihood of that item being in the ‘Winner’ class and represents a softer prediction than the binary ‘Winner’ or ‘Loser’ classification. This softer prediction allows us to change the predictions from a boolean classification to a range. Each Decision Tree produces one ballot, and once the entire Forest has created their ballots, the iterative process of preferential ballot elimination begins to determine the Forest’s choice for winner. By using rankings rather than picking one class, my Preferential Balloting Random Forest is saving information that would otherwise be discarded by a Traditional Random Forest and using it again later in the elimination and reranking stage of preferential balloting.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_Ad7TaqajnhQCYfw" /><figcaption>Figure 2: An Individual Decision Tree’s vote on the test set</figcaption></figure><h3><strong>Simulating the Oscars</strong></h3><p>Using my Preferential Balloting Random Forest I simulated this year’s Best Picture race. To de-correlate each Decision Tree, I varied which awards show each tree saw, similar to Random Forest’s <em>max_features</em> hyperparameter. In this simulation, <em>max_features</em> represents what guild the voting academy member may be in, or how closely they follow the other awards shows that season. I also included a random noise feature for each Decision Tree to train on, representing each voter’s innate bias towards certain films. The Academy is made up of around 7,000 unique voters, so I fired up my Forest, which soon produced 7,000 ballots. After 6 rounds of eliminating the last place film, the top film had over 50% of the #1 votes, and my model had chosen the Best Picture Winner…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/968/0*v-wmTN-1PnovJRN9" /><figcaption>Figure 3: The final standings after 6 rounds of preferential balloting elimination. The process stopped once the film 1917 had greater than 50% of the vote.</figcaption></figure><h3><strong>Final Prediction</strong></h3><p>My Preferential Balloting Random Forest is a novel approach to simulate the Oscars, and I hope it helped you understand a bit about what goes into the Best Picture voting and Random Forest Classifiers, but preferential balloting aside, let’s get down to business and really predict these bad boys. Using my scraped dataset of Awards winning films, I implemented H2O’s powerful <a href="http://docs.h2o.ai/h2o/latest-stable/h2o-docs/automl.html">AutoML tool</a> to train 100 different Random Forest, XBGT, and Deep Learning models with various parameters to predict this year’s Oscars. AutoML chose a XGBoost model that correctly predicted the Oscar outcomes of 147 out of 159 films on cross-validation. And which film did this maelstrom of models predict? Also <em>1917</em>! Looks like things are looking good for this flick since the Preferential Balloting Random Forest and my AutoML model both predicted it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/720/0*M3wJBdWZ5OWQPJit" /><figcaption>Photo Credit: Universal Pictures, François Duhamel</figcaption></figure><h4>Links and shoutouts:</h4><p><a href="https://github.com/njparker1993/oscars_predictions">Github Repo For This Project</a></p><p>Scraping Code Inspired from Github user <a href="https://github.com/Buzdygan">Buzdygan</a></p><p>University of San Francisco MSDS</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=32f06ffbf427" width="1" height="1" alt=""><hr><p><a href="https://medium.com/data-science/predicting-the-oscars-using-preferential-machine-learning-32f06ffbf427">Predicting the Oscars using Preferential Machine Learning</a> was originally published in <a href="https://medium.com/data-science">TDS Archive</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>