<?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 Abe Fa on Medium]]></title>
        <description><![CDATA[Stories by Abe Fa on Medium]]></description>
        <link>https://medium.com/@afanta?source=rss-a94ac21777ca------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*dmbNkD5D-u45r44go_cf0g.png</url>
            <title>Stories by Abe Fa on Medium</title>
            <link>https://medium.com/@afanta?source=rss-a94ac21777ca------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 18:30:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@afanta/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[LIME vs. SHAP]]></title>
            <link>https://medium.com/@afanta/lime-vs-shap-a92623e95c4?source=rss-a94ac21777ca------2</link>
            <guid isPermaLink="false">https://medium.com/p/a92623e95c4</guid>
            <dc:creator><![CDATA[Abe Fa]]></dc:creator>
            <pubDate>Mon, 23 May 2022 12:49:50 GMT</pubDate>
            <atom:updated>2022-05-23T12:49:50.449Z</atom:updated>
            <content:encoded><![CDATA[<p>If you trained your machine learning model, the next step is to explain what your model is predicting, also known as the model explainability. Fortunately, there are two powerful tools available for such tasks: LIME and SHAP. These two methods are model agnostic, meaning that they would explain the interpretation of the model regardless of the model type.</p><h3>SHAP</h3><p>SHAP (an acronym for SHapley Additive exPlanations) uses the explanations on <a href="https://en.wikipedia.org/wiki/Shapley_value"><em>shapely values</em> </a>— measures of contributions each feature has in the model. The idea is to get insights into how the machine learning model works. In python, there are a variety of model that can help achieve this. But here, we will consider only <a href="https://pypi.org/project/shap/">SHAP</a> library.</p><p>SHAP can be applied for multiple forms data prediction. Here is a code snippet for a binary classification problem. There are more options to visualize SHAP results. The most common one is a summary plot which is a neat way to visualize every feature’s importance and their impact on prediction.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/c3f98e57fdd626504bad2d32d36e180a/href">https://medium.com/media/c3f98e57fdd626504bad2d32d36e180a/href</a></iframe><p>You get a nice visualization for the impact of each feature:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/759/1*NPONUpYLlG3DJBh2gLjDgA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/759/1*x8kRagVF_Pa80Ju3PEC4bw.png" /><figcaption>SHAP explanation</figcaption></figure><h3>LIME</h3><p>LIME is short for Local Interpretable Model-Agnostic Explanations. Each part of the name reflects something that we desire in explanations. <strong>Local</strong> refers to local fidelity — i.e., we want the explanation to really reflect the behavior of the classifier “around” the instance being predicted. This explanation is useless unless it is <strong>interpretable</strong> — that is, unless a human can make sense of it. Lime is able to explain any model without needing to ‘peak’ into it, so it is <strong>model-agnostic</strong>. We now give a high level overview of how lime works. More details can be found in the famous by <a href="http://arxiv.org/pdf/1602.04938v1.pdf">Marco Tulio Ribeiro, Sameer Singh and Carlos Guestrin</a>.</p><p>Here is a code snippet on how to use LIME for text classification. I created a probability predicting function for a given text. LIME identifies key words that can predict the sentiment of a given text.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8d049bb0f9574a17e526dbc5fedbaca7/href">https://medium.com/media/8d049bb0f9574a17e526dbc5fedbaca7/href</a></iframe><p>Here is the outcome of the code:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tciwyl6gyxbCDV-au141XQ.png" /><figcaption>LIME for sentiment analysis</figcaption></figure><p>In conclusion, SHAP and LIME provide explanation to any type of model. I cannot make recommendations as to which to use. Because it is largely dependent on the details of explainability and the type of visualization that either of these two great libraries can provide.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a92623e95c4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Bayesian Linear Regression]]></title>
            <link>https://medium.com/@afanta/bayesian-linear-regression-dea1b7e7cf48?source=rss-a94ac21777ca------2</link>
            <guid isPermaLink="false">https://medium.com/p/dea1b7e7cf48</guid>
            <category><![CDATA[lasso-regression]]></category>
            <category><![CDATA[ridge-regression]]></category>
            <category><![CDATA[frequentists]]></category>
            <category><![CDATA[linear-regression]]></category>
            <category><![CDATA[bayesian]]></category>
            <dc:creator><![CDATA[Abe Fa]]></dc:creator>
            <pubDate>Mon, 22 Nov 2021 20:02:28 GMT</pubDate>
            <atom:updated>2021-11-23T15:36:46.421Z</atom:updated>
            <content:encoded><![CDATA[<p>The debate over statistical legitimacy between frequentists and bayesianist has raged for ages. But when it comes to simple machine learning approaches, like regression, there is a large amount of dominance by frequentists’ method to sample and analyze data based on those assumptions. As a fledgling bayesianist, I explored if linear regression is possible using the Bayesian approach and I was not disappointed. Before delving into the mathematics of the Bayesian method to address regression problems, it is important to do a quick recap on the frequentist approach to linear regression.</p><h3>Frequentists’ Approach to Linear Regression</h3><p>Linear regressions are often presented as well drawn problems from a uniformly distributed population. This assumptions conforms well with the <a href="https://en.wikipedia.org/wiki/Central_limit_theorem">central limit theorem</a>. In brief, the classical representation of linear regression looks something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/145/1*l6OM8easm0bqWYw63dWQJw.jpeg" /></figure><p>Where ε and <em>y</em> terms are sampled from a uniform distribution:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/167/1*6S-kuW7hXnSUMC78o2VkrQ.jpeg" /></figure><p>The terms <em>X</em> and <em>y</em> represent the feature matrix and the target that we want to estimate with our model. Classical regression uses <a href="https://en.wikipedia.org/wiki/Ordinary_least_squares">Ordinary Least Squares (OLS)</a> where a single fit is calculated that minimizes the L2 loss function (also called residual sum) represented as follows.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/254/1*pOR_xVZ1QCPbtXyVV0w-5g.jpeg" /></figure><p>Finding the <em>β </em>estimates (<em>β </em>hat) values that can minimize the loss could be computed using the following equation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/192/1*FKwWCoOxwxOIqPcG4QSKnQ.png" /></figure><p>Inverting a matrix is computationally costly when the sizes are large. Some machine learning tools take different route in doing this. <a href="https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html">Scikit learn</a> uses iterative gradient descent approach while <a href="https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.html">statsmodel </a>employs a direct method, techniques probably like <a href="https://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_inverse">Moore–Penrose inverse</a> that avoid matrix singularity.</p><p>The flaw of this method is that it does not account for priors and updating the posterior, unlike the Bayesian statistics. In addition, in the classical method, only one fit is given as a solution to predict future cases which is unrealistic in the real world. The other shortcoming is that the <em>β</em> terms predicted using OLS have high variance, meaning that small changes in <em>x</em> can lead to high change in the coefficients, another undesirable effect.</p><h3>The Bayesian Approach</h3><p>Unironically, the Bayesian approach uses <a href="https://en.wikipedia.org/wiki/Bayes%27_theorem">Bayes’ theorem</a> while also considering the central limit theorem. The following picture shades light on what terminologies are used in describing Bayesian statistics.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_vRVYERQT4eQAN1kcYn3Ew.png" /><figcaption>Bayesian terminologies</figcaption></figure><p>When used for linear regression, the equation looks like this.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/295/1*l-up2Vgvw1n1KygVV5JnFQ.jpeg" /></figure><p>MAP stands for <a href="https://en.wikipedia.org/wiki/Maximum_a_posteriori_estimation">Maximum a posteriori estimation</a>, which is to say maximizing the posterior probability. The direct interpretation is that what are the <em>β </em>estimates that can maximize the prediction, given features and target values. The conditional probability can be replaced its Bayesian equivalent.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/346/1*WmSm8brpnoVM9dyBpqHgsw.png" /></figure><p>The denominator has no <em>β </em>term thus can be ignored which reduces our equation to this.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/342/1*zCZymKCvJ9EyUek8dOQKOg.jpeg" /></figure><p>Taking the log,</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/488/1*P1xBZZZoXXoW3tiPLhGuUQ.png" /></figure><p>Now, let’s treat each term separately. Just as the frequentist approach, the conditional probability of <em>y</em> given <em>β </em>is assumed to be Gaussian. Therefore, the probability becomes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/342/1*aNas3Mzq3ycOFjHncqj0og.jpeg" /></figure><p>Taking the log of the function,</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/504/1*n3b5ur2Uc-j8WfxS5NvDzA.png" /></figure><p>Now for the second part. The prior in this case is hard to generalize. Making assumptions on <em>β</em>s without targets really does not make sense. But we are going to take a leap of faith here and claim that <em>β </em>is also a normally distributed with 0 mean and τ standard deviation as such.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/141/1*cMXpG1Q_ZnKmoCs6MCVtTA.jpeg" /></figure><p>Then the probability becomes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/240/1*Rjzh7-S_utAsEDzg33RTDQ.png" /></figure><p>Taking the log, the equation is changed to:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/387/1*nMrbmsWA95_Glx_-iyh_Pg.jpeg" /></figure><p>Putting it all together, our MAP becomes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/761/1*AnMISOiSYBIliOz-9m1mfg.png" /></figure><p>Since all the terms are negative, the ARGMAX is changed to ARGMIN with positive values. The constants can be taken out and the function is written in a vectorized form:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/439/1*o4Duh-epzZU1tsRQKrfAlQ.jpeg" /></figure><p>Again substituting <em>σ²/τ²</em> by some constant <em>λ,</em> the function now becomes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/418/1*O3v0EObmQy_vou6so6UxmQ.png" /></figure><p>For those familiar with classical linear regression, this is what is called <a href="https://online.stat.psu.edu/stat857/node/155/">Ridge regression</a> (also called L2 regularization). Better predictions can be made by penalizing the <em>β</em> estimators by some constant. The Bayesian explanation of this is,when <em>λ </em>is increased<em>, τ </em>is reduced, squeezing the <em>β</em> normal distribution towards the center. This leads to smaller <em>β </em>estimations.</p><p>Let’s take a few steps back and considered a different distribution instead, like a Laplace distribution instead. The <em>β </em>now becomes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/142/1*61IogUxiewsIxM7DI5xmZw.jpeg" /></figure><p>The probability and log of probability are now changed to:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/363/1*OQ3YPX97Tb049st0_6Ec9w.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/363/1*33akzLjLeqjC_YaM478ANA.png" /></figure><p>Now the MAP function becomes a <a href="https://en.wikipedia.org/wiki/Lasso_(statistics)">Lasso</a> or L1 regularization:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/421/1*aC2kQzr4GRkiI9KogAoVhw.png" /></figure><p>It is important to establish the theoretical background of some regression techniques the reasoning of which is strongly linked to Bayesian approach.</p><h3>Computing Bayesian Linear Regression</h3><p>Now that the mathematical formulation is covered, how do we implement Bayesian linear regression. Remember the vectorized forms of <em>β </em>MAP estimates are summations of vectors. This means that methods used for integrating continuous functions for unknown functions can be applied here. The most common one is usually used in tandem with Bayesian statistics is the <a href="https://en.wikipedia.org/wiki/Markov_chain_Monte_Carlo">Markov Chain Monte Carlo (MCMC)</a> method. Samples are drawn from likelihood and prior to compute the MAP distribution. Here it is important to note that unlike the classical linear regression, <strong><em>β </em>is computed as a distribution, and not as a vector of coefficients.</strong></p><h3>Libraries and code samples</h3><p><a href="https://docs.pymc.io/en/v3/">PyMC3</a> provides excellent tools for MCMC estimation. Some notable GitHub repositories that help to understand the implementation of PyMC3 are written by <a href="https://github.com/GeostatsGuy/PythonNumericalDemos/blob/master/SubsurfaceDataAnalytics_BayesianRegression.ipynb">Michael Pyrcz</a> (video lectures also found <a href="https://www.youtube.com/watch?v=LzZ5b3wdZQk&amp;list=PLG19vXLQHvSC2ZKFIkgVpI9fCjkN38kwf&amp;index=33">here</a>) and a blog by <a href="https://towardsdatascience.com/introduction-to-bayesian-linear-regression-e66e60791ea7">Will Koehrsen</a>.</p><h3>Conclusion</h3><p>Bayesian statistics has wide variety of applications. But in this blog, I tried to show how some of the methods used in the frequentist approach have Bayesian background. Although not described in detail, interested readers are encouraged to explore the resources provided here and other materials in relation to Bayesian linear regression. The blog might be updated with complex applications of Bayesian regression, hopefully soon. Finally, I would like to thank <a href="https://www.youtube.com/watch?v=Z6HGJMUakmc">Ritvikmath </a>for his excellent video on how to derive necessary equations for Bayesian linear regression.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dea1b7e7cf48" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Polars: a new dataframe on the rise]]></title>
            <link>https://medium.com/@afanta/polars-a-new-dataframe-on-the-rise-d88a3f30936?source=rss-a94ac21777ca------2</link>
            <guid isPermaLink="false">https://medium.com/p/d88a3f30936</guid>
            <category><![CDATA[polar]]></category>
            <category><![CDATA[spark]]></category>
            <category><![CDATA[dataframes]]></category>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[pandas]]></category>
            <dc:creator><![CDATA[Abe Fa]]></dc:creator>
            <pubDate>Fri, 15 Oct 2021 17:45:04 GMT</pubDate>
            <atom:updated>2021-10-21T21:46:36.699Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Kqda4JOrVPIncoO7K35vYA.png" /><figcaption>Polars logo</figcaption></figure><p>Tabulated data is the bread-and-butter of any data scientists. Virtually all data lakes and warehouses use data tabulation to wrangle data and extract key features to process. One of the most commonly used data tabulation methods are Dataframes. They afford flexibility in collecting and cleaning data from delimited text files, spreadsheets and queries from database. The most commonly used dataframe is <a href="https://pandas.pydata.org/">Pandas</a>, a python package which performs sufficiently well for limited data. However, what if the data is too large for Pandas to handle but also too small for distributed file management systems such as <a href="https://spark.apache.org/">Spark</a>? <a href="https://www.pola.rs/">Polars</a> seeks to bridge that gap.</p><p>Polars is written in <a href="https://www.rust-lang.org/">Rust</a> for a more robust performance and <a href="https://arrow.apache.org/">Apache Arrow(2)</a> as memory model. PyPolars (currently updated to just Polars) is a python wrapper around Polars. It has API similar to Pandas which makes it a lot easier to transition.</p><h3>Installation</h3><p>Installing Polars is simple. Polars can be installed with pip as follows:</p><p>pip install polars</p><p>Unfortunately, Polars is not available on Anaconda for now. Updates will be made if this changes.</p><p><em>Disclaimer: Create and activate a new environment to install Polars as the stable version has not been released yet.</em></p><h3>Importing files with Polars</h3><p>Importing Polars is as smooth as importing Pandas.</p><p>import polars as pl</p><p>Let’s read one of the datasets offered with Polars.</p><p>df = pl.read_csv(&#39;my_data.csv&#39;)</p><p>The latest version of Polars ( v=0.8.10) supports csv, ipc, json , parquet and sql.</p><p>To check if your data is loaded, you can use head just as Pandas.</p><p>df.head()</p><p>Similarly, the last 10 entries, the shapes and type of the dataframe can be checked using the following codes:</p><p>df.tail(10)</p><p>df.shape</p><p>type(df)</p><p>The current version does not provide options to import compressed delimited files or read the first n-rows of the file. For a loaded Polars dataframe, describe and dtype provide information on the types of data by columns. Column names can be checked with df.columns .</p><p>Features in df.describe() can be passed to Pandas for a better display with:</p><p>df.describe().to_pandas()</p><h3>Accessing Table Elements</h3><p>Polars can access table rows directly through row index similar to pandas.DataFrame.iloc function as follows:</p><p>df[:10] #access the first ten rows</p><p>Columns can be directly referenced by name.</p><p>df[&#39;name&#39;] #find column &#39;name&#39;</p><p>Indices can be selected by passing list of index to the dataframe</p><p>df[[1,4,10,15],:]</p><p>Slicing through indices can be done using the built-in function slice</p><p>df.slice(0,5) #Slices the df beginning at index 0 and 5 rows down</p><p>Polars also enables slicing dataframe with conditional boolean.</p><p>df[df[&#39;sale&#39;]&gt;=10]</p><p>Polars also has.value_counts, .unique and .dtypes functions</p><p>df[&#39;name&#39;].value_counts() #returns unique values with numbers of occurrences</p><p>df[&#39;name&#39;].unique() #returns a list of unique values in the column</p><p>df.dtypes() #returns the data types</p><p>Groupby and sort is also supported by Polars:</p><p>df.groupby(&#39;country&#39;).sort(&#39;products&#39;,reverse=True)</p><h3>apply() and map() in Polars</h3><p>Similar to Pandas, Polars supports .apply() and .map() functions.</p><p>df[&#39;values&#39;].map(lambda x: &#39;high&#39; if x&gt;=5 else &#39;low&#39;)</p><p>df[&#39;values].apply(my_func)</p><p>The only caveat is that dictionaries cannot be passed to these functions.</p><p>mydict = {k:v for v,k in enumerate(df[&#39;catagories&#39;].unique())}</p><p>df[&#39;catagories&#39;].map(mydict) #This will throw an error</p><h3>Plotting with Polars</h3><p>Polars, just as Pandas, has built-in plotting functions. It also allows integration with <a href="https://matplotlib.org/">Matplotlib</a> and <a href="https://seaborn.pydata.org/">Seaborn</a>.</p><p>import matplotlib.pyplot as plt</p><p>fig,ax=plt.subplots(figsize=(10,5))</p><p>ax.hist(df[&#39;name&#39;])</p><p>plt.show()</p><h3>Eager and Lazy APIs</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/908/1*W__DYjqhCm_McA0641MUiA.png" /><figcaption>Polars’ Eager and Lazy APIs (<a href="https://pola-rs.github.io/polars-book/user-guide/index.html">source</a>)</figcaption></figure><p>Polars (by extension, Pandas) employs eager evaluation by default, meaning that functions are mapped to each data in real time. But as the table size grows larger, lazy implementation is more efficient in loading and transforming selected values. A sample implementation looks like as follows:</p><p>from polars.lazy import *</p><p>lazy_df = pl.scan_csv(&#39;large_dataset.csv&#39;,ignore_erros=True)</p><p>filt_lazy_df = (lazy_df.filter(col(&#39;name&#39;).str_lengths() &gt; 5).filter(col(&#39;country&#39;).str_contains(r&#39;US-Germany-France&#39;).is_not()))</p><p>#Filter names longer than 5 characters that are not in US, Germany or France</p><p>Similar to Spark’s lazy implementation, filt_lazy_df is evaluated when collect function is called.</p><p>lazy_df.collect()</p><p>As mentioned earlier, the most appealing aspect of Polars is its ability to transform large datasets. <a href="https://h2oai.github.io/db-benchmark/">h2oai</a> has tables of benchmark performances between different dataframes. According the benchmark, groupby applied on a 1,000,000,000x9 50GB file was reported as follows:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/797/1*kUggveOp22FeaZicpSMB9Q.png" /><figcaption>Benchmark report by h2oai</figcaption></figure><h3>Final Thoughts</h3><p>Polars has promising prospects with its fast performances on very large datasets that may be too big for Pandas. It has similar implementation to Pandas, supports mapping and applying functions to series in dataframes. Plots are easy to generate and integrate with some of the most common visualization tools. Moreover, it allows for lazy evaluation without <a href="https://databricks.com/glossary/what-is-rdd">Resilient Distributed Datasets (RDDs)</a>.</p><p>Overall, Polars can provide data scientists and enthusiasts with better tools to import data into a dataframe. There are a lot functionalities that Pandas can do which are not currently present on Polars. In such cases, casting the dataframe to Pandas is highly recommended.</p><p>The intention of this blog is to introduce the data science community to Polars in a rather crude manner. Detailed documentations and other resources are provided below for more in-depth use cases and implementation of Polars. <a href="https://www.ritchievink.com/">Ritchie Vink</a>, the creator of Polars, wrote <a href="https://www.ritchievink.com/blog/2021/02/28/i-wrote-one-of-the-fastest-dataframe-libraries/">a detailed blog</a> on how Polars operates.</p><h3>Additional Resources</h3><p><a href="https://pola-rs.github.io/polars-book/user-guide/index.html">Polars User Guide</a></p><p><a href="https://medium.com/analytics-vidhya/introduction-to-polars-ee9e638dc163">Introduction to Polars: One of the fastest Dataframe library at the moment</a></p><p><a href="https://www.analyticsvidhya.com/blog/2021/06/polars-the-fastest-dataframe-library-youve-never-heard-of/">Polars: The fastest DataFrame library you’ve never heard of</a></p><p><a href="https://www.youtube.com/watch?v=vjvTD5oTdos">PyPolars Python Tutorial (Data Analysis with PyPolars &amp; Pandas)</a></p><p>Or any other blogs or tutorials on Polars</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d88a3f30936" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>