Eu estava lendo o relatório da solução vencedora de uma competição Kaggle ( Classificação de malware ). O relatório pode ser encontrado nesta postagem do fórum . O problema era um problema de classificação (nove classes, a métrica era a perda logarítmica) com 10.000 elementos no conjunto de trens e 10.000 elementos no conjunto de testes.
Durante a competição, os modelos foram avaliados contra 30% do conjunto de testes. Outro elemento importante é que os modelos tiveram um desempenho muito bom (precisão quase 100%)
Os autores usaram a seguinte técnica:
Outra técnica importante que surgimos é o aprendizado semissupervisionado. Primeiro, geramos pseudo-rótulos do conjunto de testes escolhendo a probabilidade máxima de nosso melhor modelo. Em seguida, prevemos o conjunto de testes novamente com validação cruzada, com dados de trem e dados de teste. Por exemplo, o conjunto de dados de teste é dividido em 4 partes A, B, C e D. Usamos todos os dados de treinamento e dados de teste A, B, C com seus pseudo rótulos, juntos como o novo conjunto de treinamento e prevemos o teste conjunto D.
O mesmo método é usado para prever A, B e C. Essa abordagem, inventada por Xiaozhou, funciona surpreendentemente bem e reduz a perda de validação cruzada local, a perda de LB pública e a perda de LB privada. O melhor modelo de aprendizado semissupervisionado pode atingir 0,0023 na perda de log LB privada, que é a melhor pontuação em todas as nossas soluções.
Realmente não vejo como isso pode melhorar os resultados. É porque 30% do conjunto de teste "vazou" e foi uma maneira de usar essas informações?
Ou existe alguma razão teórica para explicar por que funciona?
Não é muito grosseiro (dependendo da definição). As informações de destino do conjunto de testes são preservadas. Semi-supervisionado permite gerar um conjunto de dados sintético extra para treinar o modelo. Na abordagem descrita, os dados originais do treinamento são misturados sem ponderação com os sintéticos na proporção 4: 3. Assim, se a qualidade dos dados sintéticos for ruim, a abordagem seria desastrosa. Acho que, para qualquer problema em que as previsões sejam incertas, o conjunto de dados sintéticos seria de baixa precisão. Se a estrutura subjacente é muito complexa e o sistema possui baixo ruído, isso pode ajudar a gerar dados sintéticos, eu acho. Eu acho que o aprendizado semi-supervisionado é muito grande no aprendizado profundo (não é meu conhecimento), onde a representação de recursos também deve ser aprendida.
Tentei reproduzir maior precisão com o treinamento semi-supervisionado em vários conjuntos de dados com rf e xgboost sem nenhum resultado positivo. [Sinta-se à vontade para editar meu código.] Percebo que a melhoria real da precisão usando semi-supervisionada é bastante modesta no relatório do kaggle, talvez aleatória?
fonte
Por esta definição: "O ajuste excessivo ocorre quando um modelo estatístico descreve erro ou ruído aleatório em vez do relacionamento subjacente" (wikipedia), a solução não está ajustando demais.
Mas nesta situação:
- Os dados de teste são um fluxo de itens e não um conjunto fixo de itens.
OU
- O processo de previsão não deve conter a fase de aprendizado (por exemplo, devido a problemas de desempenho).
A solução mencionada é sobreajustada. Porque a precisão da modelagem é mais do que situações reais.
fonte