Receita real para resolver o problema apresentado (uma solução possível)
É simples resolver esse problema usando minha ferramenta favorita de aprendizado de máquina, o vowpal wabbit, que suporta recursos quadráticos (cruzados) por meio da opção -q .
fundo de wabbit vowpal
Antes de entrarmos nos detalhes de uso. O vowpal wabbit é um software de aprendizado de máquina on-line rápido e escalável para classificação e regressão. Recebo taxas de aprendizado (treinamento) de cerca de 5 milhões de recursos por segundo na minha área de trabalho, sem limite de tamanho de dados (número de exemplos), pois como ferramenta de aprendizado on-line, não é necessário carregar os dados completos na memória. Ele tem muitos outros recursos atraentes: suporte a diferentes algoritmos de aprendizado, múltiplas funções de perda, recursos esparsos, tipos de recursos mistos e muito mais, que estão além do escopo desta pergunta.
Aqui estão as 3 etapas para resolver o problema com comentários:
Etapa 0: Faça o download e crie o vowpal wabbit no github (veja a nota na parte inferior dos ambientes suportados)
Etapa 1: prepare um conjunto de treinamento em que cada linha se pareça com isto:
1.0 protein1/protein2|A p1_feature1 p1_feature2 ... |B p2_feature1 ...
...
explicação do formato do conjunto de treinamento:
O número mais à esquerda, 1.0 , é o rótulo (força da interação, que pode ser qualquer valor numérico), a segunda sequência ' protein1 / protein2 ' é uma tag para dar identidade à linha, IOW: "essa linha representa a interação entre a proteína1 e protein2 "; É opcional e você pode pensar nisso como um comentário. Essa string de tag também é ecoada nas previsões de modelos para identificar qual previsão pertence a qual exemplo, mas não estamos prevendo aqui, estamos apenas modelando e estudando nosso modelo. Em seguida, vem o espaço de nome do recurso de entrada para protein1 |A
(precisamos definir um espaço de nome para que possamos cruzar entre diferentes espaços de nome, ele não precisa serA
, pode ser qualquer palavra de fato, mas a primeira letra deve diferir entre os espaços de nome para que possamos cruzá-los na chamada de comando) seguida pela lista de recursos de entrada para protein1 p1_...
. Por último, vem o espaço de nomes para protein2: |B
seguido pelos nomes dos recursos de protein2 p2_...
.
Uma das belezas do vowpal wabbit é que você pode usar seqüências arbitrárias para nomes de recursos (ele os mistura internamente, mas você não se importa). Os únicos caracteres especiais no conjunto de treinamento são:
- espaços (obviamente)
|
, para prefixar recursos de entrada e espaços de nome e
:
separar nomes de recursos de seus valores
O :
não é usado aqui, porque assumimos que todo nome de recurso de proteína representa um booleano (existência), portanto seus valores são padronizados 1
e eles não precisam de valores explícitos.
Agora você pode executar vowpal_wabbit (o nome do executável é vw
) com -q AB
para criar automaticamente recursos cruzados (termos de interação) entre todos os pares possíveis de recursos em que um recurso é selecionado a partir de protein1 ( namespace começando com A
) e outro a partir de protein2 ( espaço de nome começando com B
). O vowpal_wabbit lerá os dados, aprenderá e criará um modelo com pesos para cada combinação de recursos que resulta em alguma interação entre o par de proteínas. Aqui, em vez de executar vw
diretamente, executamos o vw-varinfo
utilitário wrapper, que vem com o vowpal wabbit, como nosso último passo. vw-varinfo
é executado vw
para criar o modelo e despeja o modelo na forma legível por humanos.
Etapa 3: chame vw-varinfo assim:
vw-varinfo -q AB -c --passes 20 your_data_set_file
vw-varinfo passará todas as opções ( -q ... -c --passes ...
) como estão vw
. Somente o -q AB
cruzamento dos dois espaços de nome dos recursos é essencial. Eu adicionei mais uma opção acima (execute várias passagens), que acredito que daria melhores resultados.
Este comando chamará vowpal wabbit ( vw
) para treinar no conjunto de dados e imprimirá a saída que acredito estar procurando: todas as interações de recursos em ordem de força e seus pesos relativos.
Exemplo de entrada e saída
Suponha que sua entrada prot.dat
inclua uma interação de três vias entre três proteínas:
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
Este é deliberadamente um exemplo muito minimalista. vw
não deveria ter nenhum problema com conjuntos de dados muito maiores (por exemplo, milhões de linhas, centenas de recursos); também variei os rótulos de força da interação nos exemplos. Se, no seu caso, a interação for um "sim" ou "não" booleano, basta usar 0
(sem interação) ou 1
(existe interação) como o primeiro campo em cada linha.
Corrida:
vw-varinfo -q AB -c --passes 20 prot.dat
Produziria todas as interações possíveis (ignore os espaços de nomes A
e B
na saída) e seus pesos:
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%
Mostrando que nesses dados os contribuintes mais fortes para qualquer interação em geral são 1) a mera presença do k
recurso, 2) o k
recurso interagindo consigo mesmo (supondo que ambas as proteínas o tenham) e 3) k
interagindo m
. enquanto os mais fracos (contribuição negativa para a interação de proteínas) são o b
recurso emparelhado com o m
recurso.
Aqui está uma página HOWTO em vw-varinfo
O vowpal wabbit constrói a partir da fonte (veja o link acima) e roda no Linux (e possivelmente outros unixes), Mac OS-X e Windows.
HTH