{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":87793,"databundleVersionId":11553390,"isSourceIdPinned":false,"sourceType":"competition"},{"sourceId":11519231,"sourceType":"datasetVersion","datasetId":7224412}],"dockerImageVersionId":31012,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import sys\nsys.path.append(\"/kaggle/input/your-biopython-dataset\")\n\n!pip install /kaggle/input/biopython/biopython-1.85-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import h2o\nh2o.init()\nfrom h2o.estimators import H2OXGBoostEstimator\nimport numpy as np \nimport pandas as pd \nimport xgboost as xgb\nfrom scipy.stats import entropy\nfrom sklearn.model_selection import KFold,StratifiedKFold\nfrom sklearn.metrics import mean_squared_error\nfrom collections import Counter\nfrom Bio.SeqUtils import gc_fraction\nfrom Bio.SeqUtils import molecular_weight, MeltingTemp as mt","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_sequences =  pd.read_csv('/kaggle/input/stanford-rna-3d-folding/train_sequences.csv') \ntrain_labels =  pd.read_csv('/kaggle/input/stanford-rna-3d-folding/train_labels.csv') \ntest_sequences = pd.read_csv('/kaggle/input/stanford-rna-3d-folding/test_sequences.csv') \nsample_submission = pd.read_csv('/kaggle/input/stanford-rna-3d-folding/sample_submission.csv')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def seq_entropy(seq):\n    freqs = np.array([seq.count(base)/len(seq) for base in \"ACGU\"])\n    return entropy(freqs)\n\n\ndef get_kmers(sequence, k=3):\n    return Counter([sequence[i:i+k] for i in range(len(sequence)-k+1)])\n\n\ndef has_palindrome(seq, k=4):\n    for i in range(len(seq) - k + 1):\n        sub = seq[i:i+k]\n        if sub == sub[::-1].translate(str.maketrans(\"AUCG\", \"UAGC\")):\n            return 1\n    return 0\n\n\ndef feat_eng(df):\n    df['seq_length'] = df['sequence'].str.len()\n    df['a_cnt'] = df['sequence'].str.count(\"A\")\n    df['c_cnt'] = df['sequence'].str.count(\"C\")\n    df['u_cnt'] = df['sequence'].str.count(\"U\")\n    df['g_cnt'] = df['sequence'].str.count(\"G\")\n    df['ac_cnt'] = df['sequence'].str.count(\"AC\")\n    df['au_cnt'] = df['sequence'].str.count(\"AU\")\n    df['ag_cnt'] = df['sequence'].str.count(\"AG\")\n    df['ca_cnt'] = df['sequence'].str.count(\"CA\")\n    df['cu_cnt'] = df['sequence'].str.count(\"CU\")\n    df['cg_cnt'] = df['sequence'].str.count(\"CG\")\n    df['ua_cnt'] = df['sequence'].str.count(\"UA\")\n    df['uc_cnt'] = df['sequence'].str.count(\"UC\")\n    df['ug_cnt'] = df['sequence'].str.count(\"UG\")\n    df['ga_cnt'] = df['sequence'].str.count(\"GA\")\n    df['gc_cnt'] = df['sequence'].str.count(\"GC\")\n    df['gu_cnt'] = df['sequence'].str.count(\"GU\")\n    df['aa_cnt'] = df['sequence'].str.count(\"AA\")\n    df['cc_cnt'] = df['sequence'].str.count(\"CC\")\n    df['uu_cnt'] = df['sequence'].str.count(\"UU\")\n    df['gg_cnt'] = df['sequence'].str.count(\"GG\")\n    \n    df['begin_sequence'] = df['sequence'].str[0]\n    df['end_sequence'] = df['sequence'].str[-1]\n\n    df['gc_ratio'] = (df['g_cnt'] + df['c_cnt']) / df['seq_length']\n    df['au_ratio'] = (df['a_cnt'] + df['u_cnt']) / df['seq_length']\n\n    df['tm'] = df['sequence'].apply(lambda x: mt.Tm_NN(x, nn_table=mt.RNA_NN1))\n    \n    df['entropy'] = df['sequence'].apply(seq_entropy)\n\n    df['gc_fraction'] = df['sequence'].apply(gc_fraction)\n\n    df['3mer_freqs'] = df['sequence'].apply(lambda x: get_kmers(x, 3))\n    \n    df['palindrome'] = df['sequence'].apply(lambda x: has_palindrome(x, k=6))\n    \n    df = df.drop(['sequence', 'temporal_cutoff', 'description', 'all_sequences'],axis=1)\n\n    return df","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_sequences_fe = feat_eng(train_sequences)\ntest_sequences_fe = feat_eng(test_sequences)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(train_sequences_fe.columns)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_labels['target_id'] = train_labels['ID'].str.split('_',expand=True)[0] + '_' + train_labels['ID'].str.split('_',expand=True)[1]\ntrain_combined = train_labels.merge(train_sequences_fe,how='left',on='target_id')\n\nprint(train_labels['target_id'].head())\nprint(train_sequences_fe['target_id'].head())\n\ntrain_combined['x_1'] = train_combined.groupby(['target_id','resname'])['x_1'].transform(lambda x: x.fillna(x.mean()))\ntrain_combined['y_1'] = train_combined.groupby(['target_id','resname'])['y_1'].transform(lambda x: x.fillna(x.mean()))\ntrain_combined['z_1'] = train_combined.groupby(['target_id','resname'])['z_1'].transform(lambda x: x.fillna(x.mean()))\n\nprint(\"Before dropna:\", train_combined.shape)\nprint(train_combined.isna().sum())\n\ntrain_combined = train_combined.dropna()\ntrain_combined = train_combined.drop('target_id',axis=1)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def generate_test_label(tmp_id, tmp_seq):\n\n    tmp_seq_len = len(tmp_seq)\n    tmp_df = pd.DataFrame()\n    \n    tmp_df['resname'] = [x for x in tmp_seq]\n    tmp_df.insert(0, 'ID', tmp_id) \n    tmp_df['target_id'] = tmp_df['ID']\n    tmp_df['resid'] = list(range(1,tmp_seq_len+1))\n    tmp_df['ID'] = [x+\"_\" + str(y) for x,y in zip(tmp_df['ID'],tmp_df['resid'])]\n    return tmp_df\n    \ntest_labels = pd.DataFrame()\nfor x,y in zip(test_sequences['target_id'],test_sequences['sequence']):\n    test_labels =  pd.concat([test_labels, generate_test_label(x,y)])\n\ntest_combined = test_labels.merge(test_sequences_fe,how='left',on='target_id')\ntest_combined = test_combined.drop('target_id',axis=1)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"features = train_combined.drop(['ID','x_1','y_1','z_1'],axis=1).columns.to_list()\n\n# ----------- X_1 -----------\ntrain_hframe = h2o.H2OFrame(train_combined.drop(['ID', 'y_1', 'z_1'], axis=1))\ntrain, valid = train_hframe.split_frame(ratios=[.8], seed=1)\n\nxgb_x = H2OXGBoostEstimator(\n    booster='gbtree',\n    ntrees=400,\n    max_depth=20,\n    learn_rate=0.01,\n    sample_rate=0.8,\n    col_sample_rate=0.8,\n    reg_alpha=1.0,\n    reg_lambda=1.0,\n    nfolds=5,\n    keep_cross_validation_predictions=True,\n    seed=1,\n    score_tree_interval=10,\n    stopping_rounds=20,\n    stopping_metric=\"RMSE\",\n    stopping_tolerance=1e-4\n)\nxgb_x.train(x=features, y='x_1', training_frame=train, validation_frame=valid)\n\n# ----------- Y_1 -----------\ntrain_hframe = h2o.H2OFrame(train_combined.drop(['ID', 'x_1', 'z_1'], axis=1))\ntrain, valid = train_hframe.split_frame(ratios=[.8], seed=1)\n\nxgb_y = H2OXGBoostEstimator(\n    booster='gbtree',\n    ntrees=400,\n    max_depth=20,\n    learn_rate=0.01,\n    sample_rate=0.8,\n    col_sample_rate=0.8,\n    reg_alpha=1.0,\n    reg_lambda=1.0,\n    nfolds=5,\n    keep_cross_validation_predictions=True,\n    seed=1,\n    score_tree_interval=10,\n    stopping_rounds=20,\n    stopping_metric=\"RMSE\",\n    stopping_tolerance=1e-4\n)\nxgb_y.train(x=features, y='y_1', training_frame=train, validation_frame=valid)\n\n# ----------- Z_1 -----------\ntrain_hframe = h2o.H2OFrame(train_combined.drop(['ID', 'x_1', 'y_1'], axis=1))\ntrain, valid = train_hframe.split_frame(ratios=[.8], seed=1)\n\nxgb_z = H2OXGBoostEstimator(\n    booster='gbtree',\n    ntrees=400,\n    max_depth=20,\n    learn_rate=0.01,\n    sample_rate=0.8,\n    col_sample_rate=0.8,\n    reg_alpha=1.0,\n    reg_lambda=1.0,\n    nfolds=5,\n    keep_cross_validation_predictions=True,\n    seed=1,\n    score_tree_interval=10,\n    stopping_rounds=20,\n    stopping_metric=\"RMSE\",\n    stopping_tolerance=1e-4\n)\nxgb_z.train(x=features, y='z_1', training_frame=train, validation_frame=valid)\n\n\nprint(\"x_1 Metrics:\")\nprint(f\"  MSE: {xgb_x.mse(valid=True)}\")\nprint(f\"  RMSE: {xgb_x.rmse(valid=True)}\")\nprint(f\"  MAE: {xgb_x.mae(valid=True)}\")\nprint(f\"  R2: {xgb_x.r2(valid=True)}\")\n\nprint(\"y_1 Metrics:\")\nprint(f\"  MSE: {xgb_y.mse(valid=True)}\")\nprint(f\"  RMSE: {xgb_y.rmse(valid=True)}\")\nprint(f\"  MAE: {xgb_y.mae(valid=True)}\")\nprint(f\"  R2: {xgb_y.r2(valid=True)}\")\n\nprint(\"z_1 Metrics:\")\nprint(f\"  MSE: {xgb_z.mse(valid=True)}\")\nprint(f\"  RMSE: {xgb_z.rmse(valid=True)}\")\nprint(f\"  MAE: {xgb_z.mae(valid=True)}\")\nprint(f\"  R2: {xgb_z.r2(valid=True)}\")","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_hframe = h2o.H2OFrame(test_combined.drop(['ID'],axis=1)) \npreds_x = xgb_x.predict(test_hframe)\npreds_y = xgb_y.predict(test_hframe)\npreds_z = xgb_z.predict(test_hframe)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission = test_labels.drop('target_id',axis=1)\n\nsubmission['x_1'] =  preds_x.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['y_1'] =preds_y.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['z_1'] = preds_z.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\n\nsubmission['x_2'] = preds_x.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['y_2'] =preds_y.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['z_2'] = preds_z.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\n\nsubmission['x_3'] = preds_x.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['y_3'] =preds_y.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['z_3'] = preds_z.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\n\nsubmission['x_4'] = preds_x.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['y_4'] =preds_y.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['z_4'] = preds_z.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\n\nsubmission['x_5'] = preds_x.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['y_5'] =preds_y.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)\nsubmission['z_5'] = preds_z.as_data_frame(use_pandas=True, header=True,use_multi_thread=True)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"submission.to_csv('submission.csv',index=False)\nsubmission.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}