Project page: https://www.kaggle.com/c/tmdb-box-office-prediction/data
Data Download: https://www.kaggle.com/c/10300/download-all
*.png | |
test.csv | |
train.csv | |
sample_submission.csv | |
tmdb-box-office-prediction.zip |
Project page: https://www.kaggle.com/c/tmdb-box-office-prediction/data
Data Download: https://www.kaggle.com/c/10300/download-all
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 52, | |
"metadata": { | |
"_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", | |
"_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5" | |
}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"import numpy as np # linear algebra\n", | |
"import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n", | |
"from time import sleep\n", | |
"import urllib\n", | |
"from sklearn.linear_model import LinearRegression\n", | |
"from skimage.color import rgb2hsv\n", | |
"from skimage import data, segmentation, color\n", | |
"from skimage.future import graph\n", | |
"from skimage.io import imread\n", | |
"import dask.array as da\n", | |
"import dask.array.image\n", | |
"\n", | |
"# Any results you write to the current directory are saved as output.\n", | |
"base_img_url = \"http://image.tmdb.org/t/p/w185\"\n", | |
"# base_input = os.path.join('/', 'kaggle', 'input', 'tmdb-box-office-prediction')\n", | |
"base_input = '.'" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0", | |
"_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a" | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>id</th>\n", | |
" <th>belongs_to_collection</th>\n", | |
" <th>budget</th>\n", | |
" <th>genres</th>\n", | |
" <th>homepage</th>\n", | |
" <th>imdb_id</th>\n", | |
" <th>original_language</th>\n", | |
" <th>original_title</th>\n", | |
" <th>overview</th>\n", | |
" <th>popularity</th>\n", | |
" <th>...</th>\n", | |
" <th>release_date</th>\n", | |
" <th>runtime</th>\n", | |
" <th>spoken_languages</th>\n", | |
" <th>status</th>\n", | |
" <th>tagline</th>\n", | |
" <th>title</th>\n", | |
" <th>Keywords</th>\n", | |
" <th>cast</th>\n", | |
" <th>crew</th>\n", | |
" <th>revenue</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>[{'id': 313576, 'name': 'Hot Tub Time Machine ...</td>\n", | |
" <td>14000000</td>\n", | |
" <td>[{'id': 35, 'name': 'Comedy'}]</td>\n", | |
" <td>NaN</td>\n", | |
" <td>tt2637294</td>\n", | |
" <td>en</td>\n", | |
" <td>Hot Tub Time Machine 2</td>\n", | |
" <td>When Lou, who has become the \"father of the In...</td>\n", | |
" <td>6.575393</td>\n", | |
" <td>...</td>\n", | |
" <td>2/20/15</td>\n", | |
" <td>93.0</td>\n", | |
" <td>[{'iso_639_1': 'en', 'name': 'English'}]</td>\n", | |
" <td>Released</td>\n", | |
" <td>The Laws of Space and Time are About to be Vio...</td>\n", | |
" <td>Hot Tub Time Machine 2</td>\n", | |
" <td>[{'id': 4379, 'name': 'time travel'}, {'id': 9...</td>\n", | |
" <td>[{'cast_id': 4, 'character': 'Lou', 'credit_id...</td>\n", | |
" <td>[{'credit_id': '59ac067c92514107af02c8c8', 'de...</td>\n", | |
" <td>12314651</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2</td>\n", | |
" <td>[{'id': 107674, 'name': 'The Princess Diaries ...</td>\n", | |
" <td>40000000</td>\n", | |
" <td>[{'id': 35, 'name': 'Comedy'}, {'id': 18, 'nam...</td>\n", | |
" <td>NaN</td>\n", | |
" <td>tt0368933</td>\n", | |
" <td>en</td>\n", | |
" <td>The Princess Diaries 2: Royal Engagement</td>\n", | |
" <td>Mia Thermopolis is now a college graduate and ...</td>\n", | |
" <td>8.248895</td>\n", | |
" <td>...</td>\n", | |
" <td>8/6/04</td>\n", | |
" <td>113.0</td>\n", | |
" <td>[{'iso_639_1': 'en', 'name': 'English'}]</td>\n", | |
" <td>Released</td>\n", | |
" <td>It can take a lifetime to find true love; she'...</td>\n", | |
" <td>The Princess Diaries 2: Royal Engagement</td>\n", | |
" <td>[{'id': 2505, 'name': 'coronation'}, {'id': 42...</td>\n", | |
" <td>[{'cast_id': 1, 'character': 'Mia Thermopolis'...</td>\n", | |
" <td>[{'credit_id': '52fe43fe9251416c7502563d', 'de...</td>\n", | |
" <td>95149435</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>3</td>\n", | |
" <td>NaN</td>\n", | |
" <td>3300000</td>\n", | |
" <td>[{'id': 18, 'name': 'Drama'}]</td>\n", | |
" <td>http://sonyclassics.com/whiplash/</td>\n", | |
" <td>tt2582802</td>\n", | |
" <td>en</td>\n", | |
" <td>Whiplash</td>\n", | |
" <td>Under the direction of a ruthless instructor, ...</td>\n", | |
" <td>64.299990</td>\n", | |
" <td>...</td>\n", | |
" <td>10/10/14</td>\n", | |
" <td>105.0</td>\n", | |
" <td>[{'iso_639_1': 'en', 'name': 'English'}]</td>\n", | |
" <td>Released</td>\n", | |
" <td>The road to greatness can take you to the edge.</td>\n", | |
" <td>Whiplash</td>\n", | |
" <td>[{'id': 1416, 'name': 'jazz'}, {'id': 1523, 'n...</td>\n", | |
" <td>[{'cast_id': 5, 'character': 'Andrew Neimann',...</td>\n", | |
" <td>[{'credit_id': '54d5356ec3a3683ba0000039', 'de...</td>\n", | |
" <td>13092000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>4</td>\n", | |
" <td>NaN</td>\n", | |
" <td>1200000</td>\n", | |
" <td>[{'id': 53, 'name': 'Thriller'}, {'id': 18, 'n...</td>\n", | |
" <td>http://kahaanithefilm.com/</td>\n", | |
" <td>tt1821480</td>\n", | |
" <td>hi</td>\n", | |
" <td>Kahaani</td>\n", | |
" <td>Vidya Bagchi (Vidya Balan) arrives in Kolkata ...</td>\n", | |
" <td>3.174936</td>\n", | |
" <td>...</td>\n", | |
" <td>3/9/12</td>\n", | |
" <td>122.0</td>\n", | |
" <td>[{'iso_639_1': 'en', 'name': 'English'}, {'iso...</td>\n", | |
" <td>Released</td>\n", | |
" <td>NaN</td>\n", | |
" <td>Kahaani</td>\n", | |
" <td>[{'id': 10092, 'name': 'mystery'}, {'id': 1054...</td>\n", | |
" <td>[{'cast_id': 1, 'character': 'Vidya Bagchi', '...</td>\n", | |
" <td>[{'credit_id': '52fe48779251416c9108d6eb', 'de...</td>\n", | |
" <td>16000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>5</td>\n", | |
" <td>NaN</td>\n", | |
" <td>0</td>\n", | |
" <td>[{'id': 28, 'name': 'Action'}, {'id': 53, 'nam...</td>\n", | |
" <td>NaN</td>\n", | |
" <td>tt1380152</td>\n", | |
" <td>ko</td>\n", | |
" <td>마린보이</td>\n", | |
" <td>Marine Boy is the story of a former national s...</td>\n", | |
" <td>1.148070</td>\n", | |
" <td>...</td>\n", | |
" <td>2/5/09</td>\n", | |
" <td>118.0</td>\n", | |
" <td>[{'iso_639_1': 'ko', 'name': '한국어/조선말'}]</td>\n", | |
" <td>Released</td>\n", | |
" <td>NaN</td>\n", | |
" <td>Marine Boy</td>\n", | |
" <td>NaN</td>\n", | |
" <td>[{'cast_id': 3, 'character': 'Chun-soo', 'cred...</td>\n", | |
" <td>[{'credit_id': '52fe464b9251416c75073b43', 'de...</td>\n", | |
" <td>3923970</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>5 rows × 23 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" id belongs_to_collection budget \\\n", | |
"0 1 [{'id': 313576, 'name': 'Hot Tub Time Machine ... 14000000 \n", | |
"1 2 [{'id': 107674, 'name': 'The Princess Diaries ... 40000000 \n", | |
"2 3 NaN 3300000 \n", | |
"3 4 NaN 1200000 \n", | |
"4 5 NaN 0 \n", | |
"\n", | |
" genres \\\n", | |
"0 [{'id': 35, 'name': 'Comedy'}] \n", | |
"1 [{'id': 35, 'name': 'Comedy'}, {'id': 18, 'nam... \n", | |
"2 [{'id': 18, 'name': 'Drama'}] \n", | |
"3 [{'id': 53, 'name': 'Thriller'}, {'id': 18, 'n... \n", | |
"4 [{'id': 28, 'name': 'Action'}, {'id': 53, 'nam... \n", | |
"\n", | |
" homepage imdb_id original_language \\\n", | |
"0 NaN tt2637294 en \n", | |
"1 NaN tt0368933 en \n", | |
"2 http://sonyclassics.com/whiplash/ tt2582802 en \n", | |
"3 http://kahaanithefilm.com/ tt1821480 hi \n", | |
"4 NaN tt1380152 ko \n", | |
"\n", | |
" original_title \\\n", | |
"0 Hot Tub Time Machine 2 \n", | |
"1 The Princess Diaries 2: Royal Engagement \n", | |
"2 Whiplash \n", | |
"3 Kahaani \n", | |
"4 마린보이 \n", | |
"\n", | |
" overview popularity ... \\\n", | |
"0 When Lou, who has become the \"father of the In... 6.575393 ... \n", | |
"1 Mia Thermopolis is now a college graduate and ... 8.248895 ... \n", | |
"2 Under the direction of a ruthless instructor, ... 64.299990 ... \n", | |
"3 Vidya Bagchi (Vidya Balan) arrives in Kolkata ... 3.174936 ... \n", | |
"4 Marine Boy is the story of a former national s... 1.148070 ... \n", | |
"\n", | |
" release_date runtime spoken_languages \\\n", | |
"0 2/20/15 93.0 [{'iso_639_1': 'en', 'name': 'English'}] \n", | |
"1 8/6/04 113.0 [{'iso_639_1': 'en', 'name': 'English'}] \n", | |
"2 10/10/14 105.0 [{'iso_639_1': 'en', 'name': 'English'}] \n", | |
"3 3/9/12 122.0 [{'iso_639_1': 'en', 'name': 'English'}, {'iso... \n", | |
"4 2/5/09 118.0 [{'iso_639_1': 'ko', 'name': '한국어/조선말'}] \n", | |
"\n", | |
" status tagline \\\n", | |
"0 Released The Laws of Space and Time are About to be Vio... \n", | |
"1 Released It can take a lifetime to find true love; she'... \n", | |
"2 Released The road to greatness can take you to the edge. \n", | |
"3 Released NaN \n", | |
"4 Released NaN \n", | |
"\n", | |
" title \\\n", | |
"0 Hot Tub Time Machine 2 \n", | |
"1 The Princess Diaries 2: Royal Engagement \n", | |
"2 Whiplash \n", | |
"3 Kahaani \n", | |
"4 Marine Boy \n", | |
"\n", | |
" Keywords \\\n", | |
"0 [{'id': 4379, 'name': 'time travel'}, {'id': 9... \n", | |
"1 [{'id': 2505, 'name': 'coronation'}, {'id': 42... \n", | |
"2 [{'id': 1416, 'name': 'jazz'}, {'id': 1523, 'n... \n", | |
"3 [{'id': 10092, 'name': 'mystery'}, {'id': 1054... \n", | |
"4 NaN \n", | |
"\n", | |
" cast \\\n", | |
"0 [{'cast_id': 4, 'character': 'Lou', 'credit_id... \n", | |
"1 [{'cast_id': 1, 'character': 'Mia Thermopolis'... \n", | |
"2 [{'cast_id': 5, 'character': 'Andrew Neimann',... \n", | |
"3 [{'cast_id': 1, 'character': 'Vidya Bagchi', '... \n", | |
"4 [{'cast_id': 3, 'character': 'Chun-soo', 'cred... \n", | |
"\n", | |
" crew revenue \n", | |
"0 [{'credit_id': '59ac067c92514107af02c8c8', 'de... 12314651 \n", | |
"1 [{'credit_id': '52fe43fe9251416c7502563d', 'de... 95149435 \n", | |
"2 [{'credit_id': '54d5356ec3a3683ba0000039', 'de... 13092000 \n", | |
"3 [{'credit_id': '52fe48779251416c9108d6eb', 'de... 16000000 \n", | |
"4 [{'credit_id': '52fe464b9251416c75073b43', 'de... 3923970 \n", | |
"\n", | |
"[5 rows x 23 columns]" | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"test_data = pd.read_csv(os.path.join(base_input, 'test.csv'))\n", | |
"train_data = pd.read_csv(os.path.join(base_input, 'train.csv'))\n", | |
"sample_submission = pd.read_csv(os.path.join(base_input, 'sample_submission.csv'))\n", | |
"train_data.head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"Index(['id', 'belongs_to_collection', 'budget', 'genres', 'homepage',\n", | |
" 'imdb_id', 'original_language', 'original_title', 'overview',\n", | |
" 'popularity', 'poster_path', 'production_companies',\n", | |
" 'production_countries', 'release_date', 'runtime', 'spoken_languages',\n", | |
" 'status', 'tagline', 'title', 'Keywords', 'cast', 'crew', 'revenue'],\n", | |
" dtype='object')" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"train_data.columns" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>id</th>\n", | |
" <th>imdb_id</th>\n", | |
" <th>title</th>\n", | |
" <th>poster_path</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>tt2637294</td>\n", | |
" <td>Hot Tub Time Machine 2</td>\n", | |
" <td>/tQtWuwvMf0hCc2QR2tkolwl7c3c.jpg</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>2</td>\n", | |
" <td>tt0368933</td>\n", | |
" <td>The Princess Diaries 2: Royal Engagement</td>\n", | |
" <td>/w9Z7A0GHEhIp7etpj0vyKOeU1Wx.jpg</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>3</td>\n", | |
" <td>tt2582802</td>\n", | |
" <td>Whiplash</td>\n", | |
" <td>/lIv1QinFqz4dlp5U4lQ6HaiskOZ.jpg</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>4</td>\n", | |
" <td>tt1821480</td>\n", | |
" <td>Kahaani</td>\n", | |
" <td>/aTXRaPrWSinhcmCrcfJK17urp3F.jpg</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>5</td>\n", | |
" <td>tt1380152</td>\n", | |
" <td>Marine Boy</td>\n", | |
" <td>/m22s7zvkVFDU9ir56PiiqIEWFdT.jpg</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" id imdb_id title \\\n", | |
"0 1 tt2637294 Hot Tub Time Machine 2 \n", | |
"1 2 tt0368933 The Princess Diaries 2: Royal Engagement \n", | |
"2 3 tt2582802 Whiplash \n", | |
"3 4 tt1821480 Kahaani \n", | |
"4 5 tt1380152 Marine Boy \n", | |
"\n", | |
" poster_path \n", | |
"0 /tQtWuwvMf0hCc2QR2tkolwl7c3c.jpg \n", | |
"1 /w9Z7A0GHEhIp7etpj0vyKOeU1Wx.jpg \n", | |
"2 /lIv1QinFqz4dlp5U4lQ6HaiskOZ.jpg \n", | |
"3 /aTXRaPrWSinhcmCrcfJK17urp3F.jpg \n", | |
"4 /m22s7zvkVFDU9ir56PiiqIEWFdT.jpg " | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"train_data[['id', 'imdb_id', 'title', 'poster_path']].head()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Downloading train data posters...\n", | |
"Could now download: http://image.tmdb.org/t/p/w185nan\n", | |
"Downloading test data posters...\n", | |
"Could now download: http://image.tmdb.org/t/p/w185nan\n" | |
] | |
} | |
], | |
"source": [ | |
"def download_posters(urls, local_paths, base_dir='posters', sleep_time=0.1):\n", | |
" downloaded_files = []\n", | |
" for url, local_path in zip(urls, local_paths):\n", | |
" if os.path.isfile(local_path):\n", | |
" downloaded_files.append(local_path)\n", | |
" continue\n", | |
" \n", | |
" try:\n", | |
" urllib.request.urlretrieve(url, local_path)\n", | |
" downloaded_files.append(local_path)\n", | |
" except urllib.request.HTTPError:\n", | |
" print(\"Could now download: \", url)\n", | |
" downloaded_files.append(\"\")\n", | |
" sleep(sleep_time)\n", | |
" return downloaded_files\n", | |
"\n", | |
"os.makedirs('posters', exist_ok=True)\n", | |
"\n", | |
"print(\"Downloading train data posters...\")\n", | |
"poster_urls = [\"{}{}\".format(base_img_url, x) for x in train_data['poster_path']]\n", | |
"poster_local_paths = [\"{}{}\".format('posters', x) for x in train_data['poster_path']]\n", | |
"train_posters = download_posters(poster_urls, poster_local_paths)\n", | |
"train_data['poster_url'] = train_posters\n", | |
"\n", | |
"print(\"Downloading test data posters...\")\n", | |
"poster_urls = [\"{}{}\".format(base_img_url, x) for x in test_data['poster_path']]\n", | |
"poster_local_paths = [\"{}{}\".format('posters', x) for x in test_data['poster_path']]\n", | |
"test_posters = download_posters(poster_urls, poster_local_paths)\n", | |
"test_data['poster_url'] = test_posters" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/jpeg": "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\n", | |
"text/plain": [ | |
"<IPython.core.display.Image object>" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"from IPython.display import Image\n", | |
"Image(train_data['poster_url'][0])" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Filters" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"train_data = train_data[~(train_data['poster_url'] == '')]" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## The Math" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Region Adjacency Graph (RAG) and normalized cut\n", | |
"def get_normal_cut(img):\n", | |
" labels1 = segmentation.slic(img, compactness=30, n_segments=100)\n", | |
" g = graph.rag_mean_color(img, labels1, mode='similarity')\n", | |
" labels2 = graph.cut_normalized(labels1, g)\n", | |
" return labels1, labels2\n", | |
"\n", | |
"def get_unique_colors(filename):\n", | |
" if filename == '':\n", | |
" # in the test data, if we don't have a poster\n", | |
" return 0\n", | |
" print(\"Reading the image...\")\n", | |
" img = imread(filename)\n", | |
" print(\"Doing normal cut...\")\n", | |
" labels = get_normal_cut(img)[1]\n", | |
" print(\"Doing unique...\")\n", | |
" return np.unique(labels).size" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 37, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x576 with 2 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"from matplotlib import pyplot as plt\n", | |
"\n", | |
"img = imread(train_data['poster_url'][0])\n", | |
"labels1, labels2 = get_normal_cut(img)\n", | |
"out1 = color.label2rgb(labels1, img, kind='avg')\n", | |
"out2 = color.label2rgb(labels2, img, kind='avg')\n", | |
"\n", | |
"fig, ax = plt.subplots(nrows=2, sharex=True, sharey=True, figsize=(6, 8))\n", | |
"ax[0].imshow(out1)\n", | |
"ax[1].imshow(out2)\n", | |
"\n", | |
"for a in ax:\n", | |
" a.axis('off')\n", | |
"\n", | |
"plt.tight_layout()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# %%time\n", | |
"# results = []\n", | |
"# for idx, fn in enumerate(train_data['poster_url']):\n", | |
"# print(idx)\n", | |
"# results.append(get_unique_colors(fn))\n", | |
"# len(results)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<table style=\"border: 2px solid white;\">\n", | |
"<tr>\n", | |
"<td style=\"vertical-align: top; border: 0px solid white\">\n", | |
"<h3 style=\"text-align: left;\">Client</h3>\n", | |
"<ul style=\"text-align: left; list-style: none; margin: 0; padding: 0;\">\n", | |
" <li><b>Scheduler: </b>tcp://127.0.0.1:44629</li>\n", | |
" <li><b>Dashboard: </b><a href='http://127.0.0.1:8787/status' target='_blank'>http://127.0.0.1:8787/status</a>\n", | |
"</ul>\n", | |
"</td>\n", | |
"<td style=\"vertical-align: top; border: 0px solid white\">\n", | |
"<h3 style=\"text-align: left;\">Cluster</h3>\n", | |
"<ul style=\"text-align: left; list-style:none; margin: 0; padding: 0;\">\n", | |
" <li><b>Workers: </b>4</li>\n", | |
" <li><b>Cores: </b>12</li>\n", | |
" <li><b>Memory: </b>67.15 GB</li>\n", | |
"</ul>\n", | |
"</td>\n", | |
"</tr>\n", | |
"</table>" | |
], | |
"text/plain": [ | |
"<Client: 'tcp://127.0.0.1:44629' processes=4 threads=12, memory=67.15 GB>" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"from dask.distributed import Client, LocalCluster\n", | |
"os.environ['OMP_NUM_THREADS'] = \"3\"\n", | |
"client = Client()\n", | |
"client" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Training data\n", | |
"# futures = client.map(get_unique_colors, train_data['poster_url'].tolist())\n", | |
"# train_results = client.gather(futures)\n", | |
"# np.save('train_num_colors.npy', np.array(train_results))\n", | |
"\n", | |
"# Test data\n", | |
"# futures = client.map(get_unique_colors, test_data['poster_url'].tolist())\n", | |
"# test_results = client.gather(futures)\n", | |
"# np.save('test_num_colors.npy', np.array(test_results))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Load from cache\n", | |
"train_results = np.load('train_num_colors.npy')\n", | |
"test_results = np.load('test_num_colors.npy')" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# client.close()\n", | |
"# cluster.close()\n", | |
"# del client, cluster" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 44, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"0.567209996038492\n" | |
] | |
} | |
], | |
"source": [ | |
"train_data['poster_colors'] = train_results\n", | |
"test_data['poster_colors'] = test_results\n", | |
"X = train_data[['budget', 'poster_colors']]\n", | |
"Y = train_data['revenue']\n", | |
"lm = LinearRegression()\n", | |
"reg = lm.fit(X, Y)\n", | |
"print(reg.score(X, Y))\n", | |
"predicted_revenue = reg.predict(test_data[['budget', 'poster_colors']])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 45, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([ 2409678.02719629, -478081.45831937, 1364883.70220721, ...,\n", | |
" 49078702.54167123, 14022324.70160154, 7813012.1899247 ])" | |
] | |
}, | |
"execution_count": 45, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"predicted_revenue" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 40, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"0.6139207260503408" | |
] | |
}, | |
"execution_count": 40, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"X = train_data[['budget', 'popularity']]\n", | |
"Y = train_data['revenue']\n", | |
"lm = LinearRegression()\n", | |
"reg = lm.fit(X, Y)\n", | |
"reg.score(X, Y)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.7.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 4 | |
} |
name: box_office_kaggle | |
channels: | |
- conda-forge | |
- defaults | |
dependencies: | |
- python=3.7 | |
- dask-image | |
- pandas | |
- scikit-image | |
- scikit-learn | |
- scipy | |
- dask | |
- matplotlib | |
- dask_labextension | |
- jupyterlab | |