{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":31011,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import models, transforms\nfrom torch.utils.data import Dataset, DataLoader\nimport pandas as pd\nimport numpy as np\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom tqdm import tqdm\n\n# Use GPU if available\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n# ===============================\n# 1. Load Dataset\n# ===============================\ntrain_df = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest_df = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\n\nX = train_df.drop(\"label\", axis=1).values.reshape(-1, 28, 28).astype(np.uint8)\ny = train_df[\"label\"].values\nX_test = test_df.values.reshape(-1, 28, 28).astype(np.uint8)\n\n# ===============================\n# 2. Dataset & Dataloader\n# ===============================\nclass DigitDataset(Dataset):\n    def __init__(self, images, labels=None, transform=None):\n        self.images = images\n        self.labels = labels\n        self.transform = transform\n    \n    def __len__(self):\n        return len(self.images)\n    \n    def __getitem__(self, idx):\n        image = Image.fromarray(self.images[idx])\n        image = image.convert(\"RGB\")  # ResNet expects 3-channel\n        if self.transform:\n            image = self.transform(image)\n        \n        if self.labels is not None:\n            return image, self.labels[idx]\n        return image\n\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),  # ResNet input size\n    transforms.ToTensor(),\n    transforms.Normalize([0.5]*3, [0.5]*3)\n])\n\nX_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.1, random_state=42)\n\ntrain_dataset = DigitDataset(X_train, y_train, transform)\nval_dataset = DigitDataset(X_val, y_val, transform)\ntest_dataset = DigitDataset(X_test, transform=transform)\n\ntrain_loader = DataLoader(train_dataset, batch_size=64, shuffle=True, num_workers=2)\nval_loader = DataLoader(val_dataset, batch_size=64, shuffle=False, num_workers=2)\ntest_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n\n# ===============================\n# 3. Model Setup: ResNet18\n# ===============================\nmodel = models.resnet18(pretrained=True)\nmodel.fc = nn.Linear(model.fc.in_features, 10)  # MNIST has 10 classes\nmodel = model.to(device)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=1e-4)\n\n# ===============================\n# 4. Training Loop\n# ===============================\nfor epoch in range(8):\n    model.train()\n    total_loss = 0\n    for imgs, labels in tqdm(train_loader):\n        imgs, labels = imgs.to(device), labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(imgs)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        \n        total_loss += loss.item()\n    \n    print(f\"Epoch {epoch+1}, Loss: {total_loss:.4f}\")\n\n# ===============================\n# 5. Validation Accuracy\n# ===============================\nmodel.eval()\ncorrect = 0\ntotal = 0\nwith torch.no_grad():\n    for imgs, labels in val_loader:\n        imgs, labels = imgs.to(device), labels.to(device)\n        outputs = model(imgs)\n        _, preds = torch.max(outputs, 1)\n        correct += (preds == labels).sum().item()\n        total += labels.size(0)\n\nprint(f\"Validation Accuracy: {100 * correct / total:.2f}%\")\n\n# ===============================\n# 6. Predict Test Data\n# ===============================\nmodel.eval()\nall_preds = []\nwith torch.no_grad():\n    for imgs in test_loader:\n        imgs = imgs.to(device)\n        outputs = model(imgs)\n        preds = torch.argmax(outputs, 1)\n        all_preds.extend(preds.cpu().numpy())\n\n# ===============================\n# 7. Submission\n# ===============================\nsubmission = pd.DataFrame({\n    'ImageId': np.arange(1, len(all_preds) + 1),\n    'Label': all_preds\n})\nsubmission.to_csv('submission.csv', index=False)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-05-03T07:38:14.306425Z","iopub.execute_input":"2025-05-03T07:38:14.306698Z","iopub.status.idle":"2025-05-03T07:56:07.351382Z","shell.execute_reply.started":"2025-05-03T07:38:14.306677Z","shell.execute_reply":"2025-05-03T07:56:07.350501Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#PCA\nimport pandas as pd\nimport numpy as np\nfrom sklearn.decomposition import PCA\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\n\ntrain_df = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest_df = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\n\nX = train_df.drop(\"label\", axis=1).values / 255.0  # нормализация\ny = train_df[\"label\"].values\n\nX_test = test_df.values / 255.0\n\npca = PCA(n_components=50)  # можно 30, 64, 100 — экспериментируй\nX_pca = pca.fit_transform(X)\nX_test_pca = pca.transform(X_test)\n\nprint(f\"Explained variance: {np.sum(pca.explained_variance_ratio_):.4f}\")\n\nX_train, X_val, y_train, y_val = train_test_split(X_pca, y, test_size=0.2, random_state=42, stratify=y)\n\nclf = LogisticRegression(max_iter=2000, solver='lbfgs', multi_class='multinomial')\nclf.fit(X_train, y_train)\n\ny_pred = clf.predict(X_val)\nprint(f\"Validation Accuracy: {accuracy_score(y_val, y_pred):.4f}\")\n\ny_test_pred = clf.predict(X_test_pca)\n\nsubmission = pd.DataFrame({\n    \"ImageId\": np.arange(1, len(y_test_pred)+1),\n    \"Label\": y_test_pred\n})\nsubmission.to_csv(\"submission.csv\", index=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-03T09:23:59.883031Z","iopub.execute_input":"2025-05-03T09:23:59.883308Z","iopub.status.idle":"2025-05-03T09:24:15.863789Z","shell.execute_reply.started":"2025-05-03T09:23:59.883286Z","shell.execute_reply":"2025-05-03T09:24:15.860659Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q timm\n\nimport torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torch.utils.data import DataLoader, Dataset\nfrom torchvision import transforms\nimport pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom timm import create_model\nfrom tqdm import tqdm\n\n\n# Загрузка\ntrain_df = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')\ntest_df = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\n\n# train/test split\ntrain_data, val_data = train_test_split(train_df, test_size=0.1, random_state=42, stratify=train_df['label'])\n\n# Кастомный датасет\nclass DigitDataset(Dataset):\n    def __init__(self, df, train=True):\n        self.X = df.drop('label', axis=1).values if train else df.values\n        self.y = df['label'].values if train else None\n        self.train = train\n        self.transform = transforms.Compose([\n            transforms.ToPILImage(),\n            transforms.Resize((224, 224)),\n            transforms.Grayscale(3),\n            transforms.ToTensor(),\n            transforms.Normalize([0.5]*3, [0.5]*3),\n        ])\n\n    def __len__(self):\n        return len(self.X)\n\n    def __getitem__(self, idx):\n        img = self.X[idx].reshape(28, 28).astype(np.uint8)\n        img = self.transform(img)\n        if self.train:\n            return img, self.y[idx]\n        return img\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nmodel = create_model('efficientnet_b0', pretrained=True, num_classes=10)\nmodel.to(device)\n\ntrain_loader = DataLoader(DigitDataset(train_data), batch_size=64, shuffle=True)\nval_loader = DataLoader(DigitDataset(val_data), batch_size=64, shuffle=False)\n\ncriterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=1e-4)\n\nEPOCHS = 5\n\nfor epoch in range(EPOCHS):\n    model.train()\n    total_loss = 0\n    for X_batch, y_batch in tqdm(train_loader):\n        X_batch, y_batch = X_batch.to(device), y_batch.to(device)\n        optimizer.zero_grad()\n        out = model(X_batch)\n        loss = criterion(out, y_batch)\n        loss.backward()\n        optimizer.step()\n        total_loss += loss.item()\n\n    print(f\"Epoch {epoch+1}/{EPOCHS}, Train Loss: {total_loss / len(train_loader):.4f}\")\n\n\nmodel.eval()\nval_correct = 0\nwith torch.no_grad():\n    for X_batch, y_batch in val_loader:\n        X_batch, y_batch = X_batch.to(device), y_batch.to(device)\n        preds = model(X_batch).argmax(1)\n        val_correct += (preds == y_batch).sum().item()\nprint(f\"Validation Accuracy: {val_correct / len(val_data):.4f}\")\n\n\ntest_dataset = DigitDataset(test_df, train=False)\ntest_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)\n\nall_preds = []\nmodel.eval()\nwith torch.no_grad():\n    for X_batch in test_loader:\n        X_batch = X_batch.to(device)\n        preds = model(X_batch).argmax(1)\n        all_preds.extend(preds.cpu().numpy())\n\nsubmission = pd.DataFrame({\n    \"ImageId\": np.arange(1, len(all_preds)+1),\n    \"Label\": all_preds\n})\nsubmission.to_csv(\"submission.csv\", index=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-03T10:06:44.067296Z","iopub.execute_input":"2025-05-03T10:06:44.067863Z","iopub.status.idle":"2025-05-03T10:28:45.666334Z","shell.execute_reply.started":"2025-05-03T10:06:44.067840Z","shell.execute_reply":"2025-05-03T10:28:45.665659Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Batyr, кратко и по сути.\n\n### 🎯 Цель: у тебя есть куча моделей, натренированных на `pandas.DataFrame`, и ты хочешь **объединить их предсказания** для лучшего результата (например, на тесте). Это называется **ансамблирование**. Есть 3 популярных способа:\n\n---\n\n### ✅ 1. **Averaging (Среднее предсказаний)**\n\nПростой и часто эффективный метод:\n\n```python\nimport numpy as np\n\n# допустим, у тебя есть список предсказаний от моделей\npreds_list = [model1.predict(X_test), model2.predict(X_test), model3.predict(X_test)]\navg_preds = np.mean(preds_list, axis=0)\n```\n\n* **Подходит** для регрессии и вероятностных предсказаний классификации (например, `.predict_proba()`).\n* **Недостаток** — все модели равны, даже слабые.\n\n---\n\n### ✅ 2. **Weighted Averaging (Взвешенное среднее)**\n\nЕсли ты знаешь, какая модель лучше — дай ей больший вес:\n\n```python\nweights = [0.2, 0.3, 0.5]\nweighted_avg = np.average(preds_list, axis=0, weights=weights)\n```\n\n* **Когда использовать**: если ты валидировал модели и знаешь их метрики (например, RMSE или accuracy).\n\n---\n\n### ✅ 3. **Stacking (Мета-модель)**\n\nТы собираешь предсказания всех моделей как признаки и обучаешь финальную модель:\n\n```python\n# соберём out-of-fold предсказания или просто из валидации\nstacked_preds = np.column_stack(preds_list)\nmeta_model = SomeRegressor()\nmeta_model.fit(stacked_preds, y_val)\n\n# потом\ntest_preds = np.column_stack([m.predict(X_test) for m in models])\nfinal_preds = meta_model.predict(test_preds)\n```\n\n* **Плюс**: может выучить, какие модели сильны на каких данных.\n* **Минус**: требует отдельного `y_val` и риска переобучения.\n\n---\n\n### 🔧 Практические советы\n\n* Сначала попробуй **усреднение**, это просто и быстро.\n* Потом **взвешенное**, если есть метрики моделей.\n* **Stacking** — мощный, но требует аккуратного подхода: OOF-предсказания, кросс-валидация.\n\n---\n\nХочешь — могу помочь автоматизировать ансамбль под твои модели. Хочешь пример на реальных данных с DataFrame?\n","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.svm import SVC\nfrom sklearn.metrics import accuracy_score\nfrom skimage.feature import hog\nfrom skimage import exposure\nfrom sklearn.linear_model import LogisticRegression\n\n\n# 1. Load data\ntrain_df = pd.read_csv('/kaggle/input/digit-recognizer/train.csv')  # from Kaggle\ntest_df = pd.read_csv('/kaggle/input/digit-recognizer/test.csv')\n\n# 2. Extract labels and images\nX = train_df.drop('label', axis=1).values\ny = train_df['label'].values\nX_test = test_df.values\n\n# 3. Normalize images\nX = X / 255.0\nX_test = X_test / 255.0\n\n# 4. Extract HOG features from images\ndef extract_hog_features(images):\n    hog_features = []\n    for img in images:\n        img_reshaped = img.reshape((28, 28))\n        features = hog(img_reshaped,\n                       orientations=9,\n                       pixels_per_cell=(8, 8),\n                       cells_per_block=(2, 2),\n                       block_norm='L2-Hys',\n                       visualize=False)\n        hog_features.append(features)\n    return np.array(hog_features)\n\nX_hog = extract_hog_features(X)\nX_test_hog = extract_hog_features(X_test)\n\n# 5. Train/Test split\nX_train, X_val, y_train, y_val = train_test_split(X_hog, y, test_size=0.2, random_state=42)\n\n# 6. Train classifier\nclf = LogisticRegression()\nclf.fit(X_train, y_train)\n\n# 7. Evaluate\nval_preds = clf.predict(X_val)\nacc = accuracy_score(y_val, val_preds)\nprint(f'Validation Accuracy: {acc:.4f}')\n\n# 8. Predict on test set\ntest_preds = clf.predict(X_test_hog)\n\n# 9. Submission\nsubmission = pd.DataFrame({'ImageId': np.arange(1, len(test_preds) + 1), 'Label': test_preds})\nsubmission.to_csv('submission.csv', index=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-05-03T19:00:21.315852Z","iopub.execute_input":"2025-05-03T19:00:21.316179Z","iopub.status.idle":"2025-05-03T19:00:45.726157Z","shell.execute_reply.started":"2025-05-03T19:00:21.316154Z","shell.execute_reply":"2025-05-03T19:00:45.724570Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics.pairwise import cosine_similarity\nimport numpy as np\n\nA = np.array([[1, 2]])\nB = np.array([[2, 3]])\n\nsimilarity = cosine_similarity(A, B)\nprint(similarity)  # Результат: [[0.9926...]]","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\nfrom sklearn.datasets import load_iris\n\nX, y = load_iris(return_X_y=True)\nmodel = RandomForestClassifier()\nmodel.fit(X, y)\n\nprobas = model.predict_proba(X[:5])  # Вероятности для первых 5 объектов\nprint(probas)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import cv2\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# Пример: создадим случайную матрицу 28x28\nimage = np.random.rand(28, 28).astype(np.float32)\n\n# Применим гауссовский фильтр с ядром 5x5 и σ=1\nblurred = cv2.GaussianBlur(image, (5, 5), sigmaX=1)\n\n# Визуализация\nplt.subplot(1, 2, 1)\nplt.title(\"Original\")\nplt.imshow(image, cmap='gray')\n\nplt.subplot(1, 2, 2)\nplt.title(\"Gaussian Blurred\")\nplt.imshow(blurred, cmap='gray')\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import numpy as np\n\na = np.arange(12)         # [0, 1, ..., 11] shape (12,)\nb = a.reshape(3, 4)       # shape (3, 4)\nc = a.reshape(2, 2, 3)    # shape (2, 2, 3)\nd = a.reshape(-1, 6)      # -1 = \"угадай сам\", здесь получится (2, 6)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\n\n# Создание исходного DataFrame\ndf = pd.DataFrame({\n    'Name': ['Alice', 'Bob'],\n    'Age': [25, 30]\n})\n\nprint(\"До добавления:\")\nprint(df)\n\n# Добавление новой строки с числовым индексом\ndf.loc[len(df)] = ['Charlie', 28]\n\nprint(\"\\nПосле добавления:\")\nprint(df)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df['std_AC'] = df[['A', 'C']].std(axis=1, ddof=0)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}