Trouver les meilleures fonctionnalités dans les modèles d'interaction

13

J'ai une liste de protéines avec leurs valeurs caractéristiques. Un exemple de tableau ressemble à ceci:

...............Feature1...Feature2...Feature3...Feature4  
Protein1  
Protein2  
Protein3  
Protein4  

Les lignes sont des protéines et les colonnes sont des caractéristiques.

J'ai également une liste de protéines qui interagissent également; par exemple

Protein3, Protein4  
Protein1, Protein2  
Protein4, Protein1  

Problème : Pour une analyse préliminaire, je veux savoir quelles caractéristiques contribuent le plus aux interactions protéiques.

Ma compréhension est que normalement les arbres de décision pourraient être utilisés pour obtenir la caractéristique la plus importante basée sur l'entropie, mais je ne sais pas comment l'étendre aux paires de protéines (c'est-à-dire les interactions). Existe-t-il une méthode à cette fin?

Anish
la source
Dites-moi si je vous comprends bien: vous avez une force d'interaction pour n'importe quelle paire de protéines (qui est par exemple nulle si les protéines n'interagissent pas), puis vous voulez avoir un vecteur de caractéristiques dont la valeur sera fortement corrélée avec la force d'interaction? Ou, en d'autres termes, qui vous permettra de prédire la force d'interaction entre les protéines?
dsign

Réponses:

25

Recette réelle pour résoudre le problème présenté (une solution possible)

Il est simple de résoudre ce problème en utilisant mon outil d'apprentissage machine préféré, vowpal wabbit qui prend en charge les fonctionnalités quadratiques (croisées) via son option -q .

fond de wabbit vowpal

Avant de passer aux détails d'utilisation. vowpal wabbit est un logiciel d'apprentissage automatique en ligne rapide et évolutif pour la classification et la régression. J'obtiens des taux d'apprentissage (formation) d'environ 5 millions de fonctionnalités par seconde sur mon bureau, sans limite de taille des données (nombre d'exemples), car en tant qu'outil d'apprentissage en ligne, il ne nécessite pas de charger toutes les données en mémoire. Il possède de nombreuses autres fonctionnalités attrayantes: la prise en charge de différents algorithmes d'apprentissage, des fonctions de perte multiple, des fonctionnalités clairsemées, des types de fonctionnalités mixtes, etc., qui dépassent le cadre de cette question.

Voici les 3 étapes pour résoudre le problème avec un commentaire:

Étape 0: Téléchargez et construisez vowpal wabbit à partir de github (voir la note en bas sur les environnements pris en charge)

Étape 1: Préparez un ensemble de formation où chaque ligne ressemble à ceci:

1.0 protein1/protein2|A p1_feature1 p1_feature2 ... |B p2_feature1 ...
...

explication du format de l'ensemble de formation:

Le nombre le plus à gauche, 1.0 , est le libellé (force d'interaction, qui peut être n'importe quelle valeur numérique), la deuxième chaîne " protéine1 / protéine2 " est une étiquette pour donner une identité à la ligne, IOW: "cette ligne représente l'interaction entre protéine1 et protéine2 "; Il est facultatif et vous pouvez le considérer comme un commentaire. Cette chaîne de balises est également répercutée dans les prédictions des modèles pour identifier quelle prédiction appartient à quel exemple, mais nous ne prédisons pas ici, nous modélisons et étudions simplement notre modèle. Vient ensuite l'espace de nom de la fonction d'entrée pour protein1 |A(nous devons définir un espace de nom afin que nous puissions traverser différents espaces de nom, il n'a pas besoin d'êtreA, peut être n'importe quel mot en fait, mais la première lettre doit différer entre les espaces de noms afin que nous puissions les croiser dans l'appel de commande) suivie de la liste des fonctionnalités d'entrée pour protein1 p1_.... Vient ensuite l'espace de noms pour protein2: |Bsuivi des noms de fonctionnalité de protein2 p2_....

L'une des beautés de vowpal wabbit est que vous pouvez utiliser des chaînes arbitraires pour les noms de fonctionnalités (cela les hachera en interne, mais cela ne vous dérange pas). Les seuls caractères spéciaux de l'ensemble de formation sont:

  • espaces (évidemment)
  • |, pour préfixer les entités en entrée et les espaces de nom, et
  • : pour séparer les noms de fonction de leurs valeurs

Le :n'est pas utilisé ici, car nous supposons que chaque nom de caractéristique de protéine représente un booléen (existence), donc leurs valeurs par défaut 1et ils n'ont pas besoin de valeurs explicites.

Vous pouvez maintenant exécuter vowpal_wabbit (le nom de l'exécutable est vw) avec -q ABpour créer automatiquement des fonctionnalités croisées (alias termes d'interaction) entre toutes les paires possibles de fonctionnalités où une fonctionnalité est sélectionnée dans protein1 (espace de noms commençant par A) et l'autre dans protein2 ( espace de noms commençant par B). vowpal_wabbit lira les données, apprendra et créera un modèle avec des poids pour chaque combinaison de caractéristiques qui entraîne une certaine interaction entre la paire de protéines. Ici, au lieu de s'exécuter vwdirectement, nous l'exécuterons via l' vw-varinfoutilitaire wrapper, qui est fourni avec vowpal wabbit, comme dernière étape. vw-varinfos'exécute vwpour créer le modèle et vide le modèle sous une forme lisible par l'homme.

Étape 3: appelez vw-varinfo comme ceci:

vw-varinfo -q AB -c --passes 20 your_data_set_file

vw-varinfo passera toutes les options ( -q ... -c --passes ...) telles quelles à vw. Seul le -q ABpour traverser les deux espaces-noms est essentiel. J'ai ajouté une option de plus ci-dessus (exécuter plusieurs passes), ce qui, je pense, donnerait de meilleurs résultats.

Cette commande appellera vowpal wabbit ( vw) pour s'entraîner sur l'ensemble de données et affichera la sortie que je crois que vous recherchez: toutes les interactions des fonctionnalités par ordre de force et leurs poids relatifs.

Exemple d'entrée et de sortie

Supposons que votre entrée,, prot.datinclut une interaction à 3 voies entre 3 protéines:

1.0 protein1/protein2|A a b |B k m
0.6 protein2/protein3|A k m |B b c d
2.2 protein1/protein3|A a b |B b c d

Il s'agit délibérément d'un exemple très minimaliste. vwne devrait pas avoir de problème avec des ensembles de données beaucoup plus volumineux (par exemple, des millions de lignes, des centaines de fonctionnalités), aussi, j'ai varié les étiquettes de force d'interaction dans les exemples. Si dans votre cas, l'interaction est un "oui" ou "non" booléen, utilisez simplement 0(aucune interaction) ou 1(il existe une interaction) comme 1er champ de chaque ligne.

Fonctionnement:

vw-varinfo -q AB -c --passes 20 prot.dat

Donnerait toutes les interactions possibles (ignorer les espaces de noms Aet Bdans la sortie) et leurs poids:

FeatureName        HashVal   MinVal   MaxVal    Weight   RelScore
A^k                 220268     0.00     1.00   +0.3804    100.00%
A^k^B^k             254241     0.00     0.00   +0.3804    100.00%
A^k^B^m              93047     0.00     0.00   +0.3804    100.00%
B^k                 178789     0.00     1.00   +0.1011     26.58%
B^m                  17595     0.00     1.00   +0.1011     26.58%
[... trimmed for brevity ...]
A^m^B^m             141879     0.00     0.00   +0.0000      0.00%
Constant            116060     0.00     0.00   +0.1515      0.00%
A^b                 139167     0.00     1.00   -0.0641    -16.86%
A^b^B^k             204424     0.00     0.00   -0.1233    -32.43%
A^b^B^m              43230     0.00     0.00   -0.1233    -32.43%

Montrant que dans ces données, les contributeurs les plus importants à toutes les interactions en général sont 1) la simple présence de la kcaractéristique, 2) la kcaractéristique interagissant avec elle-même (en supposant que les deux protéines l'ont) et 3) kinteragissant avec m. tandis que les plus faibles (contribution négative à l'interaction des protéines) sont la bcaractéristique associée à la mcaractéristique.

Voici une page HOWTO sur vw-varinfo

vowpal wabbit se construit à partir de la source (voir lien ci-dessus) et fonctionne sous Linux (et éventuellement d'autres unix), Mac OS-X et Windows.

HTH

arielf
la source
Cela impliquerait-il directement que la suppression des interactions faibles améliorerait la précision du modèle?
mat
Pas nécessairement. La précision augmente souvent lorsqu'il y a plus de fonctionnalités à apprendre. Cependant, si les fonctionnalités sont dans la pratique du bruit, ou trop rares pour être généralisées, elles le pourraient. La plupart des modèles réels ont une composante d'erreur. Plus de données peuvent conduire à une plus grande confiance dans la précision du modèle.
arielf
1

Les réseaux d'interaction des protéines peuvent être représentés par des graphiques non orientés, les protéines formant les nœuds et leurs interactions les bords. Si l'interaction des protéines est un phénomène binaire, les bords sont également binaires (zéro ou un), sinon vous pouvez utiliser un nombre réel. Vous pouvez représenter numériquement ce graphique comme une matrice carrée, et symétrique en particulier. Pour trouver les fonctionnalités les plus importantes, vous pouvez conserver celles qui ont la plus grande projection le long des vecteurs propres de la matrice d'interaction.

Emre
la source
Le graphique peut ne pas être binaire .. car une protéine peut interagir avec plus d'une protéine. Existe-t-il une extension pour plusieurs arêtes?
Anish
Ce n'est pas ce que je voulais dire par binaire. La question est de savoir si vous souhaitez capturer l' intensité de l'interaction ou s'il suffit de modéliser sa présence. Bien sûr, le modèle graphique peut rendre compte de l'interaction entre n'importe quelle paire de protéines.
Emre
Hmm .. Je suppose que lorsque vous me demandez de créer une matrice carrée pour les interactions protéiques, les valeurs dans la matrice représentent le nombre d'interactions entre les protéines. Mais, je ne vois pas où nous utilisons les fonctionnalités ici. Pourriez-vous préciser ceci?
Anish
Les vecteurs propres sont une combinaison linéaire des protéines dans l'espace caractéristique.
Emre