Sibur Challenge 2020 o "cómo se nos ocurrieron las funciones"

¡Hola a todos! Este año, Sibur Digital volvió a organizar un gran campeonato de análisis de datos (en comparación con otros rusos). Mi amigo y yo participamos en él y nos gustaría compartir con los lectores de Habr nuestra decisión y experiencia obtenida de la participación. Por supuesto, es poco probable que abramos América con este artículo, pero algún principiante en la competencia de presión arterial definitivamente podrá aprender algo útil para sí mismo.





¿Quienes somos?

Somos estudiantes apasionados por DS y ML. Aprendimos sobre esta área por primera vez en la conferencia AI Journey celebrada en nuestra universidad. Desde ese momento, hemos aprobado más de uno, no dos, ni tres cursos (desde la Universidad Técnica Estatal de Omsk hasta Andrew NG) y ahora participamos constantemente en hackatones y concursos (en algunos incluso ganamos premios), en paralelo estamos buscando una pasantía.





Sobre la tarea

Asumimos el segundo desafío de la competencia: "coincidencia de nombres".





La esencia es la siguiente: Sibur trabaja con una gran cantidad de nuevas empresas y, para optimizar el flujo de trabajo, sería útil que entendieran que están trabajando con un holding familiar previamente. Por ejemplo, Sibur Neftekhim y SIBUR IT pertenecen al mismo holding y, cuando se trabaja con una de estas empresas, sería útil utilizar la información acumulada anteriormente en el holding SIBUR.





Parafraseemos el problema en lenguaje DS. Se han dado dos nombres, mediante los cuales tenemos que determinar si las empresas pertenecen a un holding o no.





nombre_1





nombre_2





is_duplicate





Japón caucho sintético Co





Elastómero Jsr Bst





uno





JSR Corporation





BST ELASTOMERS CO.





0





Así es como se veía el conjunto de datos.





Preprocesamiento de datos

En primer lugar, convertimos los datos al alfabeto latino utilizando el módulo mágico unidecode. Luego lo llevaron a la minúscula, eliminaron cualquier basura en forma de signos de puntuación innecesarios, espacios dobles, etc.





from unidecode import unidecode
import re
def preprocess(text: str):
    text = unidecode(text)
    text = text.lower()
    text = re.sub(r'[\.,]+', '', text)
    text = re.sub(r"\(.*\)", ' ', text)
    text = re.sub(r"[^\w\s]", ' ', text)
    text = re.sub(r'\b\w\b', ' ', text)
    text = ' '.join(text.split())
    return text
      
      



. , pycountry( ) , .





. , , , . " " "shanghai", , , . .





, , - ( , ).





, : "" , .





" ". 0.3 . , .





. . .





, , . .





, , :





  • ,





  • ()





  • : , ,





  • tfidf - ( )









  • ngram





  • ( )





  • ,





  • ,





, , XGBoost, . ~ 0.59 .





, - . (, , !), , 0.69 . , , .





- , , , .





, . , fit_predict, . ( ). , -.





?





Se podía tener en cuenta la semántica de las palabras o dar peso a las palabras: si una palabra en dos nombres coincidía y es útil (se refiere al nombre de la empresa) - tiene peso, automáticamente consideramos que es igual de dañino en la "diferencia" de palabras; utilizar la mayor cantidad de datos externos con nombres de empresas, etc. Además, no olvide analizar las observaciones en las que el modelo está equivocado (Falso Positivo, Falso Negativo), y en base a esto, construir nuevas características.





PD

Todo el código está aquí





Si desea contactarnos: matnik2001@gmail.com, domonion@list.ru








All Articles