{"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":"none","dataSources":[{"sourceId":116062,"databundleVersionId":14084779,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":13535489,"sourceType":"datasetVersion","datasetId":8595092}],"dockerImageVersionId":31153,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nBASE = '/kaggle/input/cafa-6-protein-function-prediction'","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Cargar datos principales\ntrain_terms = pd.read_csv(f'{BASE}/Train/train_terms.tsv', sep='\\t')\nia_scores = pd.read_csv(f'{BASE}/IA.tsv', sep='\\t', names=['term', 'ia'], header=None)\nia_dict = dict(zip(ia_scores['term'], ia_scores['ia']))\n\n# Cargar IDs de test\nwith open(f'{BASE}/Test/testsuperset.fasta', 'r') as f:\n    test_ids = [line[1:].strip().split()[0] for line in f if line.startswith('>')]\n\nprint(f\"✅ Datos cargados: {len(train_terms):,} términos, {len(test_ids):,} proteínas test\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-28T18:50:40.778296Z","iopub.execute_input":"2025-10-28T18:50:40.778679Z","iopub.status.idle":"2025-10-28T18:50:41.607823Z","shell.execute_reply.started":"2025-10-28T18:50:40.778655Z","shell.execute_reply":"2025-10-28T18:50:41.606780Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"🎯 SELECCIÓN INTELIGENTE DE TÉRMINOS\")\n\n# Contar frecuencia\ngo_counts = train_terms['term'].value_counts()\n\n# Función para ontología\ndef get_ontology(term):\n    num = int(term[3:])\n    if num < 1000000: return 'MF'\n    elif num < 2000000: return 'BP' \n    else: return 'CC'\n\n# Estrategia: Combinar términos frecuentes + términos de alta IA\nfrequent_terms = go_counts.head(800).index.tolist()\nhigh_ia_terms = ia_scores[ia_scores['ia'] > 5.0]['term'].tolist()[:200]\n\n# Balancear por ontología\nselected_terms = []\nfor term in list(set(frequent_terms + high_ia_terms)):\n    selected_terms.append(term)\n\nprint(f\"📦 {len(selected_terms)} términos seleccionados\")\n\n# Verificar distribución\nontologies = [get_ontology(term) for term in selected_terms]\nfrom collections import Counter\nprint(f\"📊 Distribución: {dict(Counter(ontologies))}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-28T18:50:46.039771Z","iopub.execute_input":"2025-10-28T18:50:46.040740Z","iopub.status.idle":"2025-10-28T18:50:46.110713Z","shell.execute_reply.started":"2025-10-28T18:50:46.040707Z","shell.execute_reply":"2025-10-28T18:50:46.109766Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"🚀 ESTRATEGIA CONSERVADORA - ALTA PRECISIÓN\")\n\n# 1. TÉRMINOS ULTRA-SEGUROS (los más comunes = más probables)\nsafe_terms = go_counts.head(100).index.tolist()\n\n# 2. TÉRMINOS POR ONTOLOGÍA\nmf_terms = [t for t in safe_terms if int(t[3:]) < 1000000][:15]\nbp_terms = [t for t in safe_terms if 1000000 <= int(t[3:]) < 2000000][:15]\ncc_terms = [t for t in safe_terms if int(t[3:]) >= 2000000][:15]\n\nprint(f\"📦 MF:{len(mf_terms)} | BP:{len(bp_terms)} | CC:{len(cc_terms)}\")\n\n# 3. PREDECIR CONSERVADORAMENTE\npredictions = []\nbase_terms = mf_terms + bp_terms + cc_terms\n\nmax_freq = go_counts.max()\n\nfor i, protein_id in enumerate(test_ids):\n    if i % 10000 == 0:\n        print(f\"   {i:,}/{len(test_ids):,}\")\n    \n    for term in base_terms:\n        freq = go_counts.loc[term]\n        freq_normalized = freq / max_freq\n        \n        base_score = 0.3 + (freq_normalized * 0.5)\n        \n        protein_seed = hash(protein_id + term) % 100\n        variation = (protein_seed / 100) * 0.1 - 0.05\n        \n        final_score = np.clip(base_score + variation, 0.15, 0.85)\n        \n        predictions.append({\n            'protein': protein_id,\n            'term': term,\n            'score': round(final_score, 3)\n        })\n\nprint(f\"✅ {len(predictions):,} predicciones generadas\")\n\n# CREAR SUBMISSION INMEDIATAMENTE\nsubmission_df = pd.DataFrame(predictions)\n\nprint(f\"\\n📊 ESTADÍSTICAS FINALES:\")\nprint(f\"   • Predicciones: {len(submission_df):,}\")\nprint(f\"   • Proteínas: {submission_df['protein'].nunique():,}\")\nprint(f\"   • Términos únicos: {submission_df['term'].nunique()}\")\n\n# Distribución ontología\nontology_dist = submission_df['term'].apply(get_ontology).value_counts()\nprint(f\"   • Ontologías: {dict(ontology_dist)}\")\nprint(f\"   • Score promedio: {submission_df['score'].mean():.3f}\")\nprint(f\"   • Score rango: [{submission_df['score'].min():.3f}, {submission_df['score'].max():.3f}]\")\n\n# GUARDAR\nsubmission_df.to_csv('submission.tsv', sep='\\t', index=False, header=False)\nprint(\"\\n💾 SUBMISIÓN GUARDADA: submission.tsv\")\nprint(\"🎯 Expectativa: Score > 0.15 (ya NO es 0.000)\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-28T18:50:52.653420Z","iopub.execute_input":"2025-10-28T18:50:52.653798Z","iopub.status.idle":"2025-10-28T18:52:21.929762Z","shell.execute_reply.started":"2025-10-28T18:50:52.653740Z","shell.execute_reply":"2025-10-28T18:52:21.928619Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# En una nueva celda\nimport os\nprint(f\"Tamaño archivo: {os.path.getsize('submission.tsv') / 1024 / 1024:.1f} MB\")\n\n# Ver primeras líneas\n!head -20 submission.tsv","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-28T18:53:03.413385Z","iopub.execute_input":"2025-10-28T18:53:03.414704Z","iopub.status.idle":"2025-10-28T18:53:03.602617Z","shell.execute_reply.started":"2025-10-28T18:53:03.414650Z","shell.execute_reply":"2025-10-28T18:53:03.601210Z"}},"outputs":[],"execution_count":null}]}