sks01dev/Customer-Conversion-Prediction
1
1{2 "cells": [3 {4 "cell_type": "markdown",5 "id": "4458df13-d0f7-462e-bc80-42169bb1a62b",6 "metadata": {},7 "source": [8 "This is a starter notebook for an updated module 5 of ML Zoomcamp\n",9 "\n",10 "The code is based on the modules 3 and 4. We use the same dataset: [telco customer churn](https://www.kaggle.com/datasets/blastchar/telco-customer-churn)"11 ]12 },13 {14 "cell_type": "code",15 "execution_count": 1,16 "id": "a16177e8-cbd2-4088-9bb0-07a0cfb3eee6",17 "metadata": {},18 "outputs": [],19 "source": [20 "import pandas as pd\n",21 "import numpy as np\n",22 "import sklearn"23 ]24 },25 {26 "cell_type": "code",27 "execution_count": 2,28 "id": "498798c7-1848-47f0-9789-5881ae3658bd",29 "metadata": {},30 "outputs": [31 {32 "name": "stdout",33 "output_type": "stream",34 "text": [35 "pandas==2.3.1\n",36 "numpy==2.3.1\n",37 "sklearn==1.7.0\n"38 ]39 }40 ],41 "source": [42 "print(f'pandas=={pd.__version__}')\n",43 "print(f'numpy=={np.__version__}')\n",44 "print(f'sklearn=={sklearn.__version__}')"45 ]46 },47 {48 "cell_type": "code",49 "execution_count": 4,50 "id": "e9e9464c-d8ed-45ea-9e8c-70e6d73842f7",51 "metadata": {},52 "outputs": [],53 "source": [54 "# Import the necessary libraries\n",55 "import numpy as np\n",56 "import pandas as pd\n",57 "from sklearn.linear_model import LogisticRegression\n",58 "from sklearn.pipeline import make_pipeline\n",59 "from sklearn.feature_extraction import DictVectorizer"60 ]61 },62 {63 "cell_type": "code",64 "execution_count": 8,65 "id": "54ff5e16-47a9-43ab-975b-37605ee75d19",66 "metadata": {67 "scrolled": true68 },69 "outputs": [70 {71 "data": {72 "text/html": [73 "<div>\n",74 "<style scoped>\n",75 " .dataframe tbody tr th:only-of-type {\n",76 " vertical-align: middle;\n",77 " }\n",78 "\n",79 " .dataframe tbody tr th {\n",80 " vertical-align: top;\n",81 " }\n",82 "\n",83 " .dataframe thead th {\n",84 " text-align: right;\n",85 " }\n",86 "</style>\n",87 "<table border=\"1\" class=\"dataframe\">\n",88 " <thead>\n",89 " <tr style=\"text-align: right;\">\n",90 " <th></th>\n",91 " <th>lead_source</th>\n",92 " <th>industry</th>\n",93 " <th>number_of_courses_viewed</th>\n",94 " <th>annual_income</th>\n",95 " <th>employment_status</th>\n",96 " <th>location</th>\n",97 " <th>interaction_count</th>\n",98 " <th>lead_score</th>\n",99 " <th>converted</th>\n",100 " </tr>\n",101 " </thead>\n",102 " <tbody>\n",103 " <tr>\n",104 " <th>0</th>\n",105 " <td>paid_ads</td>\n",106 " <td>NaN</td>\n",107 " <td>1</td>\n",108 " <td>79450.0</td>\n",109 " <td>unemployed</td>\n",110 " <td>south_america</td>\n",111 " <td>4</td>\n",112 " <td>0.94</td>\n",113 " <td>1</td>\n",114 " </tr>\n",115 " <tr>\n",116 " <th>1</th>\n",117 " <td>social_media</td>\n",118 " <td>retail</td>\n",119 " <td>1</td>\n",120 " <td>46992.0</td>\n",121 " <td>employed</td>\n",122 " <td>south_america</td>\n",123 " <td>1</td>\n",124 " <td>0.80</td>\n",125 " <td>0</td>\n",126 " </tr>\n",127 " <tr>\n",128 " <th>2</th>\n",129 " <td>events</td>\n",130 " <td>healthcare</td>\n",131 " <td>5</td>\n",132 " <td>78796.0</td>\n",133 " <td>unemployed</td>\n",134 " <td>australia</td>\n",135 " <td>3</td>\n",136 " <td>0.69</td>\n",137 " <td>1</td>\n",138 " </tr>\n",139 " <tr>\n",140 " <th>3</th>\n",141 " <td>paid_ads</td>\n",142 " <td>retail</td>\n",143 " <td>2</td>\n",144 " <td>83843.0</td>\n",145 " <td>NaN</td>\n",146 " <td>australia</td>\n",147 " <td>1</td>\n",148 " <td>0.87</td>\n",149 " <td>0</td>\n",150 " </tr>\n",151 " <tr>\n",152 " <th>4</th>\n",153 " <td>referral</td>\n",154 " <td>education</td>\n",155 " <td>3</td>\n",156 " <td>85012.0</td>\n",157 " <td>self_employed</td>\n",158 " <td>europe</td>\n",159 " <td>3</td>\n",160 " <td>0.62</td>\n",161 " <td>1</td>\n",162 " </tr>\n",163 " </tbody>\n",164 "</table>\n",165 "</div>"166 ],167 "text/plain": [168 " lead_source industry number_of_courses_viewed annual_income \\\n",169 "0 paid_ads NaN 1 79450.0 \n",170 "1 social_media retail 1 46992.0 \n",171 "2 events healthcare 5 78796.0 \n",172 "3 paid_ads retail 2 83843.0 \n",173 "4 referral education 3 85012.0 \n",174 "\n",175 " employment_status location interaction_count lead_score converted \n",176 "0 unemployed south_america 4 0.94 1 \n",177 "1 employed south_america 1 0.80 0 \n",178 "2 unemployed australia 3 0.69 1 \n",179 "3 NaN australia 1 0.87 0 \n",180 "4 self_employed europe 3 0.62 1 "181 ]182 },183 "execution_count": 8,184 "metadata": {},185 "output_type": "execute_result"186 }187 ],188 "source": [189 "# Load the data\n",190 "data_url = \"https://raw.githubusercontent.com/alexeygrigorev/datasets/master/course_lead_scoring.csv\"\n",191 "df = pd.read_csv(data_url)\n",192 "df.head()"193 ]194 },195 {196 "cell_type": "code",197 "execution_count": 11,198 "id": "963e0b2c-5d60-4d8a-a216-00cb869d516d",199 "metadata": {},200 "outputs": [],201 "source": [202 "# the target variable\n",203 "y_train = df.converted"204 ]205 },206 {207 "cell_type": "code",208 "execution_count": 14,209 "id": "692ae989-fb9a-4219-9a01-18424176748d",210 "metadata": {},211 "outputs": [212 {213 "data": {214 "text/html": [215 "<style>#sk-container-id-2 {\n",216 " /* Definition of color scheme common for light and dark mode */\n",217 " --sklearn-color-text: #000;\n",218 " --sklearn-color-text-muted: #666;\n",219 " --sklearn-color-line: gray;\n",220 " /* Definition of color scheme for unfitted estimators */\n",221 " --sklearn-color-unfitted-level-0: #fff5e6;\n",222 " --sklearn-color-unfitted-level-1: #f6e4d2;\n",223 " --sklearn-color-unfitted-level-2: #ffe0b3;\n",224 " --sklearn-color-unfitted-level-3: chocolate;\n",225 " /* Definition of color scheme for fitted estimators */\n",226 " --sklearn-color-fitted-level-0: #f0f8ff;\n",227 " --sklearn-color-fitted-level-1: #d4ebff;\n",228 " --sklearn-color-fitted-level-2: #b3dbfd;\n",229 " --sklearn-color-fitted-level-3: cornflowerblue;\n",230 "\n",231 " /* Specific color for light theme */\n",232 " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",233 " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",234 " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",235 " --sklearn-color-icon: #696969;\n",236 "\n",237 " @media (prefers-color-scheme: dark) {\n",238 " /* Redefinition of color scheme for dark theme */\n",239 " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",240 " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",241 " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",242 " --sklearn-color-icon: #878787;\n",243 " }\n",244 "}\n",245 "\n",246 "#sk-container-id-2 {\n",247 " color: var(--sklearn-color-text);\n",248 "}\n",249 "\n",250 "#sk-container-id-2 pre {\n",251 " padding: 0;\n",252 "}\n",253 "\n",254 "#sk-container-id-2 input.sk-hidden--visually {\n",255 " border: 0;\n",256 " clip: rect(1px 1px 1px 1px);\n",257 " clip: rect(1px, 1px, 1px, 1px);\n",258 " height: 1px;\n",259 " margin: -1px;\n",260 " overflow: hidden;\n",261 " padding: 0;\n",262 " position: absolute;\n",263 " width: 1px;\n",264 "}\n",265 "\n",266 "#sk-container-id-2 div.sk-dashed-wrapped {\n",267 " border: 1px dashed var(--sklearn-color-line);\n",268 " margin: 0 0.4em 0.5em 0.4em;\n",269 " box-sizing: border-box;\n",270 " padding-bottom: 0.4em;\n",271 " background-color: var(--sklearn-color-background);\n",272 "}\n",273 "\n",274 "#sk-container-id-2 div.sk-container {\n",275 " /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",276 " but bootstrap.min.css set `[hidden] { display: none !important; }`\n",277 " so we also need the `!important` here to be able to override the\n",278 " default hidden behavior on the sphinx rendered scikit-learn.org.\n",279 " See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",280 " display: inline-block !important;\n",281 " position: relative;\n",282 "}\n",283 "\n",284 "#sk-container-id-2 div.sk-text-repr-fallback {\n",285 " display: none;\n",286 "}\n",287 "\n",288 "div.sk-parallel-item,\n",289 "div.sk-serial,\n",290 "div.sk-item {\n",291 " /* draw centered vertical line to link estimators */\n",292 " background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",293 " background-size: 2px 100%;\n",294 " background-repeat: no-repeat;\n",295 " background-position: center center;\n",296 "}\n",297 "\n",298 "/* Parallel-specific style estimator block */\n",299 "\n",300 "#sk-container-id-2 div.sk-parallel-item::after {\n",301 " content: \"\";\n",302 " width: 100%;\n",303 " border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",304 " flex-grow: 1;\n",305 "}\n",306 "\n",307 "#sk-container-id-2 div.sk-parallel {\n",308 " display: flex;\n",309 " align-items: stretch;\n",310 " justify-content: center;\n",311 " background-color: var(--sklearn-color-background);\n",312 " position: relative;\n",313 "}\n",314 "\n",315 "#sk-container-id-2 div.sk-parallel-item {\n",316 " display: flex;\n",317 " flex-direction: column;\n",318 "}\n",319 "\n",320 "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",321 " align-self: flex-end;\n",322 " width: 50%;\n",323 "}\n",324 "\n",325 "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",326 " align-self: flex-start;\n",327 " width: 50%;\n",328 "}\n",329 "\n",330 "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",331 " width: 0;\n",332 "}\n",333 "\n",334 "/* Serial-specific style estimator block */\n",335 "\n",336 "#sk-container-id-2 div.sk-serial {\n",337 " display: flex;\n",338 " flex-direction: column;\n",339 " align-items: center;\n",340 " background-color: var(--sklearn-color-background);\n",341 " padding-right: 1em;\n",342 " padding-left: 1em;\n",343 "}\n",344 "\n",345 "\n",346 "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",347 "clickable and can be expanded/collapsed.\n",348 "- Pipeline and ColumnTransformer use this feature and define the default style\n",349 "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",350 "*/\n",351 "\n",352 "/* Pipeline and ColumnTransformer style (default) */\n",353 "\n",354 "#sk-container-id-2 div.sk-toggleable {\n",355 " /* Default theme specific background. It is overwritten whether we have a\n",356 " specific estimator or a Pipeline/ColumnTransformer */\n",357 " background-color: var(--sklearn-color-background);\n",358 "}\n",359 "\n",360 "/* Toggleable label */\n",361 "#sk-container-id-2 label.sk-toggleable__label {\n",362 " cursor: pointer;\n",363 " display: flex;\n",364 " width: 100%;\n",365 " margin-bottom: 0;\n",366 " padding: 0.5em;\n",367 " box-sizing: border-box;\n",368 " text-align: center;\n",369 " align-items: start;\n",370 " justify-content: space-between;\n",371 " gap: 0.5em;\n",372 "}\n",373 "\n",374 "#sk-container-id-2 label.sk-toggleable__label .caption {\n",375 " font-size: 0.6rem;\n",376 " font-weight: lighter;\n",377 " color: var(--sklearn-color-text-muted);\n",378 "}\n",379 "\n",380 "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",381 " /* Arrow on the left of the label */\n",382 " content: \"▸\";\n",383 " float: left;\n",384 " margin-right: 0.25em;\n",385 " color: var(--sklearn-color-icon);\n",386 "}\n",387 "\n",388 "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",389 " color: var(--sklearn-color-text);\n",390 "}\n",391 "\n",392 "/* Toggleable content - dropdown */\n",393 "\n",394 "#sk-container-id-2 div.sk-toggleable__content {\n",395 " display: none;\n",396 " text-align: left;\n",397 " /* unfitted */\n",398 " background-color: var(--sklearn-color-unfitted-level-0);\n",399 "}\n",400 "\n",401 "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",402 " /* fitted */\n",403 " background-color: var(--sklearn-color-fitted-level-0);\n",404 "}\n",405 "\n",406 "#sk-container-id-2 div.sk-toggleable__content pre {\n",407 " margin: 0.2em;\n",408 " border-radius: 0.25em;\n",409 " color: var(--sklearn-color-text);\n",410 " /* unfitted */\n",411 " background-color: var(--sklearn-color-unfitted-level-0);\n",412 "}\n",413 "\n",414 "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",415 " /* unfitted */\n",416 " background-color: var(--sklearn-color-fitted-level-0);\n",417 "}\n",418 "\n",419 "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",420 " /* Expand drop-down */\n",421 " display: block;\n",422 " width: 100%;\n",423 " overflow: visible;\n",424 "}\n",425 "\n",426 "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",427 " content: \"▾\";\n",428 "}\n",429 "\n",430 "/* Pipeline/ColumnTransformer-specific style */\n",431 "\n",432 "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",433 " color: var(--sklearn-color-text);\n",434 " background-color: var(--sklearn-color-unfitted-level-2);\n",435 "}\n",436 "\n",437 "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",438 " background-color: var(--sklearn-color-fitted-level-2);\n",439 "}\n",440 "\n",441 "/* Estimator-specific style */\n",442 "\n",443 "/* Colorize estimator box */\n",444 "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",445 " /* unfitted */\n",446 " background-color: var(--sklearn-color-unfitted-level-2);\n",447 "}\n",448 "\n",449 "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",450 " /* fitted */\n",451 " background-color: var(--sklearn-color-fitted-level-2);\n",452 "}\n",453 "\n",454 "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",455 "#sk-container-id-2 div.sk-label label {\n",456 " /* The background is the default theme color */\n",457 " color: var(--sklearn-color-text-on-default-background);\n",458 "}\n",459 "\n",460 "/* On hover, darken the color of the background */\n",461 "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",462 " color: var(--sklearn-color-text);\n",463 " background-color: var(--sklearn-color-unfitted-level-2);\n",464 "}\n",465 "\n",466 "/* Label box, darken color on hover, fitted */\n",467 "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",468 " color: var(--sklearn-color-text);\n",469 " background-color: var(--sklearn-color-fitted-level-2);\n",470 "}\n",471 "\n",472 "/* Estimator label */\n",473 "\n",474 "#sk-container-id-2 div.sk-label label {\n",475 " font-family: monospace;\n",476 " font-weight: bold;\n",477 " display: inline-block;\n",478 " line-height: 1.2em;\n",479 "}\n",480 "\n",481 "#sk-container-id-2 div.sk-label-container {\n",482 " text-align: center;\n",483 "}\n",484 "\n",485 "/* Estimator-specific */\n",486 "#sk-container-id-2 div.sk-estimator {\n",487 " font-family: monospace;\n",488 " border: 1px dotted var(--sklearn-color-border-box);\n",489 " border-radius: 0.25em;\n",490 " box-sizing: border-box;\n",491 " margin-bottom: 0.5em;\n",492 " /* unfitted */\n",493 " background-color: var(--sklearn-color-unfitted-level-0);\n",494 "}\n",495 "\n",496 "#sk-container-id-2 div.sk-estimator.fitted {\n",497 " /* fitted */\n",498 " background-color: var(--sklearn-color-fitted-level-0);\n",499 "}\n",500 "\n",501 "/* on hover */\n",502 "#sk-container-id-2 div.sk-estimator:hover {\n",503 " /* unfitted */\n",504 " background-color: var(--sklearn-color-unfitted-level-2);\n",505 "}\n",506 "\n",507 "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",508 " /* fitted */\n",509 " background-color: var(--sklearn-color-fitted-level-2);\n",510 "}\n",511 "\n",512 "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",513 "\n",514 "/* Common style for \"i\" and \"?\" */\n",515 "\n",516 ".sk-estimator-doc-link,\n",517 "a:link.sk-estimator-doc-link,\n",518 "a:visited.sk-estimator-doc-link {\n",519 " float: right;\n",520 " font-size: smaller;\n",521 " line-height: 1em;\n",522 " font-family: monospace;\n",523 " background-color: var(--sklearn-color-background);\n",524 " border-radius: 1em;\n",525 " height: 1em;\n",526 " width: 1em;\n",527 " text-decoration: none !important;\n",528 " margin-left: 0.5em;\n",529 " text-align: center;\n",530 " /* unfitted */\n",531 " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",532 " color: var(--sklearn-color-unfitted-level-1);\n",533 "}\n",534 "\n",535 ".sk-estimator-doc-link.fitted,\n",536 "a:link.sk-estimator-doc-link.fitted,\n",537 "a:visited.sk-estimator-doc-link.fitted {\n",538 " /* fitted */\n",539 " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",540 " color: var(--sklearn-color-fitted-level-1);\n",541 "}\n",542 "\n",543 "/* On hover */\n",544 "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",545 ".sk-estimator-doc-link:hover,\n",546 "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",547 ".sk-estimator-doc-link:hover {\n",548 " /* unfitted */\n",549 " background-color: var(--sklearn-color-unfitted-level-3);\n",550 " color: var(--sklearn-color-background);\n",551 " text-decoration: none;\n",552 "}\n",553 "\n",554 "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",555 ".sk-estimator-doc-link.fitted:hover,\n",556 "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",557 ".sk-estimator-doc-link.fitted:hover {\n",558 " /* fitted */\n",559 " background-color: var(--sklearn-color-fitted-level-3);\n",560 " color: var(--sklearn-color-background);\n",561 " text-decoration: none;\n",562 "}\n",563 "\n",564 "/* Span, style for the box shown on hovering the info icon */\n",565 ".sk-estimator-doc-link span {\n",566 " display: none;\n",567 " z-index: 9999;\n",568 " position: relative;\n",569 " font-weight: normal;\n",570 " right: .2ex;\n",571 " padding: .5ex;\n",572 " margin: .5ex;\n",573 " width: min-content;\n",574 " min-width: 20ex;\n",575 " max-width: 50ex;\n",576 " color: var(--sklearn-color-text);\n",577 " box-shadow: 2pt 2pt 4pt #999;\n",578 " /* unfitted */\n",579 " background: var(--sklearn-color-unfitted-level-0);\n",580 " border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",581 "}\n",582 "\n",583 ".sk-estimator-doc-link.fitted span {\n",584 " /* fitted */\n",585 " background: var(--sklearn-color-fitted-level-0);\n",586 " border: var(--sklearn-color-fitted-level-3);\n",587 "}\n",588 "\n",589 ".sk-estimator-doc-link:hover span {\n",590 " display: block;\n",591 "}\n",592 "\n",593 "/* \"?\"-specific style due to the `<a>` HTML tag */\n",594 "\n",595 "#sk-container-id-2 a.estimator_doc_link {\n",596 " float: right;\n",597 " font-size: 1rem;\n",598 " line-height: 1em;\n",599 " font-family: monospace;\n",600 " background-color: var(--sklearn-color-background);\n",601 " border-radius: 1rem;\n",602 " height: 1rem;\n",603 " width: 1rem;\n",604 " text-decoration: none;\n",605 " /* unfitted */\n",606 " color: var(--sklearn-color-unfitted-level-1);\n",607 " border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",608 "}\n",609 "\n",610 "#sk-container-id-2 a.estimator_doc_link.fitted {\n",611 " /* fitted */\n",612 " border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",613 " color: var(--sklearn-color-fitted-level-1);\n",614 "}\n",615 "\n",616 "/* On hover */\n",617 "#sk-container-id-2 a.estimator_doc_link:hover {\n",618 " /* unfitted */\n",619 " background-color: var(--sklearn-color-unfitted-level-3);\n",620 " color: var(--sklearn-color-background);\n",621 " text-decoration: none;\n",622 "}\n",623 "\n",624 "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",625 " /* fitted */\n",626 " background-color: var(--sklearn-color-fitted-level-3);\n",627 "}\n",628 "\n",629 ".estimator-table summary {\n",630 " padding: .5rem;\n",631 " font-family: monospace;\n",632 " cursor: pointer;\n",633 "}\n",634 "\n",635 ".estimator-table details[open] {\n",636 " padding-left: 0.1rem;\n",637 " padding-right: 0.1rem;\n",638 " padding-bottom: 0.3rem;\n",639 "}\n",640 "\n",641 ".estimator-table .parameters-table {\n",642 " margin-left: auto !important;\n",643 " margin-right: auto !important;\n",644 "}\n",645 "\n",646 ".estimator-table .parameters-table tr:nth-child(odd) {\n",647 " background-color: #fff;\n",648 "}\n",649 "\n",650 ".estimator-table .parameters-table tr:nth-child(even) {\n",651 " background-color: #f6f6f6;\n",652 "}\n",653 "\n",654 ".estimator-table .parameters-table tr:hover {\n",655 " background-color: #e0e0e0;\n",656 "}\n",657 "\n",658 ".estimator-table table td {\n",659 " border: 1px solid rgba(106, 105, 104, 0.232);\n",660 "}\n",661 "\n",662 ".user-set td {\n",663 " color:rgb(255, 94, 0);\n",664 " text-align: left;\n",665 "}\n",666 "\n",667 ".user-set td.value pre {\n",668 " color:rgb(255, 94, 0) !important;\n",669 " background-color: transparent !important;\n",670 "}\n",671 "\n",672 ".default td {\n",673 " color: black;\n",674 " text-align: left;\n",675 "}\n",676 "\n",677 ".user-set td i,\n",678 ".default td i {\n",679 " color: black;\n",680 "}\n",681 "\n",682 ".copy-paste-icon {\n",683 " background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",684 " background-repeat: no-repeat;\n",685 " background-size: 14px 14px;\n",686 " background-position: 0;\n",687 " display: inline-block;\n",688 " width: 14px;\n",689 " height: 14px;\n",690 " cursor: pointer;\n",691 "}\n",692 "</style><body><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[('dictvectorizer', DictVectorizer()),\n",693 " ('logisticregression', LogisticRegression(solver='liblinear'))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-4\" type=\"checkbox\" ><label for=\"sk-estimator-id-4\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>Pipeline</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",694 " <div class=\"estimator-table\">\n",695 " <details>\n",696 " <summary>Parameters</summary>\n",697 " <table class=\"parameters-table\">\n",698 " <tbody>\n",699 " \n",700 " <tr class=\"user-set\">\n",701 " <td><i class=\"copy-paste-icon\"\n",702 " onclick=\"copyToClipboard('steps',\n",703 " this.parentElement.nextElementSibling)\"\n",704 " ></i></td>\n",705 " <td class=\"param\">steps </td>\n",706 " <td class=\"value\">[('dictvectorizer', ...), ('logisticregression', ...)]</td>\n",707 " </tr>\n",708 " \n",709 "\n",710 " <tr class=\"default\">\n",711 " <td><i class=\"copy-paste-icon\"\n",712 " onclick=\"copyToClipboard('transform_input',\n",713 " this.parentElement.nextElementSibling)\"\n",714 " ></i></td>\n",715 " <td class=\"param\">transform_input </td>\n",716 " <td class=\"value\">None</td>\n",717 " </tr>\n",718 " \n",719 "\n",720 " <tr class=\"default\">\n",721 " <td><i class=\"copy-paste-icon\"\n",722 " onclick=\"copyToClipboard('memory',\n",723 " this.parentElement.nextElementSibling)\"\n",724 " ></i></td>\n",725 " <td class=\"param\">memory </td>\n",726 " <td class=\"value\">None</td>\n",727 " </tr>\n",728 " \n",729 "\n",730 " <tr class=\"default\">\n",731 " <td><i class=\"copy-paste-icon\"\n",732 " onclick=\"copyToClipboard('verbose',\n",733 " this.parentElement.nextElementSibling)\"\n",734 " ></i></td>\n",735 " <td class=\"param\">verbose </td>\n",736 " <td class=\"value\">False</td>\n",737 " </tr>\n",738 " \n",739 " </tbody>\n",740 " </table>\n",741 " </details>\n",742 " </div>\n",743 " </div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-5\" type=\"checkbox\" ><label for=\"sk-estimator-id-5\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>DictVectorizer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.feature_extraction.DictVectorizer.html\">?<span>Documentation for DictVectorizer</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"dictvectorizer__\">\n",744 " <div class=\"estimator-table\">\n",745 " <details>\n",746 " <summary>Parameters</summary>\n",747 " <table class=\"parameters-table\">\n",748 " <tbody>\n",749 " \n",750 " <tr class=\"default\">\n",751 " <td><i class=\"copy-paste-icon\"\n",752 " onclick=\"copyToClipboard('dtype',\n",753 " this.parentElement.nextElementSibling)\"\n",754 " ></i></td>\n",755 " <td class=\"param\">dtype </td>\n",756 " <td class=\"value\"><class 'numpy.float64'></td>\n",757 " </tr>\n",758 " \n",759 "\n",760 " <tr class=\"default\">\n",761 " <td><i class=\"copy-paste-icon\"\n",762 " onclick=\"copyToClipboard('separator',\n",763 " this.parentElement.nextElementSibling)\"\n",764 " ></i></td>\n",765 " <td class=\"param\">separator </td>\n",766 " <td class=\"value\">'='</td>\n",767 " </tr>\n",768 " \n",769 "\n",770 " <tr class=\"default\">\n",771 " <td><i class=\"copy-paste-icon\"\n",772 " onclick=\"copyToClipboard('sparse',\n",773 " this.parentElement.nextElementSibling)\"\n",774 " ></i></td>\n",775 " <td class=\"param\">sparse </td>\n",776 " <td class=\"value\">True</td>\n",777 " </tr>\n",778 " \n",779 "\n",780 " <tr class=\"default\">\n",781 " <td><i class=\"copy-paste-icon\"\n",782 " onclick=\"copyToClipboard('sort',\n",783 " this.parentElement.nextElementSibling)\"\n",784 " ></i></td>\n",785 " <td class=\"param\">sort </td>\n",786 " <td class=\"value\">True</td>\n",787 " </tr>\n",788 " \n",789 " </tbody>\n",790 " </table>\n",791 " </details>\n",792 " </div>\n",793 " </div></div></div><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-6\" type=\"checkbox\" ><label for=\"sk-estimator-id-6\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LogisticRegression</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.7/modules/generated/sklearn.linear_model.LogisticRegression.html\">?<span>Documentation for LogisticRegression</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"logisticregression__\">\n",794 " <div class=\"estimator-table\">\n",795 " <details>\n",796 " <summary>Parameters</summary>\n",797 " <table class=\"parameters-table\">\n",798 " <tbody>\n",799 " \n",800 " <tr class=\"default\">\n",801 " <td><i class=\"copy-paste-icon\"\n",802 " onclick=\"copyToClipboard('penalty',\n",803 " this.parentElement.nextElementSibling)\"\n",804 " ></i></td>\n",805 " <td class=\"param\">penalty </td>\n",806 " <td class=\"value\">'l2'</td>\n",807 " </tr>\n",808 " \n",809 "\n",810 " <tr class=\"default\">\n",811 " <td><i class=\"copy-paste-icon\"\n",812 " onclick=\"copyToClipboard('dual',\n",813 " this.parentElement.nextElementSibling)\"\n",814 " ></i></td>\n",815 " <td class=\"param\">dual </td>\n",816 " <td class=\"value\">False</td>\n",817 " </tr>\n",818 " \n",819 "\n",820 " <tr class=\"default\">\n",821 " <td><i class=\"copy-paste-icon\"\n",822 " onclick=\"copyToClipboard('tol',\n",823 " this.parentElement.nextElementSibling)\"\n",824 " ></i></td>\n",825 " <td class=\"param\">tol </td>\n",826 " <td class=\"value\">0.0001</td>\n",827 " </tr>\n",828 " \n",829 "\n",830 " <tr class=\"default\">\n",831 " <td><i class=\"copy-paste-icon\"\n",832 " onclick=\"copyToClipboard('C',\n",833 " this.parentElement.nextElementSibling)\"\n",834 " ></i></td>\n",835 " <td class=\"param\">C </td>\n",836 " <td class=\"value\">1.0</td>\n",837 " </tr>\n",838 " \n",839 "\n",840 " <tr class=\"default\">\n",841 " <td><i class=\"copy-paste-icon\"\n",842 " onclick=\"copyToClipboard('fit_intercept',\n",843 " this.parentElement.nextElementSibling)\"\n",844 " ></i></td>\n",845 " <td class=\"param\">fit_intercept </td>\n",846 " <td class=\"value\">True</td>\n",847 " </tr>\n",848 " \n",849 "\n",850 " <tr class=\"default\">\n",851 " <td><i class=\"copy-paste-icon\"\n",852 " onclick=\"copyToClipboard('intercept_scaling',\n",853 " this.parentElement.nextElementSibling)\"\n",854 " ></i></td>\n",855 " <td class=\"param\">intercept_scaling </td>\n",856 " <td class=\"value\">1</td>\n",857 " </tr>\n",858 " \n",859 "\n",860 " <tr class=\"default\">\n",861 " <td><i class=\"copy-paste-icon\"\n",862 " onclick=\"copyToClipboard('class_weight',\n",863 " this.parentElement.nextElementSibling)\"\n",864 " ></i></td>\n",865 " <td class=\"param\">class_weight </td>\n",866 " <td class=\"value\">None</td>\n",867 " </tr>\n",868 " \n",869 "\n",870 " <tr class=\"default\">\n",871 " <td><i class=\"copy-paste-icon\"\n",872 " onclick=\"copyToClipboard('random_state',\n",873 " this.parentElement.nextElementSibling)\"\n",874 " ></i></td>\n",875 " <td class=\"param\">random_state </td>\n",876 " <td class=\"value\">None</td>\n",877 " </tr>\n",878 " \n",879 "\n",880 " <tr class=\"user-set\">\n",881 " <td><i class=\"copy-paste-icon\"\n",882 " onclick=\"copyToClipboard('solver',\n",883 " this.parentElement.nextElementSibling)\"\n",884 " ></i></td>\n",885 " <td class=\"param\">solver </td>\n",886 " <td class=\"value\">'liblinear'</td>\n",887 " </tr>\n",888 " \n",889 "\n",890 " <tr class=\"default\">\n",891 " <td><i class=\"copy-paste-icon\"\n",892 " onclick=\"copyToClipboard('max_iter',\n",893 " this.parentElement.nextElementSibling)\"\n",894 " ></i></td>\n",895 " <td class=\"param\">max_iter </td>\n",896 " <td class=\"value\">100</td>\n",897 " </tr>\n",898 " \n",899 "\n",900 " <tr class=\"default\">\n",901 " <td><i class=\"copy-paste-icon\"\n",902 " onclick=\"copyToClipboard('multi_class',\n",903 " this.parentElement.nextElementSibling)\"\n",904 " ></i></td>\n",905 " <td class=\"param\">multi_class </td>\n",906 " <td class=\"value\">'deprecated'</td>\n",907 " </tr>\n",908 " \n",909 "\n",910 " <tr class=\"default\">\n",911 " <td><i class=\"copy-paste-icon\"\n",912 " onclick=\"copyToClipboard('verbose',\n",913 " this.parentElement.nextElementSibling)\"\n",914 " ></i></td>\n",915 " <td class=\"param\">verbose </td>\n",916 " <td class=\"value\">0</td>\n",917 " </tr>\n",918 " \n",919 "\n",920 " <tr class=\"default\">\n",921 " <td><i class=\"copy-paste-icon\"\n",922 " onclick=\"copyToClipboard('warm_start',\n",923 " this.parentElement.nextElementSibling)\"\n",924 " ></i></td>\n",925 " <td class=\"param\">warm_start </td>\n",926 " <td class=\"value\">False</td>\n",927 " </tr>\n",928 " \n",929 "\n",930 " <tr class=\"default\">\n",931 " <td><i class=\"copy-paste-icon\"\n",932 " onclick=\"copyToClipboard('n_jobs',\n",933 " this.parentElement.nextElementSibling)\"\n",934 " ></i></td>\n",935 " <td class=\"param\">n_jobs </td>\n",936 " <td class=\"value\">None</td>\n",937 " </tr>\n",938 " \n",939 "\n",940 " <tr class=\"default\">\n",941 " <td><i class=\"copy-paste-icon\"\n",942 " onclick=\"copyToClipboard('l1_ratio',\n",943 " this.parentElement.nextElementSibling)\"\n",944 " ></i></td>\n",945 " <td class=\"param\">l1_ratio </td>\n",946 " <td class=\"value\">None</td>\n",947 " </tr>\n",948 " \n",949 " </tbody>\n",950 " </table>\n",951 " </details>\n",952 " </div>\n",953 " </div></div></div></div></div></div></div><script>function copyToClipboard(text, element) {\n",954 " // Get the parameter prefix from the closest toggleable content\n",955 " const toggleableContent = element.closest('.sk-toggleable__content');\n",956 " const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",957 " const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",958 "\n",959 " const originalStyle = element.style;\n",960 " const computedStyle = window.getComputedStyle(element);\n",961 " const originalWidth = computedStyle.width;\n",962 " const originalHTML = element.innerHTML.replace('Copied!', '');\n",963 "\n",964 " navigator.clipboard.writeText(fullParamName)\n",965 " .then(() => {\n",966 " element.style.width = originalWidth;\n",967 " element.style.color = 'green';\n",968 " element.innerHTML = \"Copied!\";\n",969 "\n",970 " setTimeout(() => {\n",971 " element.innerHTML = originalHTML;\n",972 " element.style = originalStyle;\n",973 " }, 2000);\n",974 " })\n",975 " .catch(err => {\n",976 " console.error('Failed to copy:', err);\n",977 " element.style.color = 'red';\n",978 " element.innerHTML = \"Failed!\";\n",979 " setTimeout(() => {\n",980 " element.innerHTML = originalHTML;\n",981 " element.style = originalStyle;\n",982 " }, 2000);\n",983 " });\n",984 " return false;\n",985 "}\n",986 "\n",987 "document.querySelectorAll('.fa-regular.fa-copy').forEach(function(element) {\n",988 " const toggleableContent = element.closest('.sk-toggleable__content');\n",989 " const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",990 " const paramName = element.parentElement.nextElementSibling.textContent.trim();\n",991 " const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",992 "\n",993 " element.setAttribute('title', fullParamName);\n",994 "});\n",995 "</script></body>"996 ],997 "text/plain": [998 "Pipeline(steps=[('dictvectorizer', DictVectorizer()),\n",999 " ('logisticregression', LogisticRegression(solver='liblinear'))])"1000 ]1001 },1002 "execution_count": 14,1003 "metadata": {},1004 "output_type": "execute_result"1005 }1006 ],1007 "source": [1008 "# Preprocessing using DictVectorizer and Training the model \n",1009 "categorical = ['lead_source']\n",1010 "numeric = ['number_of_courses_viewed', 'annual_income']\n",1011 "\n",1012 "df[categorical] = df[categorical].fillna('NA')\n",1013 "df[numeric] = df[numeric].fillna(0)\n",1014 "\n",1015 "train_dict = df[categorical + numeric].to_dict(orient='records')\n",1016 "\n",1017 "pipeline = make_pipeline(\n",1018 " DictVectorizer(),\n",1019 " LogisticRegression(solver='liblinear')\n",1020 ")\n",1021 "\n",1022 "pipeline.fit(train_dict, y_train)"1023 ]1024 },1025 {1026 "cell_type": "code",1027 "execution_count": 15,1028 "id": "80f2002c-433b-4e77-9df7-965839859d4a",1029 "metadata": {},1030 "outputs": [1031 {1032 "data": {1033 "text/plain": [1034 "{'lead_source': 'paid_ads',\n",1035 " 'number_of_courses_viewed': 1,\n",1036 " 'annual_income': 79450.0}"1037 ]1038 },1039 "execution_count": 15,1040 "metadata": {},1041 "output_type": "execute_result"1042 }1043 ],1044 "source": [1045 "train_dict[0]"1046 ]1047 },1048 {1049 "cell_type": "code",1050 "execution_count": 21,1051 "id": "7bbf2adb-11c4-4853-8f1b-fd22b5cf09b2",1052 "metadata": {},1053 "outputs": [1054 {1055 "data": {1056 "text/plain": [1057 "number_of_courses_viewed\n",1058 "1 417\n",1059 "2 388\n",1060 "3 269\n",1061 "0 181\n",1062 "4 109\n",1063 "5 67\n",1064 "6 22\n",1065 "7 6\n",1066 "8 2\n",1067 "9 1\n",1068 "Name: count, dtype: int64"1069 ]1070 },1071 "execution_count": 21,1072 "metadata": {},1073 "output_type": "execute_result"1074 }1075 ],1076 "source": [1077 "df.number_of_courses_viewed.value_counts()"1078 ]1079 },1080 {1081 "cell_type": "code",1082 "execution_count": 26,1083 "id": "5a613b8d-47bb-4e5a-8b80-117b49221d6c",1084 "metadata": {},1085 "outputs": [],1086 "source": [1087 "# sample customer data\n",1088 "customer = {\n",1089 " 'lead_source': 'organic_search',\n",1090 " 'number_of_courses_viewed': 3,\n",1091 " 'annual_income': 50450.0}"1092 ]1093 },1094 {1095 "cell_type": "code",1096 "execution_count": 28,1097 "id": "b91d20df-46a2-4580-9de0-f17d5bdc7f65",1098 "metadata": {},1099 "outputs": [1100 {1101 "data": {1102 "text/plain": [1103 "np.float64(0.6644010536277872)"1104 ]1105 },1106 "execution_count": 28,1107 "metadata": {},1108 "output_type": "execute_result"1109 }1110 ],1111 "source": [1112 "# probability of this customer to get converted\n",1113 "pipeline.predict_proba(customer)[0, 1] "1114 ]1115 },1116 {1117 "cell_type": "code",1118 "execution_count": 29,1119 "id": "96a4d3ac-d5e4-4890-a085-00298c231e28",1120 "metadata": {},1121 "outputs": [],1122 "source": [1123 "# save the model\n",1124 "import pickle\n",1125 "\n",1126 "with open('model.bin', 'wb') as f:\n",1127 " pickle.dump(pipeline, f)"1128 ]1129 },1130 {1131 "cell_type": "code",1132 "execution_count": 31,1133 "id": "7f99bdbb-1304-49e1-9f6f-fdc1fdcdba54",1134 "metadata": {},1135 "outputs": [],1136 "source": [1137 "# load the model\n",1138 "\n",1139 "with open('model.bin', 'rb') as f_in:\n",1140 " model = pickle.load(f_in)"1141 ]1142 },1143 {1144 "cell_type": "code",1145 "execution_count": 32,1146 "id": "0ac0af36-e4e8-475f-896d-645a63877aff",1147 "metadata": {},1148 "outputs": [1149 {1150 "data": {1151 "text/html": [1152 "<style>#sk-container-id-3 {\n",1153 " /* Definition of color scheme common for light and dark mode */\n",1154 " --sklearn-color-text: #000;\n",1155 " --sklearn-color-text-muted: #666;\n",1156 " --sklearn-color-line: gray;\n",1157 " /* Definition of color scheme for unfitted estimators */\n",1158 " --sklearn-color-unfitted-level-0: #fff5e6;\n",1159 " --sklearn-color-unfitted-level-1: #f6e4d2;\n",1160 " --sklearn-color-unfitted-level-2: #ffe0b3;\n",1161 " --sklearn-color-unfitted-level-3: chocolate;\n",1162 " /* Definition of color scheme for fitted estimators */\n",1163 " --sklearn-color-fitted-level-0: #f0f8ff;\n",1164 " --sklearn-color-fitted-level-1: #d4ebff;\n",1165 " --sklearn-color-fitted-level-2: #b3dbfd;\n",1166 " --sklearn-color-fitted-level-3: cornflowerblue;\n",1167 "\n",1168 " /* Specific color for light theme */\n",1169 " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",1170 " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",1171 " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",1172 " --sklearn-color-icon: #696969;\n",1173 "\n",1174 " @media (prefers-color-scheme: dark) {\n",1175 " /* Redefinition of color scheme for dark theme */\n",1176 " --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",1177 " --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",1178 " --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",1179 " --sklearn-color-icon: #878787;\n",1180 " }\n",1181 "}\n",1182 "\n",1183 "#sk-container-id-3 {\n",1184 " color: var(--sklearn-color-text);\n",1185 "}\n",1186 "\n",1187 "#sk-container-id-3 pre {\n",1188 " padding: 0;\n",1189 "}\n",1190 "\n",1191 "#sk-container-id-3 input.sk-hidden--visually {\n",1192 " border: 0;\n",1193 " clip: rect(1px 1px 1px 1px);\n",1194 " clip: rect(1px, 1px, 1px, 1px);\n",1195 " height: 1px;\n",1196 " margin: -1px;\n",1197 " overflow: hidden;\n",1198 " padding: 0;\n",1199 " position: absolute;\n",1200 " width: 1px;\n",