{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":31254,"databundleVersionId":3103714,"sourceType":"competition"}],"dockerImageVersionId":30918,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Установка и импорт библиотек\n!pip install implicit scikit-surprise --quiet\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom scipy.sparse import csr_matrix\nfrom implicit.als import AlternatingLeastSquares\nfrom tqdm import tqdm\nimport warnings\nwarnings.filterwarnings('ignore')\n\n# Загрузка данных\ndef load_data():\n    try:\n        trans = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/transactions_train.csv', \n                          dtype={'article_id': str}, parse_dates=['t_dat'])\n        cust = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/customers.csv')\n        arts = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/articles.csv',\n                         dtype={'article_id': str})\n        print(\"Данные загружены\")\n        return trans, cust, arts\n    except:\n        trans = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/transactions_train.csv',\n                          dtype={'article_id': str}, parse_dates=['t_dat'])\n        cust = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/customers.csv')\n        arts = pd.read_csv('../input/h-and-m-personalized-fashion-recommendations/articles.csv',\n                         dtype={'article_id': str})\n        print(\"Данные загружены через относительный путь\")\n        return trans, cust, arts\n\ntransactions, customers, articles = load_data()\n\n# Предобработка данных\ndef preprocess_data(trans, last_n_days=180, min_purchases=3):\n    # Фильтрация по дате\n    last_date = trans['t_dat'].max()\n    mask = trans['t_dat'] > (last_date - pd.Timedelta(days=last_n_days))\n    recent_trans = trans[mask].copy()\n    \n    # Фильтрация неактивных пользователей\n    user_counts = recent_trans['customer_id'].value_counts()\n    active_users = user_counts[user_counts >= min_purchases].index\n    filtered_trans = recent_trans[recent_trans['customer_id'].isin(active_users)]\n    \n    # Топ товаров для новых пользователей\n    popular_items = filtered_trans['article_id'].value_counts().head(12).index.tolist()\n    \n    return filtered_trans, popular_items\n\nprocessed_trans, popular_items = preprocess_data(transactions)\n\n# Подготовка матрицы взаимодействий\ndef build_interaction_matrix(df):\n    # Создание mappings\n    user_ids = df['customer_id'].unique()\n    item_ids = df['article_id'].unique()\n    \n    user_map = {u: i for i, u in enumerate(user_ids)}\n    item_map = {a: i for i, a in enumerate(item_ids)}\n    \n    # Построение матрицы\n    rows = [user_map[u] for u in df['customer_id']]\n    cols = [item_map[a] for a in df['article_id']]\n    data = np.ones(len(df))\n    \n    return csr_matrix((data, (rows, cols)), shape=(len(user_ids), len(item_ids))), user_map, item_map\n\ninteraction_matrix, user_map, item_map = build_interaction_matrix(processed_trans)\n\n# Обучение ALS модели\nprint(\"Обучение модели...\")\nmodel = AlternatingLeastSquares(\n    factors=64,\n    iterations=15,\n    regularization=0.1,\n    random_state=42\n)\nmodel.fit(interaction_matrix)\n\n# Генерация рекомендаций\ndef generate_recommendations(customer_list, model, user_map, item_map, popular_items, k=12):\n    reverse_item_map = {v: k for k, v in item_map.items()}\n    recommendations = []\n    \n    for customer in tqdm(customer_list, desc=\"Генерация рекомендаций\"):\n        if customer in user_map:\n            user_idx = user_map[customer]\n            scores = model.user_factors[user_idx] @ model.item_factors.T\n            top_items = np.argsort(-scores)[:k]\n            recs = [reverse_item_map[i] for i in top_items]\n        else:\n            recs = popular_items[:k]\n        \n        recommendations.append(' '.join(recs))\n    \n    return pd.DataFrame({'customer_id': customer_list, 'prediction': recommendations})\n\n# Для демонстрации возьмем 10% пользователей\nsample_customers = customers.sample(frac=0.1, random_state=42)['customer_id']\nsubmission = generate_recommendations(sample_customers, model, user_map, item_map, popular_items)\n\n# Сохранение и анализ результатов\nsubmission.to_csv('submission.csv', index=False)\nprint(\"Сабмит сохранен как submission.csv\")\n\n# Пример рекомендаций\nprint(\"\\nПример рекомендаций для 3 пользователей:\")\nfor i in range(3):\n    cust_id = submission.iloc[i]['customer_id']\n    items = submission.iloc[i]['prediction'].split()\n    print(f\"\\nПользователь {cust_id}:\")\n    print(articles[articles['article_id'].isin(items)][['article_id', 'prod_name']].to_string(index=False))\n\n# Визуализация\nplt.figure(figsize=(10, 6))\ntop_recs = submission['prediction'].str.split().explode().value_counts().head(20)\nsns.barplot(y=top_recs.index, x=top_recs.values)\nplt.title('20 самых рекомендуемых товаров')\nplt.xlabel('Количество рекомендаций')\nplt.show()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-04-04T11:08:14.140252Z","iopub.execute_input":"2025-04-04T11:08:14.140634Z","iopub.status.idle":"2025-04-04T11:18:19.702995Z","shell.execute_reply.started":"2025-04-04T11:08:14.140603Z","shell.execute_reply":"2025-04-04T11:18:19.701536Z"}},"outputs":[],"execution_count":null}]}