where n noise was the number of points classified as noise and ICD was the average intracluster distance between clustered points for each HDBSCAN run. We performed a grid search over HDBSCAN hyperparameters and calculated the value of the objective function for each set of clusters. We selected the hyperparameters corresponding to the global minimum of the objective function to use for clustering (Figure ). More information on the design of the objective function can be found in the Supporting Information (see Section S1.1 and Figure ). Following cluster assignment, we predicted the cluster assignment for new building blocks by projecting points onto existing UMAP embeddings and applying the function hdbscan.prediction.approximate_predict. We elected to use UMAP because it was reported to have better performance and reproducibility than other commonly used methods and was demonstrated to improve the results from clustering algorithms. Associated code for these steps can be found at 4.6. Model Construction and Evaluation. We used Scikit-Learn (v.0.23.2) to build a decision tree model and assess the quality of model predictions. To reduce the chance of overfitting to the training data, we performed 5-fold cross validation to determine the maximum depth of the decision tree (Figure ). For our evaluation criteria, we elected to use precision and recall because of the imbalance of class labels in our dataset. Recall evaluates the fraction of hits that are correctly identified by a classifier and precision evaluates the fraction of true hits from all compounds classified as hits. For a given imperfect classifier, tuning to yield an increase in precision (better prediction of active trisynthons) results in a decrease in recall (fewer active trisynthons identified) and vice versa. The quality of a classifier can be described by the extent of this trade-off, which is quantified by the area under the curve (AUC) of the precision-recall curve (PRC). Associated code for these steps can be found at .