{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.10","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nimport pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport progressbar # Necessário para o widget da barra de progresso\nfrom sklearn.ensemble import RandomForestClassifier\n","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.status.busy":"2023-06-29T19:46:52.960401Z","iopub.execute_input":"2023-06-29T19:46:52.961924Z","iopub.status.idle":"2023-06-29T19:47:11.292069Z","shell.execute_reply.started":"2023-06-29T19:46:52.961873Z","shell.execute_reply":"2023-06-29T19:47:11.289451Z"},"trusted":true},"execution_count":4,"outputs":[{"name":"stdout","text":"Collecting anfis\n  Downloading anfis-0.3.1-py3-none-any.whl (7.4 kB)\nRequirement already satisfied: numpy in /opt/conda/lib/python3.10/site-packages (from anfis) (1.23.5)\nRequirement already satisfied: matplotlib in /opt/conda/lib/python3.10/site-packages (from anfis) (3.6.3)\nCollecting scikit-fuzzy (from anfis)\n  Downloading scikit-fuzzy-0.4.2.tar.gz (993 kB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m994.0/994.0 kB\u001b[0m \u001b[31m23.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m\n\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25ldone\n\u001b[?25hRequirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.10/site-packages (from matplotlib->anfis) (1.0.7)\nRequirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.10/site-packages (from matplotlib->anfis) (0.11.0)\nRequirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.10/site-packages (from matplotlib->anfis) (4.39.3)\nRequirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.10/site-packages (from matplotlib->anfis) (1.4.4)\nRequirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.10/site-packages (from matplotlib->anfis) (21.3)\nRequirement already satisfied: pillow>=6.2.0 in /opt/conda/lib/python3.10/site-packages (from matplotlib->anfis) (9.5.0)\nRequirement already satisfied: pyparsing>=2.2.1 in /opt/conda/lib/python3.10/site-packages (from matplotlib->anfis) (3.0.9)\nRequirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.10/site-packages (from matplotlib->anfis) (2.8.2)\nRequirement already satisfied: scipy>=0.9.0 in /opt/conda/lib/python3.10/site-packages (from scikit-fuzzy->anfis) (1.10.1)\nRequirement already satisfied: networkx>=1.9.0 in /opt/conda/lib/python3.10/site-packages (from scikit-fuzzy->anfis) (3.1)\nRequirement already satisfied: six>=1.5 in /opt/conda/lib/python3.10/site-packages (from python-dateutil>=2.7->matplotlib->anfis) (1.16.0)\nBuilding wheels for collected packages: scikit-fuzzy\n  Building wheel for scikit-fuzzy (setup.py) ... \u001b[?25ldone\n\u001b[?25h  Created wheel for scikit-fuzzy: filename=scikit_fuzzy-0.4.2-py3-none-any.whl size=894088 sha256=e7452c03e14562463490b7c9ebbb2e9f2ce010d26346a0fbf6d44680036aa6c2\n  Stored in directory: /root/.cache/pip/wheels/4f/86/1b/dfd97134a2c8313e519bcebd95d3fedc7be7944db022094bc8\nSuccessfully built scikit-fuzzy\nInstalling collected packages: scikit-fuzzy, anfis\nSuccessfully installed anfis-0.3.1 scikit-fuzzy-0.4.2\n\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n\u001b[0m","output_type":"stream"},{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)","Cell \u001b[0;32mIn[4], line 8\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mprogressbar\u001b[39;00m \u001b[38;5;66;03m# Necessário para o widget da barra de progresso\u001b[39;00m\n\u001b[1;32m      7\u001b[0m get_ipython()\u001b[38;5;241m.\u001b[39msystem(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpip install anfis\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m----> 8\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01manfis\u001b[39;00m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/anfis/__init__.py:2\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01manfis\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mmembership\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m membershipfunction\n\u001b[1;32m      3\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mmembership\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m mfDerivs\n","\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'membership'"],"ename":"ModuleNotFoundError","evalue":"No module named 'membership'","output_type":"error"}]},{"cell_type":"code","source":"# Carregar o conjunto de dados\ntrain_terms = pd.read_csv(\"/kaggle/input/cafa-5-protein-function-prediction/Train/train_terms.tsv\",sep=\"\\t\")\ntrain_terms.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-29T19:47:11.293135Z","iopub.status.idle":"2023-06-29T19:47:11.293565Z","shell.execute_reply.started":"2023-06-29T19:47:11.293355Z","shell.execute_reply":"2023-06-29T19:47:11.293376Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Carregando os embeddings de proteína\ntrain_protein_ids = np.load('/kaggle/input/t5embeds/train_ids.npy')\ntrain_protein_ids[:10]","metadata":{"execution":{"iopub.status.busy":"2023-06-29T19:47:11.295214Z","iopub.status.idle":"2023-06-29T19:47:11.295598Z","shell.execute_reply.started":"2023-06-29T19:47:11.295404Z","shell.execute_reply":"2023-06-29T19:47:11.295421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_embeddings = np.load('/kaggle/input/t5embeds/train_embeds.npy')\n\n# Agora converte os embeddings em um array numpy (train_embeddings) em um dataframe do pandas.\ncolumn_num = train_embeddings.shape[1]\ntrain_df = pd.DataFrame(train_embeddings, columns = [\"Column_\" + str(i) for i in range(1, column_num + 1)])\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-29T19:47:11.296411Z","iopub.status.idle":"2023-06-29T19:47:11.296799Z","shell.execute_reply.started":"2023-06-29T19:47:11.296618Z","shell.execute_reply":"2023-06-29T19:47:11.296635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Selecione os primeiros 50 valores para plotagem\nplot_df = train_terms['term'].value_counts().iloc[:50]\n\nfigure, axis = plt.subplots(1, 1, figsize=(12, 6))\n\nbp = sns.barplot(ax=axis, x=np.array(plot_df.index), y=plot_df.values, color='red')\n\nbp.set_xticklabels(bp.get_xticklabels(), rotation=90, size=6)\naxis.set_title('Top 50 frequent GO term IDs')\nbp.set_xlabel(\"GO term IDs\", fontsize=12)\nbp.set_ylabel(\"Count\", fontsize=12)\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-06-29T19:47:11.297981Z","iopub.status.idle":"2023-06-29T19:47:11.298511Z","shell.execute_reply.started":"2023-06-29T19:47:11.298228Z","shell.execute_reply":"2023-06-29T19:47:11.298252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Definir o limite para o rótulo\nnum_of_labels = 1500\n\n# Pegue as contagens de valores em ordem decrescente e busque os primeiros 1500 `GO term ID` como rótulos\nlabels = train_terms['term'].value_counts().index[:num_of_labels].tolist()\n\n# Obtenha os dados train_terms somente para os rótulos relevantes\ntrain_terms_updated = train_terms.loc[train_terms['term'].isin(labels)]","metadata":{"execution":{"iopub.status.busy":"2023-06-29T19:47:11.299753Z","iopub.status.idle":"2023-06-29T19:47:11.300221Z","shell.execute_reply.started":"2023-06-29T19:47:11.300003Z","shell.execute_reply":"2023-06-29T19:47:11.300029Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pie_df = train_terms_updated['aspect'].value_counts()\npalette_color = sns.color_palette('bright')\n\nfig, ax = plt.subplots()\nax.bar(pie_df.index, pie_df.values, color=palette_color)\n\n# Personalizar o eixo x\nax.set_xlabel('Aspecto')\nax.set_ylabel('Contagem')\n\n# Adicionar rótulos nas barras\nfor i, value in enumerate(pie_df.values):\n    ax.text(i, value, str(value), ha='center', va='bottom')\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-06-29T19:47:11.301256Z","iopub.status.idle":"2023-06-29T19:47:11.301802Z","shell.execute_reply.started":"2023-06-29T19:47:11.301521Z","shell.execute_reply":"2023-06-29T19:47:11.301546Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Definir as configurações da barra de progresso.\n# Isso é estritamente estético.\nbar = progressbar.ProgressBar(maxval=num_of_labels, \\\n    widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()])\n\n# Crie um dataframe vazio do tamanho necessário para armazenar os rótulos,\n# ou seja, train_size x num_of_labels (142246 x 1500)\ntrain_size = train_protein_ids.shape[0] # len(X)\ntrain_labels = np.zeros((train_size ,num_of_labels))\n\n# Converter de séries numpy para pandas para melhor manuseio\nseries_train_protein_ids = pd.Series(train_protein_ids)\n\n# Percorrer cada rótulo\nfor i in range(num_of_labels):\n    # Para cada label, busque os dados train_terms correspondentes\n    n_train_terms = train_terms_updated[train_terms_updated['term'] ==  labels[i]]\n    \n    # Busque todas as proteínas EntryId exclusivas, também conhecidas como proteínas relacionadas ao rótulo atual (ID do termo GO)\n    label_related_proteins = n_train_terms['EntryID'].unique()\n    \n    # Na série de pandas series_train_protein_ids, se uma proteína estiver relacionada\n    # ao rótulo atual, marque-a como 1, caso contrário, 0.\n    # Substitua a i-ésima coluna de train_Y por essa série de pandas.\n    train_labels[:,i] =  series_train_protein_ids.isin(label_related_proteins).astype(float)\n    \n    # Aumento da porcentagem da barra de progresso\n    bar.update(i+1)\n\n# Notificar o fim da barra de progresso \nbar.finish()\n\n# Converta o numpy train_Y em um dataframe do pandas\nlabels_df = pd.DataFrame(data = train_labels, columns = labels)\nlabels_df.head()","metadata":{"execution":{"iopub.status.busy":"2023-06-29T19:47:11.302981Z","iopub.status.idle":"2023-06-29T19:47:11.303489Z","shell.execute_reply.started":"2023-06-29T19:47:11.303218Z","shell.execute_reply":"2023-06-29T19:47:11.303242Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Treinamento usando Random Forest\nmodel = RandomForestClassifier(n_estimators=100)\n\nmodel.fit(train_df, labels_df)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Submissão\n# Para o envio, usamos os embeddings de proteína dos dados de teste\n\ntest_embeddings = np.load('/kaggle/input/t5embeds/test_embeds.npy')\n\n# Converter test_embeddings em dataframe\ncolumn_num = test_embeddings.shape[1]\ntest_df = pd.DataFrame(test_embeddings, columns=[\"Column_\" + str(i) for i in range(1, column_num+1)])\ntest_df.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = model.predict(test_df)","metadata":{},"execution_count":null,"outputs":[]}]}