{ "cells": [ { "cell_type": "markdown", "id": "d841f273", "metadata": {}, "source": [ "# AutoML for Classification Model Screening\n", "\n", "The following are the steps for using AutoML for a classification task:\n", "\n", "\n", "1. Provide an input pandas dataframe consisting of two columns:
\n", " * SMILES strings
\n", " * target class values
\n", "\n", "\n", "2. If featurization = True, Molecules are represented as:
\n", " * Coulomb matrix
\n", " * RDKit Morgan (ECFP6 1024-bit) fingerprints
\n", " * MACCs keys
\n", " * RDKit hashed topological torsion
\n", " * RDKit molecular descriptors (all)
\n", " * Mordred molecular descriptors
\n", " \n", " If featurization=False, a feature set must be provided by the user.\n", "\n", "\n", "3. Screens through various classifier models:
\n", " * Single-core (runs regardless of multi_core value):\n", " * [LogisticRegression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)
\n", " * [DecisionTreeClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html)
\n", " * [SVC](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html)
\n", " * [KNeighboursClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html)
\n", " * Multi-core(set multi_core=True):\n", " * [RandomForestClassifier](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)
\n", " * [ChemML_MLP](https://hachmannlab.github.io/chemml/ipython_notebooks/ml_model.html) (if n_datapoints>500)
\n", " * (optional) [XGBClassifier](https://xgboost.readthedocs.io/en/latest/python/python_api.html)
\n", " * (optional) [LightGBM](https://lightgbm.readthedocs.io/en/stable/)\n", "\n", "Yields 'n-best' models, with optimized hyperparamters.\n", "\n", "The output_dir argument specifies a folder that will be created wherever the code is run from, containing the following directory tree:\n", "\n", "
 <output_dir>/
|-- output.log
|-- scores.csv
|-- best_model/
| |-- model.pkl # most non-MLP models
| |-- model_chemml_model.json # MLP case (plus possible extra model files)
| |-- scaler.pkl # present when scaler exists for chosen feature_key
| |-- feature_order.json
| |-- metadata.json
|-- .model_screener_artifacts/
| |-- <run_key_1>/
| |-- model.pkl # or MLP artifact files
| |-- <run_key_2>/
...
" ] }, { "cell_type": "markdown", "id": "2a2ea142", "metadata": {}, "source": [ "## Load your data \n", "\n", "We are using ChemML's in-built dataset to demonstrate the minimum requirements to run AutoML." ] }, { "cell_type": "code", "execution_count": 1, "id": "3186feee", "metadata": { "scrolled": true }, "outputs": [], "source": [ "import pandas as pd\n", "from chemml.datasets import load_organic_density" ] }, { "cell_type": "code", "execution_count": 2, "id": "56240d5a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
smilesdensity_Kg/m3
361c1scc(n1)c1ncc(s1)c1c(ccc2c1cccc2)c1cncs11328.35
73S1CC(SC(C1)C1CCCC1)c1cocc1c1ccccc11143.80
374N1CNC(NC1)c1sccc1C1(CSCCS1)c1cccs11351.33
155c1nc(c(s1)c1nsnc1)c1csc(n1)c1cccs11466.57
104Oc1ccc2c(c1c1cocc1)c(ccc2)c1ccccn11207.67
.........
248Oc1ncc(c(c1)C)c1cnccn11195.16
145Sc1cc2ccccc2c(c1)c1cnccc1c1cnccn11213.41
92c1sc(c(c1)c1ncccc1c1nsnc1)c1ccc2c(c1)cccc21264.16
152N1CNC(NC1)(N1CNC(NC1)c1cncs1)c1cccc2c1cccc21270.40
367C1CSC(CS1)C1(CSC(CS1)c1ccc2c(c1)cccc2)c1cnccn11268.28
\n", "

200 rows × 2 columns

\n", "
" ], "text/plain": [ " smiles density_Kg/m3\n", "361 c1scc(n1)c1ncc(s1)c1c(ccc2c1cccc2)c1cncs1 1328.35\n", "73 S1CC(SC(C1)C1CCCC1)c1cocc1c1ccccc1 1143.80\n", "374 N1CNC(NC1)c1sccc1C1(CSCCS1)c1cccs1 1351.33\n", "155 c1nc(c(s1)c1nsnc1)c1csc(n1)c1cccs1 1466.57\n", "104 Oc1ccc2c(c1c1cocc1)c(ccc2)c1ccccn1 1207.67\n", ".. ... ...\n", "248 Oc1ncc(c(c1)C)c1cnccn1 1195.16\n", "145 Sc1cc2ccccc2c(c1)c1cnccc1c1cnccn1 1213.41\n", "92 c1sc(c(c1)c1ncccc1c1nsnc1)c1ccc2c(c1)cccc2 1264.16\n", "152 N1CNC(NC1)(N1CNC(NC1)c1cncs1)c1cccc2c1cccc2 1270.40\n", "367 C1CSC(CS1)C1(CSC(CS1)c1ccc2c(c1)cccc2)c1cnccn1 1268.28\n", "\n", "[200 rows x 2 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "molecules, target, dragon_subset = load_organic_density()\n", "df=pd.concat([molecules, target], axis=1)\n", "df = df.sample(200, random_state=42)\n", "df" ] }, { "cell_type": "code", "execution_count": 3, "id": "e0fa0dbf", "metadata": {}, "outputs": [], "source": [ "# Labeling data for classification instead of regression\n", "# Note: This is just for demonstration purposes. In practice, you would want to use a regression model for predicting density.\n", "df['density_class'] = pd.qcut(df['density_Kg/m3'], q=3, labels=range(3))" ] }, { "cell_type": "markdown", "id": "61cdf76b", "metadata": {}, "source": [ "## Run autoML for a classification task" ] }, { "cell_type": "code", "execution_count": 4, "id": "97133962", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "-------------------------ChemML AutoML Model Screening-------------------------\n", "\n", "-------------------------Model screening started at Mon Aug 31 01:28:19 2026-------------------------\n", "\n", "\n", "\n", "Converting SMILES to ChemML Molecule objects...\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Converting SMILES to ChemML Molecule objects: 100%|██████████| 200/200 [00:06<00:00, 28.92it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Generating Coulomb matrix representation...\n", "\n", "featurizing molecules in batches of 12 ...\n", "\u001b[1m200/200\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m14s\u001b[0m 69ms/step \n", "Merging batch features ... [DONE]\n", "\n", "Generating RDKit fingerprint representations...\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Generating Morgan Fingerprints: 100%|██████████| 200/200 [00:00<00:00, 10268.08molecule/s]\n", "Generating MACCS Fingerprints: 100%|██████████| 200/200 [00:00<00:00, 998.62molecule/s] \n", "Generating Hashed Topological Torsion Fingerprints: 100%|██████████| 200/200 [00:00<00:00, 8634.43molecule/s]\n", "Generating Atom Pair Fingerprints: 100%|██████████| 200/200 [00:00<00:00, 9262.83molecule/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Generating RDKit descriptor representations...\n", "\n", "Step 1: Normalizing molecule input\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Step 2: Calculating RDKit descriptors: 100%|██████████| 200/200 [00:02<00:00, 95.34it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "Generating Mordred descriptor representations...\n", "\n", "Step 1: Normalizing molecule input\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Normalizing Molecule input: 100%|██████████| 200/200 [00:00\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelAccuracyRecallPrecisionF1-scoretime(seconds)parametersFeaturerun_key
27LogisticRegression0.80.7936510.8444440.7975879.955029[{'C': 0.1, 'class_weight': None, 'dual': Fals...mord_descriptorsLogisticRegression_mord_descriptors_324dd7b551...
26KNeighborsClassifier0.750.7460320.8111110.7583716.259871[{'algorithm': 'auto', 'leaf_size': 30, 'metri...mord_descriptorsKNeighborsClassifier_mord_descriptors_1e7fa7c1...
24DecisionTreeClassifier0.70.6904760.7638890.6944443.405225[{'ccp_alpha': 0.0, 'class_weight': None, 'cri...mord_descriptorsDecisionTreeClassifier_mord_descriptors_6a4d98...
19LogisticRegression0.650.6428570.6629630.6465627.150034[{'C': 42.16315789473685, 'class_weight': None...hashedatompair_radius3LogisticRegression_hashedatompair_radius3_c444...
17SVC0.60.5952380.6047620.5976912.851144[{'C': 0.0037926901907322525, 'break_ties': Fa...hashedatompair_radius3SVC_hashedatompair_radius3_ef5a1fb731b9493682d...
15KNeighborsClassifier0.550.5634920.5416670.5457885.889152[{'algorithm': 'auto', 'leaf_size': 30, 'metri...hashedtopologicaltorsion_radius3KNeighborsClassifier_hashedtopologicaltorsion_...
16DecisionTreeClassifier0.50.5079370.5416670.5056281.434301[{'ccp_alpha': 0.0, 'class_weight': None, 'cri...hashedatompair_radius3DecisionTreeClassifier_hashedatompair_radius3_...
\n", "" ], "text/plain": [ " Model Accuracy Recall Precision F1-score \\\n", "27 LogisticRegression 0.8 0.793651 0.844444 0.797587 \n", "26 KNeighborsClassifier 0.75 0.746032 0.811111 0.758371 \n", "24 DecisionTreeClassifier 0.7 0.690476 0.763889 0.694444 \n", "19 LogisticRegression 0.65 0.642857 0.662963 0.646562 \n", "17 SVC 0.6 0.595238 0.604762 0.597691 \n", "15 KNeighborsClassifier 0.55 0.563492 0.541667 0.545788 \n", "16 DecisionTreeClassifier 0.5 0.507937 0.541667 0.505628 \n", "\n", " time(seconds) parameters \\\n", "27 9.955029 [{'C': 0.1, 'class_weight': None, 'dual': Fals... \n", "26 6.259871 [{'algorithm': 'auto', 'leaf_size': 30, 'metri... \n", "24 3.405225 [{'ccp_alpha': 0.0, 'class_weight': None, 'cri... \n", "19 7.150034 [{'C': 42.16315789473685, 'class_weight': None... \n", "17 2.851144 [{'C': 0.0037926901907322525, 'break_ties': Fa... \n", "15 5.889152 [{'algorithm': 'auto', 'leaf_size': 30, 'metri... \n", "16 1.434301 [{'ccp_alpha': 0.0, 'class_weight': None, 'cri... \n", "\n", " Feature \\\n", "27 mord_descriptors \n", "26 mord_descriptors \n", "24 mord_descriptors \n", "19 hashedatompair_radius3 \n", "17 hashedatompair_radius3 \n", "15 hashedtopologicaltorsion_radius3 \n", "16 hashedatompair_radius3 \n", "\n", " run_key \n", "27 LogisticRegression_mord_descriptors_324dd7b551... \n", "26 KNeighborsClassifier_mord_descriptors_1e7fa7c1... \n", "24 DecisionTreeClassifier_mord_descriptors_6a4d98... \n", "19 LogisticRegression_hashedatompair_radius3_c444... \n", "17 SVC_hashedatompair_radius3_ef5a1fb731b9493682d... \n", "15 KNeighborsClassifier_hashedtopologicaltorsion_... \n", "16 DecisionTreeClassifier_hashedatompair_radius3_... " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scores" ] }, { "cell_type": "markdown", "id": "35fd504e", "metadata": {}, "source": [ "## Validating AutoML-generated model\n", "\n", "Since ChemML v1.3.4, AutoML outputs the best model and required scaler and feature order as easy-to-import files. A quick demonstration of the model loading workflow is given below:" ] }, { "cell_type": "code", "execution_count": 6, "id": "f527cd3a", "metadata": {}, "outputs": [], "source": [ "import pickle\n", "import json\n", "\n", "with open(f'{output_dir}/best_model/metadata.json', 'r') as f:\n", " metadata = json.load(f)\n", "with open(f'{output_dir}/best_model/explanation.json', 'r') as f:\n", " explanation = json.load(f)\n", "with open(f'{output_dir}/best_model/feature_order.json', 'r') as f:\n", " feature_order = json.load(f)\n", "with open(f\"{output_dir}/best_model/model.pkl\", \"rb\") as f:\n", " loaded_model = pickle.load(f)\n", "with open(f\"{output_dir}/best_model/scaler.pkl\", \"rb\") as f:\n", " loaded_scaler = pickle.load(f)" ] }, { "cell_type": "markdown", "id": "c12e712d", "metadata": {}, "source": [ "Metadata isn't necessary for model validation, but gives us a lot of context from the AutoML screening workflow." ] }, { "cell_type": "code", "execution_count": 7, "id": "b1127a85", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'artifact_schema_version': 1,\n", " 'model_name': 'LogisticRegression',\n", " 'feature_key': 'mord_descriptors',\n", " 'run_key': 'LogisticRegression_mord_descriptors_324dd7b551dd4d0e89563c3fa79868b8',\n", " 'screener_type': 'classifier',\n", " 'parameters': {'C': 0.1,\n", " 'class_weight': None,\n", " 'dual': False,\n", " 'fit_intercept': True,\n", " 'intercept_scaling': 1,\n", " 'l1_ratio': 0.0,\n", " 'max_iter': 100,\n", " 'n_jobs': None,\n", " 'penalty': 'deprecated',\n", " 'random_state': None,\n", " 'solver': 'sag',\n", " 'tol': 0.0001,\n", " 'verbose': 0,\n", " 'warm_start': False},\n", " 'n_folds': 5,\n", " 'n_datapoints': 200,\n", " 'metrics': {'Accuracy': 0.8,\n", " 'Recall': 0.7936507936507936,\n", " 'Precision': 0.8444444444444444,\n", " 'F1-score': 0.7975867269984916,\n", " 'time(seconds)': 9.955028772354126},\n", " 'model_serializer': 'pickle',\n", " 'model_artifact_dir': 'model_artifact',\n", " 'scaler_file': 'scaler.pkl',\n", " 'feature_order_file': 'feature_order.json',\n", " 'timestamp': 'Mon Aug 31 01:30:34 2026'}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "metadata" ] }, { "cell_type": "markdown", "id": "c163ecf5", "metadata": {}, "source": [ "Explanation gives the user a list of feature importances alongside feature names; while not necessary for validation, this is useful to understand what features the model is actually using." ] }, { "cell_type": "code", "execution_count": null, "id": "c0d50b6d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'model_type': 'LogisticRegression',\n", " 'explanation_type': 'linear.coef_',\n", " 'importance_values': {'BCUTs-1l': 0.12080837896578821,\n", " 'ATSC6s': 0.11705360020911237,\n", " 'BCUTdv-1l': 0.11643211939895474,\n", " 'MATS6s': 0.11176801885427924,\n", " 'MIC0': -0.10732155496149466,\n", " 'BCUTZ-1h': -0.10718923909200691,\n", " 'VSA_EState7': 0.10557335217812619,\n", " 'SM1_DzZ': -0.10481593783264181,\n", " 'MIC2': -0.10150151886248547,\n", " 'MDEC-22': 0.10067185163430138,\n", " 'PEOE_VSA4': -0.10042496013838315,\n", " 'Mor13': 0.09870373105961783,\n", " 'IC0': -0.09707281423378299,\n", " 'C2SP3': 0.09600380966243331,\n", " 'Mor19': 0.09434981175135433,\n", " 'IC2': -0.09216564338412887,\n", " 'Mor23v': -0.08944319176524317,\n", " 'WNSA4': 0.08883671204663847,\n", " 'Mor11m': 0.08859302230665116,\n", " 'nHetero': -0.08830107172063842,\n", " 'Mor21': -0.0877983270264638,\n", " 'nS': -0.0852109498551405,\n", " 'MATS1s': 0.0849868365554287,\n", " 'ATSC8i': -0.08486929913376605,\n", " 'Mor11v': 0.0843377479785362,\n", " 'PEOE_VSA6': 0.08371084437200652,\n", " 'GATS3Z': 0.08314941767103975,\n", " 'ZMIC4': -0.08291889991449908,\n", " 'SlogP_VSA11': -0.08264076194322785,\n", " 'Mor22': 0.0811945672039007,\n", " 'AATSC0Z': -0.08025587707186668,\n", " 'AATSC2Z': 0.07969179763267753,\n", " 'ATSC0Z': -0.07938387796472843,\n", " 'GATS1s': -0.0778363152307057,\n", " 'PNSA4': 0.07711466587068334,\n", " 'WNSA3': 0.07702985845556001,\n", " 'SMR_VSA5': 0.07635130453924953,\n", " 'ATS0Z': -0.07621573428909163,\n", " 'MIC1': -0.07537027853437128,\n", " 'Mor07v': 0.07493426507957587,\n", " 'ATSC2Z': 0.07423512895464822,\n", " 'Mor17': -0.07265706116251208,\n", " 'SM1_Dzse': -0.07258756393687768,\n", " 'Mor23m': -0.07243901248933617,\n", " 'AMID_h': -0.0715074895084047,\n", " 'Mor18': -0.07134081353269153,\n", " 'FNSA2': 0.07098238606356791,\n", " 'DPSA3': -0.07086776819047452,\n", " 'WNSA5': 0.07072208522949826,\n", " 'NaaS': -0.07011039127881565,\n", " 'Mor21m': -0.06984160210315588,\n", " 'Mor23': -0.06979633396704292,\n", " 'AATS5Z': -0.06776667525244524,\n", " 'DPSA4': -0.06743265563863299,\n", " 'AATS6Z': -0.0671288925307278,\n", " 'ATSC4c': -0.06709979041594832,\n", " 'Mor31': 0.06705804301418883,\n", " 'DPSA1': 0.06667074035047829,\n", " 'PNSA2': 0.06665612606226767,\n", " 'PNSA3': 0.06598975001498042,\n", " 'Mor07': 0.06558397866509244,\n", " 'ATSC6v': -0.06527858478714987,\n", " 'AATS0Z': -0.06513692171231619,\n", " 'RNCS': 0.06500833397631156,\n", " 'VSA_EState6': 0.06467998846396998,\n", " 'ATSC1s': 0.0639567175973236,\n", " 'SRW05': -0.06385335676797899,\n", " 'Mor03m': 0.0635536906752689,\n", " 'ZMIC2': 0.0633770766472029,\n", " 'ATSC1dv': 0.06315167855356948,\n", " 'Mor07m': 0.06299027299502238,\n", " 'PNSA1': -0.06284026238877223,\n", " 'MATS1c': 0.0627341979463412,\n", " 'SlogP_VSA5': 0.0625480201773812,\n", " 'GATS3p': 0.062294692738831585,\n", " 'Mor27': -0.06183006226945349,\n", " 'Mor06p': -0.061320930862255645,\n", " 'NsCH3': 0.061107468780475446,\n", " 'AATSC7i': 0.0609338990453993,\n", " 'Mor25': 0.06088850374545029,\n", " 'Mor16': 0.06065044433704577,\n", " 'n5HRing': -0.06056563915935044,\n", " 'ATSC6p': -0.060454239126411874,\n", " 'PEOE_VSA9': -0.0600792995531491,\n", " 'PNSA5': 0.05925226467000524,\n", " 'ATSC1c': 0.05879170065770135,\n", " 'EState_VSA4': -0.05878302306780468,\n", " 'Xch-7dv': -0.058671009652759135,\n", " 'Mor12': -0.05831698042454397,\n", " 'Mor27v': -0.05783720073530536,\n", " 'n6aRing': 0.05779768084307773,\n", " 'Mor05': -0.056562456827765124,\n", " 'AATS5p': -0.056103765160925564,\n", " 'AATS6p': -0.05584058998601546,\n", " 'nC': 0.055696487376654696,\n", " 'nHRing': -0.05569562438544719,\n", " 'NsSH': -0.05557082227059615,\n", " 'Mor22m': 0.05546542693895479,\n", " 'ATSC3c': 0.05545302844910022,\n", " 'Mor24m': -0.05518521095380485,\n", " 'GATS3s': 0.05507287368131927,\n", " 'ATSC3s': -0.054405275267100005,\n", " 'ATSC1pe': 0.053341518437240255,\n", " 'Mor20': 0.05289003546006708,\n", " 'AATS6se': -0.05263014767903107,\n", " 'ATSC6Z': -0.05225501029632406,\n", " 'Mor22v': 0.052208026618504474,\n", " 'AATS1se': -0.052016972573772045,\n", " 'WNSA1': -0.05171974088332188,\n", " 'Mor27m': -0.05160604383234613,\n", " 'Mor02m': -0.05150896285084032,\n", " 'ATSC8p': -0.05140676549186002,\n", " 'Mor08': 0.05065750034077404,\n", " 'ATSC1d': 0.05049038574033142,\n", " 'AATS7se': -0.050397534695051004,\n", " 'GATS7dv': 0.050337125780684985,\n", " 'AATS0p': -0.050133006029732294,\n", " 'nH': 0.04994985338326599,\n", " 'ATSC7pe': -0.0499325873419884,\n", " 'ATSC7i': 0.049757529903058186,\n", " 'Mor08m': -0.049655392893681344,\n", " 'n6aHRing': 0.049326708043321135,\n", " 'SMR_VSA6': -0.04875171896956202,\n", " 'ATSC0c': -0.04853618150329924,\n", " 'Mor06m': -0.04843296330364251,\n", " 'MATS7se': -0.04825440075448658,\n", " 'AATS0se': -0.04803193343483492,\n", " 'NaaCH': 0.047451231845715536,\n", " 'ATSC6d': -0.047438229513838054,\n", " 'Xch-7d': -0.04672316245021522,\n", " 'n5ARing': 0.04656107401997829,\n", " 'GATS8c': 0.046445633614312684,\n", " 'Mor03v': 0.04613276455370276,\n", " 'ATSC2s': -0.045158917984958566,\n", " 'AATSC6dv': 0.045088567124141644,\n", " 'GATS2i': 0.0449961983869565,\n", " 'SssssC': -0.04484900692779872,\n", " 'Xch-6dv': -0.044822868571114144,\n", " 'Mor19v': 0.044568215687565874,\n", " 'PPSA5': -0.044566700343472855,\n", " 'SlogP_VSA2': -0.04385382135295167,\n", " 'Mor13m': -0.043827443270466844,\n", " 'PPSA1': 0.04372327809832466,\n", " 'GATS5se': 0.04369325110545239,\n", " 'AATS6v': -0.04343297632486252,\n", " 'AATSC0i': -0.04341791286884424,\n", " 'GATS7i': -0.0434061357080254,\n", " 'EState_VSA5': 0.043374799734754096,\n", " 'AATS6d': -0.0433590548614338,\n", " 'VSA_EState4': -0.04324451352340742,\n", " 'GATS5s': 0.043077255568700526,\n", " 'IC3': -0.04304824612498354,\n", " 'GATS1c': -0.04268478018796047,\n", " 'BCUTi-1h': -0.042563074562621574,\n", " 'GATS8se': 0.04234499544350699,\n", " 'Mor04': 0.042174025066053104,\n", " 'ATSC1i': 0.042123078096283836,\n", " 'Mor11': 0.04183428134082267,\n", " 'Mor09v': -0.04139005913449453,\n", " 'PBF': -0.041357787060382276,\n", " 'ATS1s': 0.041118530026729085,\n", " 'WPSA4': -0.04103054559761104,\n", " 'ATSC1v': 0.04097175567563154,\n", " 'Mor06v': -0.04088194743414806,\n", " 'PPSA3': -0.040781104102206964,\n", " 'TSRW10': -0.04067851727584217,\n", " 'nAtom': 0.04061022541330121,\n", " 'ATSC5d': -0.04057738727442518,\n", " 'AATSC1dv': 0.040422250329272824,\n", " 'PPSA4': -0.040403788344096726,\n", " 'GATS8i': 0.04030302886012403,\n", " 'ATSC8v': -0.03998086414854392,\n", " 'FilterItLogS': -0.039921638053251565,\n", " 'ATS1Z': -0.03971944245657374,\n", " 'GATS8d': 0.039695789372516,\n", " 'Mor09m': -0.03913069799730909,\n", " 'EState_VSA7': -0.03912183849300865,\n", " 'BCUTdv-1h': 0.03900251000427328,\n", " 'MATS8se': -0.03868718084008164,\n", " 'PEOE_VSA3': -0.038544662912747045,\n", " 'EState_VSA8': 0.03832646356895805,\n", " 'GGI5': -0.03818453197788489,\n", " 'VSA_EState1': -0.03813749920248062,\n", " 'AATS4Z': -0.03793591279064621,\n", " 'C2SP2': 0.037918849523622865,\n", " 'Mor28v': 0.03791048872968623,\n", " 'ATSC2p': 0.0377302251776739,\n", " 'EState_VSA9': -0.03772536321427576,\n", " 'AATSC8i': -0.03756741721389703,\n", " 'ATSC7s': -0.03752247664142901,\n", " 'GATS3pe': 0.03748397243724362,\n", " 'MATS7pe': -0.037454316039981214,\n", " 'Mor03p': 0.03742225801021257,\n", " 'TIC0': -0.037091138743572956,\n", " 'MOMI-Z': -0.03673544730428269,\n", " 'ATSC2c': -0.03659842931031411,\n", " 'WPSA3': -0.03655098660898325,\n", " 'AATS8Z': -0.036426949000269715,\n", " 'GATS4c': 0.03640763506047627,\n", " 'C3SP2': 0.03622097013264929,\n", " 'n6Ring': 0.03600524256872238,\n", " 'VSA_EState3': -0.03598617330057456,\n", " 'AATS8se': -0.03598336238532537,\n", " 'AATS8v': -0.03588540437424892,\n", " 'Mor25v': 0.03575406686616382,\n", " 'GATS6c': -0.03571323705637587,\n", " 'AATS7dv': -0.035709233992754275,\n", " 'SlogP_VSA4': 0.035595726333001766,\n", " 'ATSC2i': -0.035533947698472214,\n", " 'GATS7pe': 0.03544377091744612,\n", " 'IC1': -0.035318856821838794,\n", " 'GATS2Z': -0.03523082334691317,\n", " 'AATSC5Z': -0.03518587363716325,\n", " 'GATS8v': 0.03515408663806315,\n", " 'GATS5c': 0.03499472480062851,\n", " 'nN': -0.034973671072659474,\n", " 'AATS3se': -0.03479487354198179,\n", " 'Mor28': 0.03465975459211602,\n", " 'ATSC1se': 0.03459650262766007,\n", " 'Mor20v': 0.03455455953869654,\n", " 'GATS3se': 0.03417833564230912,\n", " 'AATS7d': -0.03379234214974467,\n", " 'ATSC6se': 0.03368938958085084,\n", " 'ATSC4s': 0.03348157704550467,\n", " 'AETA_eta_F': 0.03344524366162438,\n", " 'GGI3': 0.03333809347740654,\n", " 'GATS7s': 0.03329907226614312,\n", " 'SLogP': 0.033296158740393066,\n", " 'ATSC5Z': -0.03291013612885785,\n", " 'Mor14': 0.032494717094798266,\n", " 'Mor02v': -0.03243454950353637,\n", " 'ATSC1p': 0.03235723703221591,\n", " 'GATS4d': 0.03213071756937961,\n", " 'WPSA1': 0.03204081935416987,\n", " 'ZMIC1': 0.03175504914419546,\n", " 'GATS6s': -0.03174403296326133,\n", " 'AATS7v': -0.03158880137632405,\n", " 'GATS8dv': 0.03149243806228315,\n", " 'BCUTv-1l': 0.03141600025632607,\n", " 'Mor02': -0.03141313893835163,\n", " 'Mor17m': -0.03108572632809317,\n", " 'Mor31v': 0.031030703631038617,\n", " 'AATS0v': -0.03094044861566445,\n", " 'AATS8dv': -0.03089234179186471,\n", " 'ATSC2d': 0.030859505152072943,\n", " 'ETA_beta_ns_d': -0.030760271583760854,\n", " 'AATS5se': -0.030673974188087906,\n", " 'AATSC7Z': 0.03062008976467808,\n", " 'GATS5dv': 0.030363024750366778,\n", " 'BCUTd-1l': 0.03034751402930108,\n", " 'AATS5v': -0.030054379260253988,\n", " 'Mor30': 0.030026921537975884,\n", " 'Mor12v': -0.02995494123464769,\n", " 'C1SP3': -0.029850079987276748,\n", " 'AATS0d': -0.029786400838106974,\n", " 'ATSC6c': 0.029634235738143305,\n", " 'AATS7p': -0.029579194629221896,\n", " 'ATSC8dv': 0.02956838830959986,\n", " 'GATS7se': 0.029560655514654085,\n", " 'AATS7Z': -0.02938696938277561,\n", " 'ATSC7p': 0.029294574241194842,\n", " 'ATSC7dv': -0.02927189635074724,\n", " 'Mor15m': 0.02924786240531492,\n", " 'Xch-5d': -0.0292284675316169,\n", " 'Mor26': 0.029227336506969362,\n", " 'ATSC3se': 0.029090242864351516,\n", " 'MATS8c': -0.028737757192897992,\n", " 'GATS7c': 0.02871728591065137,\n", " 'ATSC4Z': 0.02861463295868068,\n", " 'GATS4dv': -0.028602795346020473,\n", " 'SMR_VSA9': -0.028436211874360486,\n", " 'ATSC0pe': -0.028174027562501442,\n", " 'GATS8s': 0.028027497144830545,\n", " 'Mor32': -0.027993098403816467,\n", " 'ATSC5pe': -0.027865227096743512,\n", " 'EState_VSA10': -0.027765215131674813,\n", " 'Mor16m': -0.02747678915681787,\n", " 'SpDiam_A': 0.02707751469458059,\n", " 'GATS4Z': -0.027076555261340566,\n", " 'NaaaC': 0.027051961639268735,\n", " 'AETA_eta': -0.02635034188664906,\n", " 'SlogP_VSA3': 0.026101049264122173,\n", " 'GATS1v': 0.025984281294022943,\n", " 'PEOE_VSA1': -0.02595518355265528,\n", " 'GATS1i': -0.02579969730869756,\n", " 'ATSC7se': -0.025749022568350342,\n", " 'GATS6se': -0.024877375469614656,\n", " 'GATS1dv': -0.02487193856883485,\n", " 'ZMIC3': -0.02481406451167846,\n", " 'ATSC0s': -0.024664162611399188,\n", " 'Mor29m': 0.024635822452118733,\n", " 'naHRing': -0.0244160224209537,\n", " 'Mor26m': 0.024393142174503377,\n", " 'PEOE_VSA11': -0.024158926935076683,\n", " 'SsssCH': 0.024151614605519355,\n", " 'AATS5d': -0.0240537394560784,\n", " 'C3SP3': -0.023930094098212035,\n", " 'ATS8Z': -0.023845978695860522,\n", " 'Mor18m': 0.02372629202014074,\n", " 'Mor14m': 0.023681010725991394,\n", " 'ATSC4pe': 0.023497304830171806,\n", " 'PEOE_VSA7': 0.02335863107276624,\n", " 'ATSC3v': 0.023224391427887205,\n", " 'Mor14v': 0.022849585533492225,\n", " 'AATSC6i': 0.022733282370838992,\n", " 'Mor10m': 0.022693229431218653,\n", " 'PEOE_VSA10': 0.022612955260741616,\n", " 'Mor03': 0.022574412132690302,\n", " 'GATS7p': -0.022562967133813918,\n", " 'AATS8d': -0.022506183812222098,\n", " 'ATSC3d': 0.022434065641580275,\n", " 'MATS2c': -0.022235910306878787,\n", " 'Kier3': 0.02209691431108705,\n", " 'Mor18v': -0.022034478423942447,\n", " 'Mor20m': 0.022030408353566844,\n", " 'AATSC1Z': -0.021798724701541445,\n", " 'AATS6i': 0.021795803436324458,\n", " 'ATSC5s': 0.021724251870350087,\n", " 'GATS8p': 0.021561892868083674,\n", " 'AATSC3Z': -0.02138593757099824,\n", " 'AATS4v': -0.021380028623155453,\n", " 'Mor30v': 0.02128891759160878,\n", " 'nBondsS': 0.021245438965662014,\n", " 'ATSC5v': 0.021165322577128286,\n", " 'AATS6dv': -0.020618411361216192,\n", " 'ATSC3Z': 0.02055258260850909,\n", " 'GeomRadius': -0.020365194458673772,\n", " 'GGI6': 0.020245840183482973,\n", " 'GATS6i': -0.01996577030664135,\n", " 'GATS4s': -0.019901593682738417,\n", " 'Mor19m': 0.019894103328682643,\n", " 'ATSC8Z': -0.0197225636172513,\n", " 'nBase': -0.019564851553910717,\n", " 'AATSC4Z': 0.01954478320106971,\n", " 'Mor26v': 0.01944767438693513,\n", " 'ATS0s': 0.019420890511106893,\n", " 'Mor05m': 0.0191717524435837,\n", " 'nO': -0.019102406157183102,\n", " 'NssS': -0.019022275818320313,\n", " 'Mor24v': -0.01899422049238081,\n", " 'Mor15': -0.018963789164845295,\n", " 'PEOE_VSA2': -0.01888627921356993,\n", " 'AATS5i': 0.018883019070424507,\n", " 'NaasC': -0.018860335924556344,\n", " 'ATSC4se': -0.018718299423674763,\n", " 'MATS8pe': -0.018713655414184422,\n", " 'GATS2s': 0.01845801972633954,\n", " 'SlogP_VSA10': -0.018453408599639877,\n", " 'Mor15v': 0.018370474208481303,\n", " 'AATSC3dv': -0.01816487281000892,\n", " 'Mor16v': -0.018039991701816402,\n", " 'ATS8dv': -0.01803103830420602,\n", " 'bpol': -0.01790988535814143,\n", " 'SpMAD_Dzv': -0.017662584935053235,\n", " 'AATSC4dv': 0.017655581863441818,\n", " 'ATSC0dv': 0.01759992703689625,\n", " 'GeomDiameter': -0.017592270004226924,\n", " 'VSA_EState5': -0.017575783706958507,\n", " 'Mor24': -0.017247652356007122,\n", " 'AATSC0dv': -0.01679405907743964,\n", " 'GATS3i': 0.016729722877538884,\n", " 'GATS3d': 0.016716326167183247,\n", " 'nAromAtom': 0.01663544423871456,\n", " 'ATSC8pe': 0.0165489757976493,\n", " 'BCUTs-1h': -0.016375298303912638,\n", " 'EState_VSA3': -0.01637158872863449,\n", " 'Mor30m': 0.0162990875191024,\n", " 'ATSC4dv': 0.016052266391098753,\n", " 'AATS0dv': -0.01597193168906244,\n", " 'ATSC5i': 0.01595376511830446,\n", " 'Xc-5dv': -0.0159334533542992,\n", " 'BCUTse-1h': 0.01581502820625964,\n", " 'SM1_Dzv': 0.01567428400897486,\n", " 'ATSC4i': -0.01555376531026534,\n", " 'AATS8s': -0.015507668494879032,\n", " 'ATS5Z': -0.015505966323840633,\n", " 'AATS7i': 0.01529088377921347,\n", " 'AATSC5i': -0.015206230067802503,\n", " 'ABC': 0.01504900999678791,\n", " 'ATSC1Z': -0.01494853102953502,\n", " 'Mor17v': -0.014929294487106051,\n", " 'Mor09': -0.0148456512922033,\n", " 'Mor10': 0.014818335522133267,\n", " 'ATSC4d': -0.014671718922032085,\n", " 'EState_VSA6': -0.014620905427907517,\n", " 'NaaN': -0.01461249488018046,\n", " 'NssCH2': 0.014433326572594258,\n", " 'AATSC5dv': 0.014361123743243328,\n", " 'ATS4Z': -0.014295005564255907,\n", " 'Mor04v': -0.014274482358727676,\n", " 'Mor29v': 0.013942273803252875,\n", " 'AATSC7v': 0.013927729782467571,\n", " 'AATSC6v': -0.013845625977691081,\n", " 'IC4': 0.013841369031042643,\n", " 'ATSC6i': -0.013809963550853866,\n", " 'GATS6d': -0.013278827188968063,\n", " 'AATS5s': 0.01327335136899033,\n", " 'AATSC4v': -0.013265763055328393,\n", " 'AATSC4i': -0.013208798229842698,\n", " 'AATS6s': 0.013111145876303718,\n", " 'BCUTd-1h': 0.013039791446187431,\n", " 'AATS1s': 0.01297712631644322,\n", " 'MATS7s': -0.012819518397026159,\n", " 'ATSC6dv': -0.012695458971319025,\n", " 'ATSC2pe': 0.012627986175127386,\n", " 'MATS3c': 0.012532211191348218,\n", " 'GATS1se': -0.01226020248651081,\n", " 'GATS4se': 0.012044764182006677,\n", " 'ATS0p': -0.01202874740132981,\n", " 'MOMI-X': -0.01195705188224151,\n", " 'AATSC8dv': 0.011593901857097626,\n", " 'EState_VSA2': 0.011485509005819157,\n", " 'Mor29': 0.011442491495566209,\n", " 'ATSC3pe': 0.011252494641212038,\n", " 'GATS6Z': 0.011004069202544696,\n", " 'MATS6Z': -0.010922885759840106,\n", " 'SpMAD_Dzse': 0.01091386629500248,\n", " 'AATSC3i': -0.010792789862865448,\n", " 'VSA_EState2': -0.010669171906056407,\n", " 'PPSA2': -0.010552607701175708,\n", " 'NsssN': -0.01048360294504262,\n", " 'NsOH': -0.010399404378233161,\n", " 'GGI4': 0.010371577152687722,\n", " 'ATSC8s': -0.010289387062335077,\n", " 'HybRatio': -0.010203032282095544,\n", " 'VSA_EState8': -0.01012299968417748,\n", " 'Xc-3d': 0.01004582444826636,\n", " 'NsssCH': 0.00987138365890545,\n", " 'ATSC3i': 0.009860001349554158,\n", " 'AATSC8v': -0.009851679397161897,\n", " 'GATS5Z': 0.0098296033697443,\n", " 'Mor10v': 0.009524195326703427,\n", " 'RPCS': 0.009479618511522283,\n", " 'GATS4i': 0.009434124915095588,\n", " 'AATSC3v': -0.009250485551279448,\n", " 'ATSC2dv': -0.009248887894812406,\n", " 'n6HRing': 0.009220218970159056,\n", " 'GATS1p': 0.00913905968461284,\n", " 'ABCGG': 0.008846590790875604,\n", " 'ATSC7Z': 0.008836035647976647,\n", " 'ATSC5p': -0.008771074035330353,\n", " 'ATSC6pe': 0.008741724958691814,\n", " 'GATS7d': 0.008658437699936567,\n", " 'Mor31m': -0.008631865746234656,\n", " 'PEOE_VSA5': 0.008608479318108455,\n", " 'NaaO': 0.008470508231880062,\n", " 'Mor06': -0.008324047346850843,\n", " 'AATSC5v': 0.008244623690123996,\n", " 'Mor25m': 0.008210285307578077,\n", " 'Mor08v': -0.008176492232599985,\n", " 'TIC1': 0.008111812714411117,\n", " 'TASA': -0.008076971938866709,\n", " 'PEOE_VSA8': 0.007991740676410645,\n", " 'AATSC0s': -0.007880053497496244,\n", " 'AATS4d': -0.007847738060549957,\n", " 'ATS3Z': -0.007752947283317865,\n", " 'GATS5p': -0.007731696636388393,\n", " 'ATSC3dv': 0.007701331853378726,\n", " 'AATSC6Z': 0.007673583603162428,\n", " 'GATS7Z': -0.007672085357791472,\n", " 'GATS6dv': 0.007596712280292142,\n", " 'GATS4p': 0.007556136439638323,\n", " 'GeomShapeIndex': 0.007549975306883341,\n", " 'GATS2p': -0.007521998694664529,\n", " 'ATSC8d': 0.007378353981595479,\n", " 'MATS8s': -0.007371633631964059,\n", " 'GATS5d': 0.007259039134314974,\n", " 'GATS3c': 0.006907057823903871,\n", " 'AATS3i': 0.006784190636373167,\n", " 'ATSC7v': -0.006647635199080438,\n", " 'ATSC4v': -0.006415697640047022,\n", " 'GATS6p': 0.006413182801058924,\n", " 'TPSA': 0.006306411336226291,\n", " 'GATS2d': 0.006004335795723908,\n", " 'Diameter': 0.005906372134926628,\n", " 'GATS2dv': 0.005632581173283952,\n", " 'Mor13v': -0.005505364083768485,\n", " 'Mor32v': -0.005309891043961399,\n", " 'AATS4s': -0.004972038769412041,\n", " 'ATSC8se': 0.00496770140295598,\n", " 'SaasC': 0.0048910366323222255,\n", " 'GATS2se': 0.004797693231150838,\n", " 'GATS2c': -0.004746725781479923,\n", " 'nARing': -0.004642425776856336,\n", " 'SpAbs_Dzv': 0.00463528097789879,\n", " 'ATSC3p': 0.004558142291516235,\n", " 'ATSC2v': -0.004550088266698585,\n", " 'ATSC5se': -0.00442243501281143,\n", " 'ATSC0i': 0.004314492190282043,\n", " 'AATS0i': 0.004241714262895952,\n", " 'SMR_VSA4': 0.004214130514558937,\n", " 'Mor12m': 0.004123668433162665,\n", " 'GATS8Z': 0.003878508009245308,\n", " 'GATS2pe': 0.0038411985668661656,\n", " 'ATSC2se': -0.0036228142018597045,\n", " 'Mor05v': -0.0034515466442078917,\n", " 'BertzCT': 0.0033810458092780635,\n", " 'GATS1d': 0.0033145741419369507,\n", " 'AATSC7dv': 0.0032971353646910977,\n", " 'Mor32m': -0.0031899890121089096,\n", " 'GATS1pe': -0.0031599525391522725,\n", " 'Mor04m': -0.002994585785813329,\n", " 'Xpc-4d': 0.0029481044932680657,\n", " 'ATSC5c': -0.0027035010160079047,\n", " 'GATS7v': -0.0026707947283959163,\n", " 'C1SP2': 0.002609641521495827,\n", " 'BalabanJ': -0.0026005323726227417,\n", " 'Mor28m': -0.002558739893057113,\n", " 'Mor08p': 0.002402515626697463,\n", " 'ATS0dv': 0.002391766968703715,\n", " 'ATSC4p': 0.0023100954233423484,\n", " 'AATS0s': -0.002283643270338704,\n", " 'SlogP_VSA8': -0.0021781827981010656,\n", " 'ATSC7d': -0.002157439015782142,\n", " 'AATS7s': -0.0021031222183819803,\n", " 'AATS4i': 0.0018362999805065171,\n", " 'AATSC8Z': -0.0017249952237436636,\n", " 'AATSC8s': -0.0013104399048625135,\n", " 'ETA_eta': -0.0012892607379178737,\n", " 'AATSC0v': 0.0011370541916987963,\n", " 'ETA_beta_s': -0.0011002668124823179,\n", " 'GGI1': -0.00102978149010937,\n", " 'Xc-5d': 0.0009812545095996433,\n", " 'ATS6Z': -0.000951268458762142,\n", " 'AATS8i': -0.0006175520907965654,\n", " 'ATS7Z': 0.0006012797445065009,\n", " 'AATSC8d': 0.0005781758748009287,\n", " 'GATS5i': -0.0005646279557973399,\n", " 'Xc-3dv': 0.0005191797356694013,\n", " 'ATSC5dv': -0.0004020036125952537}}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "explanation" ] }, { "cell_type": "markdown", "id": "f49601b3", "metadata": {}, "source": [ "feature_order ensures that the trained model sees features in the exact same order as trained." ] }, { "cell_type": "code", "execution_count": 9, "id": "1333f74c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['ABC', 'ABCGG', 'nBase', 'SpDiam_A', 'nAromAtom']" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "feature_order[:5]" ] }, { "cell_type": "code", "execution_count": 10, "id": "d14e97a2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Converting SMILES to ChemML Molecule objects: 100%|██████████| 200/200 [00:06<00:00, 29.34it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Step 1: Normalizing molecule input\n", "Step 2/3: Optimizing geometry for 3D descriptor calculation\n", "Step 3/3: Calculating Mordred descriptors\n" ] } ], "source": [ "from chemml.chem import Molecule\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.model_selection import train_test_split\n", "import tqdm\n", "from chemml.chem import Mordred\n", "from sklearn.svm import SVR\n", "\n", "mol_objs_list = []\n", "for i, smi in enumerate(tqdm.tqdm(df[\"smiles\"], desc=\"Converting SMILES to ChemML Molecule objects\")):\n", " mol = Molecule(smi, 'smiles')\n", " mol.hydrogens('add')\n", " try:\n", " mol.to_xyz('MMFF', maxIters=10000, mmffVariant='MMFF94s')\n", " mol_objs_list.append(mol)\n", " except Exception as e:\n", " print(f\"\\nUnable to process SMILES: {smi}; Error: {e}\")\n", " # self.discarded_indices.append(i)\n", "loaded_mols = mol_objs_list\n", "features = Mordred(ignore_3D=False).represent(loaded_mols).drop(columns=['SMILES'])[feature_order].values\n", "targets = df[\"density_class\"].values\n", "\n", "\n", "X_test = loaded_scaler.transform(features)\n", "\n", "y_pred = loaded_model.predict(X_test)\n", "y_pred_proba = loaded_model.predict_proba(X_test)" ] }, { "cell_type": "markdown", "id": "fb78402e", "metadata": {}, "source": [ "The loaded_model object can be treated just like any model object" ] }, { "cell_type": "code", "execution_count": 11, "id": "86a7dabc", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
LogisticRegression(C=0.1, solver='sag')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "LogisticRegression(C=0.1, solver='sag')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "loaded_model" ] }, { "cell_type": "code", "execution_count": 12, "id": "b74d7ee7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "([2, 0, 2, 2, 0]\n", " Categories (3, int64): [0 < 1 < 2],\n", " array([2, 0, 2, 2, 0]))" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "targets[:5], y_pred[:5]" ] }, { "cell_type": "code", "execution_count": 13, "id": "397854f9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TP: [65 66 65]\n", "FP: [0 3 1]\n", "TN: [131 130 131]\n", "FN : [2 4 2]\n", "Accuracy: 0.98\n", "Precision: [1. 0.95652174 0.98484848]\n", "Recall: [0.97014925 1. 0.97014925]\n", "f1_score: [0.98484848 0.97777778 0.97744361]\n", "FPR: [0. 0.02255639 0.00757576]\n", "TPR: [0.97014925 0.94285714 0.97014925]\n", " 0 1 2\n", "TP 65.000000 66.000000 65.000000\n", "TN 131.000000 130.000000 131.000000\n", "FP 0.000000 3.000000 1.000000\n", "FN 2.000000 4.000000 2.000000\n", "precision 1.000000 0.956522 0.984848\n", "recall 0.970149 1.000000 0.970149\n", "f1_score 0.984848 0.977778 0.977444\n", "TPR 0.970149 0.942857 0.970149\n", "FPR 0.000000 0.022556 0.007576\n", "TNR 1.000000 0.977444 0.992424\n", "PPV 1.000000 0.956522 0.984848\n", "NPV 0.984962 0.970149 0.984962\n", "FNR 0.029851 0.057143 0.029851\n", "FDR 0.000000 0.043478 0.015152\n" ] }, { "data": { "text/plain": [ "(np.float64(0.98),\n", " 0 1 2\n", " 0 65.0 1.0 1.0\n", " 1 0.0 66.0 0.0\n", " 2 0.0 2.0 65.0,\n", " 0 1 2\n", " TP 65.000000 66.000000 65.000000\n", " TN 131.000000 130.000000 131.000000\n", " FP 0.000000 3.000000 1.000000\n", " FN 2.000000 4.000000 2.000000\n", " precision 1.000000 0.956522 0.984848\n", " recall 0.970149 1.000000 0.970149\n", " f1_score 0.984848 0.977778 0.977444\n", " TPR 0.970149 0.942857 0.970149\n", " FPR 0.000000 0.022556 0.007576\n", " TNR 1.000000 0.977444 0.992424\n", " PPV 1.000000 0.956522 0.984848\n", " NPV 0.984962 0.970149 0.984962\n", " FNR 0.029851 0.057143 0.029851\n", " FDR 0.000000 0.043478 0.015152)" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from chemml.utils import classification_metrics\n", "classification_metrics(targets, y_pred)" ] }, { "cell_type": "code", "execution_count": 14, "id": "592b1e91", "metadata": {}, "outputs": [ { "data": { "image/png": "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vYljPcZyVHYRv5sicVKKNAv5FDpERORdTpw4oVOwHT58WK9jzGrt2rV17nB34OPqFSAiIiIiIqLw9+bNGw1QCxQoYA5YMcf40KFDpVChQm7zljDTSkRERERE5GWuXr0qTZo0kU2bNpmXYS7xuXPnSt68ecWdMNNKRERERETkJUwmkwammCPcCFgjRYokHTt2lP3797tdwArMtBIREREREXmJv/76Sxo2bGi+niZNGvn111+lTJky4q6YaSUiIiIiIvISn3/+uRQpUkR/R/B69OhRtw5YgZlWIiIiIiKiCNxsycfnv1ylr6+vzJkzR44cOSJffvmleAJmWomIiIiIiCKgPXv26NjVffv2WS3PnDmzxwSswKCViIiIiIgoAnn16pX07dtXihcvLidPntQy4OfPn4unYnkwERERERFRBHHmzBlp0KCBdgI2xIsXTx48eCAxY8YUT8RMKxERERERUQSYymbChAmSL18+c8AaOXJk6d+/v+zYsUNSp04tnoqZViIiIiIiIg9248YNadasmaxdu9a8LGvWrNpwqVChQuLpmGklIiIiIiLyUKtWrdJmS5YBa9u2beXgwYMRImAFZlqJiIiIiIg8VIoUKeTp06f6e8qUKeWXX36RChUqSETCoJWIiIiIiMhD5c2bVwYMGCCHDx+WSZMmScKECSWiYdBKRERERETkAfz9/WX8+PHSvn17iRo1qnl5165dJVKkSBJRMWglIiIiIiJycwcOHNCpbE6fPi1+fn4ycOBA820ROWAFNmIiIiIiIiJyU69fv5ZBgwZJ0aJFNWCFMWPGyL1798RbMNNKRERERETkhs6dOyeNGjWS3bt3m5flz59fp7JJnDixeAsGrS4QK0ZU+eKTvJI5bVI5eeGW/Ln2oLx5YzLf/mP7zySyj3USfOnmo7L94AUXrK13u3njhsyb+6v8c/euDBk2Unx9+ZFxF7t27pAVy5ZIlqzZpHHTr129OkREREROYzKZZNq0adKxY0d5/vy5LvPx8ZHu3btLnz59rMazegOWB4ezLOmSyqEF3aXJZ0XlybMXUjx/Rpk/0vqAu03djyVaNF+5cuuB+eL37EV4r6rX69T+OylXurjs2rFDJk34SUszyPX++ecfKVIgj/Tq3kVWr/pbVq1c4epVIiIiInKaW7duSbVq1aRVq1bmgDVjxoyyfft2LRP2toAVXJo2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n0ybNk2yZMkifn5+Tn6VRERE7/bk/7GZM49pPDpoNXbImT5I4+pVISJy2vdavHjxuDU9sFsvxqVaMq7jNmc9ZujQodK/f/8g1wOBcKFChUK8/kRERM6GqiFnHdN4dNCaMmVKuXbtmnZc9PQ5snBGIk2aNPp64saN6+rVIQt8b9xXRHpvcDYSASu+18gzOykaE60b/P399adlJvV9H4PxryghNjx69EjSpUsnV69e5ckOJ4lI3yvugNuT29Td8X/U+VAFlDZtWkmYMKHTntOjg1ZMlp46dWqJSLCD5E7SPfG9cV8R5b1hhtVzIXBcv3691TI0VgLsuJ31mGjRounF3v9ORPgMuJOI8r3iLrg9uU3dHf9HwyZWc9pzOe2ZiIiIvFT58uXlxIkTcuHCBfMyTF2DidcxbtWYj3X79u3y8OFDhx9DREREHp5pJSIicgdVqlSRUqVKSc2aNaV3795y5coVGTFihEyZMsV8pvn69etSsmRJWb58uVSrVs2hxxARERGDVreBcq++ffvaLfsi1+J747743pC7QF+FlStXmoNO9Fr4888/pUaNGub7YCqa4sWLm8f4OPKYd+FnwPm4Tbk93R3/R7k9vfF/NJKJ8ysQERERERGRm2L9EREREREREbktBq1ERERERETkthi0EhERERERkdti0Oombt++Lfv27ZP79++7elXIxtmzZ3WaCg7/di///POPHDp0SB49euTqVSEKU/fu3dP9w507d8L0Md4C3+UnT56Uw4cPy+vXrx16jL+/v94fHaDpbfge3r9/f6i2z65du+TgwYPcrHaOPbBdAgICHN42mFYL+0UcU5I1Pz8//R+9fPlyiL5H8R5gWrI3b95wk9pAx3scH+P70VEXL16UAwcOyLNnzyTE0IiJXCcwMNDUokULU7Ro0Uw5cuTQnz169OBb4gYWL15sKlGihClBggQmfFT8/f1dvUpkMpl2795t+vjjj01JkiQx5c2b1xQjRgxTs2bNTC9fvuT2oQina9euVvuH1q1bm968eeP0x3iLc+fO6XbB90fatGlNKVKkMG3fvj3I+9+9e9f09ddfm+LFi2fKkyePKWHChKYiRYro89C/RowYYYoePbope/bs+n1cp04dU0BAgEObZ9y4cSYfHx9T1qxZuTn/79atW6bChQub4sePb8qQIYP+z61YseKd22fUqFGmOHHi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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "from chemml.visualization import ClassificationPlots\n", "\n", "\n", "plotter = ClassificationPlots().plot(targets, y_pred, y_pred_proba)\n", "display(plotter)" ] } ], "metadata": { "kernelspec": { "display_name": "nitin_py312_env", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.13" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 5 }