Xiaobai também pode entender: uma introdução à sociedade da literatura recomendado surpresa biblioteca de algoritmos

Source |  Machine Learning e sistema de recomendação

Todo algoritmo suportado pela surpresa não é complicado à sua maneira, e o código não é obscuro.O nosso principal objetivo é entender sua arquitetura e aprender a interação de várias partes da estrutura.

Este artigo quer apresentar as idéias originais do autor de uma perspectiva holística, observar e pensar em como fazer o modelo funcionar passo a passo.

Vamos rodar um modelo primeiro

Vamos primeiro olhar para um código geral, algumas linhas simples de código, para iniciar nossa jornada de surpresa.

Reescrevi as partes que precisam ser importadas aqui, mas você pode experimentá-lo em seu próprio código local e usar a biblioteca surpresa para executar um algoritmo KNN simples, que é essencialmente um algoritmo de filtragem colaborativo baseado em vizinhanças. . De acordo com a parte da linha vermelha que eu marquei no código, forneça os quatro módulos de importação correspondentes e adicione o caminho da surpris.Em frente a ele para importar da surpresa.

Ele precisa ser mencionado aqui.Eu usei o conjunto de dados que baixei no site oficial da movielens. Você pode baixá-lo diretamente ou pode encontrar um tutorial on-line.O Surprise suporta o download automático do conjunto de dados dos movielens.

A seguir, analisamos apenas a função surprise_code (), que é tudo o que precisamos aprender.A partir deste exemplo, temos que nos aprofundar no processo de execução da surpresa.

def surprise_code():
    reader = Reader(line_format="user item rating", sep=',', skip_lines=1)
    data = Dataset.load_from_file('./ml-latest-small/ratings.csv', reader)

    algo = KNNBasic()
    perf = cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=2, verbose=0)
for keys in perf:
        print(keys, ": ", perf[keys])

A função principal surprise_code () pode ser dividida em duas partes: carregamento de dados, execução de algoritmos e resultados de testes.

O carregamento de dados é fornecido por duas classes, Reader e Dataset. A idéia específica é que Reader () forneça o formato para leitura de dados e, em seguida, o DataSet carregue os dados de acordo com as configurações do Reader.

Os resultados de execução e detecção de algoritmos , aqui são completados por um cross_validate (), importam o algoritmo a ser executado antecipadamente e instanciam e, em seguida, passam os dados, algoritmos e indicadores a serem detectados em cross_validate (), concluirão o treinamento do algoritmo Ajuste e, em seguida, preveja os resultados, verifique os resultados e, finalmente, retorne os resultados correspondentes ao índice de detecção de destino.

Assim, podemos ver que é muito fácil executar um modelo diretamente chamando a interface.Somente algumas linhas de código simples podem executar completamente um algoritmo. Mas se você quiser se aprofundar nos detalhes da execução do código, precisará suavizar o relacionamento e depois puxar o casulo um pouco.

Podemos dividir os resultados de execução e detecção do algoritmo acima em duas partes antecipadamente , ou seja, dividir todo o fluxo de trabalho em três partes: carregamento de dados, design do algoritmo e avaliação de resultados. É claro que esta etapa mais detalhada não é problema e é mais fácil entender logicamente.

Agora que suavizamos a execução do algoritmo, começamos a analisar o código-fonte a partir do carregamento do conjunto de dados.

Truque : Antes dos detalhes formais do código, compartilhe alguns métodos sobre o meu estudo do código fonte, que podem não ser adequados para todos ou para todo o código fonte, apenas para sua referência:

Primeiro , precisamos concluir uma demonstração muito simples como a nossa.Como título desta seção, primeiro executaremos um modelo. Pelo menos temos que usá-lo e usá-lo para que possamos analisá-lo.

Em segundo lugar, seguimos o fluxo do modelo e o dividimos em várias partes principais.De acordo com essa sequência lógica, a partir da parte inicial, tente concluir a função do módulo. Importe a parte que você escreveu, substitua a parte do código-fonte, veja se a demonstração anterior pode continuar em execução e verifique se os resultados são consistentes.

Por fim, não fique obcecado com detalhes ao analisar e conclua primeiro as principais funções do módulo. Se essa parte da função estiver relacionada a outros módulos, você poderá primeiro importar os módulos relevantes e usá-los diretamente. Não tente escrever um módulo perfeito em uma única etapa.

Esses três conteúdos mencionados, podemos entender melhor no próximo artigo.

A partir do carregamento de dados da primeira parte

Analisamos anteriormente a parte de carregamento de dados, fornecida pelas classes Reader e Dataset. A próxima coisa a fazer é percorrer essa parte do conteúdo e, em seguida, tentar escrever o módulo correspondente e substituí-lo para ver se o código antes de nós pode continuar funcionando normalmente.

Quando chegamos a essa etapa, o primeiro é abrir esses dois módulos, dar uma olhada no código e entender suas funções. Em [Segundo Artigo: Prática Recomendada (2): Carregamento e Corte de Conjuntos de Dados ], o conteúdo dessas duas partes é cuidadosamente analisado.Farei uma introdução geral aqui, sem entrar em detalhes do código. Também.

reader = Reader(line_format="user item rating", sep=',', skip_lines=1)

Para esta classe Reader (), a função principal é configurar um leitor. Também pode ser visto pelo uso do Reader que a entrada necessária é o formato de cada linha, o separador de cada linha e o número de linhas a serem ignoradas.

A partir da entrada dessa instância de classe, podemos julgar que o papel dessa classe Reader () é construir um leitor de objeto de leitor, que contém alguns atributos de como ler dados. Por exemplo, o leitor sabe que os dados de cada linha são distribuídos de acordo com a "classificação do item do usuário", sabe que cada linha de dados é separada pelo símbolo "," e sabe que os dados da primeira linha devem ser ignorados.

Portanto, depois que construímos esse leitor, podemos passá-lo para a classe Dataset () para nos ajudar a ler o conteúdo dos dados do conjunto de dados no formato que queremos.

data = Dataset.load_from_file('./ml-latest-small/ratings.csv', reader)

Como escolhemos usar o conjunto de dados que baixamos aqui, o método Dataset.load_from_file () é chamado. Como você pode ver, a entrada desse método possui dois parâmetros, o primeiro é o caminho do conjunto de dados e o segundo é o leitor leitor que foi instanciado.

Portanto, quando load_from_file () lê dados, ele lê no formato definido pelo leitor e, finalmente, retorna um formato de dados personalizado. De fato, se você olhar para o código, podemos ver que o formato de dados retornado aqui é: dataset.DatasetAutoFolds, mas como dissemos anteriormente, não se enquadram nos detalhes do código-fonte. Sabemos que o arquivo do conjunto de dados original foi processado nessas duas etapas, e o formato dos dados que pode ser processado posteriormente é obtido e está OK.

Validar resultados cruzados

Após carregar o conjunto de dados, optamos por usar cross_validate () para executar o algoritmo e fazer uma verificação cruzada. O conteúdo desta parte é apresentado em duas partes.

Primeiro, ignore a implementação do algoritmo e chame diretamente a interface do algoritmo. Esse também é um truque muito útil: ignore algumas implementações de código, quando apropriado, mesmo que você queira usá-lo a seguir, você pode ajustar diretamente a interface do código-fonte . Portanto, ignoramos a implementação do algoritmo KNN aqui e o chamamos diretamente para obter o ajuste do treinamento e a previsão subsequente no conjunto de testes.

Então, o que há dentro de cross_validate ()? Vamos dar uma olhada no conteúdo em validar:

Existem duas funções em validate, cross_validate () e fit_and_score (). Vamos apresentar brevemente suas funções, para que todos possam continuar lendo o artigo atual sem obstáculos.

algo = KNNBasic()
perf = cross_validate(algo, data, measures=['RMSE', 'MAE'], cv=2, verbose=0)

Você pode ver que cross_validate () é a interface externa que está sendo chamada.É fácil adivinhar que fit_and_score () é chamado em cross_validate ().

Para cross_validate (), suas entradas incluem objetos de algoritmo, conjuntos de dados, indicadores a serem medidos, o número de validação cruzada etc. Aqui está uma breve introdução à sua lógica interna. Ele divide os dados dos dados de entrada em partes cv e, em seguida, seleciona uma parte como o conjunto de teste e o restante como o conjunto de treinamento. Após dividir o conjunto de dados, chame fit_and_score () para executar o ajuste do algoritmo.

Preste atenção a um pequeno detalhe aqui.A divisão do conjunto de dados não é dividida estaticamente e, em seguida, o treinamento e a verificação são executados no conjunto de dados, mas um gerador é construído usando os dados de entrada e um conjunto de resultados divididos é gerado a cada vez.

Para a função fit_and_score (), ele ajusta o algoritmo de entrada no conjunto de treinamento de entrada, depois o verifica no conjunto de teste de entrada e calcula os indicadores necessários.

Ao prosseguir aqui, a etapa de medir os resultados da previsão também é ignorada e a precisão da surpresa é diretamente solicitada para processamento . Obviamente, adicionaremos esse conteúdo posteriormente, o foco aqui é como executar a validação cruzada.

O núcleo desta parte é como dividir o conjunto de dados e como treinar e verificar o algoritmo após a entrada de dados na Seção 2. Portanto, nosso foco está em como dividir o conjunto de dados ao executar a validação cruzada k-fold e em como chamar a interface para concluir o treinamento e o teste do algoritmo no conjunto de dados.

O significado deste parágrafo é dizer que, ao ler o código-fonte ou copiá-lo, você precisa entender suas idéias principais nesta etapa para proteger o conteúdo que não é importante temporariamente ou que não é crítico para a etapa atual . Mesmo que você chame cada interface para concluir a tarefa da sua etapa atual, desde que você compreenda a interação deles, o fluxo de processamento está OK.

Em seguida, adicione a parte do algoritmo ignorado

Abra a função fit_and_score () acima, podemos ver que existem apenas duas linhas de código para usar algo, uma é algo.fit (trainset) na fase de treinamento e uma é algo.test (testset) na fase de teste. O primeiro é ajustar o algoritmo no conjunto de treinamento, enquanto o último é testar o algoritmo no conjunto de teste.

Para o algoritmo de knn, a implementação do algoritmo é relativamente simples. Ele inclui principalmente um método fit () e um método de estimativa (). Aqui, principalmente, é necessário resolver o relacionamento de herança entre classes.

Surpreendentemente, todas as classes de algoritmos são herdadas de uma classe pai: algo_base (), essa classe abstrai alguns métodos fáceis de usar por algumas subclasses, algumas implementações específicas e outras apenas abstratas Uma interface, como o método fit (), é definida em algo_base () e sua subclasse knn ().

Aqui para ajudá-lo a resolver ainda mais o relacionamento entre as classes de algoritmos. Para algo_base (), é a superclasse de todos os algoritmos de surpresa. Tomando o algoritmo knn como exemplo, em vez de herdar diretamente algo_base () por knn (), existe uma classe SymmetricalAlgo () que herda algo_base () e, em seguida, a classe knn () correspondente herda a classe SymmetricalAlgo ().

A principal tarefa do SymmetricalAlgo () aqui é lidar com um problema que geralmente precisa ser considerado. Filtragem colaborativa com base em usuários ou itens. Existem dois métodos principais em SymmetricalAlgo (). Um é o método fit () mencionado anteriormente. O método fit () aqui ajusta principalmente n_x e n_y etc., e avalia se é baseado na semelhança do usuário ou na similaridade do item. E ajuste os indicadores de dados correspondentes.

O outro método é o método switch () . Como o nome indica, o método switch () também ajusta o índice correspondente. O ajuste é baseado na semelhança do usuário ou na similaridade do item. O resultado ajustado é usado para o teste.

Não começaremos a analisar outros algoritmos um por um.É melhor ensinar as pessoas a pescar do que ensinar as pessoas.Por meio da análise desse algoritmo, podemos entender como analisar a implementação específica do algoritmo, e podemos entender facilmente A composição funcional de outros algoritmos.

Após resolver o problema da parte do algoritmo, entendemos o relacionamento de herança das classes entre os algoritmos, bem como a interface fornecida pela classe pai e os métodos que podem ser usados. Em seguida, mesmo se escrevermos outros algoritmos, podemos seguir essa ideia e garantir que implementemos nosso próprio código de algoritmo com base nessas interfaces.

Medição do índice e formato do conjunto de dados

Conforme mencionado na terceira parte da seção anterior, o conteúdo de como calcular o indicador para o resultado da previsão pode ser temporariamente ignorado.Neste ponto, suplementaremos esta parte. A razão pela qual escolhi adicionar aqui, podemos ver que, nas etapas anteriores, uma demonstração basicamente completa foi construída. Apenas uma pequena quantidade de conteúdo chama o código-fonte, e o cálculo do índice do resultado da previsão é um deles.

A única coisa a ser observada na parte de medição do indicador é a forma de retorno do resultado da previsão, que é o resultado retornado pelo método test () nas previsões anteriores da Algo_base ():.

Depois, é necessário entender a definição de vários tipos de indicadores calculados: MSE, RMSE, MAE, FCP. As três primeiras categorias são indicadores relativamente comuns: o FCP fornece um documento como referência no código-fonte, a definição também é muito clara e podemos nos referir à definição no papel.

Depois que o método de cálculo específico é conhecido, a implementação do código é muito simples. Usar numpy pode calcular rapidamente o resultado desejado.

Neste ponto, toda a demonstração pode ser executada. No entanto, existe um buraco na frente que precisa ser preenchido, ou seja, o problema mencionado acima com o formato do conjunto de dados. Como mencionado anteriormente, dissemos que esses conteúdos podem ser ignorados no passado. No entanto, a definição de formato de dados surpresa ainda vale a pena aprender.

surpresa define uma classe Trainset (), usada para armazenar todo o conteúdo relacionado ao conjunto de dados. Por exemplo, o conteúdo relativamente simples, como o número de usuários, o número de itens, o número de classificações, etc., e a conversão do ID do usuário no conjunto de dados no ID interno do ID interno na estrutura de dados recém-definida e a obtenção de funções um pouco mais complexas, como a classificação média global.

Ao definir uma classe de conjunto de dados, você pode processar o conjunto de dados uma vez e depois chamá-lo diretamente quando precisar do indicador correspondente. Ainda resta muito tempo de execução e o código é mais conciso.

Sumário

Este artigo em si é considerado um resumo de preparação: combinando com o artigo anterior, você pode reproduzir o algoritmo knn de uma maneira surpresa e as interfaces de outras partes também são muito claras. Para aqueles que desejam continuar aprendendo outro código-fonte de algoritmo de surpresa, eles podem facilmente seguir nossa base de análise anterior e continuar seu próprio aprendizado; para aqueles que desejam fazer alterações mágicas e adicionar alguns algoritmos que desejam, a introdução atual também é As interfaces foram explicadas claramente e todos devem encapsular seus próprios algoritmos.

Por outro lado, este artigo também compartilhou algumas das minhas próprias experiências da perspectiva de como ler o código-fonte.Talvez alguns lugares possam ajudá-lo. Desde como começar a ler o código fonte, até uma análise gradual de uma pequena demonstração, ignorando temporariamente alguns módulos sem importância, passo a passo para concluir a substituição do código fonte pelo seu próprio código, para escrever para leitura.

Estritamente falando, esse tipo de gravação na leitura é mais adequado para bibliotecas pequenas com não mais de 10.000 linhas de código. Podemos aprofundar nossa compreensão desse nível de código, escrevendo-o na íntegra. No entanto, o nível mais alto de código não é adequado para gravação e baseia-se principalmente na combinação da arquitetura lógica.

Benefícios de hoje

Conheça Lu Qi

Também como parte importante de "Um milhão de pessoas aprendem IA", a Conferência Dez Mil para Desenvolvedores da AIProCon 2020 será transmitida ao vivo on-line de 3 a 4 de julho, permitindo que os desenvolvedores aprendam sobre a tecnologia de ponta da IA ​​em uma parada Pesquisa, tecnologia e aplicação principais, e experiência prática de casos empresariais, e também pode participar de emocionantes e diversos salões de desenvolvedores e projetos de programação online. Participando da série de atividades prospectivas e da interação da transmissão ao vivo on-line, não apenas é possível se comunicar com dezenas de milhares de desenvolvedores, mas também a oportunidade de ganhar presentes exclusivos para transmissões ao vivo e até se juntar à gigante da tecnologia.

Os ingressos são limitados ao grande show! A partir de hoje, clique para ler o registro original "2020 AI Developer Ten Thousand Conference", use o código de cupom "AIP211", você pode obter um bilhete de conferência on-line gratuito no valor de 299 yuan. Limitado a 100 folhas, primeiro a chegar, primeiro a ser servido! Venha e use seu dedo para obter uma associação de graça!

Clique para ler o texto original e vá diretamente para o site oficial da conferência.

    Todo "assistindo" que você pede, eu levo isso a sério como IA

Publicado 1385 artigos originais · Mais de 10.000 elogios · 6,99 milhões de visualizações

Acho que você gosta

Origin blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/105608349
Recomendado
Clasificación