<?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"><channel><title><![CDATA[Oscar Fernandez Tech Blog]]></title><description><![CDATA[Data Science, Machine Learning and Full-Stack AI projects. I write about recommendation systems, analytics, Python development and real-world AI applications.]]></description><link>https://oscar-datascience.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Oscar Fernandez Tech Blog</title><link>https://oscar-datascience.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 16:37:49 GMT</lastBuildDate><atom:link href="https://oscar-datascience.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[From Machine Learning Notebook to Production System: Building a Hybrid Tourist Route Recommender | Evolve]]></title><description><![CDATA[During my Master’s Degree in Data Science and Artificial Intelligence at Evolve, I developed a production-oriented recommendation system capable of generating personalized tourist routes in Barcelona.]]></description><link>https://oscar-datascience.hashnode.dev/from-machine-learning-notebook-to-production-system-building-a-hybrid-tourist-route-recommender-evolve</link><guid isPermaLink="true">https://oscar-datascience.hashnode.dev/from-machine-learning-notebook-to-production-system-building-a-hybrid-tourist-route-recommender-evolve</guid><category><![CDATA[Machine Learning]]></category><category><![CDATA[Python]]></category><category><![CDATA[llm]]></category><category><![CDATA[AI]]></category><category><![CDATA[Jupyter Notebook ]]></category><dc:creator><![CDATA[Óscar Fernandez Chinchilla Lopez]]></dc:creator><pubDate>Mon, 25 May 2026 15:24:15 GMT</pubDate><content:encoded><![CDATA[<p>During my Master’s Degree in Data Science and Artificial Intelligence at Evolve, I developed a production-oriented recommendation system capable of generating personalized tourist routes in Barcelona.</p>
<p>The original idea emerged from a real operational problem in the tourism sector.</p>
<p>Creating personalized tourist routes manually is a time-consuming process, especially when companies manage multiple customers or tourist groups simultaneously. Building these routes requires selecting Points of Interest (POIs), validating distances, grouping locations geographically and adapting each route according to user preferences and available time.</p>
<p>The objective of the project was to automate that process through a hybrid recommendation system capable of generating complete, coherent and geographically viable tourist routes.</p>
<hr />
<h1>The Problem</h1>
<p>Traditional recommendation systems usually focus on suggesting isolated items. However, tourist recommendations involve additional constraints that make the problem significantly more complex.</p>
<p>A valid route must consider:</p>
<ul>
<li><p>User preferences</p>
</li>
<li><p>Thematic similarity between POIs</p>
</li>
<li><p>Geographic proximity</p>
</li>
<li><p>Maximum route distance</p>
</li>
<li><p>Available visit time</p>
</li>
<li><p>Route feasibility</p>
</li>
<li><p>Logical ordering between locations</p>
</li>
</ul>
<p>The goal was not simply recommending popular places, but generating complete optimized experiences automatically.</p>
<hr />
<h1>Dataset and Data Preparation</h1>
<p>The project works with a dataset of Points of Interest in Barcelona containing:</p>
<ul>
<li><p>Names and categories</p>
</li>
<li><p>Geographic coordinates</p>
</li>
<li><p>Ratings and quality scores</p>
</li>
<li><p>Estimated visit duration</p>
</li>
<li><p>Tags and textual descriptions</p>
</li>
</ul>
<p>One of the biggest challenges was transforming raw tourism data into features usable by both the recommendation engine and the final application.</p>
<p>The preprocessing pipeline included:</p>
<ul>
<li><p>Cleaning inconsistent values</p>
</li>
<li><p>Normalizing quality variables</p>
</li>
<li><p>Geographic clustering</p>
</li>
<li><p>Feature engineering</p>
</li>
<li><p>Text vectorization using TF-IDF</p>
</li>
</ul>
<p>The final enriched dataset was later integrated into the recommendation engine and persisted inside a MySQL database.</p>
<hr />
<h1>Recommendation Architecture</h1>
<p>The recommendation engine combines multiple techniques:</p>
<ul>
<li><p>Content-based filtering</p>
</li>
<li><p>TF-IDF vectorization</p>
</li>
<li><p>Cosine similarity</p>
</li>
<li><p>Geographic clustering</p>
</li>
<li><p>Quality-based ranking</p>
</li>
<li><p>Constraint-based route generation</p>
</li>
</ul>
<p>The workflow starts by selecting candidate POIs according to user preferences and thematic similarity.</p>
<p>After the initial filtering phase, a greedy route generation algorithm constructs the final itinerary while respecting:</p>
<ul>
<li><p>Maximum total distance</p>
</li>
<li><p>Available time</p>
</li>
<li><p>Distance between consecutive POIs</p>
</li>
<li><p>Minimum and maximum number of locations</p>
</li>
</ul>
<p>This hybrid approach allows the system to generate routes that are not only relevant from a recommendation perspective, but also realistic and usable in practice.</p>
<hr />
<h1>Full-Stack Integration</h1>
<p>One of the most important parts of the project was moving beyond isolated notebooks and integrating the recommendation engine into a real application architecture.</p>
<p>The system was developed using:</p>
<ul>
<li><p>Python, Pandas and Scikit-learn for the recommendation engine</p>
</li>
<li><p>Node.js and Express for the backend API</p>
</li>
<li><p>MySQL for persistence</p>
</li>
<li><p>React for the frontend</p>
</li>
<li><p>Leaflet for interactive route visualization</p>
</li>
</ul>
<p>The Python recommendation logic was integrated into the backend layer through API communication, allowing the frontend to dynamically generate and visualize routes in real time.</p>
<hr />
<h1>Application Features</h1>
<p>The final application supports different user roles:</p>
<ul>
<li><p>Administrators</p>
</li>
<li><p>Companies</p>
</li>
<li><p>Final users</p>
</li>
</ul>
<p>Companies can:</p>
<ul>
<li><p>Generate intelligent routes automatically</p>
</li>
<li><p>Create routes manually</p>
</li>
<li><p>Edit generated itineraries</p>
</li>
<li><p>Assign routes to customers</p>
</li>
</ul>
<p>The platform also includes:</p>
<ul>
<li><p>Interactive maps</p>
</li>
<li><p>Route editors</p>
</li>
<li><p>POI management</p>
</li>
<li><p>User management</p>
</li>
<li><p>Intelligent recommendation views</p>
</li>
</ul>
<hr />
<h1>Example Generated Route</h1>
<p>Example output generated by the system:</p>
<ul>
<li><p>6 recommended POIs</p>
</li>
<li><p>7.79 km total route distance</p>
</li>
<li><p>400 minutes estimated visit duration</p>
</li>
<li><p>32 minutes walking time</p>
</li>
<li><p>432 minutes total experience time</p>
</li>
</ul>
<p>The generated routes are displayed on an interactive map together with detailed POI information.</p>
<hr />
<h1>Key Learnings</h1>
<p>One of the biggest lessons from this project was understanding the difference between building a machine learning model and building a usable product.</p>
<p>The recommendation logic alone was not enough. The system also required:</p>
<ul>
<li><p>Backend integration</p>
</li>
<li><p>API communication</p>
</li>
<li><p>Persistence layers</p>
</li>
<li><p>Role-based access</p>
</li>
<li><p>Frontend visualization</p>
</li>
<li><p>Business constraints</p>
</li>
<li><p>Real usability considerations</p>
</li>
</ul>
<p>Another important takeaway was the value of interpretable hybrid recommendation systems. Instead of relying on black-box models, the recommendation pipeline was designed so every stage had a clear purpose:</p>
<ul>
<li><p>Similarity for relevance</p>
</li>
<li><p>Geographic filtering for feasibility</p>
</li>
<li><p>Ranking for quality</p>
</li>
<li><p>Constraints for usability</p>
</li>
</ul>
<hr />
<h1>Repository</h1>
<p>GitHub Repository: [<a href="https://github.com/OscarFdz24/Proyecto-Master-DataScience-Evolve-OscarFernandez-ChinchillaLopez">Repository</a>]</p>
<p>Dev to Article: [<a href="https://dev.to/evolve-space/from-data-science-notebook-to-production-app-a-hybrid-tourist-route-recommender-2i9d-temp-slug-9658516?preview=953beb7b54794aff22640ccbcb230afde569366de913320eba9bbbc9506c4db28e9d49948044aaf439bf25b71758607ff6b55d253a5ca8844a97897c">Article</a>]</p>
<p>Medium Article: [<a href="https://medium.com/@oscarcontactweb/how-i-built-a-hybrid-tourist-route-recommender-during-my-masters-at-evolve-797dac910838">Article</a>]</p>
<hr />
<h1>Closing</h1>
<p>This project was developed during my Master’s Degree in Data Science and Artificial Intelligence at Evolve.</p>
]]></content:encoded></item></channel></rss>