{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\nimport polars as pl\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\nimport pandas\nimport numpy\n\n# Helper Functions\ndef sample_and_sort(dataframe, sessions_column_name, fraction, seed=None):\n    \"\"\"\n    Sample a fraction of sessions and sort by the session column.\n    \"\"\"\n    sampled_sessions = dataframe[sessions_column_name].sample(fraction=fraction, seed=seed)\n    return dataframe.filter(pl.col(sessions_column_name).is_in(sampled_sessions)).sort(sessions_column_name)\n\n# Load datasets\ntrain = pl.read_parquet('../input/otto-train-and-test-data-for-local-validation/train.parquet')\ndataA = pl.read_parquet('../input/otto-train-and-test-data-for-local-validation/test.parquet')\ndataB = pl.read_parquet('../input/otto-train-and-test-data-for-local-validation/test_labels.parquet')\n\n# Preprocess datasets\nfraction_of_sessions = 0.2\nSEED_VALUE = 70\ntrain = sample_and_sort(train, 'session', fraction_of_sessions, SEED_VALUE)\ndataA = sample_and_sort(dataA, 'session', fraction_of_sessions, SEED_VALUE)\ndataB = sample_and_sort(dataB, 'session', fraction_of_sessions, SEED_VALUE)\n\n# Convert train to Pandas dataframe for visualization and modeling\ntrain = train.to_pandas()\n\n\n\n\n\n","metadata":{"execution":{"iopub.status.busy":"2023-08-11T11:55:26.526614Z","iopub.execute_input":"2023-08-11T11:55:26.527062Z","iopub.status.idle":"2023-08-11T11:56:01.721196Z","shell.execute_reply.started":"2023-08-11T11:55:26.527022Z","shell.execute_reply":"2023-08-11T11:56:01.720183Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Visualization\nid2type = {0: 'clicks', 1: 'carts', 2: 'orders'}\nevent_counts = train['type'].value_counts()\ntotal_events = event_counts.sum()\n\nsns.barplot(x=event_counts.index.map(id2type), y=event_counts.values / total_events, palette=\"pastel\")\nplt.title('Event Frequency')\nplt.ylabel('Frequency')\nplt.xlabel('Type')\nplt.savefig('event_frequency_pastel.png')\n\nsession_lengths = train['session'].value_counts()\nlengths_counts = session_lengths.value_counts().sort_index()\n","metadata":{"execution":{"iopub.status.busy":"2023-08-11T11:56:01.723215Z","iopub.execute_input":"2023-08-11T11:56:01.723536Z","iopub.status.idle":"2023-08-11T11:56:05.238258Z","shell.execute_reply.started":"2023-08-11T11:56:01.723511Z","shell.execute_reply":"2023-08-11T11:56:05.237314Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 8))\nsns.barplot(x=lengths_counts.index, y=lengths_counts.values, color=\"skyblue\")\nplt.title('Session Lengths')\nplt.ylabel('Frequency')\nplt.xlabel('Length')\nplt.xlim(0, 250)\nplt.xticks([])\nplt.grid(axis='y', linestyle='--', alpha=0.7)\nplt.tight_layout()\nplt.savefig('session_lengths.png')","metadata":{"execution":{"iopub.status.busy":"2023-08-11T11:56:05.239608Z","iopub.execute_input":"2023-08-11T11:56:05.240615Z","iopub.status.idle":"2023-08-11T11:56:08.576287Z","shell.execute_reply.started":"2023-08-11T11:56:05.240581Z","shell.execute_reply":"2023-08-11T11:56:08.575356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"aid_freqs = train['aid'].value_counts()\nplt.figure(figsize=(15, 8))\ntop_aids = 500\nsns.barplot(x=aid_freqs.index[:top_aids], y=aid_freqs.values[:top_aids], color=\"salmon\")\nplt.title('Top {} AID Counts'.format(top_aids))\nplt.ylabel('Frequency')\nplt.xlabel('AID')\nplt.xticks([])\nplt.grid(axis='y', linestyle='--', alpha=0.7)\nplt.tight_layout()\nplt.savefig('aid_freqs.png')","metadata":{"execution":{"iopub.status.busy":"2023-08-11T11:56:08.578668Z","iopub.execute_input":"2023-08-11T11:56:08.579296Z","iopub.status.idle":"2023-08-11T11:56:14.266484Z","shell.execute_reply.started":"2023-08-11T11:56:08.579262Z","shell.execute_reply":"2023-08-11T11:56:14.265412Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# Random Forest Classifier with Reduced Dataset\n\n# Shrink the dataset for quicker processing\nfraction_of_data = 0.03\ntrain_sampled = train.sample(frac=fraction_of_data, random_state=SEED_VALUE)\n\nX = train_sampled.drop(columns=['type', 'session'])\ny = train_sampled['type']\n\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=SEED_VALUE)\n\nclf = RandomForestClassifier(\n    n_estimators=50,\n    max_depth=10,\n    bootstrap=True,\n    max_samples=0.7,\n    n_jobs=-1,\n    max_features='sqrt',\n    random_state=SEED_VALUE\n)\n\nclf.fit(X_train, y_train)\ny_pred = clf.predict(X_val)\naccuracy = accuracy_score(y_val, y_pred)\nprint(f'Validation Accuracy with reduced dataset: {accuracy:.4f}')\n","metadata":{"execution":{"iopub.status.busy":"2023-08-11T11:56:14.268168Z","iopub.execute_input":"2023-08-11T11:56:14.268603Z","iopub.status.idle":"2023-08-11T11:57:23.056571Z","shell.execute_reply.started":"2023-08-11T11:56:14.268571Z","shell.execute_reply":"2023-08-11T11:57:23.055625Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"exit()","metadata":{},"execution_count":null,"outputs":[]}]}