{"id":4529,"date":"2026-08-31T12:00:00","date_gmt":"2026-08-31T12:00:00","guid":{"rendered":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/"},"modified":"2026-09-01T13:59:09","modified_gmt":"2026-09-01T13:59:09","slug":"combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline","status":"publish","type":"post","link":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/","title":{"rendered":"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline"},"content":{"rendered":"<p><br \/>\n<\/p>\n<div id=\"\">\n<p>On this article, you&#8217;ll discover ways to construct a unified scikit-learn pipeline that mixes textual content embeddings generated by a light-weight open-source language mannequin with structured tabular options for classification duties.<\/p>\n<p>Subjects we&#8217;ll cowl embrace:<\/p>\n<p>The way to generate textual content embeddings utilizing Hugging Face\u2019s sentence-transformers library and wrap them in a customized scikit-learn transformer class.<br \/>\nThe way to use a ColumnTransformer to run parallel preprocessing branches for textual content, numeric, and categorical options concurrently.<br \/>\nThe way to assemble and consider an entire, deployment-ready classification pipeline on a blended dataset combining actual textual content knowledge with artificial tabular options.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png\" alt=\"Combining LLM Embeddings with Tabular Features in a Unified Scikit-learn Pipeline\" width=\"800\" height=\"706\"\/><\/p>\n<h2>Introduction<\/h2>\n<p>Actual-world duties like ticket triage or buyer churn prediction are sometimes addressed by constructing classification fashions. But, in an more and more data-pervaded period, the information used to assemble these fashions and carry out inference on them not often is available in a single taste. We are sometimes confronted with a mixture of tabular, structured knowledge of numeric and qualitative nature, in addition to unstructured knowledge like textual content \u2014 as an illustration, ticket descriptions or buyer messages. Feeding these knowledge varieties collectively into machine studying fashions requires efficient and unified pipelines that accommodate the most recent knowledge nuances and strategies to deal with them.<\/p>\n<p>This text exhibits you tips on how to construct a clear, deployment-ready answer that encapsulates embeddings generated by open-source LLMs (language fashions) right into a unified scikit-learn pipeline, bringing collectively textual content representations and tabular options of distinct varieties \u2014 all primarily based on the usage of a ColumnTransformer. For example its use, we&#8217;ll contemplate a classification situation for detecting spammer customers in a buyer base.<\/p>\n<h2>Stipulations<\/h2>\n<p>As an alternative of resorting to a paid API like OpenAI\u2019s or Google Gemini\u2019s, or an enormous open-source LLM like LLaMA 3, we&#8217;ll use a extra light-weight, CPU-friendly answer to generate embeddings from a group of texts: Hugging Face\u2019s sentence-transformers. Relying in your operating atmosphere, all you might want is to put in the next libraries and dependencies:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a96c0f2b0d12073357535\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n!pip set up -q sentence-transformers scikit-learn pandas numpy<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-o\">!<\/span><span class=\"crayon-e\">pip <\/span><span class=\"crayon-v\">set up<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-i\">q<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">sentence<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">transformers <\/span><span class=\"crayon-v\">scikit<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">study <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-v\">numpy<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Take away the ! if you&#8217;re working in your individual Python IDE quite than a cloud pocket book atmosphere like Google Colab.<\/p>\n<h2>Step-by-Step Information<\/h2>\n<p>Right here\u2019s what our supposed, unified scikit-learn pipeline structure seems to be like:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/Captura-de-pantalla-2026-08-13-a-las-11.50.18.png\" alt=\"Scikit-learn Pipeline Architecture\" width=\"800\" height=\"706\"\/><\/p>\n<p>However first, we want a blended dataset that appears moderately lifelike. For this, we undertake a hybrid method: we pull an actual dataset obtainable on GitHub \u2014 the well-known SMS Spam Assortment dataset containing customers\u2019 textual content messages labeled as spam or not \u2014 and increase it with artificial tabular knowledge options. Put collectively, the information will serve us to arrange a buyer churn\/triage situation.<\/p>\n<p>The code excerpt required for knowledge technology is a bit massive, however there are many feedback that will help you perceive each determination behind the artificial knowledge creation course of:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a96c0f2b0d1f826433002\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\nimport pandas as pd&#13;<br \/>\nimport numpy as np&#13;<br \/>\n&#13;<br \/>\n# 1. Loading base textual content dataset from GitHub&#13;<br \/>\nurl = &#8220;https:\/\/uncooked.githubusercontent.com\/justmarkham\/pycon-2016-tutorial\/grasp\/knowledge\/sms.tsv&#8221;&#13;<br \/>\ndf = pd.read_csv(url, sep=&#8217;t&#8217;, header=None, names=[&#8216;label&#8217;, &#8216;message&#8217;])&#13;<br \/>\n&#13;<br \/>\n# 2. Encoding unique goal variable first (0 for regular\/ham, 1 for spam)&#13;<br \/>\ndf[&#8216;target&#8217;] = df[&#8216;label&#8217;].map({&#8216;ham&#8217;: 0, &#8216;spam&#8217;: 1})&#13;<br \/>\n&#13;<br \/>\n# 3. Synthesising significant tabular options WITH lifelike overlap (noise)&#13;<br \/>\n# With out noise and some extent of overlap, the classifier we&#8217;ll construct would&#13;<br \/>\n# simply obtain perfection: one thing not fairly lifelike in observe.&#13;<br \/>\nnp.random.seed(42)&#13;<br \/>\n&#13;<br \/>\n# Account Age: Regular customers may be model new, and spammers generally use older hacked accounts&#13;<br \/>\ndf[&#8216;account_age_days&#8217;] = np.the place(&#13;<br \/>\n    df[&#8216;target&#8217;] == 1,&#13;<br \/>\n    np.random.randint(1, 365, df.form[0]),       # Spam: 1 to three hundred and sixty five days&#13;<br \/>\n    np.random.randint(1, 1500, df.form[0])       # Ham: 1 to 1500 days (Large overlap)&#13;<br \/>\n)&#13;<br \/>\n&#13;<br \/>\n# Premium Standing: Including a bit extra noise right here&#13;<br \/>\ndf[&#8216;is_premium&#8217;] = np.the place(&#13;<br \/>\n    df[&#8216;target&#8217;] == 1,&#13;<br \/>\n    np.random.alternative([&#8216;no&#8217;, &#8216;yes&#8217;], df.form[0], p=[0.95, 0.05]), # Spam: 95% free&#13;<br \/>\n    np.random.alternative([&#8216;no&#8217;, &#8216;yes&#8217;], df.form[0], p=[0.80, 0.20])  # Ham: 80% free, 20% premium&#13;<br \/>\n)&#13;<br \/>\n&#13;<br \/>\n# Precedence Rating: Overlapping distributions so the mannequin cannot depend on this characteristic alone to categorise clients&#13;<br \/>\ndf[&#8216;priority_score&#8217;] = np.the place(&#13;<br \/>\n    df[&#8216;target&#8217;] == 1,&#13;<br \/>\n    np.random.uniform(0.4, 1.0, df.form[0]),   # Spam: 0.4 to 1.0&#13;<br \/>\n    np.random.uniform(0.0, 0.7, df.form[0])    # Ham: 0.0 to 0.7 (Overlap between 0.4 and 0.7)&#13;<br \/>\n)&#13;<br \/>\n&#13;<br \/>\n# Viewing a pattern of the logically cohesive blended knowledge&#13;<br \/>\ndf.head(3)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<p>33<\/p>\n<p>34<\/p>\n<p>35<\/p>\n<p>36<\/p>\n<p>37<\/p>\n<p>38<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">pandas <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">pd<\/span><\/p>\n<p><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">numpy <\/span><span class=\"crayon-st\">as<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-i\">np<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># 1. Loading base textual content dataset from GitHub<\/span><\/p>\n<p><span class=\"crayon-v\">url<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8220;https:\/\/uncooked.githubusercontent.com\/justmarkham\/pycon-2016-tutorial\/grasp\/knowledge\/sms.tsv&#8221;<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">pd<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">read_csv<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">url<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">sep<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;t&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">header<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">names<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;label&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;message&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># 2. Encoding unique goal variable first (0 for regular\/ham, 1 for spam)<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;target&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;label&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">map<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">{<\/span><span class=\"crayon-s\">&#8216;ham&#8217;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;spam&#8217;<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">}<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># 3. Synthesising significant tabular options WITH lifelike overlap (noise)<\/span><\/p>\n<p><span class=\"crayon-p\"># With out noise and some extent of overlap, the classifier we&#8217;ll construct would<\/span><\/p>\n<p><span class=\"crayon-p\"># simply obtain perfection: one thing not fairly lifelike in observe.<\/span><\/p>\n<p><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">seed<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">42<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Account Age: Regular customers may be model new, and spammers generally use older hacked accounts<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;account_age_days&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">the place<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;target&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">randint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">365<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">form<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-p\"># Spam: 1 to three hundred and sixty five days<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">randint<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1500<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">form<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-p\"># Ham: 1 to 1500 days (Large overlap)<\/span><\/p>\n<p><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Premium Standing: Including a bit extra noise right here<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;is_premium&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">the place<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;target&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">alternative<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;no&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yes&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">form<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">p<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0.95<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.05<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-p\"># Spam: 95% free<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">alternative<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;no&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;yes&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">form<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">p<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0.80<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.20<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\">\u00a0\u00a0<\/span><span class=\"crayon-p\"># Ham: 80% free, 20% premium<\/span><\/p>\n<p><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Precedence Rating: Overlapping distributions so the mannequin cannot depend on this characteristic alone to categorise clients<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;priority_score&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">the place<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;target&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">==<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">uniform<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">0.4<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">1.0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">form<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-p\"># Spam: 0.4 to 1.0<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">np<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">random<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">uniform<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">0.0<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0.7<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">form<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Ham: 0.0 to 0.7 (Overlap between 0.4 and 0.7)<\/span><\/p>\n<p><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Viewing a pattern of the logically cohesive blended knowledge<\/span><\/p>\n<p><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">head<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-cn\">3<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Instance output:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/Captura-de-pantalla-2026-08-13-a-las-16.26.31.png\" alt=\"Sample of the semi-synthetic dataset combining text and tabular features\" width=\"800\" height=\"706\"\/><\/p>\n<p>The following step is essential, as that is the place we create the customized textual content transformer \u2014 see the leftmost department within the earlier diagram. In scikit-learn, that is carried out by making a customized class that inherits from TransformerMixin and BaseEstimator. The requirement is to outline match() and rework() strategies, identical to any pre-existing knowledge transformation class within the library (e.g. commonplace scalers and one-hot encoders).<\/p>\n<div id=\"urvanov-syntax-highlighter-6a96c0f2b0d28498872887\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\nfrom sklearn.base import BaseEstimator, TransformerMixin&#13;<br \/>\nfrom sentence_transformers import SentenceTransformer&#13;<br \/>\n&#13;<br \/>\nclass TextEmbedder(BaseEstimator, TransformerMixin):&#13;<br \/>\n    def __init__(self, model_name=&#8221;all-MiniLM-L6-v2&#8243;):&#13;<br \/>\n        self.model_name = model_name&#13;<br \/>\n        self.mannequin = None&#13;<br \/>\n&#13;<br \/>\n    def match(self, X, y=None):&#13;<br \/>\n        # Initializing the mannequin in match() to adjust to sklearn cloning guidelines&#13;<br \/>\n        if self.mannequin is None:&#13;<br \/>\n            self.mannequin = SentenceTransformer(self.model_name)&#13;<br \/>\n        return self&#13;<br \/>\n        &#13;<br \/>\n    def rework(self, X, y=None):&#13;<br \/>\n        # Dealing with pandas DataFrame (extract the primary column as an inventory of strings)&#13;<br \/>\n        if isinstance(X, pd.DataFrame):&#13;<br \/>\n            texts = X.iloc[:, 0].astype(str).tolist()&#13;<br \/>\n        else:&#13;<br \/>\n            texts = pd.Collection(X).astype(str).tolist()&#13;<br \/>\n            &#13;<br \/>\n        # Utilizing the desired LLM, generate and return embeddings as a 2D numpy array&#13;<br \/>\n        return self.mannequin.encode(texts, show_progress_bar=False)<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">sklearn<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">base <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">BaseEstimator<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">TransformerMixin<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-e\">sentence_transformers <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">SentenceTransformer<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-t\">class<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">TextEmbedder<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">BaseEstimator<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">TransformerMixin<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">__init__<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">model_name<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;all-MiniLM-L6-v2&#8217;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">model_name<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">model_name<\/span><\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">None<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-e\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">match<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">X<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Initializing the mannequin in match() to adjust to sklearn cloning guidelines<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">mannequin <\/span><span class=\"crayon-st\">is<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">SentenceTransformer<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">model_name<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">def <\/span><span class=\"crayon-e\">rework<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">X<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-v\">None<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Dealing with pandas DataFrame (extract the primary column as an inventory of strings)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">if<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">isinstance<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">X<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">pd<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">DataFrame<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">texts<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">X<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">iloc<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-o\">:<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">astype<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">tolist<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">else<\/span><span class=\"crayon-o\">:<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">texts<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">pd<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">Collection<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">X<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">astype<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">str<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">tolist<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-p\"># Utilizing the desired LLM, generate and return embeddings as a 2D numpy array<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-st\">return<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-r\">self<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-v\">mannequin<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">encode<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">texts<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">show_progress_bar<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-t\">False<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Discover that we specify the Hugging Face sentence-transformer mannequin to make use of \u2014 particularly all-MiniLM-L6-v2 \u2014 within the constructor technique, and name the mannequin in rework() to map texts into embeddings.<\/p>\n<p>Subsequent, as soon as now we have our embeddings, we apply the parallel knowledge preprocessing required by the opposite options. Since this depends completely on already-implemented courses in scikit-learn, we will immediately assemble all of the type-specific preprocessing steps into an overarching, unified pipeline. We distinguish numerical columns from categorical ones, making use of commonplace scaling to the previous and one-hot encoding to the latter. Along with the beforehand applied textual content embedding step, this offers us three processing branches that run in parallel. The best way to implement that is by a ColumnTransformer object that accommodates an inventory of three \u201cprocessing branches.\u201d This mechanism retains the entire dataset collectively, with out the necessity to manually break up and re-unify options.<\/p>\n<p>After that, we add the ultimate stage: a random forest classifier. All the course of seems to be as follows:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a96c0f2b0d2d338667472\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\nfrom sklearn.compose import ColumnTransformer&#13;<br \/>\nfrom sklearn.pipeline import Pipeline&#13;<br \/>\nfrom sklearn.preprocessing import StandardScaler, OneHotEncoder&#13;<br \/>\nfrom sklearn.ensemble import RandomForestClassifier&#13;<br \/>\nfrom sklearn.model_selection import train_test_split&#13;<br \/>\nfrom sklearn.metrics import classification_report&#13;<br \/>\n&#13;<br \/>\n# Cut up knowledge&#13;<br \/>\nX = df[[&#8216;message&#8217;, &#8216;account_age_days&#8217;, &#8216;priority_score&#8217;, &#8216;is_premium&#8217;]]&#13;<br \/>\ny = df[&#8216;target&#8217;]&#13;<br \/>\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)&#13;<br \/>\n&#13;<br \/>\n# Outline column teams&#13;<br \/>\ntext_features = [&#8216;message&#8217;]&#13;<br \/>\nnumeric_features = [&#8216;account_age_days&#8217;, &#8216;priority_score&#8217;]&#13;<br \/>\ncategorical_features = [&#8216;is_premium&#8217;]&#13;<br \/>\n&#13;<br \/>\n# Construct the ColumnTransformer&#13;<br \/>\npreprocessor = ColumnTransformer(&#13;<br \/>\n    transformers=[&#13;<br \/>\n        (&#8216;text&#8217;, TextEmbedder(), text_features),&#13;<br \/>\n        (&#8216;num&#8217;, StandardScaler(), numeric_features),&#13;<br \/>\n        (&#8216;cat&#8217;, OneHotEncoder(handle_unknown=&#8217;ignore&#8217;), categorical_features)&#13;<br \/>\n    ],&#13;<br \/>\n    the rest=&#8221;drop&#8221; # Drop any columns not explicitly outlined&#13;<br \/>\n)&#13;<br \/>\n&#13;<br \/>\n# Assemble the ultimate pipeline&#13;<br \/>\npipeline = Pipeline(steps=[&#13;<br \/>\n    (&#8216;preprocessor&#8217;, preprocessor),&#13;<br \/>\n    (&#8216;classifier&#8217;, RandomForestClassifier(n_estimators=100, random_state=42))&#13;<br \/>\n])<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"urvanov-syntax-highlighter-nums-content\" style=\"font-size: 12px !important; line-height: 15px !important;\">\n<p>1<\/p>\n<p>2<\/p>\n<p>3<\/p>\n<p>4<\/p>\n<p>5<\/p>\n<p>6<\/p>\n<p>7<\/p>\n<p>8<\/p>\n<p>9<\/p>\n<p>10<\/p>\n<p>11<\/p>\n<p>12<\/p>\n<p>13<\/p>\n<p>14<\/p>\n<p>15<\/p>\n<p>16<\/p>\n<p>17<\/p>\n<p>18<\/p>\n<p>19<\/p>\n<p>20<\/p>\n<p>21<\/p>\n<p>22<\/p>\n<p>23<\/p>\n<p>24<\/p>\n<p>25<\/p>\n<p>26<\/p>\n<p>27<\/p>\n<p>28<\/p>\n<p>29<\/p>\n<p>30<\/p>\n<p>31<\/p>\n<p>32<\/p>\n<\/div>\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">sklearn<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">compose <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">ColumnTransformer<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">sklearn<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">pipeline <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">Pipeline<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">sklearn<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">preprocessing <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">StandardScaler<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">OneHotEncoder<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">sklearn<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">ensemble <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">RandomForestClassifier<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">sklearn<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">model_selection <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-e\">train_test_split<\/span><\/p>\n<p><span class=\"crayon-e\">from <\/span><span class=\"crayon-v\">sklearn<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">metrics <\/span><span class=\"crayon-e\">import <\/span><span class=\"crayon-v\">classification<\/span><span class=\"crayon-sy\">_<\/span>report<\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Cut up knowledge<\/span><\/p>\n<p><span class=\"crayon-v\">X<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;message&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;account_age_days&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;priority_score&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;is_premium&#8217;<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">y<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">df<\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;target&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">X_train<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">X_test<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y_train<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y_test<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">train_test_split<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">X<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">test_size<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">0.2<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">random_state<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">42<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Outline column teams<\/span><\/p>\n<p><span class=\"crayon-v\">text_features<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;message&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">numeric_features<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;account_age_days&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-s\">&#8216;priority_score&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p><span class=\"crayon-v\">categorical_features<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-sy\">[<\/span><span class=\"crayon-s\">&#8216;is_premium&#8217;<\/span><span class=\"crayon-sy\">]<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Construct the ColumnTransformer<\/span><\/p>\n<p><span class=\"crayon-v\">preprocessor<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">ColumnTransformer<\/span><span class=\"crayon-sy\">(<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">transformers<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;text&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">TextEmbedder<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">text_features<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;num&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">StandardScaler<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">numeric_features<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;cat&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">OneHotEncoder<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">handle_unknown<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;ignore&#8217;<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">categorical_features<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-v\">the rest<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-s\">&#8216;drop&#8217;<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-p\"># Drop any columns not explicitly outlined<\/span><\/p>\n<p><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Assemble the ultimate pipeline<\/span><\/p>\n<p><span class=\"crayon-v\">pipeline<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">Pipeline<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">steps<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-sy\">[<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;preprocessor&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">preprocessor<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">,<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8216;classifier&#8217;<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-e\">RandomForestClassifier<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">n_estimators<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">100<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">random_state<\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-cn\">42<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-sy\">]<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Now that now we have assembled the whole pipeline, it\u2019s time to attempt it out! The ultimate piece of code trains the mannequin \u2014 a course of that, because of the pipeline encapsulation, implicitly carries out all of the previous knowledge preparations \u2014 and evaluates it on the check set we put aside earlier:<\/p>\n<div id=\"urvanov-syntax-highlighter-6a96c0f2b0d32903278545\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\n# Coaching the mannequin (it will take a second to obtain the HF mannequin and embed the texts)&#13;<br \/>\nprint(&#8220;Coaching pipeline&#8230;&#8221;)&#13;<br \/>\npipeline.match(X_train, y_train)&#13;<br \/>\n&#13;<br \/>\n# Evaluating on check examples&#13;<br \/>\nprint(&#8220;Predicting and evaluating&#8230;&#8221;)&#13;<br \/>\ny_pred = pipeline.predict(X_test)&#13;<br \/>\nprint(classification_report(y_test, y_pred))<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-p\"># Coaching the mannequin (it will take a second to obtain the HF mannequin and embed the texts)<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Coaching pipeline&#8230;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">pipeline<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">match<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">X_train<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y_train<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-p\"># Evaluating on check examples<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-s\">&#8220;Predicting and evaluating&#8230;&#8221;<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-v\">y_pred<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-o\">=<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">pipeline<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-e\">predict<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">X_test<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<p><span class=\"crayon-e\">print<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-e\">classification_report<\/span><span class=\"crayon-sy\">(<\/span><span class=\"crayon-v\">y_test<\/span><span class=\"crayon-sy\">,<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">y_pred<\/span><span class=\"crayon-sy\">)<\/span><span class=\"crayon-sy\">)<\/span><\/p>\n<\/div><\/div><\/div>\n<p>Outcomes: <\/p>\n<div id=\"urvanov-syntax-highlighter-6a96c0f2b0d37951480272\" class=\"urvanov-syntax-highlighter-syntax crayon-theme-classic urvanov-syntax-highlighter-font-monaco urvanov-syntax-highlighter-os-pc print-yes notranslate\" data-settings=\" touchscreen minimize scroll-mouseover disable-anim\" style=\" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;\">\n<p>\nPredicting and evaluating&#8230;&#13;<br \/>\n              precision    recall  f1-score   assist&#13;<br \/>\n&#13;<br \/>\n           0       0.99      1.00      0.99       966&#13;<br \/>\n           1       1.00      0.91      0.95       149&#13;<br \/>\n&#13;<br \/>\n    accuracy                           0.99      1115&#13;<br \/>\n   macro avg       0.99      0.95      0.97      1115&#13;<br \/>\nweighted avg       0.99      0.99      0.99      1115<\/p>\n<div class=\"urvanov-syntax-highlighter-main\" style=\"\">\n<div class=\"crayon-pre\" style=\"font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;\">\n<p><span class=\"crayon-e\">Predicting <\/span><span class=\"crayon-st\">and<\/span><span class=\"crayon-h\"> <\/span><span class=\"crayon-v\">evaluating<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><span class=\"crayon-sy\">.<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">precision\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-e\">recall\u00a0\u00a0<\/span><span class=\"crayon-v\">f1<\/span><span class=\"crayon-o\">&#8211;<\/span><span class=\"crayon-e\">rating\u00a0\u00a0 <\/span><span class=\"crayon-i\">assist<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0.99<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">1.00<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0.99<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">966<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">1<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">1.00<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0.91<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0.95<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">149<\/span><\/p>\n<p>\u00a0<\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-i\">accuracy<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0.99<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">1115<\/span><\/p>\n<p><span class=\"crayon-h\">\u00a0\u00a0 <\/span><span class=\"crayon-e\">macro <\/span><span class=\"crayon-i\">avg<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0.99<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0.95<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0.97<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">1115<\/span><\/p>\n<p><span class=\"crayon-e\">weighted <\/span><span class=\"crayon-i\">avg<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><span class=\"crayon-cn\">0.99<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0.99<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">0.99<\/span><span class=\"crayon-h\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><span class=\"crayon-cn\">1115<\/span><\/p>\n<\/div><\/div><\/div>\n<p>These outcomes are fairly respectable. A part of the reason being that the actual dataset used for the labeled texts is understood for being simply class-separable and subsequently not exhausting to categorise with excessive accuracy. We additionally deliberately added noise and overlap when creating the opposite artificial attributes to introduce a little bit of problem for our classifier \u2014 in any other case, it might need achieved 100% accuracy, which might not be very informative.<\/p>\n<h2>Conclusion<\/h2>\n<p>This text tackled an more and more frequent drawback within the AI and knowledge science panorama: leveraging textual content knowledge and mixing it with structured knowledge options historically fed to downstream machine studying fashions for predictive duties like classification. We used scikit-learn\u2019s transformer courses and a pre-trained language mannequin to construct a unified pipeline that cleanly and elegantly processes these blended knowledge varieties, yielding a strong and simply reusable answer.<\/p>\n<\/p><\/div>\n<p><br \/>\n<br \/><a href=\"https:\/\/machinelearningmastery.com\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>On this article, you&#8217;ll discover ways to construct a unified scikit-learn pipeline that mixes textual content embeddings generated by a light-weight open-source language mannequin with structured tabular options for classification duties. Subjects we&#8217;ll cowl embrace: The way to generate textual content embeddings utilizing Hugging Face\u2019s sentence-transformers library and wrap them in a customized scikit-learn transformer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4531,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png","fifu_image_alt":"","jnews-multi-image_gallery":[],"jnews_single_post":[],"jnews_primary_category":[],"jnews_override_bookmark_settings":[],"jnews_social_meta":[],"jnews_override_counter":[],"footnotes":""},"categories":[7],"tags":[4703,924,2162,452,1139,4704,571,1232],"class_list":["post-4529","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-science-mlops","tag-combining","tag-embeddings","tag-features","tag-llm","tag-pipeline","tag-scikitlearn","tag-tabular","tag-unified"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline - Future News 24<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline - Future News 24\" \/>\n<meta property=\"og:description\" content=\"On this article, you&#8217;ll discover ways to construct a unified scikit-learn pipeline that mixes textual content embeddings generated by a light-weight open-source language mannequin with structured tabular options for classification duties. Subjects we&#8217;ll cowl embrace: The way to generate textual content embeddings utilizing Hugging Face\u2019s sentence-transformers library and wrap them in a customized scikit-learn transformer [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/\" \/>\n<meta property=\"og:site_name\" content=\"Future News 24\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-31T12:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-01T13:59:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png\" \/>\n<meta name=\"author\" content=\"Future News 24\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Future News 24\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/\"},\"author\":{\"name\":\"Future News 24\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/person\\\/cecad1bde21cfc357cf70128144d6c83\"},\"headline\":\"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline\",\"datePublished\":\"2026-08-31T12:00:00+00:00\",\"dateModified\":\"2026-09-01T13:59:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/\"},\"wordCount\":2021,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png\",\"keywords\":[\"Combining\",\"Embeddings\",\"features\",\"LLM\",\"pipeline\",\"Scikitlearn\",\"Tabular\",\"unified\"],\"articleSection\":[\"Data Science &amp; MLOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/\",\"name\":\"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline - Future News 24\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png\",\"datePublished\":\"2026-08-31T12:00:00+00:00\",\"dateModified\":\"2026-09-01T13:59:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/#primaryimage\",\"url\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png\",\"contentUrl\":\"https:\\\/\\\/machinelearningmastery.com\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/2026\\\/08\\\/31\\\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/futurenews24.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#website\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/\",\"name\":\"Future News 24\",\"description\":\"The Smart Hub for AI and Next-Gen Innovation\",\"publisher\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/futurenews24.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#organization\",\"name\":\"Future News 24\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/futurenews24.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/fn24-favicon.png\",\"contentUrl\":\"https:\\\/\\\/futurenews24.com\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/fn24-favicon.png\",\"width\":250,\"height\":250,\"caption\":\"Future News 24\"},\"image\":{\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/futurenews24.com\\\/#\\\/schema\\\/person\\\/cecad1bde21cfc357cf70128144d6c83\",\"name\":\"Future News 24\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g\",\"caption\":\"Future News 24\"},\"sameAs\":[\"https:\\\/\\\/futurenews24.com\"],\"url\":\"https:\\\/\\\/futurenews24.com\\\/index.php\\\/author\\\/mridulpahuja20\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline - Future News 24","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/","og_locale":"en_US","og_type":"article","og_title":"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline - Future News 24","og_description":"On this article, you&#8217;ll discover ways to construct a unified scikit-learn pipeline that mixes textual content embeddings generated by a light-weight open-source language mannequin with structured tabular options for classification duties. Subjects we&#8217;ll cowl embrace: The way to generate textual content embeddings utilizing Hugging Face\u2019s sentence-transformers library and wrap them in a customized scikit-learn transformer [&hellip;]","og_url":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/","og_site_name":"Future News 24","article_published_time":"2026-08-31T12:00:00+00:00","article_modified_time":"2026-09-01T13:59:09+00:00","og_image":[{"url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png","type":"","width":"","height":""}],"author":"Future News 24","twitter_card":"summary_large_image","twitter_image":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png","twitter_misc":{"Written by":"Future News 24","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/#article","isPartOf":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/"},"author":{"name":"Future News 24","@id":"https:\/\/futurenews24.com\/#\/schema\/person\/cecad1bde21cfc357cf70128144d6c83"},"headline":"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline","datePublished":"2026-08-31T12:00:00+00:00","dateModified":"2026-09-01T13:59:09+00:00","mainEntityOfPage":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/"},"wordCount":2021,"commentCount":0,"publisher":{"@id":"https:\/\/futurenews24.com\/#organization"},"image":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/#primaryimage"},"thumbnailUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png","keywords":["Combining","Embeddings","features","LLM","pipeline","Scikitlearn","Tabular","unified"],"articleSection":["Data Science &amp; MLOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/","url":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/","name":"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline - Future News 24","isPartOf":{"@id":"https:\/\/futurenews24.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/#primaryimage"},"image":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/#primaryimage"},"thumbnailUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png","datePublished":"2026-08-31T12:00:00+00:00","dateModified":"2026-09-01T13:59:09+00:00","breadcrumb":{"@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/#primaryimage","url":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png","contentUrl":"https:\/\/machinelearningmastery.com\/wp-content\/uploads\/2026\/08\/mlm-combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline-feature.png"},{"@type":"BreadcrumbList","@id":"https:\/\/futurenews24.com\/index.php\/2026\/08\/31\/combining-llm-embeddings-with-tabular-features-in-a-unified-scikit-learn-pipeline\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/futurenews24.com\/"},{"@type":"ListItem","position":2,"name":"Combining LLM Embeddings with Tabular Options in a Unified Scikit-learn Pipeline"}]},{"@type":"WebSite","@id":"https:\/\/futurenews24.com\/#website","url":"https:\/\/futurenews24.com\/","name":"Future News 24","description":"The Smart Hub for AI and Next-Gen Innovation","publisher":{"@id":"https:\/\/futurenews24.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/futurenews24.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/futurenews24.com\/#organization","name":"Future News 24","url":"https:\/\/futurenews24.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/futurenews24.com\/#\/schema\/logo\/image\/","url":"https:\/\/futurenews24.com\/wp-content\/uploads\/2026\/06\/fn24-favicon.png","contentUrl":"https:\/\/futurenews24.com\/wp-content\/uploads\/2026\/06\/fn24-favicon.png","width":250,"height":250,"caption":"Future News 24"},"image":{"@id":"https:\/\/futurenews24.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/futurenews24.com\/#\/schema\/person\/cecad1bde21cfc357cf70128144d6c83","name":"Future News 24","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d57f07142d73cb5503ab2446ea7bc9ef3d0a5ba378d64a6157692311e42bf097?s=96&d=mm&r=g","caption":"Future News 24"},"sameAs":["https:\/\/futurenews24.com"],"url":"https:\/\/futurenews24.com\/index.php\/author\/mridulpahuja20\/"}]}},"_links":{"self":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/4529","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/comments?post=4529"}],"version-history":[{"count":1,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/4529\/revisions"}],"predecessor-version":[{"id":4530,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/posts\/4529\/revisions\/4530"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/media\/4531"}],"wp:attachment":[{"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/media?parent=4529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/categories?post=4529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/futurenews24.com\/index.php\/wp-json\/wp\/v2\/tags?post=4529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}