{"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":"none","dataSources":[{"sourceType":"competition","sourceId":116062,"databundleVersionId":14875579,"isSourceIdPinned":false},{"sourceType":"datasetVersion","sourceId":15121522,"datasetId":9682470,"databundleVersionId":16009305}],"dockerImageVersionId":31286,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# «Application of AI Models for Protein Function Prediction from Amino Acid Sequences»","metadata":{}},{"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":"2026-03-10T14:58:24.223535Z","iopub.execute_input":"2026-03-10T14:58:24.224245Z","iopub.status.idle":"2026-03-10T14:58:24.243611Z","shell.execute_reply.started":"2026-03-10T14:58:24.224203Z","shell.execute_reply":"2026-03-10T14:58:24.241081Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**«Application of AI Models for Protein Function Prediction from Amino Acid Sequences»**\n\nhttps://www.kaggle.com/code/trnhquangminh140/protein-function-prediction-amino-acid-sequences/","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport os\nimport warnings\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom IPython.display import display\nfrom PIL import Image as PILImage  # Dùng PIL để xử lý file jfif\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.decomposition import TruncatedSVD\nfrom sklearn.linear_model import RidgeClassifier\nfrom sklearn.multiclass import OneVsRestClassifier\nfrom sklearn.preprocessing import MultiLabelBinarizer\n\n# Tắt các cảnh báo không cần thiết\nwarnings.filterwarnings('ignore')\n\n# 1. THIẾT LẬP ĐƯỜNG DẪN\nINPUT_DIR = '/kaggle/input/cafa-6-protein-function-prediction'\nif not os.path.exists(INPUT_DIR):\n    INPUT_DIR = '/kaggle/input/competitions/cafa-6-protein-function-prediction'\n\nIMG_DIR = '/kaggle/input/datasets/trnhquangminh140/image-of-protein-structure'\nTRAIN_SEQ = f'{INPUT_DIR}/Train/train_sequences.fasta'\nTRAIN_TERMS = f'{INPUT_DIR}/Train/train_terms.tsv'\nTEST_SEQ = f'{INPUT_DIR}/Test/testsuperset.fasta'\nSUBMISSION_PATH = '/kaggle/working/submission.tsv'\n\n# 2. HÀM ĐỌC DỮ LIỆU FASTA\ndef read_fasta(file_path, limit=20000):\n    ids, seqs = [], []\n    if not os.path.exists(file_path): return ids, seqs\n    with open(file_path, 'r') as f:\n        current_seq = []\n        count = 0\n        for line in f:\n            line = line.strip()\n            if line.startswith(\">\"):\n                if count >= limit: break\n                if current_seq:\n                    seqs.append(\" \".join(list(\"\".join(current_seq))))\n                ids.append(line[1:].split()[0])\n                current_seq = []\n                count += 1\n            else:\n                current_seq.append(line)\n        if current_seq and len(ids) > len(seqs):\n            seqs.append(\" \".join(list(\"\".join(current_seq))))\n    return ids, seqs\n\n# 3. TIỀN XỬ LÝ VÀ HUẤN LUYỆN\nprint(\"--- [1/5] Đang tải dữ liệu ---\")\ntrain_ids, train_seqs = read_fasta(TRAIN_SEQ, limit=25000)\ntest_ids, test_seqs = read_fasta(TEST_SEQ, limit=10000)\n\nprint(\"--- [2/5] Xử lý nhãn GO Terms ---\")\ntrain_terms_df = pd.read_csv(TRAIN_TERMS, sep=\"\\t\")\ntop_terms = train_terms_df['term'].value_counts().head(600).index.tolist()\ntrain_terms_filtered = train_terms_df[train_terms_df['term'].isin(top_terms)]\n\nmlb = MultiLabelBinarizer(classes=top_terms)\nlabels_dict = train_terms_filtered.groupby('EntryID')['term'].apply(list).to_dict()\nY_train = mlb.fit_transform([labels_dict.get(uid, []) for uid in train_ids])\n\nprint(\"--- [3/5] Vector hóa TF-IDF & Giảm chiều SVD ---\")\n\ntfidf = TfidfVectorizer(ngram_range=(1, 3), max_features=8000, token_pattern=r\"(?u)\\b\\w+\\b\")\nX_train_sparse = tfidf.fit_transform(train_seqs)\nX_test_sparse = tfidf.transform(test_seqs)\n\nsvd = TruncatedSVD(n_components=150, random_state=42)\nX_train = svd.fit_transform(X_train_sparse)\nX_test = svd.transform(X_test_sparse)\n\nprint(\"--- [4/5] Huấn luyện Ridge Classifier ---\")\nmodel = OneVsRestClassifier(RidgeClassifier(alpha=1.0))\nmodel.fit(X_train, Y_train)\n\ndecision_scores = model.decision_function(X_test)\nprobs = 1 / (1 + np.exp(-decision_scores))\n\nprint(\"--- [5/5] Đang kết xuất submission.tsv ---\")\nsubmission_rows = []\nfor i, uid in enumerate(test_ids):\n    top_indices = np.argsort(probs[i])[-30:][::-1]\n    for idx in top_indices:\n        score = probs[i][idx]\n        submission_rows.append([uid, top_terms[idx], f\"{score:.3f}\"])\n\nsubmission_df = pd.DataFrame(submission_rows)\nsubmission_df.to_csv(SUBMISSION_PATH, sep=\"\\t\", header=False, index=False)\n\nprint(f\"\\n✅ THÀNH CÔNG! Đã lưu file tại {SUBMISSION_PATH}\")\n\n# 4. TRỰC QUAN HÓA VÀ HIỂN THỊ HÌNH ẢNH\nprint(\"\\n--- [PHÂN TÍCH KẾT QUẢ DỰ ĐOÁN] ---\")\nif not submission_df.empty:\n    plt.figure(figsize=(10, 5))\n    sns.histplot(probs.flatten(), bins=50, kde=True, color='forestgreen')\n    plt.title('Confidence Score Distribution')\n    plt.show()\n\n# Hàm hiển thị ảnh hỗ trợ cả định dạng JFIF\ndef show_img_safe(path, title):\n    if os.path.exists(path):\n        print(f\"\\n{title}:\")\n        try:\n            img = PILImage.open(path)\n            plt.figure(figsize=(10, 6))\n            plt.imshow(img)\n            plt.axis('off')\n            plt.title(title)\n            plt.show()\n        except Exception as e:\n            print(f\"Lỗi hiển thị ảnh {os.path.basename(path)}: {e}\")\n    else:\n        print(f\"\\n(Thông tin: Không tìm thấy file {os.path.basename(path)})\")\n\nprint(\"\\n--- [MINH HỌA CẤU TRÚC VÀ QUY TRÌNH] ---\")\n\nimg_structure = f\"{IMG_DIR}/Backup_2_D_Luu 5_Hinh Protein Structure.png\"\n\nimg_workflow = f\"{IMG_DIR}/Backup_2_E_Luu 5_Hinh Xay dung mo hinh du doan chuc nang protein.jfif\"\nimg_licensed = f\"{IMG_DIR}/Backup_2_F_licensed-image.jfif\"\n\nshow_img_safe(img_structure, \"1. Cấu trúc Protein\")\nshow_img_safe(img_workflow, \"2. Quy trình xây dựng mô hình AI\")\nshow_img_safe(img_licensed, \"3. Hình ảnh bổ sung (Licensed Image)\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-03-10T14:58:24.246146Z","iopub.execute_input":"2026-03-10T14:58:24.247086Z","iopub.status.idle":"2026-03-10T15:00:07.431102Z","shell.execute_reply.started":"2026-03-10T14:58:24.247030Z","shell.execute_reply":"2026-03-10T15:00:07.429644Z"}},"outputs":[],"execution_count":null}]}