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)
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)
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 })
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)
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']))
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
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
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