1
resposta

Duvida Classe HeuristicaTop25

Estou para responder ultimas perguntas do projeto, mas o meu código não termina de executar a chamada "treina_e_valida_modelo_de_classificacao(enem_validacao, HeuristicaTop25())", mais precisamente a função "predict" da classe "HeuristicaTop25". Não consigo identificar o problema.

# solução: implemente o código que falta

from sklearn.metrics import accuracy_score

class HeuristicaTop25:

    def fit(self, X, y = None):
        if(X.shape[1] != 3):
            print("Erro!!! Estávamos esperando 3 colunas!")
        # some **por coluna**. a função sum recebe um parâmetro para somar por coluna, não linha
        parcial = X.sum(axis=1)
        self.top_25_quantile = pd.Series(parcial).quantile(0.75)
        print("top 25 quantile é %.2f" % self.top_25_quantile)
        return self

    def predict(self, X, y = None):
        parcial = X.sum(axis=1)
        #y_pred_true_false = [True if i> pd.Series(parcial).quantile(0.75) else False for i in parcial ]# compare a soma parcial com o self.top25_quantile
        y_pred =[1 if i> pd.Series(parcial).quantile(0.75) else 0 for i in parcial ]# 1 se for maior ou igual, 0 caso contrário
        return y_pred

    def score(self, X, y = None):
        return accuracy_score(y, self.predict(X, y))

    def get_params(self, deep=True):
        return {}
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.pipeline import make_pipeline

def treina_e_valida_modelo_de_classificacao(dados, modelo):
    # calcule X e y usando a função anterior
    X,y =  separa_dados_de_classificacao_para_validacao(dados)

    # calcule o cross_val_score    
    scores = cross_val_score(modelo,X,y)
    print(scores)
    mean = scores.mean()
    std = scores.std()
    print("Acurácia entre [%.2f,%.2f]" % (100*mean - 2*std, 100*mean + 2*std))

    modelo.fit(X, y)
    print_confusion_for(X, y, modelo)
1 resposta

Oii Yuri, como você está?

Sinto muito por demorar tanto a te responder.

Uma possível solução para o seu problema é substituir a linha comentada y_pred_true_false pela linha logo abaixo, y_pred. Dessa forma, você estará atribuindo 1 se o valor da soma parcial for maior que o quantil 0.75 e 0 caso contrário.

Aqui está o trecho de código corrigido:

def predict(self, X, y = None):
    parcial = X.sum(axis=1)
    y_pred =[1 if i > pd.Series(parcial).quantile(0.75) else 0 for i in parcial]
    return y_pred

Outra forma do método predict:

def predict(self, X, y = None):
        parcial = X.sum(axis='columns')  # some por coluna
        y_pred_true_false = parcial >= self.top_25_quantile  # compare a soma parcial com o self.top25_quantile
        y_pred = [1 if valor else 0 for valor in y_pred_true_false]  # 1 se for maior ou igual, 0 caso contrário
        return y_pred

Yuri, aproveito para te contar que os projetos foram descontinuados aqui na Alura e substituídos por Challenges e pelo 7 Days of Code e, para tirar dúvidas em relação aos desafios, temos canais em nosso servidor do Discord!

Grande abraço!