Eu tenho um banco de dados do meu aplicativo do Facebook e estou tentando usar o aprendizado de máquina para estimar a idade dos usuários com base nos sites que eles gostam no Facebook.
Existem três características cruciais do meu banco de dados:
a distribuição etária no meu conjunto de treinamento (12k de usuários no total) é inclinada para usuários mais jovens (ou seja, eu tenho 1157 usuários com 27 anos e 23 usuários com 65 anos);
muitos sites não têm mais que 5 pessoas (filtramos os sites do FB com menos de 5 pessoas).
há muito mais recursos do que amostras.
Então, minhas perguntas são: que estratégia você sugeriria para preparar os dados para uma análise mais aprofundada? Devo executar algum tipo de redução de dimensionalidade? Qual método de ML seria mais apropriado usar neste caso?
Eu uso principalmente o Python, portanto, dicas específicas do Python serão muito apreciadas.
fonte
Respostas:
Uma coisa para começar seria o k-NN. A idéia aqui é que você tenha uma matriz de usuário / item e, para alguns usuários, tenha uma idade relatada. A idade de uma pessoa na matriz de itens do usuário pode ser bem determinada por algo como a idade média ou mediana de alguns vizinhos mais próximos no espaço de itens.
Para que você exprima cada usuário como um vetor no espaço de itens, encontre os k vizinhos mais próximos e atribua ao vetor em questão uma estatística resumida das idades dos vizinhos mais próximos. Você pode escolher k em um corte de distância ou mais realisticamente, atribuindo idades a um trem de maneira iterativa e escolhendo k que minimiza o erro nessa atribuição.
Se a dimensionalidade for um problema, você poderá executar facilmente a redução nessa configuração decompondo um valor único, escolhendo os m vetores que capturam a maior variação no grupo.
Em todos os casos, já que cada recurso é binário, parece que a semelhança de cosseno seria sua métrica de distância.
Preciso pensar um pouco mais sobre outras abordagens (regressão, rf, etc ...), considerando o foco restrito do seu espaço de recurso (todas as variantes da mesma ação, gostando). Acho que a abordagem de usuário / item pode ser a melhor.
Uma nota de cautela, se as idades que você tiver para treinar forem relatadas, talvez seja necessário corrigir algumas delas. As pessoas no facebook tendem a relatar idades na década em que nasceram. Faça um histograma das datas de nascimento (derivadas das idades) e veja se você tem picos em décadas como 70, 80, 90.
fonte
sklearn.neighbors.KNeighborsRegressor
com métrica de cosseno no espaço reduzido de SVD (após aplicar SVD, o erro médio de estimativa caiu de ~ 6 anos para ~ 4). Os usuários do meu banco de dados têm entre 18 e 65 anos de idade (os usuários mais antigos foram filtrados), portanto há 48 classes possíveis. Gostaria de saber se não há muitas classes para o kNN e se devo tratá-lo como regressão ou um problema de classificação (acho que ambas são aplicáveis).Recentemente, eu fiz um projeto semelhante em Python (prevendo opiniões usando dados semelhantes ao FB) e tive bons resultados com o seguinte processo básico:
No seu caso, você precisaria trocar o classificador por um regressor (consulte aqui: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ), caso contrário, o mesmo processo deve funcionar sem muitos problemas.
Além disso, você deve estar ciente do recurso mais surpreendente de florestas aleatórias em Python: paralelização instantânea! Aqueles de nós que começaram a fazer isso no R e depois se mudaram sempre ficam impressionados, especialmente quando você começa a trabalhar em uma máquina com algumas dezenas de núcleos (veja aqui: http://blog.yhathq.com/posts/comparing- florestas-aleatórias-em-python-e-r.html ).
Por fim, observe que esse seria um aplicativo perfeito para análise de rede se você tiver os dados dos amigos e dos próprios indivíduos. Se você puder analisar a idade dos amigos de um usuário, a idade do usuário quase certamente estará dentro de um ano ou dois da mediana entre seus amigos, principalmente se os usuários forem jovens o suficiente para criar suas redes de amigos enquanto ainda estão na rede. escola (já que a maioria será de colegas de classe). Essa previsão provavelmente superaria qualquer uma que você obtivesse com a modelagem - este é um exemplo de problema em que os dados certos> sempre são o modelo certo.
Boa sorte!
fonte
Outra sugestão é testar a regressão logística . Como um bônus adicional, os pesos (coeficientes) do modelo fornecerão uma idéia de quais sites são discriminatórios por idade.
O Sklearn oferece o pacote sklearn.linear_model.LogisticRegression , projetado para lidar com dados esparsos também.
Conforme mencionado nos comentários, no presente caso, com mais variáveis de entrada que amostras, você precisa regularizar o modelo (com sklearn.linear_model.LogisticRegression use o
penalty='l1'
argumento).fonte
Algumas pesquisas de D. Nguyen et al. tente prever a idade do usuário do twitter com base em seus tweets. Talvez você os ache úteis. Eles usam regressão logística e linear.
fonte
Além dos métodos mais sofisticados, você pode experimentar a fórmula de Bayes
P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / soma_i (P (p1 ... pn | i) P (i))
P (I | p1 ... pn) é a probabilidade de um usuário pertencer à faixa etária I se ele gostou de p1, .., pn
P (i) é a probabilidade de um usuário pertencer à faixa etária i
P (p1 .. pn | i) é a probabilidade de um usuário gostar de p1, .., pn se pertencer à faixa etária i.
Para estimar P (p1 ... pn | i), para cada faixa etária, estimo a probabilidade (frequência) p_ij para gostar de uma página j. Para ter p_ij diferente de zero para todos os j, você pode misturar a frequência para toda a população com um pequeno peso.
Em seguida, registre P (p1 ... pn | i) = soma (log p_ij, i = p1, .., pn), a soma de todas as páginas de que um novo usuário gosta. Essa fórmula seria aproximadamente verdadeira, supondo que um usuário goste das páginas de sua faixa etária de forma independente.
Se você ou alguém já tentou isso, comente o resultado.
fonte
Este é um problema muito interessante.
Enfrentei um semelhante analisando as imagens que os usuários carregam na rede social. Eu fiz a seguinte abordagem:
Essa abordagem é um aprendizado semi-supervisionado e eu a recomendo caso você tenha apenas alguns dados rotulados.
Por favor, observe que em uma rede social, as pessoas geralmente mentem sobre a idade (apenas por diversão, ou às vezes porque querem se camuflar na rede social).
fonte