예제 #1
0
def carregar_ram():
    global LISTA_MODELOS, INDEX_INTERESSES, VALORES

    modelos = Database().get_document('versao_modelo')[-1]

    logger.info(f"Versão modelo: {modelos['_id']}")

    for modelo in modelos['ids_modelos']:
        modelo = Database().get_document('modelo', {'_id': modelo}, {
            'modelo': 1,
            '0': 1,
            '1': 1,
            '_id': 0
        })[0]
        LISTA_MODELOS.append({
            'modelo': descompactar_modelo(modelo['modelo']),
            0: modelo['0'],
            1: modelo['1']
        })

    ordem_interesses = Database().get_document(
        'ordem_interesse', {'_id': modelos['_id']})[-1]['interesse']

    for index, interesse in enumerate(ordem_interesses):
        INDEX_INTERESSES[interesse] = index
        VALORES[0].append(0)
예제 #2
0
def info_membros(df_membros: DataFrame, df_interesses: DataFrame,
                 qtd_membros: int) -> tuple:
    """
    Informação dos membros.

    :param DataFrame df_membros: Dataframe de membros
    :param int qtd_membros: quantida de membros a ser buscado

    :return: membros e interesses unicos
    :rtype: tuple
    """
    global INTERESSES, CATEGORIAS

    COLUNAS = ['member_id', 'group_id']
    membros = list()
    controlador = defaultdict(int)

    db = Database()
    for linhas in df_membros:
        for linha in tqdm(linhas.values):
            if sum(controlador.values()) >= qtd_membros * 33:
                break
            else:
                id_membro, id_grupo = linha
                info_grupo = db.get_document('grupos', {'_id': int(id_grupo)},
                                             {'nota': 0})[0]

                if controlador[
                        info_grupo['categoria']] == qtd_membros or info_grupo[
                            'categoria'] not in CATEGORIAS:
                    continue

                mbr_interesses = interesse_membro(id_membro, df_interesses)
                interesses_filtrado = set()
                if any(mbr_interesses):
                    flag = False
                    for interesse in mbr_interesses:
                        for e in interesse.split(','):
                            e = e.strip().lower()
                            if e and e in INTERESSES:
                                flag = True
                                interesses_filtrado.add(e)
                    if flag:
                        membro = {
                            'id_membro': id_membro,
                            'categoria_grupo': info_grupo['categoria']
                        }

                        for interesse in interesses_filtrado:
                            membro[interesse] = 1

                        membros.append(membro)
                        controlador[info_grupo['categoria']] += 1

        if sum(controlador.values()) >= qtd_membros * 33:
            break

    return DataFrame(membros)
예제 #3
0
def grupos() -> None:
    df_grupos = ler_csv(
        f'groups.csv',
        usar_colunas=['category.shortname', 'rating', 'group_id'])

    db = Database()
    for id_grupo, categoria, nota in tqdm(df_grupos.values):
        db.set_document('grupos', {
            '_id': id_grupo,
            'categoria': categoria,
            'nota': nota
        })
예제 #4
0
def salvar_modelo(dataset: dict) -> str:
    db = Database()

    modelo_pk = pickle.dumps(dataset['modelo'])
    modelo = {
        'modelo': modelo_pk,
        'grupo': dataset['grupo'],
        'metricas': dataset['metricas'],
        '0': dataset['0'],
        '1': dataset['1'],
    }

    return db.set_document('modelo', modelo)
예제 #5
0
    def get(self):
        db = Database()

        modelos = db.get_document('versao_modelo')[-1]

        r = list()
        for id_modelo in modelos['ids_modelos']:
            resultado = db.get_document('modelo', {'_id': id_modelo}, {
                '_id': 0,
                'metricas': 1,
                'grupo': 1
            })[0]
            # resultado['metricas'] = resultado['metricas']['macro avg']
            resultado['metricas'] = resultado['metricas']
            r.append(resultado)

        return Resposta.retorno(
            sorted(r, key=lambda modelo: -modelo['metricas']['f1_teste']))
예제 #6
0
def gerar_modelo(qtd):
    treinamentos, id_treinamento = montar_treinamento(qtd)

    ids_modelos = list()
    for dataset in treinamentos:
        logger.debug(f'Treinando {dataset["grupo"]}')
        modelo = RandomForest(200).treinar(dataset)
        ids_modelos.append(salvar_modelo(modelo))

    Database().set_document('versao_modelo', {
        '_id': id_treinamento,
        'ids_modelos': ids_modelos
    })

    return id_treinamento
예제 #7
0
def previsor(interesses):
    global LISTA_MODELOS, INDEX_INTERESSES, VALORES

    db = Database()

    valores = VALORES.copy()
    for interesse in interesses:
        if INDEX_INTERESSES.get(interesse, None):
            valores[0][INDEX_INTERESSES[interesse]] = 1

    grupos = list()
    for modelo in LISTA_MODELOS:
        previsao = modelo['modelo'].predict(valores)[0]
        x = modelo['modelo'].predict_proba(valores)
        print(x, x[0][previsao], modelo[previsao])

        if modelo[previsao] != 'outros' and x[0][previsao]:
            grupos.append(modelo[previsao])

    return grupos
예제 #8
0
def gerar_dataset(qtd):
    df_interesses = ler_csv('members_topics.csv')
    it_df_membros = ler_csv('members.csv',
                            usar_colunas=['member_id', 'group_id'],
                            qtd_it=10000)

    df = info_membros(it_df_membros, df_interesses, qtd)
    logger.debug(f'Quantidade de registros: {len(df)}')
    df.fillna(0, inplace=True)
    df.drop_duplicates(inplace=True)
    df.drop(['id_membro'], axis=1, inplace=True)
    logger.debug(f'Quantidade de registros únicos: {len(df)}')

    colunas = list(df.columns)
    colunas.remove('categoria_grupo')
    colunas.insert(0, 'categoria_grupo')

    id_treinamento = Database().set_document('ordem_interesse',
                                             {'interesse': colunas[1:]},
                                             auto=True)
    return df[colunas], id_treinamento