How to specify an analysis with YAML¶
Analyses in immuneML are specified through a YAML specification file with a fixed structure. Depending on the specification, immuneML can execute different tasks, such as training ML models for receptor or repertoire classification, simulate data or perform exploratory analyses. For all the options that can be specified, see YAML specification.
Structure of the analysis specification¶
The analysis specification consists of three main parts: definitions
, instructions
and output
.
Specifying Definitions¶
definitions
refer to components, which will be used within the instructions. They include:
datasets
: specifying where data is located, what format the data is in, and how it should be imported (see How to import data into immuneML for more details),preprocessing_sequences
: defining one or more preprocessing steps to be taken on the dataset (this is optional),encodings
: different data representations,ml_methods
: different machine learning methods (e.g., SVM or KNN),reports
: specific plots or statistics to apply to the raw or encoded data, ML methods or results.
Simulation-specific components (only relevant when running a Simulation instruction) are:
motifs
: parts of the simulation definition defined by a seed and a way to create specific motif instances from the seed,signals
: parts of the simulation which can include multiple motifs and correspond to a single label for subsequent classification tasks,simulations
: define how to combine different signals and how to implant them in the dataset.
Under definitions, each analysis sub-component is defined using a user-specifiable key. In the examples below, we will use the prefix ‘my_’ to identify these keys, but in practice it is possible to specify any kind of name here. These keys are unique names that identify the settings for a component, and they are later on referenced in the instructions (for example: to specify which of the imported datasets to use in a given instruction).
The import of two datasets may be defined as follows:
definitions:
datasets:
my_repertoire_dataset: # user-defined key for the first dataset
format: AIRR # import of a repertoire dataset
params:
path: path/to/first/data/
metadata_file: path/to/first/metadata.csv
my_receptor_dataset: # user-defined key for the second dataset
format: AIRR # import of a receptor dataset
params:
path: path/to/second/data/
is_repertoire: false
paired: true
receptor_chains: TRA_TRB
metadata_column_mapping: # map column names of the file to label names
epitope_column_name: my_epitope # my_epitope can be used as label
Where the imported datasets can under instructions
be referenced using the keys my_repertoire_dataset
and my_receptor_dataset
.
Note that in practice, most analyses use just one dataset.
An example of a full definitions
section which may be used for a machine learning task is given below.
See also How to train and assess a receptor or repertoire-level ML classifier for more details.
definitions:
datasets: # every instruction uses a dataset
my_dataset:
format: AIRR
params:
path: path/to/data/
metadata_file: path/to/metadata.csv
preprocessing_sequences:
my_preprocessing:
- my_beta_chain_filter:
ChainRepertoireFilter:
keep_chain: TRB
ml_methods:
my_log_reg: LogisticRegression
my_svm: SVM
encodings:
my_kmer_freq_encoding_1: KmerFrequency # KmerFrequency with default parameters
my_kmer_freq_encoding_2: # KmerFrequency with user-defined parameters
KmerFrequency:
k: 5
reports:
my_seq_length_distribution: SequenceLengthDistribution
The definitions
section used for Simulation contains different components, as shown in the example below.
See also How to simulate antigen or disease-associated signals in AIRR datasets for more details.
definitions:
datasets: # every instruction uses a dataset
my_dataset:
format: AIRR
params:
path: path/to/data/
metadata_file: path/to/metadata.csv
motifs:
my_simple_motif:
seed: AAA
instantiation: GappedKmer
signals:
my_simple_signal:
motifs:
- my_simple_motif
implanting: HealthySequence
simulations:
my_simulation:
my_implanting:
signals:
- my_simple_signal
dataset_implanting_rate: 0.5
repertoire_implanting_rate: 0.1
A diagram of all the different dataset types, preprocessing steps, encodings, ML methods and reports, and how they can be combined in different analyses is shown below. The solid lines represent components that are intended to be used together, and the dashed lines indicate optional combinations.
Specifying Instructions¶
Similarly to analysis components, instructions
are defined under a user-specifiable key.
Under this key, you should define the instruction type
, which defines the type
of analysis that will be done. All other settings are instruction-specific.
Some of the possible instruction types are (see Instructions for the complete list):
The components defined under definitions can be referenced inside the instruction, but anything generated from the instructions is not available to other instructions. If the output of one instruction needs to be used in another other instruction, two separate immuneML runs need to be made (e.g, running immuneML once with the Simulation instruction to generate a dataset, and subsequently using that dataset as an input to a second immuneML run to train a ML model).
An example of the YAML specification for the TrainMLModel instruction is shown below. See the tutorial How to train and assess a receptor or repertoire-level ML classifier for more explanation behind all settings.
instructions:
my_instruction: # user-defined instruction key
type: TrainMLModel
dataset: my_dataset # reference dataset from definitions
labels: [disease]
settings: # settings are made up of preprocessing (optional), ml_method and encoding
- encoding: my_kmer_freq_encoding_1
ml_method: my_log_reg
- preprocessing: my_preprocessing
encoding: my_kmer_freq_encoding_2
ml_method: my_svm
assessment:
split_strategy: random
split_count: 1
training_percentage: 70
reports:
data_splits: [my_seq_length_distribution]
selection:
split_strategy: k_fold
split_count: 5
strategy: GridSearch
metrics: [accuracy]
optimization_metric: accuracy
reports: null # no reports
refit_optimal_model: False
number_of_processes: 4
Specifying output¶
The third and final section of the YAML specification is output
, which currently only supports one format
: HTML
.
The output
section may be omitted from the YAML, but if included, it should look like this:
output:
format: HTML
Putting all parts together¶
An example of a complete YAML specification for training an ML model through nested cross-validation is given here:
definitions:
datasets:
d1:
format: AIRR
params:
metadata_file: path/to/metadata.csv
path: path/to/data/
preprocessing_sequences:
my_preprocessing:
- my_beta_chain_filter:
ChainRepertoireFilter:
keep_chain: TRB
ml_methods:
my_log_reg: LogisticRegression
my_svm: SVM
encodings:
my_kmer_freq_encoding_1: KmerFrequency # KmerFrequency with default parameters
my_kmer_freq_encoding_2: # KmerFrequency with user-defined parameters
KmerFrequency:
k: 5
reports:
my_seq_length_distribution: SequenceLengthDistribution
instructions:
my_instruction: # user-defined instruction key
type: TrainMLModel
dataset: my_dataset # reference dataset from definitions
labels: [disease]
settings: # settings are made up of preprocessing (optional), ml_method and encoding
- encoding: my_kmer_freq_encoding_1
ml_method: my_log_reg
- preprocessing: my_preprocessing
encoding: my_kmer_freq_encoding_2
ml_method: my_svm
assessment:
split_strategy: random
split_count: 1
training_percentage: 70
reports:
data_splits: [my_seq_length_distribution]
selection:
split_strategy: k_fold
split_count: 5
strategy: GridSearch
metrics: [accuracy]
optimization_metric: accuracy
reports: null # no reports
refit_optimal_model: False
number_of_processes: 4
output:
format: HTML
Running the specified analysis¶
To run an instruction via command line with the given YAML specification file:
immune-ml path/to/specification.yaml result/folder/path/
Alternatively, create an ImmuneMLApp object in a Python script and pass it the path parameter to the constructor before calling its run()
method as follows:
from source.app.ImmuneMLApp import ImmuneMLApp
app = ImmuneMLApp(specification_path="path/to/specification.yaml", result_path="result/folder/path/")
app.run()