<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marcin Szymaniuk, Author at TantusData</title>
	<atom:link href="https://tantusdata.com/author/marcin/feed/" rel="self" type="application/rss+xml" />
	<link>https://tantusdata.com</link>
	<description>That uncovers wisdom.</description>
	<lastBuildDate>Tue, 03 Sep 2024 13:13:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>

<image>
	<url>https://tantusdata.com/app/uploads/2023/01/cropped-Favicon-32x32.png</url>
	<title>Marcin Szymaniuk, Author at TantusData</title>
	<link>https://tantusdata.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How to convince AI to help us boost our profit</title>
		<link>https://tantusdata.com/insights/how-to-convince-ai-to-help-us-boost-our-profit/</link>
		
		<dc:creator><![CDATA[Marcin Szymaniuk]]></dc:creator>
		<pubDate>Mon, 12 Dec 2022 08:28:00 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[ML]]></category>
		<guid isPermaLink="false">https://tantusdata.com/?post_type=insights&#038;p=2108</guid>

					<description><![CDATA[<p>Recently, we have been challenged to build an ML model that will boost company revenue by increasing click-through and conversion rates. The company has a web page with properties that one can book. The current approaches they tried, even though very reasonable, weren’t able to produce the expected result. They needed a fresh look into [&#8230;]</p>
<p>The post <a href="https://tantusdata.com/insights/how-to-convince-ai-to-help-us-boost-our-profit/">How to convince AI to help us boost our profit</a> appeared first on <a href="https://tantusdata.com">TantusData</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="683" src="https://tantusdata.com/app/uploads/2024/06/shutterstock_1421945759-1024x683.jpg" alt="" class="wp-image-2109" srcset="https://tantusdata.com/app/uploads/2024/06/shutterstock_1421945759-1024x683.jpg 1024w, https://tantusdata.com/app/uploads/2024/06/shutterstock_1421945759-300x200.jpg 300w, https://tantusdata.com/app/uploads/2024/06/shutterstock_1421945759-768x512.jpg 768w, https://tantusdata.com/app/uploads/2024/06/shutterstock_1421945759-1536x1024.jpg 1536w, https://tantusdata.com/app/uploads/2024/06/shutterstock_1421945759-2048x1365.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Recently, we have been challenged to build an ML model that will boost company revenue by increasing click-through and conversion rates. The company has a web page with properties that one can book. The current approaches they tried, even though very reasonable, weren’t able to produce the expected result. They needed a fresh look into the problem, and this is how they found us.</p>



<h2 class="wp-block-heading">Picking the best image</h2>



<p>We started with a click-through rate problem. We needed to pick the best image of a property to present as a miniature. We needed to pick from two images. Let’s look at those examples:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="360" src="https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.43.42-1024x360.png" alt="" class="wp-image-2114" srcset="https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.43.42-1024x360.png 1024w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.43.42-300x105.png 300w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.43.42-768x270.png 768w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.43.42.png 1344w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>It is hard to tell by only looking at images which one would be more attractive to potential clients. This is precisely the challenge the AI should help us with!</p>



<p>Apart from images, we had additional information about the properties, such as price, region, type of property, max pets, Wi-Fi and parking availability, etc. In total, we had 49 columns.</p>



<p>To summarize the problem: We have two images and additional data about properties, and we need to decide which one will have higher click through rate. We are given historical CTRs for images from A/B testing. The graphic below presents the highest level view of the process:</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="672" src="https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.13-1024x672.png" alt="" class="wp-image-2116" srcset="https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.13-1024x672.png 1024w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.13-300x197.png 300w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.13-768x504.png 768w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.13.png 1030w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Data preparation</h2>



<p>We have started with the analysis of additional data for properties to pick up the best features. We have picked 20 features (based on their correlation with the target metric) and did the following preprocessing:</p>



<ul class="wp-block-list">
<li>standardization for numerical features</li>



<li>one hot encoding for categorical features</li>



<li>mean imputation for numerical features</li>



<li>most frequent imputation for categorical data</li>
</ul>



<h2 class="wp-block-heading">Regression model</h2>



<p>In the first approach, we built a model that takes an image and additional data to predict the click-through rate (CTR). The data came from SnapTrip, which conducted A/B tests—showing different webpage versions to different user groups to measure which one performs better. Their previous models were likely ineffective, leading to inaccurate results.</p>



<p>For the images, we used a pre-trained EfficientNetB4 network and fine-tuned it. The categorical data was processed through a five-layer fully connected network. The outputs were concatenated at the end. We used mean squared error as the loss function and performed hyper-parameter tuning to optimize the model architecture. All images were processed through an augmentation layer with standard operations. Here is a code snippet:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="def augument(image):
    image = tf.image.random_flip_left_right(image)
    image = tf.image.random_hue(image, 0.08)
    image = tf.image.random_saturation(image, 0.6, 1.6)
    image = tf.image.random_brightness(image, 0.05)
    image = tf.image.random_contrast(image, 0.7, 1.3)
    return image" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">augument</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">random_flip_left_right</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">random_hue</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.08</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">random_saturation</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.6</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1.6</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">random_brightness</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.05</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">image</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">tf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">random_contrast</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">image</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.7</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1.3</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">image</span></span></code></pre></div>



<p></p>



<p>Using this approach, we got the following result: The accuracy is calculated as a proportion of correctly selected images. The correct image is an image with a higher CTR. We run images through the model and pick the one with the highest accuracy.</p>



<figure class="wp-block-table"><table><tbody><tr><td>Model name</td><td>Accuracy</td></tr><tr><td>Regression model</td><td>0.9208</td></tr></tbody></table><figcaption class="wp-element-caption">Table 1</figcaption></figure>



<p>The visualization of this approach looks like this:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="985" src="https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.39-1024x985.png" alt="" class="wp-image-2118" srcset="https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.39-1024x985.png 1024w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.39-300x288.png 300w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.39-768x738.png 768w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.44.39.png 1196w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Classification model</h2>



<p>In the second approach, we used both images as input (together with additional data) as we expected that seeing both images could help the model make better decisions. The loss function wasn’t mean squared error, but it was standard cross entropy as we treated this as a classification problem where the model needed to decide whether the image first or second should be selected. We had two neurons as an output, and when the first neuron was activated them, the first image should be picked and vice versa.&nbsp; We performed the same image augmentation as in the previous approach, and additionally, we swapped image positions in every case. So, the same images were presented to the model twice in swapped order.</p>



<p>We created a dedicated Keras layer for the images that looks like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class EfficientNetV2B1_TF(layers.Layer):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        image_size = 260
        self.base_model = keras.applications.EfficientNetV2B2(include_top=False,
                                                            weights='imagenet',
                                                            input_shape=(image_size, image_size, 3)
                                                            )
        self.base_model.trainable = False
        self.global_pooling = tf.keras.layers.GlobalAveragePooling2D()
        self.embedding_model = keras.Sequential(
            [
                layers.Input(shape=(2816)),
                tf.keras.layers.Dropout(0.25),
                layers.Dense(2),
            ]
        )
    def set_fine_tuning(self, fine_tune_at=3):
        self.base_model.trainable = True
        for layer in self.base_model.layers[:-fine_tune_at]:
            layer.trainable = False
    def call(self, image_1, image_2):
        image_1_base = self.base_model(image_1)
        image_2_base = self.base_model(image_2)
        embb_1 = self.global_pooling(image_1_base)
        embb_2 = self.global_pooling(image_2_base)
        images = tf.concat([embb_1, embb_2], axis=1)
        output = self.embedding_model(images)
        return output" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">class</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">EfficientNetV2B1_TF</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">layers</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">Layer</span><span style="color: #D8DEE9FF">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">__init__</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">, **</span><span style="color: #8FBCBB">kwargs</span><span style="color: #D8DEE9FF">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">super</span><span style="color: #D8DEE9FF">().</span><span style="color: #8FBCBB">__init__</span><span style="color: #D8DEE9FF">(**</span><span style="color: #8FBCBB">kwargs</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">image_size</span><span style="color: #D8DEE9FF"> = 260</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">base_model</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">keras</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">applications</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">EfficientNetV2B2</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">include_top</span><span style="color: #D8DEE9FF">=</span><span style="color: #8FBCBB">False</span><span style="color: #D8DEE9FF">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                                                            </span><span style="color: #8FBCBB">weights</span><span style="color: #D8DEE9FF">=&#39;</span><span style="color: #8FBCBB">imagenet</span><span style="color: #D8DEE9FF">&#39;,</span></span>
<span class="line"><span style="color: #D8DEE9FF">                                                            </span><span style="color: #8FBCBB">input_shape</span><span style="color: #D8DEE9FF">=(</span><span style="color: #8FBCBB">image_size</span><span style="color: #D8DEE9FF">, </span><span style="color: #8FBCBB">image_size</span><span style="color: #D8DEE9FF">, 3)</span></span>
<span class="line"><span style="color: #D8DEE9FF">                                                            )</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">base_model</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">trainable</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">False</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">global_pooling</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">tf</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">keras</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">layers</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">GlobalAveragePooling2D</span><span style="color: #D8DEE9FF">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">embedding_model</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">keras</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">Sequential</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">            [</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #8FBCBB">layers</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">Input</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">shape</span><span style="color: #D8DEE9FF">=(2816)),</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #8FBCBB">tf</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">keras</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">layers</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">Dropout</span><span style="color: #D8DEE9FF">(0.25),</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #8FBCBB">layers</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">Dense</span><span style="color: #D8DEE9FF">(2),</span></span>
<span class="line"><span style="color: #D8DEE9FF">            ]</span></span>
<span class="line"><span style="color: #D8DEE9FF">        )</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">set_fine_tuning</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">, </span><span style="color: #8FBCBB">fine_tune_at</span><span style="color: #D8DEE9FF">=3):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">base_model</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">trainable</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">True</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">layer</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">base_model</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">layers</span><span style="color: #D8DEE9FF">[:-</span><span style="color: #8FBCBB">fine_tune_at</span><span style="color: #D8DEE9FF">]:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #8FBCBB">layer</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">trainable</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">False</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">call</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">, </span><span style="color: #8FBCBB">image_1</span><span style="color: #D8DEE9FF">, </span><span style="color: #8FBCBB">image_2</span><span style="color: #D8DEE9FF">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">image_1_base</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">base_model</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">image_1</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">image_2_base</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">base_model</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">image_2</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">embb_1</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">global_pooling</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">image_1_base</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">embb_2</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">global_pooling</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">image_2_base</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">images</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">tf</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">concat</span><span style="color: #D8DEE9FF">([</span><span style="color: #8FBCBB">embb_1</span><span style="color: #D8DEE9FF">, </span><span style="color: #8FBCBB">embb_2</span><span style="color: #D8DEE9FF">], </span><span style="color: #8FBCBB">axis</span><span style="color: #D8DEE9FF">=1)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">output</span><span style="color: #D8DEE9FF"> = </span><span style="color: #8FBCBB">self</span><span style="color: #D8DEE9FF">.</span><span style="color: #8FBCBB">embedding_model</span><span style="color: #D8DEE9FF">(</span><span style="color: #8FBCBB">images</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">output</span></span></code></pre></div>



<p></p>



<p>Using this approach, we got the following result. It is better, than the one from regression.</p>



<figure class="wp-block-table"><table><tbody><tr><td>Model name</td><td>Accuracy</td></tr><tr><td>Regression model</td><td>0.9411</td></tr></tbody></table><figcaption class="wp-element-caption">Table 2</figcaption></figure>



<p>The visualization of this approach looks like this:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="587" src="https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.45.00-1024x587.png" alt="Learn how we built an AI model to boost company revenue by increasing click-through and conversion rates on a property booking website. Discover our approach to selecting the best images, preprocessing data, and optimizing model performance to achieve better results. Understand the importance of considering user preferences and seasonal variations in data." class="wp-image-2120" srcset="https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.45.00-1024x587.png 1024w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.45.00-300x172.png 300w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.45.00-768x440.png 768w, https://tantusdata.com/app/uploads/2024/06/Screenshot-2024-06-11-at-09.45.00.png 1180w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Having developed those models, we decided to conduct an A/B test for the classification model. After deploying it to production and waiting a week for results, we observed that the CTR did not increase as much as we expected. Detailed investigation revealed that many images with higher CTRs in our training data now had lower CTRs. The issue was that we received an A/B test dataset from a specific time period, where certain images had higher CTRs and served as our reference. We trained the model to discover why some images were better than others, and it performed well on that dataset.</p>



<p>After conducting the A/B test again, we found that users often preferred different images than before, rendering our model ineffective. We are not entirely sure why user preferences changed suddenly, but it is likely due to seasonal variations that affected the A/B test data outcomes. Therefore, we recommend clients consider the time sensitivity and changing tastes of their potential customers.</p>



<p>To address this, one of the models we provided did not choose between two images but instead returned a specific CTR for each image. In theory, this model could process all images for a given property and select the one with the highest CTR. We decided to collect data over longer periods and try again in the future.&nbsp;</p>



<p>Not only A/B tests but also customer data would likely help, similar to how other sites operate by checking what users viewed or booked previously and basing recommendations on that.</p>



<p>Note: Access to comprehensive data is crucial for effective modeling and accurate predictions.</p>



<h2 class="wp-block-heading">Sorting search results</h2>



<p>The second problem we wanted to solve using AI was search result sorting. After the user specified what properties they were looking for, for what dates, and for how many people, we presented our offer. The problem is which properties we should show first, as usually users only open the first few so that there are maximum chances for a successful booking.</p>



<h2 class="wp-block-heading">Data preparation</h2>



<p>Here, the data was similar to the previous example. The images and property information were the same, with the new addition of textual data in the form of property descriptions. We investigated the tabular data with property information and selected 15 features that best correlated with the target value. These features were chosen based on statistical models that identify correlations between features. The preprocessing for this data was the same as in the previous problem.</p>



<p>We’ve pre-process description data using nltk. We carried out the following operations:</p>



<ul class="wp-block-list">
<li>lower casing</li>



<li>html tag removal</li>



<li>urls removal</li>



<li>word tokenization</li>



<li>punctuation removal</li>



<li>stop words removal</li>



<li>lemmatization</li>
</ul>



<p>The target value was the historical conversion rate for each property.</p>



<h2 class="wp-block-heading">Creating models</h2>



<h2 class="wp-block-heading">xgboost</h2>



<p>The first model we created was based on XGBoost. It received input consisting solely of tabular data from SnapTrip&#8217;s historical A/B tests. We performed hyper-parameter tuning to optimize the following parameters (the numbers represent the best parameters found):</p>



<ul class="wp-block-list">
<li>colsample_bytree=0.7</li>



<li>learning_rate=0.01</li>



<li>max_depth=3</li>



<li>n_estimators=1000</li>
</ul>



<p>Here is the result we got with this approach:</p>



<figure class="wp-block-table"><table><tbody><tr><td>Model name</td><td>Mean Squared Error</td></tr><tr><td>Neural network conversion rate</td><td>41</td></tr></tbody></table><figcaption class="wp-element-caption">Table 3</figcaption></figure>



<h2 class="wp-block-heading">Neural network</h2>



<p>We started creating a second model, the neural network model, by combining the tabular and textual data. We decided not to complicate it by including the images from the beginning. As we didn’t have that much data (something like 4000 rows), we started with shallow networks. We used hyperparameter tuning to find the best network architecture for us. Here is the code snipped with all configurable parameters.</p>



<p>def build_keras_hp_model(hp):</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="model = Sequential()
    kernel_regularizer = None
    kernel_regularizer_value = hp.Choice('kernel_regularizer', values=[0.01, 0.02, 0.04, 0.06, 0.08])
    type = hp.Choice('kernel_regularizer_type', values=[&quot;L1&quot;, &quot;L2&quot;, &quot;L1L2&quot;, &quot;None&quot;])
    if type == &quot;L1&quot;:
        kernel_regularizer = regularizers.L1(kernel_regularizer_value)
    elif type == &quot;L2&quot;:
        kernel_regularizer = regularizers.L2(kernel_regularizer_value)
    elif type == &quot;L1L2&quot;:
        kernel_regularizer = regularizers.L1L2(kernel_regularizer_value)
    activity_regularizer = None
    activity_regularizer_value = hp.Choice('activity_regularizer', values=[0.01, 0.02, 0.04, 0.06, 0.08])
    type = hp.Choice('activity_regularizer_type', values=[&quot;L1&quot;, &quot;L2&quot;, &quot;L1L2&quot;, &quot;None&quot;])
    if type == &quot;L1&quot;:
        activity_regularizer = regularizers.L1(activity_regularizer_value)
    elif type == &quot;L2&quot;:
        activity_regularizer = regularizers.L2(activity_regularizer_value)
    elif type == &quot;L1L2&quot;:
        activity_regularizer = regularizers.L1L2(activity_regularizer_value)
    for i in range(hp.Int('layers', 4, 12)):
        model.add(Dense(hp.Choice(
            'units', [50, 60, 70, 80 ,90, 100]),
            kernel_initializer=hp.Choice(
            'kernel_initializer', ['glorot_normal', 'glorot_uniform', 'he_normal', 'he_uniform', 'lecun_normal', 'lecun_uniform', 'random_normal']),
            kernel_regularizer = kernel_regularizer,
            activity_regularizer = activity_regularizer
        ))
        if not hp.Boolean(&quot;do_batch_norm_after_dropout&quot;) and hp.Boolean(&quot;do_batch_norm_before_dropout&quot;):
            model.add(BatchNormalization())
        model.add(Activation(hp.Choice('activation', ['elu', &quot;relu&quot;, 'selu', 'gelu', 'leaky_relu', 'swish'])))
        model.add(Dropout(hp.Choice('dropout', values=[0.0, 0.1, 0.15, 0.2, 0.25, 0.3])))
        if not hp.Boolean(&quot;do_batch_norm_before_dropout&quot;) and hp.Boolean(&quot;do_batch_norm_after_dropout&quot;):
            model.add(BatchNormalization())
    model.add(Dense(1))
    model.compile(
        optimizer=tf.keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-4, 1e-5, 1e-6])),
        loss='mean_squared_error',
        metrics=[tf.keras.metrics.RootMeanSquaredError()])
    return model" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">model</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">Sequential</span><span style="color: #D8DEE9FF">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">kernel_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">None</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">kernel_regularizer_value</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">kernel_regularizer</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">values</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0.01</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.02</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.04</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.06</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.08</span><span style="color: #D8DEE9FF">])</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">kernel_regularizer_type</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">values</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">[</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L1L2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">None</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">])</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">kernel_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">regularizers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">L1</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">kernel_regularizer_value</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">elif</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">kernel_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">regularizers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">L2</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">kernel_regularizer_value</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">elif</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L1L2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">kernel_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">regularizers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">L1L2</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">kernel_regularizer_value</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">activity_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">None</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">activity_regularizer_value</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">activity_regularizer</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">values</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0.01</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.02</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.04</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.06</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.08</span><span style="color: #D8DEE9FF">])</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">activity_regularizer_type</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">values</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">[</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L1L2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">None</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">])</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L1</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">activity_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">regularizers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">L1</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">activity_regularizer_value</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">elif</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">activity_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">regularizers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">L2</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">activity_regularizer_value</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">elif</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">L1L2</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">activity_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">regularizers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">L1L2</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">activity_regularizer_value</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">for</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">range</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Int</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">layers</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">12</span><span style="color: #D8DEE9FF">)):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">model</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">add</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">Dense</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">units</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> [</span><span style="color: #B48EAD">50</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">60</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">70</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">80</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">,</span><span style="color: #B48EAD">90</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">100</span><span style="color: #D8DEE9FF">])</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">kernel_initializer</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">kernel_initializer</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> [</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">glorot_normal</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">glorot_uniform</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">he_normal</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">he_uniform</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">lecun_normal</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">lecun_uniform</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">random_normal</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF">])</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">kernel_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">kernel_regularizer</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">activity_regularizer</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">activity_regularizer</span></span>
<span class="line"><span style="color: #D8DEE9FF">        ))</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">not</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Boolean</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">do_batch_norm_after_dropout</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Boolean</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">do_batch_norm_before_dropout</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">model</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">add</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">BatchNormalization</span><span style="color: #D8DEE9FF">())</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">model</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">add</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">Activation</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">activation</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> [</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">elu</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">relu</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">selu</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">gelu</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">leaky_relu</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">swish</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF">])))</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">model</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">add</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">Dropout</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">dropout</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">values</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">0.0</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.1</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.15</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.25</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0.3</span><span style="color: #D8DEE9FF">])))</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">not</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Boolean</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">do_batch_norm_before_dropout</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">) </span><span style="color: #D8DEE9">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Boolean</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">do_batch_norm_after_dropout</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #D8DEE9">model</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">add</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">BatchNormalization</span><span style="color: #D8DEE9FF">())</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">model</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">add</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">Dense</span><span style="color: #D8DEE9FF">(</span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">))</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">model</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">compile</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">optimizer</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9">tf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">keras</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">optimizers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Adam</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">hp</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Choice</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">learning_rate</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">values</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">[</span><span style="color: #B48EAD">1e-2</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1e-4</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1e-5</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1e-6</span><span style="color: #D8DEE9FF">]))</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">loss</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">mean_squared_error</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">metrics</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">[</span><span style="color: #D8DEE9">tf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">keras</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">metrics</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">RootMeanSquaredError</span><span style="color: #D8DEE9FF">()])</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">model</span></span></code></pre></div>



<p></p>



<p>The best-performing number of layers was 8, and the number of neurons was 70. The model also liked a small dropout (0.1) and L1 regularization with a value of 0.01.</p>



<p>We used mean squared error as a target value.</p>



<p>Here are the results for this model:</p>



<figure class="wp-block-table"><table><tbody><tr><td>Model name</td><td>Mean Squared Error</td></tr><tr><td>Neural network conversion rate</td><td>38</td></tr></tbody></table><figcaption class="wp-element-caption">Table 4</figcaption></figure>



<h2 class="wp-block-heading">Ensemble model</h2>



<p>Finally, we decided to combine both models via a simple ensemble. We ran our data through both models and averaged the results. We got these results using this approach, which are slightly better than any of the individual ones.</p>



<figure class="wp-block-table"><table><tbody><tr><td>Model name</td><td>Mean Squared Error</td></tr><tr><td>Neural network conversion rate</td><td>36</td></tr></tbody></table><figcaption class="wp-element-caption">Table 5</figcaption></figure>



<h2 class="wp-block-heading">Results</h2>



<p>Our decision to push this model into production was not without its challenges. After a few weeks of A/B testing, we were thrilled to see a conversion rate increase of over 10% on several pages. However, we also encountered a roadblock on two pages, where the target customers had different tastes and needs. To address this, we had to find an alternative approach, which involved developing dedicated models for these pages.</p>



<p>Note: We initially received a single dataset without information on its collection process. For optimal results, it’s important to have separate datasets for different client pages, as preferences can vary significantly. Dedicated models for each page type can help achieve better conversion rates. Therefore, we delivered customized models to address these variations and improve overall performance.</p>
<p>The post <a href="https://tantusdata.com/insights/how-to-convince-ai-to-help-us-boost-our-profit/">How to convince AI to help us boost our profit</a> appeared first on <a href="https://tantusdata.com">TantusData</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
