Skill v1.0.0
currentAutomated scan100/100version: "1.0.0"
name: deepchem description: Molecular ML with diverse featurizers and pre-built datasets. Use for property prediction (ADMET, toxicity) with traditional ML or GNNs when you want extensive featurization options and MoleculeNet benchmarks. Best for quick experiments with pre-trained models, diverse molecular representations. For graph-first PyTorch workflows use torchdrug; for benchmark datasets use pytdc. license: MIT license tags: [molecular-ml, drug-discovery, cheminformatics-ml, toxicity-prediction, deepchem] metadata: skill-author: K-Dense Inc. ----------|------|-------------------|------------|
| < 1K samples | Any | SklearnModel (RandomForest) | CircularFingerprint | |
|---|---|---|---|---|
| 1K-100K | Classification/Regression | GBDTModel or MultitaskRegressor | CircularFingerprint | |
| > 100K | Molecular properties | GCNModel, AttentiveFPModel, DMPNNModel | MolGraphConvFeaturizer | |
| Any (small preferred) | Transfer learning | ChemBERTa, GROVER, MolFormer | Model-specific | |
| Crystal structures | Materials properties | CGCNNModel, MEGNetModel | Structure-based | |
| Protein sequences | Protein properties | ProtBERT | Sequence-based |
Example: Traditional ML
from sklearn.ensemble import RandomForestRegressor# Wrap scikit-learn modelsklearn_model = RandomForestRegressor(n_estimators=100)model = dc.models.SklearnModel(model=sklearn_model)model.fit(train)
Example: Deep Learning
# Multitask regressor (for fingerprints)model = dc.models.MultitaskRegressor(n_tasks=2,n_features=2048,layer_sizes=[1000, 500],dropouts=0.25,learning_rate=0.001)model.fit(train, nb_epoch=50)
Example: Graph Neural Networks
# Graph Convolutional Networkmodel = dc.models.GCNModel(n_tasks=1,mode='regression',batch_size=128,learning_rate=0.001)model.fit(train, nb_epoch=50)# Graph Attention Networkmodel = dc.models.GATModel(n_tasks=1, mode='classification')model.fit(train, nb_epoch=50)# Attentive Fingerprintmodel = dc.models.AttentiveFPModel(n_tasks=1, mode='regression')model.fit(train, nb_epoch=50)
5. MoleculeNet Benchmarks
Quick access to 30+ curated benchmark datasets with standardized train/valid/test splits:
# Load benchmark datasettasks, datasets, transformers = dc.molnet.load_tox21(featurizer='GraphConv', # or 'ECFP', 'Weave', 'Raw'splitter='scaffold', # or 'random', 'stratified'reload=False)train, valid, test = datasets# Train and evaluatemodel = dc.models.GCNModel(n_tasks=len(tasks), mode='classification')model.fit(train, nb_epoch=50)metric = dc.metrics.Metric(dc.metrics.roc_auc_score)test_score = model.evaluate(test, [metric])
Common Datasets:
- Classification:
load_tox21(),load_bbbp(),load_hiv(),load_clintox() - Regression:
load_delaney(),load_freesolv(),load_lipo() - Quantum properties:
load_qm7(),load_qm8(),load_qm9() - Materials:
load_perovskite(),load_bandgap(),load_mp_formation_energy()
See references/api_reference.md for complete dataset list.
6. Transfer Learning
Leverage pretrained models for improved performance, especially on small datasets:
# ChemBERTa (BERT pretrained on 77M molecules)model = dc.models.HuggingFaceModel(model='seyonec/ChemBERTa-zinc-base-v1',task='classification',n_tasks=1,learning_rate=2e-5 # Lower LR for fine-tuning)model.fit(train, nb_epoch=10)# GROVER (graph transformer pretrained on 10M molecules)model = dc.models.GroverModel(task='regression',n_tasks=1)model.fit(train, nb_epoch=20)
When to use transfer learning:
- Small datasets (< 1000 samples)
- Novel molecular scaffolds
- Limited computational resources
- Need for rapid prototyping
Use the scripts/transfer_learning.py script for guided transfer learning workflows.
7. Model Evaluation
# Define metricsclassification_metrics = [dc.metrics.Metric(dc.metrics.roc_auc_score, name='ROC-AUC'),dc.metrics.Metric(dc.metrics.accuracy_score, name='Accuracy'),dc.metrics.Metric(dc.metrics.f1_score, name='F1')]regression_metrics = [dc.metrics.Metric(dc.metrics.r2_score, name='R²'),dc.metrics.Metric(dc.metrics.mean_absolute_error, name='MAE'),dc.metrics.Metric(dc.metrics.root_mean_squared_error, name='RMSE')]# Evaluatetrain_scores = model.evaluate(train, classification_metrics)test_scores = model.evaluate(test, classification_metrics)
8. Making Predictions
# Predict on test setpredictions = model.predict(test)# Predict on new moleculesnew_smiles = ['CCO', 'c1ccccc1', 'CC(C)O']new_features = featurizer.featurize(new_smiles)new_dataset = dc.data.NumpyDataset(X=new_features)# Apply same transformations as trainingfor transformer in transformers:new_dataset = transformer.transform(new_dataset)predictions = model.predict(new_dataset)
Typical Workflows
Workflow A: Quick Benchmark Evaluation
For evaluating a model on standard benchmarks:
import deepchem as dc# 1. Load benchmarktasks, datasets, _ = dc.molnet.load_bbbp(featurizer='GraphConv',splitter='scaffold')train, valid, test = datasets# 2. Train modelmodel = dc.models.GCNModel(n_tasks=len(tasks), mode='classification')model.fit(train, nb_epoch=50)# 3. Evaluatemetric = dc.metrics.Metric(dc.metrics.roc_auc_score)test_score = model.evaluate(test, [metric])print(f"Test ROC-AUC: {test_score}")
Workflow B: Custom Data Prediction
For training on custom molecular datasets:
import deepchem as dc# 1. Load and featurize datafeaturizer = dc.feat.CircularFingerprint(radius=2, size=2048)loader = dc.data.CSVLoader(tasks=['activity'],feature_field='smiles',featurizer=featurizer)dataset = loader.create_dataset('my_molecules.csv')# 2. Split data (use ScaffoldSplitter for molecules!)splitter = dc.splits.ScaffoldSplitter()train, valid, test = splitter.train_valid_test_split(dataset)# 3. Normalize (optional but recommended)transformers = [dc.trans.NormalizationTransformer(transform_y=True, dataset=train)]for transformer in transformers:train = transformer.transform(train)valid = transformer.transform(valid)test = transformer.transform(test)# 4. Train modelmodel = dc.models.MultitaskRegressor(n_tasks=1,n_features=2048,layer_sizes=[1000, 500],dropouts=0.25)model.fit(train, nb_epoch=50)# 5. Evaluatemetric = dc.metrics.Metric(dc.metrics.r2_score)test_score = model.evaluate(test, [metric])
Workflow C: Transfer Learning on Small Dataset
For leveraging pretrained models:
import deepchem as dc# 1. Load data (pretrained models often need raw SMILES)loader = dc.data.CSVLoader(tasks=['activity'],feature_field='smiles',featurizer=dc.feat.DummyFeaturizer() # Model handles featurization)dataset = loader.create_dataset('small_dataset.csv')# 2. Split datasplitter = dc.splits.ScaffoldSplitter()train, test = splitter.train_test_split(dataset)# 3. Load pretrained modelmodel = dc.models.HuggingFaceModel(model='seyonec/ChemBERTa-zinc-base-v1',task='classification',n_tasks=1,learning_rate=2e-5)# 4. Fine-tunemodel.fit(train, nb_epoch=10)# 5. Evaluatepredictions = model.predict(test)
See references/workflows.md for 8 detailed workflow examples covering molecular generation, materials science, protein analysis, and more.
Example Scripts
This skill includes three production-ready scripts in the scripts/ directory:
1. predict_solubility.py
Train and evaluate solubility prediction models. Works with Delaney benchmark or custom CSV data.
# Use Delaney benchmarkpython scripts/predict_solubility.py# Use custom datapython scripts/predict_solubility.py \--data my_data.csv \--smiles-col smiles \--target-col solubility \--predict "CCO" "c1ccccc1"
2. graph_neural_network.py
Train various graph neural network architectures on molecular data.
# Train GCN on Tox21python scripts/graph_neural_network.py --model gcn --dataset tox21# Train AttentiveFP on custom datapython scripts/graph_neural_network.py \--model attentivefp \--data molecules.csv \--task-type regression \--targets activity \--epochs 100
3. transfer_learning.py
Fine-tune pretrained models (ChemBERTa, GROVER) on molecular property prediction tasks.
# Fine-tune ChemBERTa on BBBPpython scripts/transfer_learning.py --model chemberta --dataset bbbp# Fine-tune GROVER on custom datapython scripts/transfer_learning.py \--model grover \--data small_dataset.csv \--target activity \--task-type classification \--epochs 20
Common Patterns and Best Practices
Pattern 1: Always Use Scaffold Splitting for Molecules
# GOOD: Prevents data leakagesplitter = dc.splits.ScaffoldSplitter()train, test = splitter.train_test_split(dataset)# BAD: Similar molecules in train and testsplitter = dc.splits.RandomSplitter()train, test = splitter.train_test_split(dataset)
Pattern 2: Normalize Features and Targets
transformers = [dc.trans.NormalizationTransformer(transform_y=True, # Also normalize target valuesdataset=train)]for transformer in transformers:train = transformer.transform(train)test = transformer.transform(test)
Pattern 3: Start Simple, Then Scale
- Start with Random Forest + CircularFingerprint (fast baseline)
- Try XGBoost/LightGBM if RF works well
- Move to deep learning (MultitaskRegressor) if you have >5K samples
- Try GNNs if you have >10K samples
- Use transfer learning for small datasets or novel scaffolds
Pattern 4: Handle Imbalanced Data
# Option 1: Balancing transformertransformer = dc.trans.BalancingTransformer(dataset=train)train = transformer.transform(train)# Option 2: Use balanced metricsmetric = dc.metrics.Metric(dc.metrics.balanced_accuracy_score)
Pattern 5: Avoid Memory Issues
# Use DiskDataset for large datasetsdataset = dc.data.DiskDataset.from_numpy(X, y, w, ids)# Use smaller batch sizesmodel = dc.models.GCNModel(batch_size=32) # Instead of 128
Common Pitfalls
Issue 1: Data Leakage in Drug Discovery
Problem: Using random splitting allows similar molecules in train/test sets. Solution: Always use ScaffoldSplitter for molecular datasets.
Issue 2: GNN Underperforming vs Fingerprints
Problem: Graph neural networks perform worse than simple fingerprints. Solutions:
- Ensure dataset is large enough (>10K samples typically)
- Increase training epochs (50-100)
- Try different architectures (AttentiveFP, DMPNN instead of GCN)
- Use pretrained models (GROVER)
Issue 3: Overfitting on Small Datasets
Problem: Model memorizes training data. Solutions:
- Use stronger regularization (increase dropout to 0.5)
- Use simpler models (Random Forest instead of deep learning)
- Apply transfer learning (ChemBERTa, GROVER)
- Collect more data
Issue 4: Import Errors
Problem: Module not found errors. Solution: Ensure DeepChem is installed with required dependencies:
uv pip install deepchem# For PyTorch modelsuv pip install deepchem[torch]# For all featuresuv pip install deepchem[all]
Reference Documentation
This skill includes comprehensive reference documentation:
references/api_reference.md
Complete API documentation including:
- All data loaders and their use cases
- Dataset classes and when to use each
- Complete featurizer catalog with selection guide
- Model catalog organized by category (50+ models)
- MoleculeNet dataset descriptions
- Metrics and evaluation functions
- Common code patterns
When to reference: Search this file when you need specific API details, parameter names, or want to explore available options.
references/workflows.md
Eight detailed end-to-end workflows:
- Molecular property prediction from SMILES
- Using MoleculeNet benchmarks
- Hyperparameter optimization
- Transfer learning with pretrained models
- Molecular generation with GANs
- Materials property prediction
- Protein sequence analysis
- Custom model integration
When to reference: Use these workflows as templates for implementing complete solutions.
Installation Notes
Basic installation:
uv pip install deepchem
For PyTorch models (GCN, GAT, etc.):
uv pip install deepchem[torch]
For all features:
uv pip install deepchem[all]
If import errors occur, the user may need specific dependencies. Check the DeepChem documentation for detailed installation instructions.
Additional Resources
- Official documentation: https://deepchem.readthedocs.io/
- GitHub repository: https://github.com/deepchem/deepchem
- Tutorials: https://deepchem.readthedocs.io/en/latest/get_started/tutorials.html
- Paper: "MoleculeNet: A Benchmark for Molecular Machine Learning"