Упростите рабочий процесс обработки данных с помощью этих простых советов для записной книжки.

Будем честны. В основном мы работаем в тетради.

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

Я просто понимаю это. Итак, теперь я даю вам простые советы от себя, чтобы сделать ваш код более читабельным. Советы:

Создавайте классы.

Если вы никогда не занимались созданием классов и пакетов, эта статья подойдет вам, так как это будет очень простой вариант использования.

В противном случае пропустите или прокомментируйте.

Я разделю это на несколько тем.

  1. Отдельный блокнот для обучения (моделирования) и блокнот для тестирования (прогнозирования)
  2. Создайте как минимум классы моделирования и прогнозирования
  3. Создать из него модуль

Отдельный ноутбук для обучения (моделирование) и тестирования (прогнозирование)

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

Создайте класс моделирования и прогнозирования

Создайте как минимум два класса: класс моделирования и класс прогнозирования. Это связано с аккуратностью кода.

  • В этой записной книжке Train (Modelling) мы будем использовать класс Modeling.
  • В то время как для ноутбука Test (Predicting) мы будем использовать класс Predicting. Мы унаследуем методы от класса Modeling

Зачем создавать классы?

  1. Таким образом, вы можете легко создать pickle для производства/развертывания после того, как все методы класса моделирования будут выполнены и выполнены.
  2. И pickle будет использоваться на стороне производства вместе с классом Predicting.

Короче говоря, вы можете просто передать эти пакеты своему инженеру DevOps вместе с рассолом. Возьмите блокнот в качестве документов для вашего пакета, чтобы ваши коллеги могли получить пример, чтобы понять, как выполнять ваш пакет.

class Modelling:
    def __init__(self):
        self.varMode = {}
        self.uniq = {}
        self.indexDummy = None
        self.model = None
        self.threshold = None

    def fit_varmode_uniq(self, data):
        for i in data:
            if data[i].dtype=='O':
                self.varMode[i] = data[i].mode()[0]
                self.uniq[i] = data[i].dropna().unique()
            elif data[i].dtype.kind in ['i', 'f']:
                self.varMode[i] = data[i].median()
            else:
                print('column', i, data[i].dtype)
                print('dataype not decided yet!')
                break
                
        return self
    
    def transform_null(self, data):
        for col, val in self.varMode.items():
            data[col] = data[col].fillna(val)
        
        return data
        
    def fit_dummy(self, data):
        self.indexDummy = pd.get_dummies(data).columns
        
        return self
        
    def transform_dummy(self, data):
        data = pd.get_dummies(data)
        data = data.reindex(columns=self.indexDummy, fill_value=0)
        
        return data
    
    def fit_model(self, X, y):
        self.model = LGBMClassifier()
        self.model.fit(X, y)
        
        return self
        
class Predicting(Modelling):
    def __init__(self):
        try:
            with open('credit_score_model_and_assortments.pkl', 'rb') as f:
                pkl = pickle.load(f)
                self.varMode = pkl['varMode']
                self.uniq = pkl['uniq']
                self.indexDummy = pkl['indexDummy']
                self.model = pkl['model']
                self.threshold = pkl['threshold']
        except FileNotFoundError:
            raise FileNotFoundError('Where is the file?')
    
    def transform_not_uniq(self, data):
        for col, val in self.uniq.items():
            data[col] = data[col].map(lambda x: self.varMode[col] if x not in val else x)
        
        return data
    
    def predict_data(self, X):
        y_pred = self.model.predict(X)
        y_proba = self.model.predict_proba(X)[:,1]
        
        return y_pred, y_proba

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

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

Создать модуль

Просто перенесите классы из блокнота в .py (модуль), если вы создали его в блокноте, скажем, credictscore.py.

Кстати, не забудьте создать файл __init__.py в той же папке.

Хорошо, теперь как выполнить это в блокноте?

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

import pandas as pd
from creditscore import X_y, Modelling, Predicting
import pickle

data_train = pd.read_csv('/Users/ALVIN RACHMAT/End To End Credit Scoring/credit_risk_dataset_train.csv')

X_train, y_train = X_y(data_train, 'loan_status')

# X_train = feat_eng(X_train)

a = Modelling()

a.fit_varmode_uniq(X_train)
X_train = a.transform_null(X_train)

a.fit_dummy(X_train)
X_train = a.transform_dummy(X_train)

a.fit_model(X_train, y_train)

with open('credit_score_model_and_assortments.pkl', 'wb') as f:
    pickle.dump(a.__dict__, f)

И вы можете выполнить этот код в блокноте прогнозирования. Или это также может быть использовано в производстве.

import pandas as pd
from creditscore import X_y, Modelling, Predicting

data_test = pd.read_csv('/Users/ALVIN RACHMAT/End To End Credit Scoring/credit_risk_dataset_test.csv')

X_test, y_test = X_y(data_test, 'loan_status')

# X_test = feat_eng(X_test)

b = Predicting()

X_test = b.transform_null(X_test)
X_test = b.transform_not_uniq(X_test)
X_test = b.transform_dummy(X_test)

y_pred, y_proba = b.predict_data(X_test)

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

Это готово к производству, просто отдайте свой пакет DevOps/Backend Engineer вместе с pickle во время выполнения прогнозирующего кода.

На самом деле я предполагал, что вы знаете, как устанавливать пакеты и настраивать jupyter. Я предоставляю статью о том, как я настроил среду с помощью virtualenv.

Чего мы еще не научились, так это вернуть эту оценку/вероятность в базу данных или создать простой API с помощью FastAPI или даже создать простой интерфейс для вашего пользователя. для ввода параметра и вывода оценки.

Думаете о меньшем объяснении здесь? Вот почему я предоставил вам репозиторий github для самостоятельного выполнения, чтобы вы могли получить опыт и понять. Самостоятельная работа очень важна в наше время.

Кстати, я создал все это всего за 2 часа, может быть, вы захотите использовать бенчмарк. Я хочу, чтобы ты тоже смог.

Подводить итоги

Теперь вы можете меньше беспокоиться о работе в блокноте, а также подготовить производственный код в пакете/модуле :). Кстати, я буду постоянно обновлять эту статью, так что, возможно, некоторые из связанных статей здесь пока нельзя щелкнуть.

Кроме того, в следующей статье будет небольшое введение в докер, где мы попробуем ввести данные в postgres, внесем дополнительные нюансы в реальный вариант использования. Это подготовка перед тем, как мы настроим полную среду postgres в докере, чтобы также сохранять выходные данные от каждого клика, когда пользователь вычисляет оценку.