Eu tenho um site no qual os usuários classificam coisas em um sistema de 1 a 5 estrelas. Quando um item chega ao topo dos gráficos, alguns usuários tendem a começar a classificá-lo com 1 estrela, mesmo que tenha uma maioria de 4-5 estrelas para chegar onde está. Não é galopante, eu diria que 10 a 20% dos novos votos são 1's. Claramente eles estão tentando manipular o sistema de classificação, e eu quero evitar isso.
A maneira atual de fazer isso é ter uma "janela razoável" do que considero um voto legítimo.
Para itens com menos de 10 votos; Atualmente, não faço nada e tomo a média como sua classificação.
Quando um item começa a receber mais de 10 votos, amarro-os a uma janela da média deles. Esta janela é definida como
Window = 4.5 - Log(TotalVotes, 10);
Portanto, um intervalo de votos razoável é então (Mean - Window) thru (Mean + Window)
Uma vez que o intervalo razoável de votos é encontrado, o "Rating" é apenas a média de todos os votos razoáveis (aqueles que se enquadram no intervalo razoável).
Isso significa que um item com uma média real de 4,2 com 100 votos teria uma janela 4.5-Log(100,10) = 2.5
; portanto, se esse item receber um voto de 1 estrela, ele será ignorado na classificação. No entanto, a estrela ainda afetará a média subjacente.
Isso funcionou bem em geral, mas a questão é quando um item Mean - Window
está à beira de 1,0, assim que cai abaixo de 1,0 a cada 1 estrela agora é incluída na classificação e a classificação cai significativamente até mesmo a diferença antes e depois de maio foram apenas mais uma classificação de 1 estrela.
Preciso de um sistema / forma de realizar melhor para filtrar essas classificações de 1 estrela, e não apenas elas, mas lidar com a situação em que alguém pode fazer com que seus amigos votem com um item em 10 votos e em todas as 5 estrelas, onde sua verdadeira classificação pode ser mais 3 estrelas.
Procurando recomendações de como lidar com sistemas de classificação orientados pelo usuário e normalizar votos fora de série.
fonte
Respostas:
Você deve procurar outros estimadores de localização.
O que você deseja é um estimador robusto , com um alto ponto de ruptura .
A abordagem extrema seria a mediana.
Mas você pode obter resultados mais numericamente interessantes com uma média aparada .
Você define um limite, digamos 2%. Em seguida, você remove os 2% de votos superiores e os 2% de votos inferiores e calcula a média apenas das entradas restantes. Um aplicativo com 98% de 5 estrelas ainda receberá 5,0
Mas, para impedir a manipulação, eu examinaria outros sinais. Como votos agrupados de uma única região, por exemplo.
fonte
Eu gosto da resposta da @ Anony-Mousse. Usar estimadores robustos é bom.
Quero adicionar uma direção diferente para lidar com o problema. Parece que existem alguns usuários "maliciosos" que votam negativamente para que você possa identificá-los.
Crie um conjunto de dados dos usuários e use " voto negativo injustificado no item principal" como etiqueta. Você pode usar "voto rejeitado no item principal" como valor padrão e modificá-lo manualmente e tornar a regra mais delicada, como "voto rejeitado mais do que duas vezes no item principal depois que o item atingir os gráficos mais altos". Acho que recursos como número de votos baixos, número de votos baixos para itens principais etc. será útil.
Agora você está em uma estrutura de aprendizado supervisionado. Depois de identificar usuários mal-intencionados, ignore seus votos e evite as manipulações.
fonte
Para fortalecer seu estimador, você pode modelar suas classificações como um modelo de mistura gaussiana (GMM) que é uma mistura de dois rvs gaussianos: 1) classificações verdadeiras, 2) classificação indesejável que são iguais a um. O Scikit-learn já possui um classificador GMM enlatado: http://scikit-learn.org/stable/auto_examples/mixture/plot_gmm_classifier.html#example-mixture-plot-gmm-classifier-py
Indo um pouco mais, uma abordagem simples seria permitir que o scikit-learn divida suas classificações em dois gaussianos. Se uma das partições tiver uma média próxima de uma, poderemos eliminar essas classificações. Ou, de maneira mais elegante, podemos considerar a média do outro gaussiano não próximo de um como a média verdadeira da classificação.
Aqui está um pouco de código para um notebook ipython que faz isso:
A saída para uma execução é semelhante a:
Podemos simular como isso funcionará com alguns testes de monte carlo:
A saída é colada abaixo. O vermelho é a classificação média e o azul é a classificação proposta. Você pode ajustar os parâmetros para obter comportamentos ligeiramente diferentes.
fonte
Gravar todos os votos
Proporção de 1 votos na primeira página em comparação a não
Aplique apenas uma fração do número 1 de votos enquanto estiver na primeira página
Remova basicamente o viés da página 1 com base no viés da página 1 como um todo
1 voto aplicado = item de 1 voto na primeira página * (1 voto no total da segunda página / 1 voto no total da primeira página)
fonte
Embora seja tecnicamente provavelmente mais fácil implementar uma das soluções acima, acho que você também deve desincentivar os eleitores a votar. Por exemplo, se os votos negativos vierem de uma minoria de usuários que abusam claramente do sistema, os votos repetidos devem contar (negativamente) para sua reputação - como este site.
fonte