Как я могу перебрать «список» моделей в python с помощью scikit learn? - PullRequest
0 голосов
/ 14 июня 2019

Я построил функцию, которая отображает некоторые показатели оценки для одной модели, и теперь я хочу применить эту функцию к пулу оцененных моделей.

Входные данные старой функции были:

OldFunction(code: str, x, X_train: np.array, X_test: np.array, X:pd.DataFrame)

Где:

код - это строка, используемая для создания имени столбца кадра данных
x - это имя модели
X_train и X_test - это np.arrays разделителя данных
X - это фрейм данных всех данных

Чтобы оценить метрики для пула моделей, я попытался изменить свою функцию, добавив цикл в свою функцию и поместив модели в список.

Но это не работает.

Проблема возникает из-за того, что я не могу перебрать список моделей, так какой вариант у меня есть?У тебя есть идея?

Я оставляю новую функцию ниже.

import numpy as np
import pandas as pd
def displaymetrics(code: list, models: list, X_train: np.array, X_test: np.array, X: pd.DataFrame):
    for i in models:
        import pandas as pd
        import numpy as np
        from sklearn.metrics import roc_curve, auc
        from sklearn.metrics import accuracy_score, recall_score, precision_score
        from sklearn.model_selection import cross_val_score

        y_score = models[i].fit(X_train, y_train).decision_function(X_test)
        fpr, tpr, _ = roc_curve(y_test, y_score)
        roc_auc = auc(fpr, tpr)

        # Traditional Scores

        y_pred = pd.DataFrame(model[i].predict(X_train)).reset_index(drop=True)
        Recall_Train,Precision_Train, Accuracy_Train  = recall_score(y_train, y_pred), precision_score(y_train, y_pred), accuracy_score(y_train, y_pred)
        y_pred = pd.DataFrame(model[i].predict(X_test)).reset_index(drop=True)
        Recall_Test = recall_score(y_test, y_pred)
        Precision_Test = precision_score(y_test, y_pred)
        Accuracy_Test = accuracy_score(y_test, y_pred)

        #Cross Validation
        cv_au = cross_val_score(models[i], X_test, y_test, cv=30, scoring='roc_auc')
        cv_f1 = cross_val_score(models[i], X_test, y_test, cv=30, scoring='f1')
        cv_pr = cross_val_score(models[i], X_test, y_test, cv=30, scoring='precision')
        cv_re = cross_val_score(models[i], X_test, y_test, cv=30, scoring='recall')
        cv_ac = cross_val_score(models[i], X_test, y_test, cv=30, scoring='accuracy')
        cv_ba = cross_val_score(models[i], X_test, y_test, cv=30, scoring='balanced_accuracy')
        cv_au_m, cv_au_std =  cv_au.mean() , cv_au.std() 
        cv_f1_m, cv_f1_std = cv_f1.mean() , cv_f1.std()
        cv_pr_m, cv_pr_std = cv_pr.mean() , cv_pr.std()
        cv_re_m, cv_re_std= cv_re.mean() , cv_re.std()
        cv_ac_m, cv_ac_std = cv_ac.mean() , cv_ac.std()
        cv_ba_m, cv_ba_std= cv_ba.mean() , cv_ba.std()
        cv_au, cv_f1, cv_pr =  (cv_au_m, cv_au_std),  (cv_f1_m, cv_f1_std), (cv_pr_m, cv_pr_std) 
        cv_re, cv_ac, cv_ba = (cv_re_m, cv_re_std), (cv_ac_m, cv_ac_std), (cv_ba_m, cv_ba_std)
        tuples = [cv_au, cv_f1, cv_pr, cv_re, cv_ac, cv_ba]
        tuplas = [0]*len(tuples)
        for i in range(len(tuples)):
            tuplas[i] = [round(x,4) for x in tuples[i]]
        results = pd.DataFrame()
        results['Metrics'] = ['roc_auc', 'Accuracy_Train', 'Precision_Train', 'Recall_Train', 'Accuracy_Test', 
                              'Precision_Test','Recall_Test', 'cv_roc-auc (mean, std)', 'cv_f1score(mean, std)', 
                              'cv_precision (mean, std)', 'cv_recall (mean, std)', 'cv_accuracy (mean, std)', 
                              'cv_bal_accuracy (mean, std)']
        results.set_index(['Metrics'], inplace=True)
        results['Model_'+code[i]] = [roc_auc, Accuracy_Train, Precision_Train, Recall_Train, Accuracy_Test, 
                            Precision_Test, Recall_Test, tuplas[0], tuplas[1], tuplas[2], tuplas[3],
                           tuplas[4], tuplas[5]]

    return results

Выходными данными должен быть кадр данных, где каждый столбец представляет каждую модель, а строка - метрику.

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Вы должны использовать словарь, а не список, как в следующем примере:

dict_classifiers = {
    "Logreg": LogisticRegression(solver='lbfgs'),
    "NN": KNeighborsClassifier(),
    "LinearSVM": SVC(probability=True, kernel='linear'), #class_weight='balanced'
    "GBC": GradientBoostingClassifier(),
    "DT": tree.DecisionTreeClassifier(),
    "RF": RandomForestClassifier(),
    "NB": GaussianNB(),
}

затем используйте, например:

for model, model_instantiation in dict_classifiers.iteritems():
     y_score = model_instantiation.fit(X_train, y_train).decision_function(X_test)
     ...

Надеюсь, это поможет, дайте мне знать, как вы поживаете!

1 голос
/ 14 июня 2019

Вы, вероятно, должны указать, произошла ли ошибка или просто вывод неверный.Я предполагаю, что у вас есть ошибка.

Вы уверены, что передаете модели в виде списка при вызове displaymetrics?

Например,

models = [model1, model2, ...]
displaymetrics(code, models, X_train, X_test, X)

Также в вашем коде есть ошибка: вы звоните models[i].fit(...), но i - это сама модель.Вы должны просто сделать i.fit(...) или лучше изменить имя i, потому что оно обычно относится к перебирающим вещам.(Вам следует использовать for i in range(0, len(models)): ..., если вы хотите перебирать индексы списка.)

Примечание : вам не следует импортировать панд и numpy для каждой итерации модели.Я также предлагаю вам поместить весь импорт (из модулей sklearn) в верхнюю часть вашего кода.

Итак, я думаю, ваш код должен выглядеть следующим образом:

import numpy as np
import pandas as pd
from sklearn.metrics import roc_curve, auc
from sklearn.metrics import accuracy_score, recall_score, precision_score
from sklearn.model_selection import cross_val_score

def displaymetrics(code: list, models: list, X_train: np.array, X_test: np.array, X: pd.DataFrame):
    for model in models:  # or for i in range(0, len(models)):
        y_score = model.fit(X_train, y_train).decision_function(X_test)
        # or y_score = models[i].fit(X_train, y_train).decision_function(X_test)
        fpr, tpr, _ = roc_curve(y_test, y_score)
        # etc etc

Попробуйте отредактировать ваш код, чтобы показать нам, как вы вызываете displaymetrics и с какими аргументами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...