{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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,"sourceType":"competition"}],"dockerImageVersionId":31153,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false},"colab":{"provenance":[],"gpuType":"T4","name":"Protein Seq to Function Prediction | CAFA 6 "},"accelerator":"GPU","widgets":{"application/vnd.jupyter.widget-state+json":{"11654663d41444c6a52f57081ac705b2":{"model_module":"@jupyter-widgets/controls","model_name":"VBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"VBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"VBoxView","box_style":"","children":["IPY_MODEL_fc1c1932da594b5c9c364335a87d0dae","IPY_MODEL_727c189733854a51889727f57dbe6f52","IPY_MODEL_c1579de9cec340278f269bb4bc6222e2","IPY_MODEL_234e717da9f6403db964ea686a03aa61","IPY_MODEL_c1f21dd538ba469bbae52ee89f901fe2"],"layout":"IPY_MODEL_8f70e8c11c0947cc9a3028c54319ebfc"}},"fc1c1932da594b5c9c364335a87d0dae":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_143b062e93fd40a686842bd2df93cf10","placeholder":"​","style":"IPY_MODEL_e78c9229860b45fc995bc98b37382e2f","value":"<center> <img\nsrc=https://www.kaggle.com/static/images/site-logo.png\nalt='Kaggle'> <br> Create an API token from <a\nhref=\"https://www.kaggle.com/settings/account\" target=\"_blank\">your Kaggle\nsettings page</a> and paste it below along with your Kaggle username. <br> </center>"}},"727c189733854a51889727f57dbe6f52":{"model_module":"@jupyter-widgets/controls","model_name":"TextModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"TextModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"TextView","continuous_update":true,"description":"Username:","description_tooltip":null,"disabled":false,"layout":"IPY_MODEL_27d6028c65df45d3a43b963141c85522","placeholder":"​","style":"IPY_MODEL_67bb5568ce724ec8881a4be91437d456","value":"socruz"}},"c1579de9cec340278f269bb4bc6222e2":{"model_module":"@jupyter-widgets/controls","model_name":"PasswordModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"PasswordModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"PasswordView","continuous_update":true,"description":"Token:","description_tooltip":null,"disabled":false,"layout":"IPY_MODEL_69843af638f54be2ba07dd4051ffc5c9","placeholder":"​","style":"IPY_MODEL_8613cc07e4924bb6a2efc6e6f474e45f","value":"807c86bfa0fbe9e9fefcdc0e10408bb3"}},"234e717da9f6403db964ea686a03aa61":{"model_module":"@jupyter-widgets/controls","model_name":"ButtonModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ButtonModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ButtonView","button_style":"","description":"Login","disabled":false,"icon":"","layout":"IPY_MODEL_6d49f341bf7a4ab1a71c4c331c5aa67a","style":"IPY_MODEL_efdb069729da42eca3bde27fccfa57fb","tooltip":""}},"c1f21dd538ba469bbae52ee89f901fe2":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_afec13e4ded04d8e8f53839fd41d49fe","placeholder":"​","style":"IPY_MODEL_ac11b3589534462d8da7446a15eb549a","value":"\n<b>Thank You</b></center>"}},"8f70e8c11c0947cc9a3028c54319ebfc":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":"center","align_self":null,"border":null,"bottom":null,"display":"flex","flex":null,"flex_flow":"column","grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":"50%"}},"143b062e93fd40a686842bd2df93cf10":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"e78c9229860b45fc995bc98b37382e2f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"27d6028c65df45d3a43b963141c85522":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"67bb5568ce724ec8881a4be91437d456":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"69843af638f54be2ba07dd4051ffc5c9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"8613cc07e4924bb6a2efc6e6f474e45f":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"6d49f341bf7a4ab1a71c4c331c5aa67a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"efdb069729da42eca3bde27fccfa57fb":{"model_module":"@jupyter-widgets/controls","model_name":"ButtonStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ButtonStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","button_color":null,"font_weight":""}},"afec13e4ded04d8e8f53839fd41d49fe":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"ac11b3589534462d8da7446a15eb549a":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"678a7e1151c047379c43d16254c18310":{"model_module":"@jupyter-widgets/controls","model_name":"VBoxModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"VBoxModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"VBoxView","box_style":"","children":["IPY_MODEL_545e9529c385472dac456fbeb945a599","IPY_MODEL_7028f06d71f6480d989051a17df51600","IPY_MODEL_10f419e1ee814953b8b25d3365ec7feb","IPY_MODEL_d0b6e69c3fcd467d9630e3f8b87cd92d","IPY_MODEL_81c80f20fc174728b37d9f29008ab3f1"],"layout":"IPY_MODEL_2609780525cc4e1a869f2f0a3db04153"}},"545e9529c385472dac456fbeb945a599":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_e23cb2818ce24bd2bb5b822ac3f16048","placeholder":"​","style":"IPY_MODEL_0e3aa2721e5e4e59acb993f9500d41fa","value":"<center> <img\nsrc=https://www.kaggle.com/static/images/site-logo.png\nalt='Kaggle'> <br> Create an API token from <a\nhref=\"https://www.kaggle.com/settings/account\" target=\"_blank\">your Kaggle\nsettings page</a> and paste it below along with your Kaggle username. <br> </center>"}},"7028f06d71f6480d989051a17df51600":{"model_module":"@jupyter-widgets/controls","model_name":"TextModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"TextModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"TextView","continuous_update":true,"description":"Username:","description_tooltip":null,"disabled":false,"layout":"IPY_MODEL_e6998d8729e948f0beb48d481cbccb11","placeholder":"​","style":"IPY_MODEL_78ed363cd36c40f9887887136b161c6d","value":""}},"10f419e1ee814953b8b25d3365ec7feb":{"model_module":"@jupyter-widgets/controls","model_name":"PasswordModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"PasswordModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"PasswordView","continuous_update":true,"description":"Token:","description_tooltip":null,"disabled":false,"layout":"IPY_MODEL_862c2d59088e4c238cd366bbcfb3ef7c","placeholder":"​","style":"IPY_MODEL_7ce436e6432d45508668999d579cc57e","value":""}},"d0b6e69c3fcd467d9630e3f8b87cd92d":{"model_module":"@jupyter-widgets/controls","model_name":"ButtonModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ButtonModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"ButtonView","button_style":"","description":"Login","disabled":false,"icon":"","layout":"IPY_MODEL_8e8a5b62f02e40418222e3041a51cf30","style":"IPY_MODEL_34181e166bbc4a6bbae7b80d9ce6854f","tooltip":""}},"81c80f20fc174728b37d9f29008ab3f1":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","model_module_version":"1.5.0","state":{"_dom_classes":[],"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"HTMLModel","_view_count":null,"_view_module":"@jupyter-widgets/controls","_view_module_version":"1.5.0","_view_name":"HTMLView","description":"","description_tooltip":null,"layout":"IPY_MODEL_72e176a85f4543d9827b8e8ea806214c","placeholder":"​","style":"IPY_MODEL_246e6c35d26b4e1199bb1dffc834fe05","value":"\n<b>Thank You</b></center>"}},"2609780525cc4e1a869f2f0a3db04153":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":"center","align_self":null,"border":null,"bottom":null,"display":"flex","flex":null,"flex_flow":"column","grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":"50%"}},"e23cb2818ce24bd2bb5b822ac3f16048":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"0e3aa2721e5e4e59acb993f9500d41fa":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"e6998d8729e948f0beb48d481cbccb11":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"78ed363cd36c40f9887887136b161c6d":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"862c2d59088e4c238cd366bbcfb3ef7c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"7ce436e6432d45508668999d579cc57e":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}},"8e8a5b62f02e40418222e3041a51cf30":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"34181e166bbc4a6bbae7b80d9ce6854f":{"model_module":"@jupyter-widgets/controls","model_name":"ButtonStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"ButtonStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","button_color":null,"font_weight":""}},"72e176a85f4543d9827b8e8ea806214c":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","model_module_version":"1.2.0","state":{"_model_module":"@jupyter-widgets/base","_model_module_version":"1.2.0","_model_name":"LayoutModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"LayoutView","align_content":null,"align_items":null,"align_self":null,"border":null,"bottom":null,"display":null,"flex":null,"flex_flow":null,"grid_area":null,"grid_auto_columns":null,"grid_auto_flow":null,"grid_auto_rows":null,"grid_column":null,"grid_gap":null,"grid_row":null,"grid_template_areas":null,"grid_template_columns":null,"grid_template_rows":null,"height":null,"justify_content":null,"justify_items":null,"left":null,"margin":null,"max_height":null,"max_width":null,"min_height":null,"min_width":null,"object_fit":null,"object_position":null,"order":null,"overflow":null,"overflow_x":null,"overflow_y":null,"padding":null,"right":null,"top":null,"visibility":null,"width":null}},"246e6c35d26b4e1199bb1dffc834fe05":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","model_module_version":"1.5.0","state":{"_model_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_model_name":"DescriptionStyleModel","_view_count":null,"_view_module":"@jupyter-widgets/base","_view_module_version":"1.2.0","_view_name":"StyleView","description_width":""}}}}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Trained on LSTM, and transformers | Will try on other models","metadata":{}},{"cell_type":"code","source":"# IMPORTANT: RUN THIS CELL IN ORDER TO IMPORT YOUR KAGGLE DATA SOURCES,\n# THEN FEEL FREE TO DELETE THIS CELL.\n# NOTE: THIS NOTEBOOK ENVIRONMENT DIFFERS FROM KAGGLE'S PYTHON\n# ENVIRONMENT SO THERE MAY BE MISSING LIBRARIES USED BY YOUR\n# NOTEBOOK.\nimport kagglehub\n\ncafa_6_protein_function_prediction_path = kagglehub.competition_download('cafa-6-protein-function-prediction')\n\nprint('Data source import complete.')\n","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"rbaoRSi4toRH","outputId":"ede360e3-60c9-4178-9202-9d1874f1817a","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T18:43:00.069264Z","iopub.execute_input":"2025-11-03T18:43:00.069968Z","iopub.status.idle":"2025-11-03T18:43:01.464658Z","shell.execute_reply.started":"2025-11-03T18:43:00.069939Z","shell.execute_reply":"2025-11-03T18:43:01.463871Z"}},"outputs":[{"name":"stdout","text":"Data source import complete.\n","output_type":"stream"}],"execution_count":1},{"cell_type":"code","source":"# IMPORTANT: SOME KAGGLE DATA SOURCES ARE PRIVATE\n# RUN THIS CELL IN ORDER TO IMPORT YOUR KAGGLE DATA SOURCES.\nimport kagglehub\nkagglehub.login()","metadata":{"_uuid":"cb6728e6-2397-42d2-a6a0-8859c17378e4","_cell_guid":"eb65eea2-72bd-406f-9cdb-0be69bab98f5","trusted":true,"id":"T6TrsZDqcI8S","outputId":"65c97910-7729-44df-aed3-be55e5d596f6","execution":{"iopub.status.busy":"2025-11-03T18:43:03.079775Z","iopub.execute_input":"2025-11-03T18:43:03.080424Z","iopub.status.idle":"2025-11-03T18:43:03.096513Z","shell.execute_reply.started":"2025-11-03T18:43:03.080396Z","shell.execute_reply":"2025-11-03T18:43:03.095828Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":273,"referenced_widgets":["678a7e1151c047379c43d16254c18310","545e9529c385472dac456fbeb945a599","7028f06d71f6480d989051a17df51600","10f419e1ee814953b8b25d3365ec7feb","d0b6e69c3fcd467d9630e3f8b87cd92d","81c80f20fc174728b37d9f29008ab3f1","2609780525cc4e1a869f2f0a3db04153","e23cb2818ce24bd2bb5b822ac3f16048","0e3aa2721e5e4e59acb993f9500d41fa","e6998d8729e948f0beb48d481cbccb11","78ed363cd36c40f9887887136b161c6d","862c2d59088e4c238cd366bbcfb3ef7c","7ce436e6432d45508668999d579cc57e","8e8a5b62f02e40418222e3041a51cf30","34181e166bbc4a6bbae7b80d9ce6854f","72e176a85f4543d9827b8e8ea806214c","246e6c35d26b4e1199bb1dffc834fe05"]},"collapsed":false},"outputs":[{"output_type":"display_data","data":{"text/plain":"VBox(children=(HTML(value='<center> <img\\nsrc=https://www.kaggle.com/static/images/site-logo.png\\nalt=\\'Kaggle…","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"b6196a8ffce54dcca2a8488c4011c432"}},"metadata":{}}],"execution_count":2},{"cell_type":"code","source":"# IMPORTANT: RUN THIS CELL IN ORDER TO IMPORT YOUR KAGGLE DATA SOURCES,\n# THEN FEEL FREE TO DELETE THIS CELL.\n# NOTE: THIS NOTEBOOK ENVIRONMENT DIFFERS FROM KAGGLE'S PYTHON\n# ENVIRONMENT SO THERE MAY BE MISSING LIBRARIES USED BY YOUR\n# NOTEBOOK.\n\ncafa_6_protein_function_prediction_path = kagglehub.competition_download('cafa-6-protein-function-prediction')\n\nprint('Data source import complete.')","metadata":{"_uuid":"61051adc-6bb1-4704-b815-d974ea376ebc","_cell_guid":"f12ad9fd-042b-4cfa-8b5b-58e523bc2184","trusted":true,"id":"mdZqgpDEcI8T","outputId":"aca38d79-0b4e-47ae-ac2b-c37326847588","execution":{"iopub.status.busy":"2025-11-03T17:10:20.24142Z","iopub.execute_input":"2025-11-03T17:10:20.241701Z","iopub.status.idle":"2025-11-03T17:10:20.80181Z","shell.execute_reply.started":"2025-11-03T17:10:20.241678Z","shell.execute_reply":"2025-11-03T17:10:20.800854Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["Data source import complete.\n"]}],"execution_count":6},{"cell_type":"code","source":"# IMPORTANT: RUN THIS CELL IN ORDER TO IMPORT YOUR KAGGLE DATA SOURCES,\n# THEN FEEL FREE TO DELETE THIS CELL.\n# NOTE: THIS NOTEBOOK ENVIRONMENT DIFFERS FROM KAGGLE'S PYTHON\n# ENVIRONMENT SO THERE MAY BE MISSING LIBRARIES USED BY YOUR\n# NOTEBOOK.\n\ncafa_6_protein_function_prediction_path = kagglehub.competition_download('cafa-6-protein-function-prediction')\n\nprint('Data source import complete.')","metadata":{"_uuid":"2f31269e-c736-4d89-adcd-cc2d44f32004","_cell_guid":"d0001a47-09f5-4b7f-b0cf-7c9a382c96ca","trusted":true,"id":"QRb_n48IwSFL","outputId":"b78de34c-87b6-441d-ac0a-142f0c055207","execution":{"iopub.status.busy":"2025-11-03T17:10:20.80284Z","iopub.execute_input":"2025-11-03T17:10:20.803062Z","iopub.status.idle":"2025-11-03T17:10:21.343844Z","shell.execute_reply.started":"2025-11-03T17:10:20.803045Z","shell.execute_reply":"2025-11-03T17:10:21.341727Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["Data source import complete.\n"]}],"execution_count":7},{"cell_type":"code","source":"from torch.cuda.amp import GradScaler, autocast","metadata":{"_uuid":"61b38159-2759-465c-853b-763e911584a5","_cell_guid":"579374c5-a49d-439a-a18f-5a7397d69c19","trusted":true,"id":"z7HP5eIcwts5","execution":{"iopub.status.busy":"2025-11-03T17:10:21.344328Z","iopub.execute_input":"2025-11-03T17:10:21.344585Z","iopub.status.idle":"2025-11-03T17:10:25.485408Z","shell.execute_reply.started":"2025-11-03T17:10:21.344559Z","shell.execute_reply":"2025-11-03T17:10:25.48482Z"},"jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":8},{"cell_type":"code","source":"\nimport numpy as np\nimport pandas as pd\nimport os\n! pip install Bio goatools\nfrom Bio import SeqIO\nfrom goatools import obo_parser","metadata":{"_uuid":"ac9550ed-6822-4914-aef0-02b8f8dcbbde","_cell_guid":"dcdc8b7e-aebe-431a-b9c6-6bd1e219576c","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T17:10:25.48755Z","iopub.execute_input":"2025-11-03T17:10:25.487867Z","iopub.status.idle":"2025-11-03T17:11:00.750607Z","shell.execute_reply.started":"2025-11-03T17:10:25.48785Z","shell.execute_reply":"2025-11-03T17:11:00.749814Z"},"id":"9z-jbTPQwSFL","outputId":"4dc4f614-c752-4a20-a5fd-07f23a86d5df","jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["Collecting Bio\n","  Downloading bio-1.8.1-py3-none-any.whl.metadata (5.7 kB)\n","Collecting goatools\n","  Downloading goatools-1.5.2-py3-none-any.whl.metadata (14 kB)\n","Collecting biopython>=1.80 (from Bio)\n","  Downloading biopython-1.86-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (13 kB)\n","Collecting gprofiler-official (from Bio)\n","  Downloading gprofiler_official-1.0.0-py3-none-any.whl.metadata (11 kB)\n","Collecting mygene (from Bio)\n","  Downloading mygene-3.2.2-py2.py3-none-any.whl.metadata (10 kB)\n","Requirement already satisfied: pandas in /usr/local/lib/python3.12/dist-packages (from Bio) (2.2.2)\n","Requirement already satisfied: pooch in /usr/local/lib/python3.12/dist-packages (from Bio) (1.8.2)\n","Requirement already satisfied: requests in /usr/local/lib/python3.12/dist-packages (from Bio) (2.32.4)\n","Requirement already satisfied: tqdm in /usr/local/lib/python3.12/dist-packages (from Bio) (4.67.1)\n","Collecting docopt-ng (from goatools)\n","  Downloading docopt_ng-0.9.0-py3-none-any.whl.metadata (13 kB)\n","Collecting ftpretty (from goatools)\n","  Downloading ftpretty-0.4.0-py2.py3-none-any.whl.metadata (6.6 kB)\n","Requirement already satisfied: numpy in /usr/local/lib/python3.12/dist-packages (from goatools) (2.0.2)\n","Requirement already satisfied: openpyxl in /usr/local/lib/python3.12/dist-packages (from goatools) (3.1.5)\n","Requirement already satisfied: pydot in /usr/local/lib/python3.12/dist-packages (from goatools) (3.0.4)\n","Requirement already satisfied: rich in /usr/local/lib/python3.12/dist-packages (from goatools) (13.9.4)\n","Requirement already satisfied: scipy in /usr/local/lib/python3.12/dist-packages (from goatools) (1.16.3)\n","Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from goatools) (75.2.0)\n","Requirement already satisfied: statsmodels in /usr/local/lib/python3.12/dist-packages (from goatools) (0.14.5)\n","Collecting xlsxwriter (from goatools)\n","  Downloading xlsxwriter-3.2.9-py3-none-any.whl.metadata (2.7 kB)\n","Requirement already satisfied: python-dateutil in /usr/local/lib/python3.12/dist-packages (from ftpretty->goatools) (2.9.0.post0)\n","Collecting biothings-client>=0.2.6 (from mygene->Bio)\n","  Downloading biothings_client-0.4.1-py3-none-any.whl.metadata (10 kB)\n","Requirement already satisfied: et-xmlfile in /usr/local/lib/python3.12/dist-packages (from openpyxl->goatools) (2.0.0)\n","Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas->Bio) (2025.2)\n","Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas->Bio) (2025.2)\n","Requirement already satisfied: platformdirs>=2.5.0 in /usr/local/lib/python3.12/dist-packages (from pooch->Bio) (4.5.0)\n","Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from pooch->Bio) (25.0)\n","Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests->Bio) (3.4.4)\n","Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests->Bio) (3.11)\n","Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests->Bio) (2.5.0)\n","Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests->Bio) (2025.10.5)\n","Requirement already satisfied: pyparsing>=3.0.9 in /usr/local/lib/python3.12/dist-packages (from pydot->goatools) (3.2.5)\n","Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.12/dist-packages (from rich->goatools) (4.0.0)\n","Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /usr/local/lib/python3.12/dist-packages (from rich->goatools) (2.19.2)\n","Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.12/dist-packages (from statsmodels->goatools) (1.0.2)\n","Requirement already satisfied: httpx>=0.22.0 in /usr/local/lib/python3.12/dist-packages (from biothings-client>=0.2.6->mygene->Bio) (0.28.1)\n","Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.12/dist-packages (from markdown-it-py>=2.2.0->rich->goatools) (0.1.2)\n","Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil->ftpretty->goatools) (1.17.0)\n","Requirement already satisfied: anyio in /usr/local/lib/python3.12/dist-packages (from httpx>=0.22.0->biothings-client>=0.2.6->mygene->Bio) (4.11.0)\n","Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.12/dist-packages (from httpx>=0.22.0->biothings-client>=0.2.6->mygene->Bio) (1.0.9)\n","Requirement already satisfied: h11>=0.16 in /usr/local/lib/python3.12/dist-packages (from httpcore==1.*->httpx>=0.22.0->biothings-client>=0.2.6->mygene->Bio) (0.16.0)\n","Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.12/dist-packages (from anyio->httpx>=0.22.0->biothings-client>=0.2.6->mygene->Bio) (1.3.1)\n","Requirement already satisfied: typing_extensions>=4.5 in /usr/local/lib/python3.12/dist-packages (from anyio->httpx>=0.22.0->biothings-client>=0.2.6->mygene->Bio) (4.15.0)\n","Downloading bio-1.8.1-py3-none-any.whl (321 kB)\n","\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m321.3/321.3 kB\u001b[0m \u001b[31m28.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading goatools-1.5.2-py3-none-any.whl (15.8 MB)\n","\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.8/15.8 MB\u001b[0m \u001b[31m125.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading biopython-1.86-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (3.2 MB)\n","\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m3.2/3.2 MB\u001b[0m \u001b[31m131.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading docopt_ng-0.9.0-py3-none-any.whl (16 kB)\n","Downloading ftpretty-0.4.0-py2.py3-none-any.whl (8.2 kB)\n","Downloading gprofiler_official-1.0.0-py3-none-any.whl (9.3 kB)\n","Downloading mygene-3.2.2-py2.py3-none-any.whl (5.4 kB)\n","Downloading xlsxwriter-3.2.9-py3-none-any.whl (175 kB)\n","\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m175.3/175.3 kB\u001b[0m \u001b[31m19.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hDownloading biothings_client-0.4.1-py3-none-any.whl (46 kB)\n","\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m46.7/46.7 kB\u001b[0m \u001b[31m4.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n","\u001b[?25hInstalling collected packages: xlsxwriter, docopt-ng, biopython, gprofiler-official, ftpretty, biothings-client, mygene, goatools, Bio\n","Successfully installed Bio-1.8.1 biopython-1.86 biothings-client-0.4.1 docopt-ng-0.9.0 ftpretty-0.4.0 goatools-1.5.2 gprofiler-official-1.0.0 mygene-3.2.2 xlsxwriter-3.2.9\n"]}],"execution_count":9},{"cell_type":"code","source":"os.listdir(cafa_6_protein_function_prediction_path)","metadata":{"_uuid":"ab640caa-73cc-4eed-8ac9-30f762a2b954","_cell_guid":"de61f011-c262-481b-910e-a508193ffa73","trusted":true,"id":"g-qbpgvixZTw","outputId":"ccca0762-e13f-4db9-8327-5c47d7d7657e","execution":{"iopub.status.busy":"2025-11-03T17:11:00.751496Z","iopub.execute_input":"2025-11-03T17:11:00.751939Z","iopub.status.idle":"2025-11-03T17:11:00.757218Z","shell.execute_reply.started":"2025-11-03T17:11:00.751909Z","shell.execute_reply":"2025-11-03T17:11:00.756679Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["['Train', 'IA.tsv', 'Test', 'sample_submission.tsv']"]},"metadata":{},"execution_count":10}],"execution_count":10},{"cell_type":"code","source":"files = []\nfor dirname, _, filenames in os.walk(cafa_6_protein_function_prediction_path):\n    for filename in filenames:\n        files.append(os.path.join(dirname, filename))","metadata":{"_uuid":"77da5381-bf11-4041-989f-4441eec62924","_cell_guid":"a472fde9-79b5-4a19-b4cc-de918d4ed296","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T17:11:00.757866Z","iopub.execute_input":"2025-11-03T17:11:00.758048Z","iopub.status.idle":"2025-11-03T17:11:00.781299Z","shell.execute_reply.started":"2025-11-03T17:11:00.758033Z","shell.execute_reply":"2025-11-03T17:11:00.780615Z"},"id":"uh-xSO2NwSFM","jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":11},{"cell_type":"code","source":"files","metadata":{"_uuid":"4fea7ca9-387d-4507-b45a-e39049b839e2","_cell_guid":"090f6208-d6ef-442e-b909-6b5bb776b339","trusted":true,"id":"oU7vr0hEyPh2","outputId":"1a5282b5-4acf-41ca-da03-7c261ea663da","execution":{"iopub.status.busy":"2025-11-03T17:11:00.781987Z","iopub.execute_input":"2025-11-03T17:11:00.782306Z","iopub.status.idle":"2025-11-03T17:11:00.786553Z","shell.execute_reply.started":"2025-11-03T17:11:00.782289Z","shell.execute_reply":"2025-11-03T17:11:00.785998Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["['/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/IA.tsv',\n"," '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/sample_submission.tsv',\n"," '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/train_terms.tsv',\n"," '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/go-basic.obo',\n"," '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/train_taxonomy.tsv',\n"," '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/train_sequences.fasta',\n"," '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Test/testsuperset.fasta',\n"," '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Test/testsuperset-taxon-list.tsv']"]},"metadata":{},"execution_count":12}],"execution_count":12},{"cell_type":"code","source":"file_names = [str(files[x]).split(\"/\")[-1] for x in range(len(files))]\nfiledict = dict(zip(file_names,files))\nfiledict","metadata":{"_uuid":"3fb499ff-dd96-457f-91fd-38ce6c5b5f2f","_cell_guid":"03dfb0e6-8553-4f38-bf10-b35e43ae1eff","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T17:11:00.787166Z","iopub.execute_input":"2025-11-03T17:11:00.787371Z","iopub.status.idle":"2025-11-03T17:11:00.800405Z","shell.execute_reply.started":"2025-11-03T17:11:00.787347Z","shell.execute_reply":"2025-11-03T17:11:00.799679Z"},"id":"JhC_Udu2wSFN","outputId":"90b0c4f9-2466-46ef-a506-9801224984de","jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["{'IA.tsv': '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/IA.tsv',\n"," 'sample_submission.tsv': '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/sample_submission.tsv',\n"," 'train_terms.tsv': '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/train_terms.tsv',\n"," 'go-basic.obo': '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/go-basic.obo',\n"," 'train_taxonomy.tsv': '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/train_taxonomy.tsv',\n"," 'train_sequences.fasta': '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/train_sequences.fasta',\n"," 'testsuperset.fasta': '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Test/testsuperset.fasta',\n"," 'testsuperset-taxon-list.tsv': '/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Test/testsuperset-taxon-list.tsv'}"]},"metadata":{},"execution_count":13}],"execution_count":13},{"cell_type":"code","source":"train_terms = pd.read_csv(filedict['train_terms.tsv'],sep='\\t')\ntrain_terms['term'] = [x[1] for x in train_terms['term'].str.split(\":\")] # removed \"GO :\" from\nnunique_go = len(train_terms['term'].unique())\ntrain_terms =train_terms.rename(columns={'EntryID':'UniprotID'})","metadata":{"_uuid":"f66c276e-8cc9-4def-94c8-1ba6b3a18266","_cell_guid":"87b0c212-db40-4c00-98b9-31219141fb40","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T17:11:00.801111Z","iopub.execute_input":"2025-11-03T17:11:00.801358Z","iopub.status.idle":"2025-11-03T17:11:02.354931Z","shell.execute_reply.started":"2025-11-03T17:11:00.801335Z","shell.execute_reply":"2025-11-03T17:11:02.354297Z"},"id":"nP6Uf41UwSFN","jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":14},{"cell_type":"code","source":"train_terms","metadata":{"_uuid":"c55edb04-7197-486f-9aa9-07f06f99bd33","_cell_guid":"8ce98395-1c79-452b-93f7-ec07980181d1","trusted":true,"id":"DQEiTxZczJo0","outputId":"8eca93da-3079-4636-fced-4a27bb9d7ace","execution":{"iopub.status.busy":"2025-11-03T17:11:02.355714Z","iopub.execute_input":"2025-11-03T17:11:02.355931Z","iopub.status.idle":"2025-11-03T17:11:02.376866Z","shell.execute_reply.started":"2025-11-03T17:11:02.355915Z","shell.execute_reply":"2025-11-03T17:11:02.376104Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":424},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["       UniprotID     term aspect\n","0         Q5W0B1  0000785      C\n","1         Q5W0B1  0004842      F\n","2         Q5W0B1  0051865      P\n","3         Q5W0B1  0006275      P\n","4         Q5W0B1  0006513      P\n","...          ...      ...    ...\n","537022    Q06667  0070481      P\n","537023    B1NF19  0033075      P\n","537024    B1NF19  0047052      F\n","537025    B1NF19  0047056      F\n","537026    B1NF19  0102632      F\n","\n","[537027 rows x 3 columns]"],"text/html":["\n","  <div id=\"df-27629017-0b25-49b6-a377-da03609c35e1\" class=\"colab-df-container\">\n","    <div>\n","<style scoped>\n","    .dataframe tbody tr th:only-of-type {\n","        vertical-align: middle;\n","    }\n","\n","    .dataframe tbody tr th {\n","        vertical-align: top;\n","    }\n","\n","    .dataframe thead th {\n","        text-align: right;\n","    }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n","  <thead>\n","    <tr style=\"text-align: right;\">\n","      <th></th>\n","      <th>UniprotID</th>\n","      <th>term</th>\n","      <th>aspect</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>Q5W0B1</td>\n","      <td>0000785</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>Q5W0B1</td>\n","      <td>0004842</td>\n","      <td>F</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>Q5W0B1</td>\n","      <td>0051865</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>Q5W0B1</td>\n","      <td>0006275</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>Q5W0B1</td>\n","      <td>0006513</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>...</th>\n","      <td>...</td>\n","      <td>...</td>\n","      <td>...</td>\n","    </tr>\n","    <tr>\n","      <th>537022</th>\n","      <td>Q06667</td>\n","      <td>0070481</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>537023</th>\n","      <td>B1NF19</td>\n","      <td>0033075</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>537024</th>\n","      <td>B1NF19</td>\n","      <td>0047052</td>\n","      <td>F</td>\n","    </tr>\n","    <tr>\n","      <th>537025</th>\n","      <td>B1NF19</td>\n","      <td>0047056</td>\n","      <td>F</td>\n","    </tr>\n","    <tr>\n","      <th>537026</th>\n","      <td>B1NF19</td>\n","      <td>0102632</td>\n","      <td>F</td>\n","    </tr>\n","  </tbody>\n","</table>\n","<p>537027 rows × 3 columns</p>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-27629017-0b25-49b6-a377-da03609c35e1')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-27629017-0b25-49b6-a377-da03609c35e1 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-27629017-0b25-49b6-a377-da03609c35e1');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    <div id=\"df-67cf692c-99ed-4ed7-9f3e-7e14890be480\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-67cf692c-99ed-4ed7-9f3e-7e14890be480')\"\n","                title=\"Suggest charts\"\n","                style=\"display:none;\">\n","\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","     width=\"24px\">\n","    <g>\n","        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n","    </g>\n","</svg>\n","      </button>\n","\n","<style>\n","  .colab-df-quickchart {\n","      --bg-color: #E8F0FE;\n","      --fill-color: #1967D2;\n","      --hover-bg-color: #E2EBFA;\n","      --hover-fill-color: #174EA6;\n","      --disabled-fill-color: #AAA;\n","      --disabled-bg-color: #DDD;\n","  }\n","\n","  [theme=dark] .colab-df-quickchart {\n","      --bg-color: #3B4455;\n","      --fill-color: #D2E3FC;\n","      --hover-bg-color: #434B5C;\n","      --hover-fill-color: #FFFFFF;\n","      --disabled-bg-color: #3B4455;\n","      --disabled-fill-color: #666;\n","  }\n","\n","  .colab-df-quickchart {\n","    background-color: var(--bg-color);\n","    border: none;\n","    border-radius: 50%;\n","    cursor: pointer;\n","    display: none;\n","    fill: var(--fill-color);\n","    height: 32px;\n","    padding: 0;\n","    width: 32px;\n","  }\n","\n","  .colab-df-quickchart:hover {\n","    background-color: var(--hover-bg-color);\n","    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n","    fill: var(--button-hover-fill-color);\n","  }\n","\n","  .colab-df-quickchart-complete:disabled,\n","  .colab-df-quickchart-complete:disabled:hover {\n","    background-color: var(--disabled-bg-color);\n","    fill: var(--disabled-fill-color);\n","    box-shadow: none;\n","  }\n","\n","  .colab-df-spinner {\n","    border: 2px solid var(--fill-color);\n","    border-color: transparent;\n","    border-bottom-color: var(--fill-color);\n","    animation:\n","      spin 1s steps(1) infinite;\n","  }\n","\n","  @keyframes spin {\n","    0% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","      border-left-color: var(--fill-color);\n","    }\n","    20% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    30% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","      border-right-color: var(--fill-color);\n","    }\n","    40% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    60% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","    }\n","    80% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-bottom-color: var(--fill-color);\n","    }\n","    90% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","    }\n","  }\n","</style>\n","\n","      <script>\n","        async function quickchart(key) {\n","          const quickchartButtonEl =\n","            document.querySelector('#' + key + ' button');\n","          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n","          quickchartButtonEl.classList.add('colab-df-spinner');\n","          try {\n","            const charts = await google.colab.kernel.invokeFunction(\n","                'suggestCharts', [key], {});\n","          } catch (error) {\n","            console.error('Error during call to suggestCharts:', error);\n","          }\n","          quickchartButtonEl.classList.remove('colab-df-spinner');\n","          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n","        }\n","        (() => {\n","          let quickchartButtonEl =\n","            document.querySelector('#df-67cf692c-99ed-4ed7-9f3e-7e14890be480 button');\n","          quickchartButtonEl.style.display =\n","            google.colab.kernel.accessAllowed ? 'block' : 'none';\n","        })();\n","      </script>\n","    </div>\n","\n","  <div id=\"id_c04a90de-c9fc-4f59-a6d7-608eb417749d\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('train_terms')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_c04a90de-c9fc-4f59-a6d7-608eb417749d button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('train_terms');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"train_terms"}},"metadata":{},"execution_count":15}],"execution_count":15},{"cell_type":"code","source":"seqs_dict ={}\n\nwith open(filedict['train_sequences.fasta'], 'r') as f:\n    x =  f.readlines()\n    # Modify headers to keep only Uniprot ID\n    for line in x:\n        if line.startswith('>'):\n            # Extract Uniprot ID (assuming format sp|UniprotID|...)\n            uniprot_id = line.split('|')[1]\n        else:\n            fasta_seq= line.replace(\"\\n\",\"\")\n            seqs_dict[uniprot_id] = fasta_seq\n\ntrian_seq_Df = pd.DataFrame(seqs_dict.items(), columns=['UniprotID', 'Sequence'])","metadata":{"_uuid":"0cbd7545-e20b-4669-889a-90819316bc65","_cell_guid":"6fe3662a-90b9-409f-9c96-f957362b5a58","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T17:11:02.377688Z","iopub.execute_input":"2025-11-03T17:11:02.377878Z","iopub.status.idle":"2025-11-03T17:11:03.78591Z","shell.execute_reply.started":"2025-11-03T17:11:02.377864Z","shell.execute_reply":"2025-11-03T17:11:03.785324Z"},"id":"ZhwLGg2nwSFN","jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":16},{"cell_type":"code","source":"trian_seq_Df","metadata":{"_uuid":"ff018b18-6473-4cc3-a53d-b13e2aacadc0","_cell_guid":"ab9be80c-db88-48a9-95d2-57de4f775760","trusted":true,"id":"xQRMPvn11f-z","outputId":"0af57f3b-7b3a-401c-acb7-a6dcad0fbad1","execution":{"iopub.status.busy":"2025-11-03T17:11:03.786662Z","iopub.execute_input":"2025-11-03T17:11:03.786896Z","iopub.status.idle":"2025-11-03T17:11:03.795131Z","shell.execute_reply.started":"2025-11-03T17:11:03.78688Z","shell.execute_reply":"2025-11-03T17:11:03.794537Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":424},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["        UniprotID                                           Sequence\n","0      A0A0C5B5G6                                   MRWQEMGYIFYPRKLR\n","1          A0JNW5                           KMALAEAHLEKDALLHHIKKMTVE\n","2          A0JP26          DETKHQNQLRENKILEEIESVKEKLLKAIQLNEEALTKTSI\n","3          A0PK11  VEEQYEESFWICVASASAHAANLVVVAISQIPLPEIKTKIEEATVT...\n","4          A1A4S6                                             NYVKLL\n","...           ...                                                ...\n","82399      Q9UTM1  IIYLKKTMRVTPSEEKIHEMINQKRETKKRKRKQKKKNDDDYGVFE...\n","82400      Q9Y7I1                                 DRLNLKEPVDLEGPKDEQ\n","82401      Q9Y7P7  LGLLVFLHSLIVARFFVASKSRSCIVRSLLFWINLDSADSRISVLF...\n","82402      Q9Y7Q3                      EMTRIYLSIRKNFFQICLKTHSPQLPLGR\n","82403      Q9Y816                             PSYPFSEITEVSRGGLHFVKLN\n","\n","[82404 rows x 2 columns]"],"text/html":["\n","  <div id=\"df-05be158d-22c7-4e2d-ba41-de14e28fedf8\" class=\"colab-df-container\">\n","    <div>\n","<style scoped>\n","    .dataframe tbody tr th:only-of-type {\n","        vertical-align: middle;\n","    }\n","\n","    .dataframe tbody tr th {\n","        vertical-align: top;\n","    }\n","\n","    .dataframe thead th {\n","        text-align: right;\n","    }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n","  <thead>\n","    <tr style=\"text-align: right;\">\n","      <th></th>\n","      <th>UniprotID</th>\n","      <th>Sequence</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>A0A0C5B5G6</td>\n","      <td>MRWQEMGYIFYPRKLR</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>A0JNW5</td>\n","      <td>KMALAEAHLEKDALLHHIKKMTVE</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>A0JP26</td>\n","      <td>DETKHQNQLRENKILEEIESVKEKLLKAIQLNEEALTKTSI</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>A0PK11</td>\n","      <td>VEEQYEESFWICVASASAHAANLVVVAISQIPLPEIKTKIEEATVT...</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>A1A4S6</td>\n","      <td>NYVKLL</td>\n","    </tr>\n","    <tr>\n","      <th>...</th>\n","      <td>...</td>\n","      <td>...</td>\n","    </tr>\n","    <tr>\n","      <th>82399</th>\n","      <td>Q9UTM1</td>\n","      <td>IIYLKKTMRVTPSEEKIHEMINQKRETKKRKRKQKKKNDDDYGVFE...</td>\n","    </tr>\n","    <tr>\n","      <th>82400</th>\n","      <td>Q9Y7I1</td>\n","      <td>DRLNLKEPVDLEGPKDEQ</td>\n","    </tr>\n","    <tr>\n","      <th>82401</th>\n","      <td>Q9Y7P7</td>\n","      <td>LGLLVFLHSLIVARFFVASKSRSCIVRSLLFWINLDSADSRISVLF...</td>\n","    </tr>\n","    <tr>\n","      <th>82402</th>\n","      <td>Q9Y7Q3</td>\n","      <td>EMTRIYLSIRKNFFQICLKTHSPQLPLGR</td>\n","    </tr>\n","    <tr>\n","      <th>82403</th>\n","      <td>Q9Y816</td>\n","      <td>PSYPFSEITEVSRGGLHFVKLN</td>\n","    </tr>\n","  </tbody>\n","</table>\n","<p>82404 rows × 2 columns</p>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-05be158d-22c7-4e2d-ba41-de14e28fedf8')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-05be158d-22c7-4e2d-ba41-de14e28fedf8 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-05be158d-22c7-4e2d-ba41-de14e28fedf8');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    <div id=\"df-ed626948-07ab-4b47-97c0-c0ad98b5e631\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-ed626948-07ab-4b47-97c0-c0ad98b5e631')\"\n","                title=\"Suggest charts\"\n","                style=\"display:none;\">\n","\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","     width=\"24px\">\n","    <g>\n","        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n","    </g>\n","</svg>\n","      </button>\n","\n","<style>\n","  .colab-df-quickchart {\n","      --bg-color: #E8F0FE;\n","      --fill-color: #1967D2;\n","      --hover-bg-color: #E2EBFA;\n","      --hover-fill-color: #174EA6;\n","      --disabled-fill-color: #AAA;\n","      --disabled-bg-color: #DDD;\n","  }\n","\n","  [theme=dark] .colab-df-quickchart {\n","      --bg-color: #3B4455;\n","      --fill-color: #D2E3FC;\n","      --hover-bg-color: #434B5C;\n","      --hover-fill-color: #FFFFFF;\n","      --disabled-bg-color: #3B4455;\n","      --disabled-fill-color: #666;\n","  }\n","\n","  .colab-df-quickchart {\n","    background-color: var(--bg-color);\n","    border: none;\n","    border-radius: 50%;\n","    cursor: pointer;\n","    display: none;\n","    fill: var(--fill-color);\n","    height: 32px;\n","    padding: 0;\n","    width: 32px;\n","  }\n","\n","  .colab-df-quickchart:hover {\n","    background-color: var(--hover-bg-color);\n","    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n","    fill: var(--button-hover-fill-color);\n","  }\n","\n","  .colab-df-quickchart-complete:disabled,\n","  .colab-df-quickchart-complete:disabled:hover {\n","    background-color: var(--disabled-bg-color);\n","    fill: var(--disabled-fill-color);\n","    box-shadow: none;\n","  }\n","\n","  .colab-df-spinner {\n","    border: 2px solid var(--fill-color);\n","    border-color: transparent;\n","    border-bottom-color: var(--fill-color);\n","    animation:\n","      spin 1s steps(1) infinite;\n","  }\n","\n","  @keyframes spin {\n","    0% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","      border-left-color: var(--fill-color);\n","    }\n","    20% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    30% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","      border-right-color: var(--fill-color);\n","    }\n","    40% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    60% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","    }\n","    80% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-bottom-color: var(--fill-color);\n","    }\n","    90% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","    }\n","  }\n","</style>\n","\n","      <script>\n","        async function quickchart(key) {\n","          const quickchartButtonEl =\n","            document.querySelector('#' + key + ' button');\n","          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n","          quickchartButtonEl.classList.add('colab-df-spinner');\n","          try {\n","            const charts = await google.colab.kernel.invokeFunction(\n","                'suggestCharts', [key], {});\n","          } catch (error) {\n","            console.error('Error during call to suggestCharts:', error);\n","          }\n","          quickchartButtonEl.classList.remove('colab-df-spinner');\n","          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n","        }\n","        (() => {\n","          let quickchartButtonEl =\n","            document.querySelector('#df-ed626948-07ab-4b47-97c0-c0ad98b5e631 button');\n","          quickchartButtonEl.style.display =\n","            google.colab.kernel.accessAllowed ? 'block' : 'none';\n","        })();\n","      </script>\n","    </div>\n","\n","  <div id=\"id_013a96c0-c056-430f-b12d-b0aeb160a344\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('trian_seq_Df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_013a96c0-c056-430f-b12d-b0aeb160a344 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('trian_seq_Df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"trian_seq_Df","summary":"{\n  \"name\": \"trian_seq_Df\",\n  \"rows\": 82404,\n  \"fields\": [\n    {\n      \"column\": \"UniprotID\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 82404,\n        \"samples\": [\n          \"Q9HBM0\",\n          \"P38813\",\n          \"O02740\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"Sequence\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 75177,\n        \"samples\": [\n          \"LTDSDLKKTVDESARIQRAYNHYFDLIIINDNLDKAFEKLQTAIEKLRMEPQWVPISWVY\",\n          \"TLSSNKNVIESGCKECEELEERNFTEFLQSFIHIVQMFINTS\",\n          \"VAMDMICVDLGPQAQDKAGDPVILWGEGLPVERIAEMTKVSAYELITRLTSRVAMKYVD\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{},"execution_count":17}],"execution_count":17},{"cell_type":"code","source":"## taxonomy file\n\ntrain_tax = pd.read_csv(filedict['train_taxonomy.tsv'], sep='\\t',header=None)\ntrain_tax.columns= ['UniprotID','TaxonomyID']","metadata":{"_uuid":"63dff561-e23c-4638-999c-0e798443cecf","_cell_guid":"0e1d1889-1f42-4977-afdb-8d091cd6a032","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T17:11:03.798132Z","iopub.execute_input":"2025-11-03T17:11:03.798326Z","iopub.status.idle":"2025-11-03T17:11:03.853166Z","shell.execute_reply.started":"2025-11-03T17:11:03.798311Z","shell.execute_reply":"2025-11-03T17:11:03.852432Z"},"id":"yfAVgynXwSFO","jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":18},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\n# plotting top 10\ntaxonomy_counts = train_tax['TaxonomyID'].value_counts()[:10]\ntotal_taxas = sum(taxonomy_counts)\nprint(f\"total taxas:{total_taxas}\")\n\nplt.figure(figsize=(18, 6))\nplt.bar(taxonomy_counts.index.astype(str), taxonomy_counts.values)\nplt.xlabel('Taxonomy ID')\nplt.ylabel('Count')\nplt.title('Distribution of Taxonomy IDs')\nplt.xticks(rotation=90)\nplt.show()","metadata":{"_uuid":"a22826a5-9029-4635-a1ef-6be315b360d3","_cell_guid":"be6a45b5-687e-4d49-b637-c94372dc89a6","trusted":true,"id":"63bf28ab","outputId":"63fb4eab-f9b4-412b-902c-07000a203e84","execution":{"iopub.status.busy":"2025-11-03T17:11:03.853967Z","iopub.execute_input":"2025-11-03T17:11:03.854197Z","iopub.status.idle":"2025-11-03T17:11:04.18512Z","shell.execute_reply.started":"2025-11-03T17:11:03.854173Z","shell.execute_reply":"2025-11-03T17:11:04.18439Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":621},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["total taxas:67335\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 1800x600 with 1 Axes>"],"image/png":"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E/T8889r3759qlGjhubNm6d27dpJklasWKEhQ4bo6NGjJicFAGQmPg+QgQIdQI7n5OQki8Wie305tFgslCVANpcrVy4lJCSoePHievPNNzV//nx9/vnnqlmzpvbu3atOnTrphRde0Lhx48yOikzEZ0LOVqBAAR04cEB+fn6yWq1ycXFRbGysKleuLOnPH6AEBgbqypUrJidFZsqXL58OHz6sxx9/XJLk7OysvXv3qmLFipKkU6dOKSAgQCkpKWbGBABkMj4PkIElXADkeF5eXlq+fLnS09MNb3v27DE7IgAH+Gth+s0332jChAlq2LCh8uXLp2eeeUaTJk3S8uXLTUwIR+AzIWcrWLCgzp8/L0m6dOmS0tLSbNuSdP78eX4LJQfw9PTUzz//LEk6evSobt++bduWpIMHD6p48eJmxQMAOAifB8jAKvcAcrwaNWooNjZWzz33nOH4P52JCCD7sFgskqTExERVqVLFbiwwMFBnzpwxIxYciM+EnC04OFi9e/dW3759tXjxYoWEhCgiIkJz5syRxWLRG2+8oTp16pgdE5msXbt26tixo5577jlFR0dryJAhGjx4sM6fPy+LxaKxY8eqdevWZscEAGQyPg+QgQIdQI73xhtv3PNXrsqUKaPNmzc7MBEAs7z99tvKly+fnJycdPbsWduvZ0p/nnmaP39+E9PBEfhMyNnef/99dejQQT179tQzzzyjxYsX66233lJAQIAsFotKly6tWbNmmR0TmWzUqFHKmzevYmJi1L17dw0bNkyBgYEaMmSIrl27pubNm3PROADIAfg8QAbWQAcAAJDUoEED2xno0p9nnHTr1s22/c4772jjxo3asmWLCekAmOnEiRO6du2aypcvr9y5OQcJAAAgJ6FABwAA+BdOnDghZ2dnlSxZ0uwoAAAAAAAH4fQJAAAAAykpKVqyZImOHTsmLy8vtW3bVkWLFjU7FoBMdv36dcXGxqpIkSIKCAiwG7tx44aWLFmijh07mpQOAAAAjsYZ6AAAAJICAgK0bds2FSlSRGfOnFHdunV16dIlPfHEEzp+/Lhy586tH3/8Uf7+/mZHBZBJfvnlF4WEhOj06dOyWCyqU6eOvvzyS3l5eUmSkpKS5O3trdu3b5ucFAAAAI7iZHYAAACArODw4cNKS0uTJEVERKhEiRI6deqUdu7cqVOnTqlKlSoaPny4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\n"},"metadata":{}}],"execution_count":19},{"cell_type":"code","source":"train_terms","metadata":{"_uuid":"e6bfcc60-6122-4c1d-92ab-4c9951113668","_cell_guid":"328811c0-3dc7-4257-a60f-1849a286e16d","trusted":true,"id":"xU7JZnuJ3uy5","outputId":"66e0a13b-80bc-46f1-ae31-9faf2b3be297","execution":{"iopub.status.busy":"2025-11-03T17:11:04.185883Z","iopub.execute_input":"2025-11-03T17:11:04.186175Z","iopub.status.idle":"2025-11-03T17:11:04.194534Z","shell.execute_reply.started":"2025-11-03T17:11:04.186157Z","shell.execute_reply":"2025-11-03T17:11:04.193601Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":424},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["       UniprotID     term aspect\n","0         Q5W0B1  0000785      C\n","1         Q5W0B1  0004842      F\n","2         Q5W0B1  0051865      P\n","3         Q5W0B1  0006275      P\n","4         Q5W0B1  0006513      P\n","...          ...      ...    ...\n","537022    Q06667  0070481      P\n","537023    B1NF19  0033075      P\n","537024    B1NF19  0047052      F\n","537025    B1NF19  0047056      F\n","537026    B1NF19  0102632      F\n","\n","[537027 rows x 3 columns]"],"text/html":["\n","  <div id=\"df-b0586028-1eaa-474f-9510-fd98b96283dc\" class=\"colab-df-container\">\n","    <div>\n","<style scoped>\n","    .dataframe tbody tr th:only-of-type {\n","        vertical-align: middle;\n","    }\n","\n","    .dataframe tbody tr th {\n","        vertical-align: top;\n","    }\n","\n","    .dataframe thead th {\n","        text-align: right;\n","    }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n","  <thead>\n","    <tr style=\"text-align: right;\">\n","      <th></th>\n","      <th>UniprotID</th>\n","      <th>term</th>\n","      <th>aspect</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>Q5W0B1</td>\n","      <td>0000785</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>Q5W0B1</td>\n","      <td>0004842</td>\n","      <td>F</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>Q5W0B1</td>\n","      <td>0051865</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>Q5W0B1</td>\n","      <td>0006275</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>Q5W0B1</td>\n","      <td>0006513</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>...</th>\n","      <td>...</td>\n","      <td>...</td>\n","      <td>...</td>\n","    </tr>\n","    <tr>\n","      <th>537022</th>\n","      <td>Q06667</td>\n","      <td>0070481</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>537023</th>\n","      <td>B1NF19</td>\n","      <td>0033075</td>\n","      <td>P</td>\n","    </tr>\n","    <tr>\n","      <th>537024</th>\n","      <td>B1NF19</td>\n","      <td>0047052</td>\n","      <td>F</td>\n","    </tr>\n","    <tr>\n","      <th>537025</th>\n","      <td>B1NF19</td>\n","      <td>0047056</td>\n","      <td>F</td>\n","    </tr>\n","    <tr>\n","      <th>537026</th>\n","      <td>B1NF19</td>\n","      <td>0102632</td>\n","      <td>F</td>\n","    </tr>\n","  </tbody>\n","</table>\n","<p>537027 rows × 3 columns</p>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-b0586028-1eaa-474f-9510-fd98b96283dc')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-b0586028-1eaa-474f-9510-fd98b96283dc button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-b0586028-1eaa-474f-9510-fd98b96283dc');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    <div id=\"df-352d4d07-29f5-4264-9b41-2e602e33403c\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-352d4d07-29f5-4264-9b41-2e602e33403c')\"\n","                title=\"Suggest charts\"\n","                style=\"display:none;\">\n","\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","     width=\"24px\">\n","    <g>\n","        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n","    </g>\n","</svg>\n","      </button>\n","\n","<style>\n","  .colab-df-quickchart {\n","      --bg-color: #E8F0FE;\n","      --fill-color: #1967D2;\n","      --hover-bg-color: #E2EBFA;\n","      --hover-fill-color: #174EA6;\n","      --disabled-fill-color: #AAA;\n","      --disabled-bg-color: #DDD;\n","  }\n","\n","  [theme=dark] .colab-df-quickchart {\n","      --bg-color: #3B4455;\n","      --fill-color: #D2E3FC;\n","      --hover-bg-color: #434B5C;\n","      --hover-fill-color: #FFFFFF;\n","      --disabled-bg-color: #3B4455;\n","      --disabled-fill-color: #666;\n","  }\n","\n","  .colab-df-quickchart {\n","    background-color: var(--bg-color);\n","    border: none;\n","    border-radius: 50%;\n","    cursor: pointer;\n","    display: none;\n","    fill: var(--fill-color);\n","    height: 32px;\n","    padding: 0;\n","    width: 32px;\n","  }\n","\n","  .colab-df-quickchart:hover {\n","    background-color: var(--hover-bg-color);\n","    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n","    fill: var(--button-hover-fill-color);\n","  }\n","\n","  .colab-df-quickchart-complete:disabled,\n","  .colab-df-quickchart-complete:disabled:hover {\n","    background-color: var(--disabled-bg-color);\n","    fill: var(--disabled-fill-color);\n","    box-shadow: none;\n","  }\n","\n","  .colab-df-spinner {\n","    border: 2px solid var(--fill-color);\n","    border-color: transparent;\n","    border-bottom-color: var(--fill-color);\n","    animation:\n","      spin 1s steps(1) infinite;\n","  }\n","\n","  @keyframes spin {\n","    0% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","      border-left-color: var(--fill-color);\n","    }\n","    20% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    30% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","      border-right-color: var(--fill-color);\n","    }\n","    40% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    60% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","    }\n","    80% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-bottom-color: var(--fill-color);\n","    }\n","    90% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","    }\n","  }\n","</style>\n","\n","      <script>\n","        async function quickchart(key) {\n","          const quickchartButtonEl =\n","            document.querySelector('#' + key + ' button');\n","          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n","          quickchartButtonEl.classList.add('colab-df-spinner');\n","          try {\n","            const charts = await google.colab.kernel.invokeFunction(\n","                'suggestCharts', [key], {});\n","          } catch (error) {\n","            console.error('Error during call to suggestCharts:', error);\n","          }\n","          quickchartButtonEl.classList.remove('colab-df-spinner');\n","          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n","        }\n","        (() => {\n","          let quickchartButtonEl =\n","            document.querySelector('#df-352d4d07-29f5-4264-9b41-2e602e33403c button');\n","          quickchartButtonEl.style.display =\n","            google.colab.kernel.accessAllowed ? 'block' : 'none';\n","        })();\n","      </script>\n","    </div>\n","\n","  <div id=\"id_c072ba06-50f3-43b1-9aae-e82f91f0ddaf\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('train_terms')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_c072ba06-50f3-43b1-9aae-e82f91f0ddaf button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('train_terms');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"train_terms"}},"metadata":{},"execution_count":20}],"execution_count":20},{"cell_type":"code","source":"main_df = pd.merge(train_tax, trian_seq_Df, on='UniprotID')\nmain_df = pd.merge(main_df, train_terms, on='UniprotID')\n\nmain_df.shape","metadata":{"_uuid":"43b1435d-2c80-42d2-b3d5-5bfb235ce75f","_cell_guid":"1a698b59-61b7-46fa-8129-9af61965f637","trusted":true,"id":"Nn2iyNrk2ODF","outputId":"5ed0bee4-c8b9-4108-9e24-b403e704b92e","execution":{"iopub.status.busy":"2025-11-03T17:11:04.195325Z","iopub.execute_input":"2025-11-03T17:11:04.195577Z","iopub.status.idle":"2025-11-03T17:11:04.972278Z","shell.execute_reply.started":"2025-11-03T17:11:04.195548Z","shell.execute_reply":"2025-11-03T17:11:04.971672Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["(537027, 5)"]},"metadata":{},"execution_count":21}],"execution_count":21},{"cell_type":"code","source":"## read GO obo file\ngo = obo_parser.GODag(filedict[\"go-basic.obo\"])\n# Display a few GO terms\nfor i, (go_id, term) in enumerate(list(go.items())[:5]):\n    print(f\"{go_id}: {term.name}\")","metadata":{"_uuid":"b42b8f28-f374-4a37-bd25-0238369f0313","_cell_guid":"f0dcf9f3-b8ba-4bde-a205-87042812dbf5","trusted":true,"execution":{"iopub.status.busy":"2025-11-03T17:11:04.972877Z","iopub.execute_input":"2025-11-03T17:11:04.973074Z","iopub.status.idle":"2025-11-03T17:11:06.077647Z","shell.execute_reply.started":"2025-11-03T17:11:04.973059Z","shell.execute_reply":"2025-11-03T17:11:06.076721Z"},"id":"F4Cmx3uJwSFO","outputId":"0b402dc5-af40-423a-bb20-f66789b1c03b","jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["/root/.cache/kagglehub/competitions/cafa-6-protein-function-prediction/Train/go-basic.obo: fmt(1.2) rel(2025-06-01) 43,448 Terms\n","GO:0000001: mitochondrion inheritance\n","GO:0000002: mitochondrial genome maintenance\n","GO:0000006: high-affinity zinc transmembrane transporter activity\n","GO:0000007: low-affinity zinc ion transmembrane transporter activity\n","GO:0000009: alpha-1,6-mannosyltransferase activity\n"]}],"execution_count":22},{"cell_type":"code","source":"## Base model: Prepare a model takes sequence as input and predict GO terms as output\n\n'''Issues:\n1. One sequence is associated with more than 1 GO term (inclusive of CC, MF, and BP).\n2. Work for single GO subtype\n3. Initially predict top most only\n\n'''","metadata":{"_uuid":"3e0ee63b-de6f-43dc-aa95-0361a5fd9f75","_cell_guid":"b2d4e6d1-bc0e-4068-bc36-b1ce2811ef1c","trusted":true,"id":"6YhLQn_nwSFO","outputId":"e59af7e4-2e00-425c-9e0b-f3b55b9c7dc5","execution":{"iopub.status.busy":"2025-11-03T17:11:06.078528Z","iopub.execute_input":"2025-11-03T17:11:06.078822Z","iopub.status.idle":"2025-11-03T17:11:06.083832Z","shell.execute_reply.started":"2025-11-03T17:11:06.078784Z","shell.execute_reply":"2025-11-03T17:11:06.083056Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":35},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["'Issues:\\n1. One sequence is associated with more than 1 GO term (inclusive of CC, MF, and BP).\\n2. Work for single GO subtype\\n3. Initially predict top most only\\n\\n'"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"string"}},"metadata":{},"execution_count":23}],"execution_count":23},{"cell_type":"code","source":"## Filter only CC subtype\ncc_main_df = main_df[main_df['aspect']=='C']\ncc_main_df","metadata":{"_uuid":"acd269c8-a650-41be-8bb5-f2e349c5e9dd","_cell_guid":"95b33792-883b-428f-ba18-9a8c62512248","trusted":true,"id":"uH4-LxkX7rPC","outputId":"a447f44e-b9bc-461a-ff6b-a2b1daa6d661","execution":{"iopub.status.busy":"2025-11-03T17:11:06.084599Z","iopub.execute_input":"2025-11-03T17:11:06.084841Z","iopub.status.idle":"2025-11-03T17:11:06.15244Z","shell.execute_reply.started":"2025-11-03T17:11:06.084826Z","shell.execute_reply":"2025-11-03T17:11:06.151559Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":424},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["         UniprotID  TaxonomyID                       Sequence     term aspect\n","2       A0A0C5B5G6        9606               MRWQEMGYIFYPRKLR  0005615      C\n","3       A0A0C5B5G6        9606               MRWQEMGYIFYPRKLR  0005634      C\n","4       A0A0C5B5G6        9606               MRWQEMGYIFYPRKLR  0005739      C\n","16          A0JNW5        9606       KMALAEAHLEKDALLHHIKKMTVE  0005769      C\n","19          A0JNW5        9606       KMALAEAHLEKDALLHHIKKMTVE  0005829      C\n","...            ...         ...                            ...      ...    ...\n","537022      Q9Y7Q3      284812  EMTRIYLSIRKNFFQICLKTHSPQLPLGR  0005634      C\n","537023      Q9Y7Q3      284812  EMTRIYLSIRKNFFQICLKTHSPQLPLGR  0005739      C\n","537024      Q9Y7Q3      284812  EMTRIYLSIRKNFFQICLKTHSPQLPLGR  0005829      C\n","537025      Q9Y816      284812         PSYPFSEITEVSRGGLHFVKLN  0005737      C\n","537026      Q9Y816      284812         PSYPFSEITEVSRGGLHFVKLN  0005783      C\n","\n","[157770 rows x 5 columns]"],"text/html":["\n","  <div id=\"df-495b714b-b874-4ebf-a8af-51c56cbb25b5\" class=\"colab-df-container\">\n","    <div>\n","<style scoped>\n","    .dataframe tbody tr th:only-of-type {\n","        vertical-align: middle;\n","    }\n","\n","    .dataframe tbody tr th {\n","        vertical-align: top;\n","    }\n","\n","    .dataframe thead th {\n","        text-align: right;\n","    }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n","  <thead>\n","    <tr style=\"text-align: right;\">\n","      <th></th>\n","      <th>UniprotID</th>\n","      <th>TaxonomyID</th>\n","      <th>Sequence</th>\n","      <th>term</th>\n","      <th>aspect</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>2</th>\n","      <td>A0A0C5B5G6</td>\n","      <td>9606</td>\n","      <td>MRWQEMGYIFYPRKLR</td>\n","      <td>0005615</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>A0A0C5B5G6</td>\n","      <td>9606</td>\n","      <td>MRWQEMGYIFYPRKLR</td>\n","      <td>0005634</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>A0A0C5B5G6</td>\n","      <td>9606</td>\n","      <td>MRWQEMGYIFYPRKLR</td>\n","      <td>0005739</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>16</th>\n","      <td>A0JNW5</td>\n","      <td>9606</td>\n","      <td>KMALAEAHLEKDALLHHIKKMTVE</td>\n","      <td>0005769</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>19</th>\n","      <td>A0JNW5</td>\n","      <td>9606</td>\n","      <td>KMALAEAHLEKDALLHHIKKMTVE</td>\n","      <td>0005829</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>...</th>\n","      <td>...</td>\n","      <td>...</td>\n","      <td>...</td>\n","      <td>...</td>\n","      <td>...</td>\n","    </tr>\n","    <tr>\n","      <th>537022</th>\n","      <td>Q9Y7Q3</td>\n","      <td>284812</td>\n","      <td>EMTRIYLSIRKNFFQICLKTHSPQLPLGR</td>\n","      <td>0005634</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>537023</th>\n","      <td>Q9Y7Q3</td>\n","      <td>284812</td>\n","      <td>EMTRIYLSIRKNFFQICLKTHSPQLPLGR</td>\n","      <td>0005739</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>537024</th>\n","      <td>Q9Y7Q3</td>\n","      <td>284812</td>\n","      <td>EMTRIYLSIRKNFFQICLKTHSPQLPLGR</td>\n","      <td>0005829</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>537025</th>\n","      <td>Q9Y816</td>\n","      <td>284812</td>\n","      <td>PSYPFSEITEVSRGGLHFVKLN</td>\n","      <td>0005737</td>\n","      <td>C</td>\n","    </tr>\n","    <tr>\n","      <th>537026</th>\n","      <td>Q9Y816</td>\n","      <td>284812</td>\n","      <td>PSYPFSEITEVSRGGLHFVKLN</td>\n","      <td>0005783</td>\n","      <td>C</td>\n","    </tr>\n","  </tbody>\n","</table>\n","<p>157770 rows × 5 columns</p>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-495b714b-b874-4ebf-a8af-51c56cbb25b5')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-495b714b-b874-4ebf-a8af-51c56cbb25b5 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-495b714b-b874-4ebf-a8af-51c56cbb25b5');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    <div id=\"df-060f6429-8ca1-406c-84d4-f528aa84fe96\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-060f6429-8ca1-406c-84d4-f528aa84fe96')\"\n","                title=\"Suggest charts\"\n","                style=\"display:none;\">\n","\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","     width=\"24px\">\n","    <g>\n","        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n","    </g>\n","</svg>\n","      </button>\n","\n","<style>\n","  .colab-df-quickchart {\n","      --bg-color: #E8F0FE;\n","      --fill-color: #1967D2;\n","      --hover-bg-color: #E2EBFA;\n","      --hover-fill-color: #174EA6;\n","      --disabled-fill-color: #AAA;\n","      --disabled-bg-color: #DDD;\n","  }\n","\n","  [theme=dark] .colab-df-quickchart {\n","      --bg-color: #3B4455;\n","      --fill-color: #D2E3FC;\n","      --hover-bg-color: #434B5C;\n","      --hover-fill-color: #FFFFFF;\n","      --disabled-bg-color: #3B4455;\n","      --disabled-fill-color: #666;\n","  }\n","\n","  .colab-df-quickchart {\n","    background-color: var(--bg-color);\n","    border: none;\n","    border-radius: 50%;\n","    cursor: pointer;\n","    display: none;\n","    fill: var(--fill-color);\n","    height: 32px;\n","    padding: 0;\n","    width: 32px;\n","  }\n","\n","  .colab-df-quickchart:hover {\n","    background-color: var(--hover-bg-color);\n","    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n","    fill: var(--button-hover-fill-color);\n","  }\n","\n","  .colab-df-quickchart-complete:disabled,\n","  .colab-df-quickchart-complete:disabled:hover {\n","    background-color: var(--disabled-bg-color);\n","    fill: var(--disabled-fill-color);\n","    box-shadow: none;\n","  }\n","\n","  .colab-df-spinner {\n","    border: 2px solid var(--fill-color);\n","    border-color: transparent;\n","    border-bottom-color: var(--fill-color);\n","    animation:\n","      spin 1s steps(1) infinite;\n","  }\n","\n","  @keyframes spin {\n","    0% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","      border-left-color: var(--fill-color);\n","    }\n","    20% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    30% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","      border-right-color: var(--fill-color);\n","    }\n","    40% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    60% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","    }\n","    80% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-bottom-color: var(--fill-color);\n","    }\n","    90% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","    }\n","  }\n","</style>\n","\n","      <script>\n","        async function quickchart(key) {\n","          const quickchartButtonEl =\n","            document.querySelector('#' + key + ' button');\n","          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n","          quickchartButtonEl.classList.add('colab-df-spinner');\n","          try {\n","            const charts = await google.colab.kernel.invokeFunction(\n","                'suggestCharts', [key], {});\n","          } catch (error) {\n","            console.error('Error during call to suggestCharts:', error);\n","          }\n","          quickchartButtonEl.classList.remove('colab-df-spinner');\n","          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n","        }\n","        (() => {\n","          let quickchartButtonEl =\n","            document.querySelector('#df-060f6429-8ca1-406c-84d4-f528aa84fe96 button');\n","          quickchartButtonEl.style.display =\n","            google.colab.kernel.accessAllowed ? 'block' : 'none';\n","        })();\n","      </script>\n","    </div>\n","\n","  <div id=\"id_2bc7d956-79ad-4f92-912b-c84c3dbcf6b7\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('cc_main_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_2bc7d956-79ad-4f92-912b-c84c3dbcf6b7 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('cc_main_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"cc_main_df"}},"metadata":{},"execution_count":24}],"execution_count":24},{"cell_type":"code","source":"train_cc_df =cc_main_df[['Sequence', 'term']]\ntrain_cc_df","metadata":{"_uuid":"3eeacdd5-0893-463d-ae48-f990d46a2580","_cell_guid":"fc4a7e67-f614-40f9-9a7f-b469355f1afb","trusted":true,"id":"Q2PsmDJD8vqb","outputId":"efbcd834-94b3-4103-d524-b96400ac3668","execution":{"iopub.status.busy":"2025-11-03T17:11:06.153442Z","iopub.execute_input":"2025-11-03T17:11:06.15379Z","iopub.status.idle":"2025-11-03T17:11:06.171306Z","shell.execute_reply.started":"2025-11-03T17:11:06.153767Z","shell.execute_reply":"2025-11-03T17:11:06.170539Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":424},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["                             Sequence     term\n","2                    MRWQEMGYIFYPRKLR  0005615\n","3                    MRWQEMGYIFYPRKLR  0005634\n","4                    MRWQEMGYIFYPRKLR  0005739\n","16           KMALAEAHLEKDALLHHIKKMTVE  0005769\n","19           KMALAEAHLEKDALLHHIKKMTVE  0005829\n","...                               ...      ...\n","537022  EMTRIYLSIRKNFFQICLKTHSPQLPLGR  0005634\n","537023  EMTRIYLSIRKNFFQICLKTHSPQLPLGR  0005739\n","537024  EMTRIYLSIRKNFFQICLKTHSPQLPLGR  0005829\n","537025         PSYPFSEITEVSRGGLHFVKLN  0005737\n","537026         PSYPFSEITEVSRGGLHFVKLN  0005783\n","\n","[157770 rows x 2 columns]"],"text/html":["\n","  <div id=\"df-6d427ca6-583e-44d3-bb39-3d6147fec65d\" class=\"colab-df-container\">\n","    <div>\n","<style scoped>\n","    .dataframe tbody tr th:only-of-type {\n","        vertical-align: middle;\n","    }\n","\n","    .dataframe tbody tr th {\n","        vertical-align: top;\n","    }\n","\n","    .dataframe thead th {\n","        text-align: right;\n","    }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n","  <thead>\n","    <tr style=\"text-align: right;\">\n","      <th></th>\n","      <th>Sequence</th>\n","      <th>term</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>2</th>\n","      <td>MRWQEMGYIFYPRKLR</td>\n","      <td>0005615</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>MRWQEMGYIFYPRKLR</td>\n","      <td>0005634</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>MRWQEMGYIFYPRKLR</td>\n","      <td>0005739</td>\n","    </tr>\n","    <tr>\n","      <th>16</th>\n","      <td>KMALAEAHLEKDALLHHIKKMTVE</td>\n","      <td>0005769</td>\n","    </tr>\n","    <tr>\n","      <th>19</th>\n","      <td>KMALAEAHLEKDALLHHIKKMTVE</td>\n","      <td>0005829</td>\n","    </tr>\n","    <tr>\n","      <th>...</th>\n","      <td>...</td>\n","      <td>...</td>\n","    </tr>\n","    <tr>\n","      <th>537022</th>\n","      <td>EMTRIYLSIRKNFFQICLKTHSPQLPLGR</td>\n","      <td>0005634</td>\n","    </tr>\n","    <tr>\n","      <th>537023</th>\n","      <td>EMTRIYLSIRKNFFQICLKTHSPQLPLGR</td>\n","      <td>0005739</td>\n","    </tr>\n","    <tr>\n","      <th>537024</th>\n","      <td>EMTRIYLSIRKNFFQICLKTHSPQLPLGR</td>\n","      <td>0005829</td>\n","    </tr>\n","    <tr>\n","      <th>537025</th>\n","      <td>PSYPFSEITEVSRGGLHFVKLN</td>\n","      <td>0005737</td>\n","    </tr>\n","    <tr>\n","      <th>537026</th>\n","      <td>PSYPFSEITEVSRGGLHFVKLN</td>\n","      <td>0005783</td>\n","    </tr>\n","  </tbody>\n","</table>\n","<p>157770 rows × 2 columns</p>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-6d427ca6-583e-44d3-bb39-3d6147fec65d')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-6d427ca6-583e-44d3-bb39-3d6147fec65d button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-6d427ca6-583e-44d3-bb39-3d6147fec65d');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    <div id=\"df-e9b83ece-9784-40b3-ba00-f9e1736e9dcc\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-e9b83ece-9784-40b3-ba00-f9e1736e9dcc')\"\n","                title=\"Suggest charts\"\n","                style=\"display:none;\">\n","\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","     width=\"24px\">\n","    <g>\n","        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n","    </g>\n","</svg>\n","      </button>\n","\n","<style>\n","  .colab-df-quickchart {\n","      --bg-color: #E8F0FE;\n","      --fill-color: #1967D2;\n","      --hover-bg-color: #E2EBFA;\n","      --hover-fill-color: #174EA6;\n","      --disabled-fill-color: #AAA;\n","      --disabled-bg-color: #DDD;\n","  }\n","\n","  [theme=dark] .colab-df-quickchart {\n","      --bg-color: #3B4455;\n","      --fill-color: #D2E3FC;\n","      --hover-bg-color: #434B5C;\n","      --hover-fill-color: #FFFFFF;\n","      --disabled-bg-color: #3B4455;\n","      --disabled-fill-color: #666;\n","  }\n","\n","  .colab-df-quickchart {\n","    background-color: var(--bg-color);\n","    border: none;\n","    border-radius: 50%;\n","    cursor: pointer;\n","    display: none;\n","    fill: var(--fill-color);\n","    height: 32px;\n","    padding: 0;\n","    width: 32px;\n","  }\n","\n","  .colab-df-quickchart:hover {\n","    background-color: var(--hover-bg-color);\n","    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n","    fill: var(--button-hover-fill-color);\n","  }\n","\n","  .colab-df-quickchart-complete:disabled,\n","  .colab-df-quickchart-complete:disabled:hover {\n","    background-color: var(--disabled-bg-color);\n","    fill: var(--disabled-fill-color);\n","    box-shadow: none;\n","  }\n","\n","  .colab-df-spinner {\n","    border: 2px solid var(--fill-color);\n","    border-color: transparent;\n","    border-bottom-color: var(--fill-color);\n","    animation:\n","      spin 1s steps(1) infinite;\n","  }\n","\n","  @keyframes spin {\n","    0% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","      border-left-color: var(--fill-color);\n","    }\n","    20% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    30% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","      border-right-color: var(--fill-color);\n","    }\n","    40% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    60% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","    }\n","    80% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-bottom-color: var(--fill-color);\n","    }\n","    90% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","    }\n","  }\n","</style>\n","\n","      <script>\n","        async function quickchart(key) {\n","          const quickchartButtonEl =\n","            document.querySelector('#' + key + ' button');\n","          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n","          quickchartButtonEl.classList.add('colab-df-spinner');\n","          try {\n","            const charts = await google.colab.kernel.invokeFunction(\n","                'suggestCharts', [key], {});\n","          } catch (error) {\n","            console.error('Error during call to suggestCharts:', error);\n","          }\n","          quickchartButtonEl.classList.remove('colab-df-spinner');\n","          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n","        }\n","        (() => {\n","          let quickchartButtonEl =\n","            document.querySelector('#df-e9b83ece-9784-40b3-ba00-f9e1736e9dcc button');\n","          quickchartButtonEl.style.display =\n","            google.colab.kernel.accessAllowed ? 'block' : 'none';\n","        })();\n","      </script>\n","    </div>\n","\n","  <div id=\"id_66aa0579-68f7-43cd-be0e-6d1535a26b81\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('train_cc_df')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_66aa0579-68f7-43cd-be0e-6d1535a26b81 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('train_cc_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"train_cc_df"}},"metadata":{},"execution_count":25}],"execution_count":25},{"cell_type":"code","source":"# Single sequence associated with >1 GO term\n## using probability we can filter top 3 GO terms","metadata":{"_uuid":"67347a42-07b0-49fe-bff6-19f44f3e17c5","_cell_guid":"f005c1e2-76e6-4606-a3ef-7525ac6b3e0e","trusted":true,"id":"OxbIEGel8_gV","execution":{"iopub.status.busy":"2025-11-03T17:11:06.172136Z","iopub.execute_input":"2025-11-03T17:11:06.172458Z","iopub.status.idle":"2025-11-03T17:11:06.176046Z","shell.execute_reply.started":"2025-11-03T17:11:06.172436Z","shell.execute_reply":"2025-11-03T17:11:06.175363Z"},"jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":26},{"cell_type":"code","source":"# Prepare tokens\n\n\nlabel2enc = { val:indx for indx, val in enumerate(train_cc_df['term'].unique())}\nenc2label = { indx:val for indx, val in enumerate(train_cc_df['term'].unique())}\nlab_df = pd.DataFrame.from_dict(label2enc,orient='index').reset_index(drop=False)\ntrain_cc_df['label'] = train_cc_df['term'].map(label2enc)\n\nprint(train_cc_df.head())","metadata":{"_uuid":"dbbdad5d-55ad-44ae-9983-c2ffa2f55812","_cell_guid":"98f77932-96f7-4934-92b9-b98fb4ba45f0","trusted":true,"id":"RNH8FsOz9NlP","outputId":"f96b1931-2eb8-4512-9f5b-1bffff4bd2f4","execution":{"iopub.status.busy":"2025-11-03T17:11:06.176822Z","iopub.execute_input":"2025-11-03T17:11:06.177015Z","iopub.status.idle":"2025-11-03T17:11:06.273333Z","shell.execute_reply.started":"2025-11-03T17:11:06.176991Z","shell.execute_reply":"2025-11-03T17:11:06.272511Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["                    Sequence     term  label\n","2           MRWQEMGYIFYPRKLR  0005615      0\n","3           MRWQEMGYIFYPRKLR  0005634      1\n","4           MRWQEMGYIFYPRKLR  0005739      2\n","16  KMALAEAHLEKDALLHHIKKMTVE  0005769      3\n","19  KMALAEAHLEKDALLHHIKKMTVE  0005829      4\n"]},{"output_type":"stream","name":"stderr","text":["/tmp/ipython-input-800628069.py:7: SettingWithCopyWarning: \n","A value is trying to be set on a copy of a slice from a DataFrame.\n","Try using .loc[row_indexer,col_indexer] = value instead\n","\n","See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n","  train_cc_df['label'] = train_cc_df['term'].map(label2enc)\n"]}],"execution_count":27},{"cell_type":"code","source":"\n## Trunc or Pad sequences\nimport numpy as np\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split\n\nseq_len = np.array(train_cc_df.iloc[:,0].apply(len))\nave_seq = np.ceil(np.mean(seq_len))\nprint('\\nAverage seq length:',ave_seq)\n\n\nprint('\\nThis length will be useful for truncating and padding the sequencing for constant embeddings')\n\n\n## Prepare vocab\n## Creating vocab of aa\naa_vocab = [list(seq) for seq in train_cc_df['Sequence'][:100].astype(str)]\naa = sorted(list(set([aa for seq in aa_vocab for aa in seq])))\nprint(\"Total amino acids:\", len(aa))\n\naa_df = pd.DataFrame(aa)\n\nenc = LabelEncoder()\naa_df = pd.DataFrame(aa, columns=[\"AA\"])\n\n## padding and truncating code\naa_df.loc[len(aa_df)] = ['<PAD>']\naa_df.loc[len(aa_df)] = ['<START>']\naa_df.loc[len(aa_df)] = ['<END>']\naa_df.loc[len(aa_df)] = ['<UNK>']\n\naa_enc = enc.fit_transform(aa_df)\n\n\n\naa2vec_dict = {aa_df.iloc[i,0]:aa_enc[i] for i in range(len(aa_df))}\n# aa_df_enc = pd.DataFrame({\n#     'AA': list(aa_vec_dict.keys()),\n#     'encoding': list(aa_vec_dict.values())\n# })","metadata":{"_uuid":"7be65d91-4ce2-4d15-97ad-13fecb11c079","_cell_guid":"5ce2cb5b-afc3-4fd6-b754-a73543bd5f92","trusted":true,"id":"Jc0r3gOp902R","outputId":"232d8575-94d9-49e6-8353-1b254071de28","execution":{"iopub.status.busy":"2025-11-03T17:11:06.274292Z","iopub.execute_input":"2025-11-03T17:11:06.274834Z","iopub.status.idle":"2025-11-03T17:11:06.869459Z","shell.execute_reply.started":"2025-11-03T17:11:06.274816Z","shell.execute_reply":"2025-11-03T17:11:06.86868Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Average seq length: 31.0\n","\n","This length will be useful for truncating and padding the sequencing for constant embeddings\n","Total amino acids: 20\n"]},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.12/dist-packages/sklearn/preprocessing/_label.py:110: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n","  y = column_or_1d(y, warn=True)\n"]}],"execution_count":28},{"cell_type":"code","source":"# Prepare tokens\n'''\nRead each sentence\nRead each amino acid\nfetch encoding and add into the list in the corresponding column\nuse each cells as a sample encoding\n'''\n\n## set len of the seq\nseq_len_min = 400\nprint(f\"Set Sequence length={seq_len_min}\")\n\n# enc_dict_seq = df_main.iloc[:n_seqs,[0,2]].copy()\ndef tokenization(sequence, aa2idx, seq_len_min):\n    token = [\"<START>\"] + list(sequence) + [\"<END>\"]\n    if len(token) > seq_len_min:\n        token = token[:seq_len_min-1]\n        token.append(\"<END>\")\n    else:\n        token += [\"<PAD>\"] * (seq_len_min - len(token))\n\n    encoded = [aa2idx.get(a, aa2idx[\"<UNK>\"]) for a in token]\n    return encoded","metadata":{"_uuid":"f1337513-6719-42a5-bcc2-2101ea17f42c","_cell_guid":"1edf231b-4f2e-4e92-b64c-df48e02f7f42","trusted":true,"id":"0Hmtl1Lz-bEj","outputId":"cd6dd763-c0c8-49f5-cf95-8efe30fffc33","execution":{"iopub.status.busy":"2025-11-03T17:11:06.870174Z","iopub.execute_input":"2025-11-03T17:11:06.870477Z","iopub.status.idle":"2025-11-03T17:11:06.87583Z","shell.execute_reply.started":"2025-11-03T17:11:06.870461Z","shell.execute_reply":"2025-11-03T17:11:06.875098Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["Set Sequence length=400\n"]}],"execution_count":29},{"cell_type":"code","source":"\n# dataset = pd.DataFrame()\nnp.random.seed(42)\nn_seqs = np.random.randint(0,len(train_cc_df), size=int(len(train_cc_df)*0.3)) ##Randomly selecting samples\nsequences = train_cc_df.iloc[n_seqs,[0,2]]\nsequences","metadata":{"_uuid":"0425d689-1521-4ba7-9bcf-63866cf572fa","_cell_guid":"0183ad7b-b408-4d34-b099-c4054e9eba20","trusted":true,"id":"ei-woC6L-ev8","outputId":"645ef66c-8fc2-41af-c9c9-684ecb1b4bfa","execution":{"iopub.status.busy":"2025-11-03T17:11:06.876486Z","iopub.execute_input":"2025-11-03T17:11:06.876807Z","iopub.status.idle":"2025-11-03T17:11:06.907349Z","shell.execute_reply.started":"2025-11-03T17:11:06.876782Z","shell.execute_reply":"2025-11-03T17:11:06.906829Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/","height":424},"collapsed":false},"outputs":[{"output_type":"execute_result","data":{"text/plain":["                                                 Sequence  label\n","446847   EEGVAQMSVGQRAKLTISPDYAYGATGHPGIIPPHATLVFDVELLKLE   2408\n","516393  TFVVLFFYKRNEKKHALGNGIILYDSNKGEELPEFVKKNMEERDGY...    129\n","476029  NYLHRIGRSGRFGRKGVAINFVTLDDQRMLFDIQKFYNVVVEELPS...     18\n","377210        AEAKRMKVAKNPQNINPSSSQNSQNFATYKEGYNVYGIESVKI    632\n","440120                                        LADRRAGVSSL     18\n","...                                                   ...    ...\n","311961  SGRSKGFGFVTYDSSQEVQNAIKSLDGADLDGRQIRVSEAEARPPRRQY      7\n","118918                                                 CR    240\n","458341                          RTRQASITTELIEIISGASALEAAK      1\n","353708               GEPRSQLHQLPKNPLSELPVVKCKRVALSLEDDGLP    247\n","424062                                    RFAQWVIRAEEDDLR   2326\n","\n","[47331 rows x 2 columns]"],"text/html":["\n","  <div id=\"df-8982a515-f0e3-45ed-a2e5-5ed6947b9f77\" class=\"colab-df-container\">\n","    <div>\n","<style scoped>\n","    .dataframe tbody tr th:only-of-type {\n","        vertical-align: middle;\n","    }\n","\n","    .dataframe tbody tr th {\n","        vertical-align: top;\n","    }\n","\n","    .dataframe thead th {\n","        text-align: right;\n","    }\n","</style>\n","<table border=\"1\" class=\"dataframe\">\n","  <thead>\n","    <tr style=\"text-align: right;\">\n","      <th></th>\n","      <th>Sequence</th>\n","      <th>label</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>446847</th>\n","      <td>EEGVAQMSVGQRAKLTISPDYAYGATGHPGIIPPHATLVFDVELLKLE</td>\n","      <td>2408</td>\n","    </tr>\n","    <tr>\n","      <th>516393</th>\n","      <td>TFVVLFFYKRNEKKHALGNGIILYDSNKGEELPEFVKKNMEERDGY...</td>\n","      <td>129</td>\n","    </tr>\n","    <tr>\n","      <th>476029</th>\n","      <td>NYLHRIGRSGRFGRKGVAINFVTLDDQRMLFDIQKFYNVVVEELPS...</td>\n","      <td>18</td>\n","    </tr>\n","    <tr>\n","      <th>377210</th>\n","      <td>AEAKRMKVAKNPQNINPSSSQNSQNFATYKEGYNVYGIESVKI</td>\n","      <td>632</td>\n","    </tr>\n","    <tr>\n","      <th>440120</th>\n","      <td>LADRRAGVSSL</td>\n","      <td>18</td>\n","    </tr>\n","    <tr>\n","      <th>...</th>\n","      <td>...</td>\n","      <td>...</td>\n","    </tr>\n","    <tr>\n","      <th>311961</th>\n","      <td>SGRSKGFGFVTYDSSQEVQNAIKSLDGADLDGRQIRVSEAEARPPRRQY</td>\n","      <td>7</td>\n","    </tr>\n","    <tr>\n","      <th>118918</th>\n","      <td>CR</td>\n","      <td>240</td>\n","    </tr>\n","    <tr>\n","      <th>458341</th>\n","      <td>RTRQASITTELIEIISGASALEAAK</td>\n","      <td>1</td>\n","    </tr>\n","    <tr>\n","      <th>353708</th>\n","      <td>GEPRSQLHQLPKNPLSELPVVKCKRVALSLEDDGLP</td>\n","      <td>247</td>\n","    </tr>\n","    <tr>\n","      <th>424062</th>\n","      <td>RFAQWVIRAEEDDLR</td>\n","      <td>2326</td>\n","    </tr>\n","  </tbody>\n","</table>\n","<p>47331 rows × 2 columns</p>\n","</div>\n","    <div class=\"colab-df-buttons\">\n","\n","  <div class=\"colab-df-container\">\n","    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-8982a515-f0e3-45ed-a2e5-5ed6947b9f77')\"\n","            title=\"Convert this dataframe to an interactive table.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n","    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n","  </svg>\n","    </button>\n","\n","  <style>\n","    .colab-df-container {\n","      display:flex;\n","      gap: 12px;\n","    }\n","\n","    .colab-df-convert {\n","      background-color: #E8F0FE;\n","      border: none;\n","      border-radius: 50%;\n","      cursor: pointer;\n","      display: none;\n","      fill: #1967D2;\n","      height: 32px;\n","      padding: 0 0 0 0;\n","      width: 32px;\n","    }\n","\n","    .colab-df-convert:hover {\n","      background-color: #E2EBFA;\n","      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","      fill: #174EA6;\n","    }\n","\n","    .colab-df-buttons div {\n","      margin-bottom: 4px;\n","    }\n","\n","    [theme=dark] .colab-df-convert {\n","      background-color: #3B4455;\n","      fill: #D2E3FC;\n","    }\n","\n","    [theme=dark] .colab-df-convert:hover {\n","      background-color: #434B5C;\n","      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","      fill: #FFFFFF;\n","    }\n","  </style>\n","\n","    <script>\n","      const buttonEl =\n","        document.querySelector('#df-8982a515-f0e3-45ed-a2e5-5ed6947b9f77 button.colab-df-convert');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      async function convertToInteractive(key) {\n","        const element = document.querySelector('#df-8982a515-f0e3-45ed-a2e5-5ed6947b9f77');\n","        const dataTable =\n","          await google.colab.kernel.invokeFunction('convertToInteractive',\n","                                                    [key], {});\n","        if (!dataTable) return;\n","\n","        const docLinkHtml = 'Like what you see? Visit the ' +\n","          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n","          + ' to learn more about interactive tables.';\n","        element.innerHTML = '';\n","        dataTable['output_type'] = 'display_data';\n","        await google.colab.output.renderOutput(dataTable, element);\n","        const docLink = document.createElement('div');\n","        docLink.innerHTML = docLinkHtml;\n","        element.appendChild(docLink);\n","      }\n","    </script>\n","  </div>\n","\n","\n","    <div id=\"df-0f91672d-378a-4361-8669-2ab96091b80a\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-0f91672d-378a-4361-8669-2ab96091b80a')\"\n","                title=\"Suggest charts\"\n","                style=\"display:none;\">\n","\n","<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","     width=\"24px\">\n","    <g>\n","        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n","    </g>\n","</svg>\n","      </button>\n","\n","<style>\n","  .colab-df-quickchart {\n","      --bg-color: #E8F0FE;\n","      --fill-color: #1967D2;\n","      --hover-bg-color: #E2EBFA;\n","      --hover-fill-color: #174EA6;\n","      --disabled-fill-color: #AAA;\n","      --disabled-bg-color: #DDD;\n","  }\n","\n","  [theme=dark] .colab-df-quickchart {\n","      --bg-color: #3B4455;\n","      --fill-color: #D2E3FC;\n","      --hover-bg-color: #434B5C;\n","      --hover-fill-color: #FFFFFF;\n","      --disabled-bg-color: #3B4455;\n","      --disabled-fill-color: #666;\n","  }\n","\n","  .colab-df-quickchart {\n","    background-color: var(--bg-color);\n","    border: none;\n","    border-radius: 50%;\n","    cursor: pointer;\n","    display: none;\n","    fill: var(--fill-color);\n","    height: 32px;\n","    padding: 0;\n","    width: 32px;\n","  }\n","\n","  .colab-df-quickchart:hover {\n","    background-color: var(--hover-bg-color);\n","    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n","    fill: var(--button-hover-fill-color);\n","  }\n","\n","  .colab-df-quickchart-complete:disabled,\n","  .colab-df-quickchart-complete:disabled:hover {\n","    background-color: var(--disabled-bg-color);\n","    fill: var(--disabled-fill-color);\n","    box-shadow: none;\n","  }\n","\n","  .colab-df-spinner {\n","    border: 2px solid var(--fill-color);\n","    border-color: transparent;\n","    border-bottom-color: var(--fill-color);\n","    animation:\n","      spin 1s steps(1) infinite;\n","  }\n","\n","  @keyframes spin {\n","    0% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","      border-left-color: var(--fill-color);\n","    }\n","    20% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    30% {\n","      border-color: transparent;\n","      border-left-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","      border-right-color: var(--fill-color);\n","    }\n","    40% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-top-color: var(--fill-color);\n","    }\n","    60% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","    }\n","    80% {\n","      border-color: transparent;\n","      border-right-color: var(--fill-color);\n","      border-bottom-color: var(--fill-color);\n","    }\n","    90% {\n","      border-color: transparent;\n","      border-bottom-color: var(--fill-color);\n","    }\n","  }\n","</style>\n","\n","      <script>\n","        async function quickchart(key) {\n","          const quickchartButtonEl =\n","            document.querySelector('#' + key + ' button');\n","          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n","          quickchartButtonEl.classList.add('colab-df-spinner');\n","          try {\n","            const charts = await google.colab.kernel.invokeFunction(\n","                'suggestCharts', [key], {});\n","          } catch (error) {\n","            console.error('Error during call to suggestCharts:', error);\n","          }\n","          quickchartButtonEl.classList.remove('colab-df-spinner');\n","          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n","        }\n","        (() => {\n","          let quickchartButtonEl =\n","            document.querySelector('#df-0f91672d-378a-4361-8669-2ab96091b80a button');\n","          quickchartButtonEl.style.display =\n","            google.colab.kernel.accessAllowed ? 'block' : 'none';\n","        })();\n","      </script>\n","    </div>\n","\n","  <div id=\"id_e8ce00ba-be51-474d-a68e-0d3a0e0cdf8d\">\n","    <style>\n","      .colab-df-generate {\n","        background-color: #E8F0FE;\n","        border: none;\n","        border-radius: 50%;\n","        cursor: pointer;\n","        display: none;\n","        fill: #1967D2;\n","        height: 32px;\n","        padding: 0 0 0 0;\n","        width: 32px;\n","      }\n","\n","      .colab-df-generate:hover {\n","        background-color: #E2EBFA;\n","        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n","        fill: #174EA6;\n","      }\n","\n","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate:hover {\n","        background-color: #434B5C;\n","        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n","        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n","        fill: #FFFFFF;\n","      }\n","    </style>\n","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('sequences')\"\n","            title=\"Generate code using this dataframe.\"\n","            style=\"display:none;\">\n","\n","  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n","       width=\"24px\">\n","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_e8ce00ba-be51-474d-a68e-0d3a0e0cdf8d button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('sequences');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"sequences","summary":"{\n  \"name\": \"sequences\",\n  \"rows\": 47331,\n  \"fields\": [\n    {\n      \"column\": \"Sequence\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 26661,\n        \"samples\": [\n          \"NIPLAAGKFDRELYLLGIKRRISKEIQRQQALQSQNSSTICSVS\",\n          \"IKDLNEKLTVFGRVSKGQDVVQEIEEVETDDQYQPKSPIEIMSVTLLQDM\",\n          \"NIALDLAKLEKARPAEQPAPVK\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 554,\n        \"min\": 0,\n        \"max\": 2649,\n        \"num_unique_values\": 1980,\n        \"samples\": [\n          557,\n          352,\n          1530\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{},"execution_count":30}],"execution_count":30},{"cell_type":"code","source":"## Faster - Vectorized of token\n\nsequences_list = sequences.iloc[:, 0].tolist()\ny = sequences.iloc[:, 1].values  # Direct numpy array\n\n# Vectorized tokenization\nX = [tokenization(seq, aa2vec_dict, seq_len_min) for seq in sequences_list]\nX = np.array(X)","metadata":{"_uuid":"7d334d57-9038-4d56-8517-212c14ad75d3","_cell_guid":"6cfc983b-d785-498c-8aaa-3ca50984a78a","trusted":true,"id":"T70T35Umhjxk","execution":{"iopub.status.busy":"2025-11-03T17:11:06.908132Z","iopub.execute_input":"2025-11-03T17:11:06.908607Z","iopub.status.idle":"2025-11-03T17:11:09.6512Z","shell.execute_reply.started":"2025-11-03T17:11:06.90859Z","shell.execute_reply":"2025-11-03T17:11:09.650594Z"},"jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":31},{"cell_type":"code","source":"\n## preparing dataset\n\n# Split\nX_train, X_test, y_train, y_test = train_test_split(np.array(X), np.array(y), test_size=0.33)","metadata":{"_uuid":"e78e1b51-c7ef-43da-9ff0-e05b4cbae6f8","_cell_guid":"e05be9c6-e708-44a9-a008-ed82f1332355","trusted":true,"id":"-t2IqAbWDJFT","execution":{"iopub.status.busy":"2025-11-03T17:11:09.651924Z","iopub.execute_input":"2025-11-03T17:11:09.652166Z","iopub.status.idle":"2025-11-03T17:11:09.76236Z","shell.execute_reply.started":"2025-11-03T17:11:09.652143Z","shell.execute_reply":"2025-11-03T17:11:09.761789Z"},"jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":32},{"cell_type":"code","source":"import torch\nfrom torch.utils.data import TensorDataset\n# Convert to tensors\n\nprint('\\nPreparing Tensor dataset...')\nX_tr_ten = torch.tensor(X_train, dtype=torch.long)\ny_tr_ten = torch.tensor(y_train, dtype=torch.long)\n\nX_te_ten = torch.tensor(X_test, dtype=torch.long)\ny_te_ten = torch.tensor(y_test, dtype=torch.long)\n\n\ntrain_ten = TensorDataset(X_tr_ten,y_tr_ten)\ntest_ten = TensorDataset(X_te_ten,y_te_ten)\n\nfrom torch.utils.data import DataLoader\n\ntrain_data = DataLoader(train_ten, batch_size=64, shuffle=True, num_workers=2, pin_memory=True)\ntest_data = DataLoader(test_ten, batch_size=64, shuffle=False,num_workers=2, pin_memory=True)","metadata":{"_uuid":"35d2d97e-9f62-4395-9a24-ae5146152dd8","_cell_guid":"df53091b-b78f-4ec9-9e92-757e6246b69c","trusted":true,"id":"D3qP5nYH-vEs","outputId":"d058f8b2-492a-493e-f090-9e92c732eb8e","execution":{"iopub.status.busy":"2025-11-03T17:11:09.763228Z","iopub.execute_input":"2025-11-03T17:11:09.763497Z","iopub.status.idle":"2025-11-03T17:11:09.862551Z","shell.execute_reply.started":"2025-11-03T17:11:09.763471Z","shell.execute_reply":"2025-11-03T17:11:09.861816Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Preparing Tensor dataset...\n"]},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.12/dist-packages/torch/utils/data/dataloader.py:627: UserWarning: This DataLoader will create 5 worker processes in total. Our suggested max number of worker in current system is 2, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary.\n","  warnings.warn(\n"]}],"execution_count":33},{"cell_type":"code","source":"## Model LSTM\nfrom torch import nn\n\n\nvocab_size=len(aa2vec_dict)\n\n\ndevice= 'cuda' if torch.cuda.is_available() else 'cpu'\nprint(f\"Using {device} device\")\n\nclass LSTM_model(nn.Module):\n    def __init__(self,vocab_size,n_class,emb_dim, hid_dim,n_layer):\n        super(LSTM_model,self).__init__()\n\n        self.embeddings = nn.Embedding(vocab_size, emb_dim)\n        self.lstm = nn.LSTM(\n            input_size=emb_dim,\n            hidden_size=hid_dim,\n            num_layers=n_layer,\n            dropout=0.3,\n            bidirectional=True,\n            batch_first=True\n        )\n\n        self.layer_norm = nn.LayerNorm(hid_dim * 2)\n        self.dropouts = nn.Dropout(0.3 )\n        self.fc = nn.Linear(hid_dim*2, n_class)\n\n    def forward(self,x):\n        embedded= self.embeddings(x)\n\n        out, (h_n, c_n) = self.lstm(embedded)\n\n        h_for = h_n[-2,:,:]\n        h_back = h_n[-1,:,:]\n\n        h_cat = torch.cat((h_for, h_back), dim=1)\n        h_cat = self.layer_norm(h_cat)\n        h_cat = self.dropouts(h_cat)\n        logits = self.fc(h_cat)\n        return logits","metadata":{"_uuid":"3a248ca9-77ec-4232-bb9d-afe9eed6a351","_cell_guid":"a7630833-3506-4f46-ac70-08d51e8e1761","trusted":true,"id":"WF9gGaxg-97t","outputId":"a3239980-03ed-4d90-94e2-9a7ca40e5887","execution":{"iopub.status.busy":"2025-11-03T17:11:09.863268Z","iopub.execute_input":"2025-11-03T17:11:09.863519Z","iopub.status.idle":"2025-11-03T17:11:09.95449Z","shell.execute_reply.started":"2025-11-03T17:11:09.863496Z","shell.execute_reply":"2025-11-03T17:11:09.953806Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["Using cuda device\n"]}],"execution_count":34},{"cell_type":"code","source":"# Model transformers\nimport math\n\nclass PositionalEncoding(nn.Module):\n    \"\"\"Positional encoding for transformer\"\"\"\n    def __init__(self, d_model, max_len=5000, dropout=0.1):\n        super(PositionalEncoding, self).__init__()\n        self.dropout = nn.Dropout(p=dropout)\n\n        # Create positional encoding matrix\n        pe = torch.zeros(max_len, d_model)\n        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)\n        div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))\n\n        pe[:, 0::2] = torch.sin(position * div_term)\n        pe[:, 1::2] = torch.cos(position * div_term)\n        pe = pe.unsqueeze(0)  # Shape: (1, max_len, d_model)\n\n        self.register_buffer('pe', pe)\n\n    def forward(self, x):\n        # x shape: (batch_size, seq_len, d_model)\n        x = x + self.pe[:, :x.size(1), :]\n        return self.dropout(x)\n\n\nclass TransformerModel(nn.Module):\n    \"\"\"Transformer model for protein sequence classification\"\"\"\n    def __init__(self, vocab_size, n_class, d_model=128, nhead=8, num_layers=4,\n                 dim_feedforward=512, dropout=0.1, max_len=5000):\n        super(TransformerModel, self).__init__()\n\n        self.d_model = d_model\n        self.vocab_size = vocab_size\n\n        # Embedding layer\n        self.embedding = nn.Embedding(vocab_size, d_model)\n        self.pos_encoder = PositionalEncoding(d_model, max_len, dropout)\n\n        # Transformer encoder layers\n        encoder_layer = nn.TransformerEncoderLayer(\n            d_model=d_model,\n            nhead=nhead,\n            dim_feedforward=dim_feedforward,\n            dropout=dropout,\n            batch_first=True  # Important: batch_first=True\n        )\n        self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)\n\n        # Classification head\n        self.layer_norm = nn.LayerNorm(d_model)\n        self.dropout = nn.Dropout(dropout)\n        self.fc = nn.Linear(d_model, n_class)\n\n        self._init_weights()\n\n    def _init_weights(self):\n        \"\"\"Initialize weights\"\"\"\n        initrange = 0.1\n        self.embedding.weight.data.uniform_(-initrange, initrange)\n        self.fc.bias.data.zero_()\n        self.fc.weight.data.uniform_(-initrange, initrange)\n\n    def forward(self, x, mask=None):\n        # x shape: (batch_size, seq_len)\n\n        # Embedding\n        x = self.embedding(x) * math.sqrt(self.d_model)  # Scale embeddings\n        x = self.pos_encoder(x)\n\n        # Create padding mask if not provided\n        if mask is None:\n            # Assuming PAD token is 0\n            mask = (x.sum(dim=-1) == 0)  # Shape: (batch_size, seq_len)\n\n        # Transformer encoding\n        x = self.transformer_encoder(x, src_key_padding_mask=mask)\n\n        # Global average pooling (better than just taking first token)\n        if mask is not None:\n            # Mask out padding tokens before averaging\n            mask_expanded = mask.unsqueeze(-1).expand(x.size())\n            sum_embeddings = torch.sum(x * (~mask_expanded), dim=1)\n            sum_mask = torch.clamp((~mask).sum(dim=1, keepdim=True), min=1e-9)\n            x = sum_embeddings / sum_mask\n        else:\n            x = x.mean(dim=1)  # Simple average pooling\n\n        # Classification\n        x = self.layer_norm(x)\n        x = self.dropout(x)\n        logits = self.fc(x)\n\n        return logits\n\n\nclass LightweightTransformerModel(nn.Module):\n    \"\"\"Lightweight transformer for faster training\"\"\"\n    def __init__(self, vocab_size, n_class, d_model=64, nhead=4, num_layers=2,\n                 dim_feedforward=256, dropout=0.1, max_len=5000):\n        super(LightweightTransformerModel, self).__init__()\n\n        self.d_model = d_model\n\n        # Embedding\n        self.embedding = nn.Embedding(vocab_size, d_model)\n        self.pos_encoder = PositionalEncoding(d_model, max_len, dropout)\n\n        # Lightweight transformer\n        encoder_layer = nn.TransformerEncoderLayer(\n            d_model=d_model,\n            nhead=nhead,\n            dim_feedforward=dim_feedforward,\n            dropout=dropout,\n            batch_first=True,\n            norm_first=True  # Pre-norm for better training\n        )\n        self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)\n\n        # Classification head\n        self.layer_norm = nn.LayerNorm(d_model)\n        self.dropout = nn.Dropout(dropout)\n        self.fc = nn.Linear(d_model, n_class)\n\n        self._init_weights()\n\n    def _init_weights(self):\n        initrange = 0.1\n        self.embedding.weight.data.uniform_(-initrange, initrange)\n        self.fc.bias.data.zero_()\n        self.fc.weight.data.uniform_(-initrange, initrange)\n\n    def forward(self, x):\n        # x shape: (batch_size, seq_len)\n\n        # Embedding with scaling\n        x = self.embedding(x) * math.sqrt(self.d_model)\n        x = self.pos_encoder(x)\n\n        # Transformer encoding\n        x = self.transformer_encoder(x)\n\n        # Use CLS token approach (first token) for speed\n        x = x[:, 0, :]  # Take first token\n\n        # Classification\n        x = self.layer_norm(x)\n        x = self.dropout(x)\n        logits = self.fc(x)\n\n        return logits","metadata":{"id":"-9k8fWHow7EJ"},"outputs":[],"execution_count":35},{"cell_type":"code","source":"\ndef training_loop(dataloader, model, loss_func, optimizer, scaler=None):\n    model.train()\n    total_loss = 0\n    correct = 0\n\n    for X_data, Y_data in dataloader:\n        X_data, Y_data = X_data.to(device), Y_data.to(device)\n\n        optimizer.zero_grad()\n\n        # Mixed precision training with compatibility\n        if scaler is not None and device == 'cuda':\n            try:\n                # Try new API\n                with torch.amp.autocast('cuda'):\n                    outputs = model(X_data)\n                    loss = loss_func(outputs, Y_data)\n            except (AttributeError, TypeError):\n                # Fall back to old API\n                with torch.cuda.amp.autocast():\n                    outputs = model(X_data)\n                    loss = loss_func(outputs, Y_data)\n\n            scaler.scale(loss).backward()\n            scaler.step(optimizer)\n            scaler.update()\n        else:\n            # Regular training without mixed precision\n            outputs = model(X_data)\n            loss = loss_func(outputs, Y_data)\n            loss.backward()\n            optimizer.step()\n\n        _, predicted = outputs.max(1)\n        correct += predicted.eq(Y_data).sum().item()\n        total_loss += loss.item()\n\n    accuracy = 100 * correct / len(dataloader.dataset)\n    return total_loss / len(dataloader), accuracy\n\n\ndef eval_loop(dataloader, model, loss_func):\n    model.eval()\n    total_loss = 0\n    correct = 0\n\n    with torch.no_grad():\n        for X_data, Y_data in dataloader:\n            X_data, Y_data = X_data.to(device), Y_data.to(device)\n\n            # Mixed precision for evaluation with compatibility\n            if device == 'cuda':\n                try:\n                    with torch.amp.autocast('cuda'):\n                        outputs = model(X_data)\n                        loss = loss_func(outputs, Y_data)\n                except (AttributeError, TypeError):\n                    with torch.cuda.amp.autocast():\n                        outputs = model(X_data)\n                        loss = loss_func(outputs, Y_data)\n            else:\n                outputs = model(X_data)\n                loss = loss_func(outputs, Y_data)\n\n            total_loss += loss.item()\n            _, predicted = outputs.max(1)\n            correct += predicted.eq(Y_data).sum().item()\n\n    accuracy = 100 * correct / len(dataloader.dataset)\n    return total_loss / len(dataloader), accuracy","metadata":{"_uuid":"4d86af91-53e2-4131-b3a5-21e934e27bf6","_cell_guid":"606ab4f7-0778-414e-a118-7d7bfdc72865","trusted":true,"id":"jFV3maTM_yNp","execution":{"iopub.status.busy":"2025-11-03T17:11:09.955312Z","iopub.execute_input":"2025-11-03T17:11:09.955522Z","iopub.status.idle":"2025-11-03T17:11:09.974291Z","shell.execute_reply.started":"2025-11-03T17:11:09.955506Z","shell.execute_reply":"2025-11-03T17:11:09.973584Z"},"jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":36},{"cell_type":"code","source":"epoch=100\n\n\nunique_labels = sorted(set(y))\nn_class = len(train_cc_df['term'].unique())\n\nprint(f\"Number of classes in sample: {n_class}\")\n# Standard Transformer\nmodel_standard = TransformerModel(\n    vocab_size=vocab_size,\n    n_class=n_class,\n    d_model=128,\n    nhead=8,\n    num_layers=4,\n    dim_feedforward=512,\n    dropout=0.1\n)\n\nmodel_light = LightweightTransformerModel(\n    vocab_size=vocab_size,\n    n_class=n_class,\n    d_model=64,\n    nhead=4,\n    num_layers=2,\n    dim_feedforward=256,\n    dropout=0.1\n)","metadata":{"id":"WijOO2OfxIPj","outputId":"6cc3381f-9875-476c-8fe7-d0053f97d3fa","colab":{"base_uri":"https://localhost:8080/"}},"outputs":[{"output_type":"stream","name":"stdout","text":["Number of classes in sample: 2651\n"]},{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.12/dist-packages/torch/nn/modules/transformer.py:392: UserWarning: enable_nested_tensor is True, but self.use_nested_tensor is False because encoder_layer.norm_first was True\n","  warnings.warn(\n"]}],"execution_count":40},{"cell_type":"code","source":"\n# print(f\"Label range: {min(y)} to {max(y)}\")\n\n\n# print(\"Model n_class:\", len(set(y)))\n\n\nmodel = LSTM_model(vocab_size=vocab_size,n_class=n_class,emb_dim=32, hid_dim=64,n_layer=2).to(device)\n# model= model_light\nmodel.to(device)\noptimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)\nloss_func = nn.CrossEntropyLoss(label_smoothing=0.1)\n\nscheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=2)\n\n## Issue in Kaggle ; No issue in GColab\ntry:\n    from torch.amp import GradScaler\n    scaler = GradScaler('cuda') if device == 'cuda' else None\nexcept (ImportError, TypeError):\n    # Fall back to old API (Kaggle's PyTorch version)\n    try:\n        from torch.cuda.amp import GradScaler\n        scaler = GradScaler() if device == 'cuda' else None\n    except ImportError:\n        # No mixed precision support\n        scaler = None\n\ntrain_loss_hist = []\ntest_loss_hist = []\ntrain_acc_hist = []\ntest_acc_hist = []\n\nprint(f\"\\nTraining for {epoch} epochs...\")\nbest_test_acc = 0\n\nfor ep in range(epoch):\n    train_loss, train_acc = training_loop(train_data, model, loss_func, optimizer, scaler)\n    train_loss_hist.append(train_loss)\n    train_acc_hist.append(train_acc)\n\n    test_loss, test_acc = eval_loop(test_data, model, loss_func)\n    test_loss_hist.append(test_loss)\n    test_acc_hist.append(test_acc)\n\n    # Update learning rate\n    scheduler.step(test_loss)\n\n    # # Save best model\n    # if test_acc > best_test_acc:\n    #     best_test_acc = test_acc\n    #     torch.save(model.state_dict(), 'best_model.pth')\n\n    if ep%5 ==0:\n      print(f\"Epoch {ep + 1}/{epoch}: Train Loss = {train_loss:.4f}, Train Acc = {train_acc:.2f}% | \"\n            f\"Test Loss = {test_loss:.4f}, Test Acc = {test_acc:.2f}% | LR = {optimizer.param_groups[0]['lr']:.6f}\")\n\nprint(f\"\\nBest Test Accuracy: {best_test_acc:.2f}%\")","metadata":{"_uuid":"3e79b9d5-7886-4716-a5c6-e9c7e4ea7205","_cell_guid":"29503032-efaf-452a-9e8d-fa8acc71e74f","trusted":true,"id":"kVw_Vq8wAAGa","outputId":"fd4cec1f-1c62-4353-f040-cab6da7354c7","execution":{"iopub.status.busy":"2025-11-03T17:11:37.657333Z","iopub.execute_input":"2025-11-03T17:11:37.657975Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Training for 100 epochs...\n","Epoch 1/100: Train Loss = 5.7879, Train Acc = 7.98% | Test Loss = 5.6119, Test Acc = 8.76% | LR = 0.001000\n","Epoch 6/100: Train Loss = 5.4878, Train Acc = 9.47% | Test Loss = 5.5521, Test Acc = 9.90% | LR = 0.001000\n","Epoch 11/100: Train Loss = 5.2741, Train Acc = 10.36% | Test Loss = 5.5534, Test Acc = 9.96% | LR = 0.001000\n","Epoch 16/100: Train Loss = 5.0230, Train Acc = 11.65% | Test Loss = 5.5759, Test Acc = 9.77% | LR = 0.000250\n","Epoch 21/100: Train Loss = 4.9378, Train Acc = 12.37% | Test Loss = 5.5865, Test Acc = 9.87% | LR = 0.000063\n","Epoch 26/100: Train Loss = 4.9083, Train Acc = 12.92% | Test Loss = 5.5897, Test Acc = 9.82% | LR = 0.000031\n","Epoch 31/100: Train Loss = 4.8908, Train Acc = 13.01% | Test Loss = 5.5912, Test Acc = 9.85% | LR = 0.000008\n","Epoch 36/100: Train Loss = 4.8930, Train Acc = 12.81% | Test Loss = 5.5917, Test Acc = 9.86% | LR = 0.000002\n","Epoch 41/100: Train Loss = 4.8947, Train Acc = 12.72% | Test Loss = 5.5920, Test Acc = 9.85% | LR = 0.000001\n","Epoch 46/100: Train Loss = 4.8857, Train Acc = 12.83% | Test Loss = 5.5921, Test Acc = 9.88% | LR = 0.000000\n","Epoch 51/100: Train Loss = 4.8858, Train Acc = 12.85% | Test Loss = 5.5921, Test Acc = 9.87% | LR = 0.000000\n","Epoch 56/100: Train Loss = 4.8927, Train Acc = 12.78% | Test Loss = 5.5921, Test Acc = 9.86% | LR = 0.000000\n","Epoch 61/100: Train Loss = 4.8851, Train Acc = 12.92% | Test Loss = 5.5921, Test Acc = 9.86% | LR = 0.000000\n","Epoch 66/100: Train Loss = 4.8921, Train Acc = 12.91% | Test Loss = 5.5921, Test Acc = 9.87% | LR = 0.000000\n","Epoch 71/100: Train Loss = 4.8909, Train Acc = 13.08% | Test Loss = 5.5921, Test Acc = 9.87% | LR = 0.000000\n","Epoch 76/100: Train Loss = 4.8884, Train Acc = 12.72% | Test Loss = 5.5921, Test Acc = 9.87% | LR = 0.000000\n","Epoch 81/100: Train Loss = 4.8869, Train Acc = 13.05% | Test Loss = 5.5921, Test Acc = 9.87% | LR = 0.000000\n","Epoch 86/100: Train Loss = 4.8902, Train Acc = 12.80% | Test Loss = 5.5921, Test Acc = 9.86% | LR = 0.000000\n","Epoch 91/100: Train Loss = 4.8873, Train Acc = 13.00% | Test Loss = 5.5921, Test Acc = 9.87% | LR = 0.000000\n","Epoch 96/100: Train Loss = 4.8877, Train Acc = 12.82% | Test Loss = 5.5921, Test Acc = 9.87% | LR = 0.000000\n","\n","Best Test Accuracy: 0.00%\n"]}],"execution_count":42},{"cell_type":"markdown","source":"Training with Light transformer\n\nTraining for 100 epochs...\nEpoch 1/100: Train Loss = 5.7656, Train Acc = 7.97% | Test Loss = 5.6073, Test Acc = 8.32% | LR = 0.001000\nEpoch 6/100: Train Loss = 5.5782, Train Acc = 8.52% | Test Loss = 5.5875, Test Acc = 8.80% | LR = 0.001000\nEpoch 11/100: Train Loss = 5.4828, Train Acc = 9.16% | Test Loss = 5.5872, Test Acc = 8.96% | LR = 0.000500\nEpoch 16/100: Train Loss = 5.3547, Train Acc = 9.86% | Test Loss = 5.5870, Test Acc = 9.35% | LR = 0.000250\nEpoch 21/100: Train Loss = 5.3107, Train Acc = 9.90% | Test Loss = 5.5869, Test Acc = 9.33% | LR = 0.000063\nEpoch 26/100: Train Loss = 5.2972, Train Acc = 9.96% | Test Loss = 5.5844, Test Acc = 9.33% | LR = 0.000031\nEpoch 31/100: Train Loss = 5.2884, Train Acc = 9.90% | Test Loss = 5.5870, Test Acc = 9.35% | LR = 0.000008\nEpoch 36/100: Train Loss = 5.2887, Train Acc = 10.06% | Test Loss = 5.5862, Test Acc = 9.35% | LR = 0.000004\nEpoch 41/100: Train Loss = 5.2888, Train Acc = 10.03% | Test Loss = 5.5863, Test Acc = 9.34% | LR = 0.000001\nEpoch 46/100: Train Loss = 5.2841, Train Acc = 9.93% | Test Loss = 5.5862, Test Acc = 9.33% | LR = 0.000000\nEpoch 51/100: Train Loss = 5.2838, Train Acc = 9.94% | Test Loss = 5.5863, Test Acc = 9.32% | LR = 0.000000\nEpoch 56/100: Train Loss = 5.2873, Train Acc = 9.87% | Test Loss = 5.5862, Test Acc = 9.31% | LR = 0.000000\nEpoch 61/100: Train Loss = 5.2854, Train Acc = 10.14% | Test Loss = 5.5862, Test Acc = 9.31% | LR = 0.000000\nEpoch 66/100: Train Loss = 5.2862, Train Acc = 10.06% | Test Loss = 5.5862, Test Acc = 9.33% | LR = 0.000000","metadata":{"id":"AJEgSSyb17kk"}},{"cell_type":"code","source":"\n# print(f\"Label range: {min(y)} to {max(y)}\")\n\n\n# print(\"Model n_class:\", len(set(y)))\n\n\n#model = LSTM_model(vocab_size=vocab_size,n_class=n_class,emb_dim=32, hid_dim=64,n_layer=2).to(device)\nmodel= model_light\nmodel.to(device)\noptimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)\nloss_func = nn.CrossEntropyLoss(label_smoothing=0.1)\n\nscheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=2)\n\n## Issue in Kaggle ; No issue in GColab\ntry:\n    from torch.amp import GradScaler\n    scaler = GradScaler('cuda') if device == 'cuda' else None\nexcept (ImportError, TypeError):\n    # Fall back to old API (Kaggle's PyTorch version)\n    try:\n        from torch.cuda.amp import GradScaler\n        scaler = GradScaler() if device == 'cuda' else None\n    except ImportError:\n        # No mixed precision support\n        scaler = None\n\ntrain_loss_hist = []\ntest_loss_hist = []\ntrain_acc_hist = []\ntest_acc_hist = []\n\nprint(f\"\\nTraining for {epoch} epochs...\")\nbest_test_acc = 0\n\nfor ep in range(epoch):\n    train_loss, train_acc = training_loop(train_data, model, loss_func, optimizer, scaler)\n    train_loss_hist.append(train_loss)\n    train_acc_hist.append(train_acc)\n\n    test_loss, test_acc = eval_loop(test_data, model, loss_func)\n    test_loss_hist.append(test_loss)\n    test_acc_hist.append(test_acc)\n\n    # Update learning rate\n    scheduler.step(test_loss)\n\n    # # Save best model\n    # if test_acc > best_test_acc:\n    #     best_test_acc = test_acc\n    #     torch.save(model.state_dict(), 'best_model.pth')\n\n    if ep%5 ==0:\n      print(f\"Epoch {ep + 1}/{epoch}: Train Loss = {train_loss:.4f}, Train Acc = {train_acc:.2f}% | \"\n            f\"Test Loss = {test_loss:.4f}, Test Acc = {test_acc:.2f}% | LR = {optimizer.param_groups[0]['lr']:.6f}\")\n\nprint(f\"\\nBest Test Accuracy: {best_test_acc:.2f}%\")","metadata":{"_uuid":"3e79b9d5-7886-4716-a5c6-e9c7e4ea7205","_cell_guid":"29503032-efaf-452a-9e8d-fa8acc71e74f","trusted":true,"outputId":"077b193d-2cf2-40ef-8eee-61e096f96933","execution":{"iopub.status.busy":"2025-11-03T17:11:37.657333Z","iopub.execute_input":"2025-11-03T17:11:37.657975Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"id":"7gV4tyzz1_0m","collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Training for 100 epochs...\n","Epoch 1/100: Train Loss = 5.7656, Train Acc = 7.97% | Test Loss = 5.6073, Test Acc = 8.32% | LR = 0.001000\n","Epoch 6/100: Train Loss = 5.5782, Train Acc = 8.52% | Test Loss = 5.5875, Test Acc = 8.80% | LR = 0.001000\n","Epoch 11/100: Train Loss = 5.4828, Train Acc = 9.16% | Test Loss = 5.5872, Test Acc = 8.96% | LR = 0.000500\n","Epoch 16/100: Train Loss = 5.3547, Train Acc = 9.86% | Test Loss = 5.5870, Test Acc = 9.35% | LR = 0.000250\n","Epoch 21/100: Train Loss = 5.3107, Train Acc = 9.90% | Test Loss = 5.5869, Test Acc = 9.33% | LR = 0.000063\n","Epoch 26/100: Train Loss = 5.2972, Train Acc = 9.96% | Test Loss = 5.5844, Test Acc = 9.33% | LR = 0.000031\n","Epoch 31/100: Train Loss = 5.2884, Train Acc = 9.90% | Test Loss = 5.5870, Test Acc = 9.35% | LR = 0.000008\n","Epoch 36/100: Train Loss = 5.2887, Train Acc = 10.06% | Test Loss = 5.5862, Test Acc = 9.35% | LR = 0.000004\n","Epoch 41/100: Train Loss = 5.2888, Train Acc = 10.03% | Test Loss = 5.5863, Test Acc = 9.34% | LR = 0.000001\n","Epoch 46/100: Train Loss = 5.2841, Train Acc = 9.93% | Test Loss = 5.5862, Test Acc = 9.33% | LR = 0.000000\n","Epoch 51/100: Train Loss = 5.2838, Train Acc = 9.94% | Test Loss = 5.5863, Test Acc = 9.32% | LR = 0.000000\n","Epoch 56/100: Train Loss = 5.2873, Train Acc = 9.87% | Test Loss = 5.5862, Test Acc = 9.31% | LR = 0.000000\n","Epoch 61/100: Train Loss = 5.2854, Train Acc = 10.14% | Test Loss = 5.5862, Test Acc = 9.31% | LR = 0.000000\n"]}],"execution_count":null},{"cell_type":"code","source":"\n# print(f\"Label range: {min(y)} to {max(y)}\")\n\n\n# print(\"Model n_class:\", len(set(y)))\n\n\n#model = LSTM_model(vocab_size=vocab_size,n_class=n_class,emb_dim=32, hid_dim=64,n_layer=2).to(device)\nmodel= model_light\nmodel.to(device)\noptimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=0.01)\nloss_func = nn.CrossEntropyLoss(label_smoothing=0.1)\n\nscheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.5, patience=2)\n\n## Issue in Kaggle ; No issue in GColab\ntry:\n    from torch.amp import GradScaler\n    scaler = GradScaler('cuda') if device == 'cuda' else None\nexcept (ImportError, TypeError):\n    # Fall back to old API (Kaggle's PyTorch version)\n    try:\n        from torch.cuda.amp import GradScaler\n        scaler = GradScaler() if device == 'cuda' else None\n    except ImportError:\n        # No mixed precision support\n        scaler = None\n\ntrain_loss_hist = []\ntest_loss_hist = []\ntrain_acc_hist = []\ntest_acc_hist = []\n\nprint(f\"\\nTraining for {epoch} epochs...\")\nbest_test_acc = 0\n\nfor ep in range(epoch):\n    train_loss, train_acc = training_loop(train_data, model, loss_func, optimizer, scaler)\n    train_loss_hist.append(train_loss)\n    train_acc_hist.append(train_acc)\n\n    test_loss, test_acc = eval_loop(test_data, model, loss_func)\n    test_loss_hist.append(test_loss)\n    test_acc_hist.append(test_acc)\n\n    # Update learning rate\n    scheduler.step(test_loss)\n\n    # # Save best model\n    # if test_acc > best_test_acc:\n    #     best_test_acc = test_acc\n    #     torch.save(model.state_dict(), 'best_model.pth')\n\n    if ep%5 ==0:\n      print(f\"Epoch {ep + 1}/{epoch}: Train Loss = {train_loss:.4f}, Train Acc = {train_acc:.2f}% | \"\n            f\"Test Loss = {test_loss:.4f}, Test Acc = {test_acc:.2f}% | LR = {optimizer.param_groups[0]['lr']:.6f}\")\n\nprint(f\"\\nBest Test Accuracy: {best_test_acc:.2f}%\")","metadata":{"_uuid":"3e79b9d5-7886-4716-a5c6-e9c7e4ea7205","_cell_guid":"29503032-efaf-452a-9e8d-fa8acc71e74f","trusted":true,"outputId":"077b193d-2cf2-40ef-8eee-61e096f96933","execution":{"iopub.status.busy":"2025-11-03T17:11:37.657333Z","iopub.execute_input":"2025-11-03T17:11:37.657975Z"},"jupyter":{"outputs_hidden":false},"colab":{"base_uri":"https://localhost:8080/"},"id":"zbrS4lqy1-wU","collapsed":false},"outputs":[{"output_type":"stream","name":"stdout","text":["\n","Training for 100 epochs...\n","Epoch 1/100: Train Loss = 5.7656, Train Acc = 7.97% | Test Loss = 5.6073, Test Acc = 8.32% | LR = 0.001000\n","Epoch 6/100: Train Loss = 5.5782, Train Acc = 8.52% | Test Loss = 5.5875, Test Acc = 8.80% | LR = 0.001000\n","Epoch 11/100: Train Loss = 5.4828, Train Acc = 9.16% | Test Loss = 5.5872, Test Acc = 8.96% | LR = 0.000500\n","Epoch 16/100: Train Loss = 5.3547, Train Acc = 9.86% | Test Loss = 5.5870, Test Acc = 9.35% | LR = 0.000250\n","Epoch 21/100: Train Loss = 5.3107, Train Acc = 9.90% | Test Loss = 5.5869, Test Acc = 9.33% | LR = 0.000063\n","Epoch 26/100: Train Loss = 5.2972, Train Acc = 9.96% | Test Loss = 5.5844, Test Acc = 9.33% | LR = 0.000031\n","Epoch 31/100: Train Loss = 5.2884, Train Acc = 9.90% | Test Loss = 5.5870, Test Acc = 9.35% | LR = 0.000008\n","Epoch 36/100: Train Loss = 5.2887, Train Acc = 10.06% | Test Loss = 5.5862, Test Acc = 9.35% | LR = 0.000004\n","Epoch 41/100: Train Loss = 5.2888, Train Acc = 10.03% | Test Loss = 5.5863, Test Acc = 9.34% | LR = 0.000001\n","Epoch 46/100: Train Loss = 5.2841, Train Acc = 9.93% | Test Loss = 5.5862, Test Acc = 9.33% | LR = 0.000000\n","Epoch 51/100: Train Loss = 5.2838, Train Acc = 9.94% | Test Loss = 5.5863, Test Acc = 9.32% | LR = 0.000000\n","Epoch 56/100: Train Loss = 5.2873, Train Acc = 9.87% | Test Loss = 5.5862, Test Acc = 9.31% | LR = 0.000000\n","Epoch 61/100: Train Loss = 5.2854, Train Acc = 10.14% | Test Loss = 5.5862, Test Acc = 9.31% | LR = 0.000000\n"]}],"execution_count":null},{"cell_type":"code","source":"","metadata":{"id":"67N0gdzM169g"},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n## Plotting\nimport matplotlib.pyplot as plt\n\n\nfig, ax = plt.subplots(1,2,figsize=(18,8))\nax[0].plot(train_loss_hist, label='Train')\nax[0].plot(test_loss_hist, label='Test')\nax[0].set_xlabel('Epoch')\nax[0].set_ylabel('Loss')\nax[0].legend()\nax[0].set_title(f\"Loss per epoch\")\n\n\nax[1].plot(train_acc_hist, label='Train')\nax[1].plot(test_acc_hist, label='Test')\nax[1].set_xlabel('Epoch')\nax[1].set_ylabel('Accuracy')\nax[1].legend()\nax[1].set_title(f\"Accuracy per epoch\")\nfig.suptitle(f\"Train-test Loss-Accuracy\")\n\n# plt.savefig(\"rnn_lstm_gru_performance.png\")\nplt.show()","metadata":{"_uuid":"a574d77d-bcf4-43d7-8164-c5029368dea9","_cell_guid":"04287a3c-87eb-4c5c-82af-3d9ca0802f85","trusted":true,"id":"PS7ZEbcyk-Ee","execution":{"iopub.status.busy":"2025-11-03T17:11:32.258158Z","iopub.status.idle":"2025-11-03T17:11:32.258378Z","shell.execute_reply.started":"2025-11-03T17:11:32.258272Z","shell.execute_reply":"2025-11-03T17:11:32.258283Z"},"jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":null},{"cell_type":"code","source":"##Inference\n\ndef predict_goterm(sequence, model, aa2vec_dict, enc2label, seq_len_min, device, train_cc_df):\n    model.eval()  # Set the model to evaluation mode\n    # Find the true label for the input sequence\n    true_label_row = train_cc_df.loc[train_cc_df[\"Sequence\"] == sequence, \"label\"]\n    if not true_label_row.empty:\n        true_lab = true_label_row.iloc[0] # Get the first true label if multiple exist\n    else:\n        true_lab = None # Handle cases where the sequence is not found in the training data\n\n    with torch.no_grad():\n        # Tokenize and encode the sequence\n        encoded_sequence = tokenization(sequence, aa2vec_dict, seq_len_min=seq_len_min)\n\n        # Convert to tensor and add a batch dimension\n        sequence_tensor = torch.tensor(encoded_sequence, dtype=torch.long).unsqueeze(0).to(device)\n\n        # Get model output\n        outputs = model(sequence_tensor)\n\n        # Get the predicted class index\n        _, predicted_index = torch.max(outputs, dim=1)\n\n        # Convert the predicted index back to the protein family label\n        predicted_label = enc2label[predicted_index.item()]\n\n        return predicted_label, true_lab\n\n\n\nseq_len_min=400\nfor x in range(10):\n    sample_sequence = train_cc_df.iloc[x]['Sequence']\n    print(f\"Sample sequence: {sample_sequence[:seq_len_min]}\") # Print first 50 characters\n\n    predicted_family, true_family = predict_goterm(sample_sequence, model, aa2vec_dict, enc2label, seq_len_min, device, train_cc_df)\n\n    print(f\"Predicted protein family: {predicted_family}\")\n    print(f\"True protein family: {true_family}\")","metadata":{"_uuid":"8ad05a67-146b-4f37-997f-51948ecbfb22","_cell_guid":"69634036-a9ac-40e4-8daa-fc512799510d","trusted":true,"id":"8lpTcHkrAJAg","execution":{"iopub.status.busy":"2025-11-03T17:11:32.259074Z","iopub.status.idle":"2025-11-03T17:11:32.259345Z","shell.execute_reply.started":"2025-11-03T17:11:32.259201Z","shell.execute_reply":"2025-11-03T17:11:32.259212Z"},"jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"_uuid":"24cf157c-2203-42b3-82b1-00d23f9ab05b","_cell_guid":"5acc029d-c29d-4e4e-bb62-80386f6bd1f8","trusted":true,"id":"9deIxCpsA5Kz","jupyter":{"outputs_hidden":false},"collapsed":false},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"_uuid":"74a29e5c-26d6-46f0-a1c4-07a131ff36fa","_cell_guid":"b6f9d26e-4f48-4987-ac04-542372b31a46","trusted":true,"jupyter":{"outputs_hidden":false},"id":"bu4PjrhFtoRQ","collapsed":false},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"_uuid":"73e20056-a49a-46f8-8b3a-55f204296f29","_cell_guid":"15d17ea6-f52e-48ac-9556-a4059f681edf","trusted":true,"jupyter":{"outputs_hidden":false},"id":"BRtkwJOwtoRQ","collapsed":false},"outputs":[],"execution_count":null}]}