{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceType":"competition","sourceId":125766,"databundleVersionId":14873485}],"dockerImageVersionId":31260,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\n\nTRAIN_PATH = \"/kaggle/input/bigdata2025classification/train.csv\"\nTEST_PATH  = \"/kaggle/input/bigdata2025classification/test_without_labels.csv\"\nOUT_PATH   = \"/kaggle/working/submission.csv\"\n\ntrain_df = pd.read_csv(TRAIN_PATH)\ntest_df  = pd.read_csv(TEST_PATH)\n\ndef build_text(df):\n    return (df[\"Title\"].fillna(\"\").astype(str) + \" \" + df[\"Content\"].fillna(\"\").astype(str)).str.strip()\n\ntrain_df[\"text\"] = build_text(train_df)\ntest_df[\"text\"]  = build_text(test_df)\n\nlabels = sorted(train_df[\"Label\"].astype(str).unique())\nlabel2id = {lab: i for i, lab in enumerate(labels)}\nid2label = {i: lab for lab, i in label2id.items()}\ntrain_df[\"y\"] = train_df[\"Label\"].astype(str).map(label2id).astype(np.int32)\n\ntry:\n    import cudf\n    from cuml.feature_extraction.text import TfidfVectorizer as cuTfidfVectorizer\n    from cuml.svm import LinearSVC as cuLinearSVC\n    from cuml.model_selection import train_test_split as cu_train_test_split\n    from cuml.metrics import accuracy_score as cu_accuracy_score\n\n    gtrain = cudf.DataFrame({\n        \"text\": cudf.Series(train_df[\"text\"].tolist()),\n        \"y\": cudf.Series(train_df[\"y\"].tolist()).astype(\"int32\")\n    })\n    gtest = cudf.DataFrame({\n        \"Id\": cudf.Series(test_df[\"Id\"].tolist()),\n        \"text\": cudf.Series(test_df[\"text\"].tolist())\n    })\n\n    Xtr, Xva, ytr, yva = cu_train_test_split(\n        gtrain[\"text\"], gtrain[\"y\"], test_size=0.05, random_state=42, stratify=gtrain[\"y\"]\n    )\n\n    vec = cuTfidfVectorizer(\n        lowercase=True,\n        stop_words=\"english\",\n        ngram_range=(1, 2),\n        min_df=3,\n        max_df=0.9,\n        max_features=200000,\n        sublinear_tf=True\n    )\n\n    Xtr_v = vec.fit_transform(Xtr)\n    Xva_v = vec.transform(Xva)\n\n    clf = cuLinearSVC(C=1.0)\n    clf.fit(Xtr_v, ytr)\n\n    va_pred = clf.predict(Xva_v)\n    acc = float(cu_accuracy_score(yva, va_pred))\n    print(\"GPU validation accuracy:\", acc)\n\n    X_all = vec.fit_transform(gtrain[\"text\"])\n    clf.fit(X_all, gtrain[\"y\"])\n\n    X_test = vec.transform(gtest[\"text\"])\n    test_pred_ids = clf.predict(X_test).to_numpy()\n\n    test_pred_labels = [id2label[int(i)] for i in test_pred_ids]\n\n    sub = pd.DataFrame({\"Id\": test_df[\"Id\"], \"Label\": test_pred_labels})\n    sub.to_csv(OUT_PATH, index=False)\n    print(\"Saved:\", OUT_PATH)\n    print(sub.head())\n\nexcept Exception as e:\n    print(\"GPU (RAPIDS cuML) path failed in this environment.\")\n    print(\"Error:\", repr(e))\n    print(\"Falling back to CPU sklearn (still produces submission.csv).\")\n\n    from sklearn.model_selection import train_test_split\n    from sklearn.pipeline import Pipeline\n    from sklearn.feature_extraction.text import TfidfVectorizer\n    from sklearn.svm import LinearSVC\n    from sklearn.metrics import accuracy_score, f1_score\n\n    X = train_df[\"text\"]\n    y = train_df[\"Label\"].astype(str)\n    X_test = test_df[\"text\"]\n\n    Xtr, Xva, ytr, yva = train_test_split(X, y, test_size=0.05, random_state=42, stratify=y)\n\n    model = Pipeline([\n        (\"tfidf\", TfidfVectorizer(\n            lowercase=True,\n            stop_words=\"english\",\n            ngram_range=(1, 2),\n            min_df=3,\n            max_df=0.9,\n            max_features=200000,\n            sublinear_tf=True\n        )),\n        (\"clf\", LinearSVC(C=1.0))\n    ])\n\n    model.fit(Xtr, ytr)\n    va_pred = model.predict(Xva)\n    print(\"CPU val_acc:\", accuracy_score(yva, va_pred))\n    print(\"CPU val_macro_f1:\", f1_score(yva, va_pred, average=\"macro_f1\" if False else \"macro\"))\n\n    model.fit(X, y)\n    test_pred = model.predict(X_test)\n\n    sub = pd.DataFrame({\"Id\": test_df[\"Id\"], \"Label\": test_pred})\n    sub.to_csv(OUT_PATH, index=False)\n    print(\"Saved:\", OUT_PATH)\n    print(sub.head())\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-02-18T22:05:47.032001Z","iopub.execute_input":"2026-02-18T22:05:47.032293Z","iopub.status.idle":"2026-02-18T22:11:19.316674Z","shell.execute_reply.started":"2026-02-18T22:05:47.032256Z","shell.execute_reply":"2026-02-18T22:11:19.315588Z"}},"outputs":[],"execution_count":null}]}