{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":10737,"databundleVersionId":290346,"isSourceIdPinned":false,"sourceType":"competition"}],"dockerImageVersionId":31090,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:24:27.180540Z","iopub.execute_input":"2025-08-01T21:24:27.180764Z","iopub.status.idle":"2025-08-01T21:24:28.229153Z","shell.execute_reply.started":"2025-08-01T21:24:27.180740Z","shell.execute_reply":"2025-08-01T21:24:28.228441Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Сиды","metadata":{}},{"cell_type":"code","source":"import os\nimport random\nimport numpy as np\nimport torch\nimport numpy as np # linear algebra\nimport pandas as pd \ntry:\n    # Hugging Face convenience fn; sets Python/Rand, NumPy, Torch seeds\n    from transformers import set_seed  \nexcept ImportError:\n    set_seed = None\n\ndef seed_everything(seed):\n    # 1. Python built‑ins\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    random.seed(seed)\n\n    # 2. NumPy\n    np.random.seed(seed)\n\n    # 3. PyTorch (CPU & GPU)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n\n    # 4. CuDNN: make deterministic, but may slow you down\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False\n\n    # 5. Transformers (if installed)\n    if set_seed is not None:\n        set_seed(seed)\n\n# call it!\nseed_everything(257)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:24:28.229942Z","iopub.execute_input":"2025-08-01T21:24:28.230316Z","iopub.status.idle":"2025-08-01T21:24:46.644084Z","shell.execute_reply.started":"2025-08-01T21:24:28.230290Z","shell.execute_reply":"2025-08-01T21:24:46.643238Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Импорты","metadata":{}},{"cell_type":"code","source":"import torch \nfrom torch.utils.data import Dataset\nfrom transformers import Trainer, TrainingArguments, AutoModelForSequenceClassification, AutoTokenizer\nfrom sklearn.model_selection import KFold, train_test_split\nfrom sklearn.metrics import f1_score","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:24:46.645670Z","iopub.execute_input":"2025-08-01T21:24:46.646197Z","iopub.status.idle":"2025-08-01T21:24:55.099791Z","shell.execute_reply.started":"2025-08-01T21:24:46.646176Z","shell.execute_reply":"2025-08-01T21:24:55.099209Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Загрузка данных","metadata":{}},{"cell_type":"code","source":"train=pd.read_csv('/kaggle/input/quora-insincere-questions-classification/train.csv')\ntest=pd.read_csv('/kaggle/input/quora-insincere-questions-classification/test.csv')\nsample=pd.read_csv('/kaggle/input/quora-insincere-questions-classification/sample_submission.csv')\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:24:55.103087Z","iopub.execute_input":"2025-08-01T21:24:55.103326Z","iopub.status.idle":"2025-08-01T21:25:00.381773Z","shell.execute_reply.started":"2025-08-01T21:24:55.103302Z","shell.execute_reply":"2025-08-01T21:25:00.381188Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# А-ля EDA","metadata":{}},{"cell_type":"code","source":"train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.382495Z","iopub.execute_input":"2025-08-01T21:25:00.382759Z","iopub.status.idle":"2025-08-01T21:25:00.409604Z","shell.execute_reply.started":"2025-08-01T21:25:00.382728Z","shell.execute_reply":"2025-08-01T21:25:00.408907Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Датасет","metadata":{}},{"cell_type":"code","source":"zeros = train[train['target'] == 0]\nones  = train[train['target'] == 1]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.410325Z","iopub.execute_input":"2025-08-01T21:25:00.410537Z","iopub.status.idle":"2025-08-01T21:25:00.496708Z","shell.execute_reply.started":"2025-08-01T21:25:00.410522Z","shell.execute_reply":"2025-08-01T21:25:00.495895Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"zeros_sampled = zeros.sample(n=len(ones), random_state=42)\ngol = pd.concat([zeros_sampled, ones]).reset_index(drop=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.497551Z","iopub.execute_input":"2025-08-01T21:25:00.497801Z","iopub.status.idle":"2025-08-01T21:25:00.593228Z","shell.execute_reply.started":"2025-08-01T21:25:00.497775Z","shell.execute_reply":"2025-08-01T21:25:00.592512Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"gol","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.595687Z","iopub.execute_input":"2025-08-01T21:25:00.595988Z","iopub.status.idle":"2025-08-01T21:25:00.604778Z","shell.execute_reply.started":"2025-08-01T21:25:00.595945Z","shell.execute_reply":"2025-08-01T21:25:00.604201Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"small_train = gol.sample(n=100000).reset_index(drop=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.605488Z","iopub.execute_input":"2025-08-01T21:25:00.605706Z","iopub.status.idle":"2025-08-01T21:25:00.631383Z","shell.execute_reply.started":"2025-08-01T21:25:00.605682Z","shell.execute_reply":"2025-08-01T21:25:00.630586Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_text=small_train['question_text']\ntest_text=test['question_text']\ntarget=small_train['target']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.632144Z","iopub.execute_input":"2025-08-01T21:25:00.632384Z","iopub.status.idle":"2025-08-01T21:25:00.636374Z","shell.execute_reply.started":"2025-08-01T21:25:00.632367Z","shell.execute_reply":"2025-08-01T21:25:00.635639Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_texts, val_texts, train_targets, val_targets=train_test_split(train_text, target, test_size=0.1, stratify=target)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.637160Z","iopub.execute_input":"2025-08-01T21:25:00.637412Z","iopub.status.idle":"2025-08-01T21:25:00.666426Z","shell.execute_reply.started":"2025-08-01T21:25:00.637390Z","shell.execute_reply":"2025-08-01T21:25:00.665878Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class QuoraDataset(Dataset):\n    def __init__(self, texts, labels, tokenizer, max_len):\n        # Force lists to avoid pandas indexing quirks\n        self.texts  = list(texts)\n        self.labels = None if labels is None else list(labels)\n        self.tokenizer = tokenizer\n        self.max_len = max_len\n\n    def __len__(self):\n        return len(self.texts)\n\n    def __getitem__(self, idx):\n        text = self.texts[idx]\n        encoding = self.tokenizer(\n            text,\n            padding='max_length',\n            truncation=True,\n            max_length=self.max_len,\n            return_tensors='pt'\n        )\n        item = {\n            'input_ids': encoding['input_ids'].squeeze(0),\n            'attention_mask': encoding['attention_mask'].squeeze(0),\n        }\n        if self.labels is not None:\n            item['labels'] = torch.tensor(self.labels[idx], dtype=torch.long)\n        return item\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.667076Z","iopub.execute_input":"2025-08-01T21:25:00.667275Z","iopub.status.idle":"2025-08-01T21:25:00.672615Z","shell.execute_reply.started":"2025-08-01T21:25:00.667260Z","shell.execute_reply":"2025-08-01T21:25:00.672016Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Модель","metadata":{}},{"cell_type":"code","source":"name='roberta-base'\nmodel=AutoModelForSequenceClassification.from_pretrained(name)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:00.673277Z","iopub.execute_input":"2025-08-01T21:25:00.673471Z","iopub.status.idle":"2025-08-01T21:25:03.640835Z","shell.execute_reply.started":"2025-08-01T21:25:00.673456Z","shell.execute_reply":"2025-08-01T21:25:03.640267Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Токенайзер","metadata":{}},{"cell_type":"code","source":"tokenizer=AutoTokenizer.from_pretrained(name)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:03.641483Z","iopub.execute_input":"2025-08-01T21:25:03.641700Z","iopub.status.idle":"2025-08-01T21:25:05.136398Z","shell.execute_reply.started":"2025-08-01T21:25:03.641682Z","shell.execute_reply":"2025-08-01T21:25:05.135769Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Делание датасетов","metadata":{}},{"cell_type":"code","source":"train_dataset=QuoraDataset(train_texts, train_targets, tokenizer, max_len=384)\nval_dataset=QuoraDataset(val_texts, val_targets, tokenizer, max_len=384)\ntest_dataset=QuoraDataset(test_text, [0]*len(test_text), tokenizer, max_len=384)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:05.137093Z","iopub.execute_input":"2025-08-01T21:25:05.137276Z","iopub.status.idle":"2025-08-01T21:25:05.183692Z","shell.execute_reply.started":"2025-08-01T21:25:05.137261Z","shell.execute_reply":"2025-08-01T21:25:05.182989Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Метрика","metadata":{}},{"cell_type":"code","source":"def compute_metrics(eval_pred):\n    preds = np.argmax(eval_pred.predictions, axis=1)\n    return {'f1': f1_score(eval_pred.label_ids, preds)}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:05.184448Z","iopub.execute_input":"2025-08-01T21:25:05.184758Z","iopub.status.idle":"2025-08-01T21:25:05.209713Z","shell.execute_reply.started":"2025-08-01T21:25:05.184732Z","shell.execute_reply":"2025-08-01T21:25:05.209008Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Training args","metadata":{}},{"cell_type":"code","source":"args=TrainingArguments(\n    output_dir='gol',\n    num_train_epochs=2,\n    learning_rate=3e-5,\n    per_device_train_batch_size=32,\n    per_device_eval_batch_size=32,\n    eval_strategy='steps',\n    eval_steps=500,\n    lr_scheduler_type='cosine',\n    warmup_ratio=0.1,\n    metric_for_best_model='f1',\n    load_best_model_at_end=True,\n    save_strategy='steps',\n    greater_is_better=True,\n    report_to='none',\n    fp16=True\n\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:05.210487Z","iopub.execute_input":"2025-08-01T21:25:05.210950Z","iopub.status.idle":"2025-08-01T21:25:05.247504Z","shell.execute_reply.started":"2025-08-01T21:25:05.210923Z","shell.execute_reply":"2025-08-01T21:25:05.246991Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Trainer","metadata":{}},{"cell_type":"code","source":"trainer=Trainer(\n    args=args,\n    model=model,\n    train_dataset=train_dataset,\n    eval_dataset=val_dataset,\n    compute_metrics=compute_metrics,\n    \n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:05.248153Z","iopub.execute_input":"2025-08-01T21:25:05.248374Z","iopub.status.idle":"2025-08-01T21:25:05.556556Z","shell.execute_reply.started":"2025-08-01T21:25:05.248351Z","shell.execute_reply":"2025-08-01T21:25:05.555983Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Обучение","metadata":{}},{"cell_type":"code","source":"trainer.train()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:25:05.557214Z","iopub.execute_input":"2025-08-01T21:25:05.557394Z","iopub.status.idle":"2025-08-01T21:41:33.706105Z","shell.execute_reply.started":"2025-08-01T21:25:05.557379Z","shell.execute_reply":"2025-08-01T21:41:33.705477Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Сабмит","metadata":{}},{"cell_type":"code","source":"SAVE_DIR = \"./quora_ckpt\"   # will hold config.json, pytorch_model.bin, vocab, etc.\ntrainer.save_model(SAVE_DIR)              # saves model weights + config\ntokenizer.save_pretrained(SAVE_DIR)       # saves tokenizer files\n\n# ---------- 4. (optional) zip it for upload ----------\nimport shutil, os, zipfile\nZIP_NAME = \"quora_ckpt.zip\"\nshutil.make_archive(base_name=SAVE_DIR, format='zip', root_dir=SAVE_DIR)\n\nprint(f\"Checkpoint written to {SAVE_DIR}  and zipped as {ZIP_NAME}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#output = trainer.predict(test_dataset)\n#logits = output.predictions\n#preds = np.argmax(logits, axis=1).astype(int)\n\n#sample['prediction'] = preds\n#sample.to_csv('submission.csv', index=False)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-01T21:41:33.706792Z","iopub.execute_input":"2025-08-01T21:41:33.707074Z","iopub.status.idle":"2025-08-01T22:53:02.284315Z","shell.execute_reply.started":"2025-08-01T21:41:33.707055Z","shell.execute_reply":"2025-08-01T22:53:02.283498Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}