← Назад к вопросам

Какие артефакты должны остаться после твоей работы?

2.0 Middle🔥 122 комментариев
#Опыт и проекты#Софт-скиллы и мотивация

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие артефакты должны остаться после твоей работы?

Артефакты (artifacts) — это все созданные и сохранённые результаты работы Data Scientist. Они должны быть организованы, версионированы и документированы.

1. Модельные артефакты

import joblib
import pickle
import torch
import mlflow

# Сохранение обученной модели
model = train_model(X_train, y_train)

# Способ 1: joblib (для sklearn моделей)
joblib.dump(model, 'artifacts/model.pkl')

# Способ 2: pickle
with open('artifacts/model.pkl', 'wb') as f:
    pickle.dump(model, f)

# Способ 3: PyTorch
torch.save(model.state_dict(), 'artifacts/model_weights.pth')

# Способ 4: MLflow (рекомендуется)
mlflow.sklearn.log_model(model, 'model')
mlflow.pytorch.log_model(model, 'pytorch_model')

# Проверка загрузки
loaded_model = joblib.load('artifacts/model.pkl')
y_pred = loaded_model.predict(X_test)

2. Метрики и результаты

import json
import pandas as pd
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# Вычисляем метрики
metrics = {
    'accuracy': accuracy_score(y_test, y_pred),
    'precision': precision_score(y_test, y_pred),
    'recall': recall_score(y_test, y_pred),
    'f1': f1_score(y_test, y_pred),
    'training_time_sec': 125.5,
    'num_features': X_train.shape[1],
    'num_samples': len(X_train)
}

# Сохраняем метрики в JSON
with open('artifacts/metrics.json', 'w') as f:
    json.dump(metrics, f, indent=2)

# Сохраняем результаты в CSV
results_df = pd.DataFrame({
    'actual': y_test,
    'predicted': y_pred,
    'probability': y_pred_proba
})
results_df.to_csv('artifacts/predictions.csv', index=False)

print("Метрики сохранены:")
for key, value in metrics.items():
    print(f"{key}: {value}")

3. Обработанные данные (preprocessors)

from sklearn.preprocessing import StandardScaler, LabelEncoder
import pickle

# Обучаем препроцессоры
scaler = StandardScaler()
scaler.fit(X_train)

le = LabelEncoder()
le.fit(y_train)

# Сохраняем для использования при inference
with open('artifacts/scaler.pkl', 'wb') as f:
    pickle.dump(scaler, f)

with open('artifacts/label_encoder.pkl', 'wb') as f:
    pickle.dump(le, f)

# При inference
X_test_scaled = scaler.transform(X_test)  # Используем FITTED scaler
y_pred = model.predict(X_test_scaled)
y_pred_decoded = le.inverse_transform(y_pred)

4. Гиперпараметры и конфигурация

import json
import yaml

# Гиперпараметры модели
config = {
    'model_type': 'RandomForest',
    'hyperparameters': {
        'n_estimators': 100,
        'max_depth': 10,
        'min_samples_split': 5,
        'random_state': 42
    },
    'training_config': {
        'test_size': 0.3,
        'random_state': 42,
        'stratified': True
    },
    'data_info': {
        'num_features': 15,
        'num_samples': 5000,
        'target_variable': 'label'
    }
}

# Сохраняем в JSON
with open('artifacts/config.json', 'w') as f:
    json.dump(config, f, indent=2)

# Или в YAML
with open('artifacts/config.yaml', 'w') as f:
    yaml.dump(config, f)

5. Отчёты и визуализация

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import confusion_matrix, roc_curve, auc

# Confusion Matrix
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 1. Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=axes[0, 0])
axes[0, 0].set_title('Confusion Matrix')

# 2. ROC Curve
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
axes[0, 1].plot(fpr, tpr, label=f'AUC = {roc_auc:.3f}')
axes[0, 1].set_title('ROC Curve')
axes[0, 1].legend()

# 3. Feature Importance
feature_importance = pd.Series(model.feature_importances_, index=feature_names)
feature_importance.head(10).plot(kind='barh', ax=axes[1, 0])
axes[1, 0].set_title('Feature Importance')

# 4. Residuals Plot
residuals = y_test - y_pred
axes[1, 1].scatter(y_pred, residuals)
axes[1, 1].axhline(y=0, color='r', linestyle='--')
axes[1, 1].set_title('Residuals Plot')

plt.tight_layout()
plt.savefig('artifacts/model_analysis.png', dpi=300, bbox_inches='tight')
plt.close()

6. Отчёт в Markdown

report = f"""
# Модель ML: {model_name}

## Описание
{model_description}

## Данные
- Количество примеров: {len(X_train)}
- Количество признаков: {X_train.shape[1]}
- Целевая переменная: {target_column}

## Гиперпараметры
- Тип модели: RandomForest
- Количество деревьев: {n_estimators}
- Максимальная глубина: {max_depth}

## Результаты
- Точность (Accuracy): {metrics['accuracy']:.4f}
- Precision: {metrics['precision']:.4f}
- Recall: {metrics['recall']:.4f}
- F1-Score: {metrics['f1']:.4f}
- AUC-ROC: {metrics['auc']:.4f}

## Лучшие признаки
1. {top_features[0]} ({importances[0]:.4f})
2. {top_features[1]} ({importances[1]:.4f})
3. {top_features[2]} ({importances[2]:.4f})

## Выводы
{conclusions}
"""

with open('artifacts/REPORT.md', 'w') as f:
    f.write(report)

7. Версионирование (DVC, MLflow)

# DVC для версионирования данных и моделей
dvc init
dvc add artifacts/model.pkl
git add artifacts/model.pkl.dvc .gitignore
git commit -m "Add trained model v1"

# MLflow для отслеживания экспериментов
mlflow.set_experiment("my_experiment")
with mlflow.start_run():
    mlflow.log_params(config['hyperparameters'])
    mlflow.log_metrics(metrics)
    mlflow.sklearn.log_model(model, 'model')
    mlflow.log_artifact('artifacts/REPORT.md')

8. Структура проекта

project/
├── artifacts/                   # Все артефакты
│   ├── model.pkl               # Обученная модель
│   ├── scaler.pkl              # Fitted scaler
│   ├── label_encoder.pkl       # Fitted encoder
│   ├── config.json             # Гиперпараметры
│   ├── metrics.json            # Метрики
│   ├── predictions.csv         # Предсказания
│   ├── model_analysis.png      # Визуализация
│   └── REPORT.md               # Полный отчёт
├── data/
│   ├── raw/                    # Исходные данные
│   └── processed/              # Обработанные данные
├── notebooks/
│   ├── 01_eda.ipynb
│   └── 02_modeling.ipynb
├── src/
│   ├── preprocessing.py
│   ├── model.py
│   └── utils.py
├── mlruns/                     # MLflow tracking
├── README.md
└── requirements.txt

9. Чеклист артефактов

Обязательные:

  • ✓ Обученная модель
  • ✓ Метрики (accuracy, precision, recall, f1)
  • ✓ Гиперпараметры и конфигурация
  • ✓ Preprocessors (scaler, encoder)

Важные:

  • ✓ Отчёт с выводами
  • ✓ Визуализация (графики, матрица ошибок)
  • ✓ Таблица с предсказаниями
  • ✓ Feature importance

Дополнительные:

  • ✓ Код проверки качества
  • ✓ Документация
  • ✓ Version control (git + DVC)
  • ✓ MLflow experiments tracking

10. Производство (Production)

Для development моделей нужны дополнительные артефакты:

# requirements.txt
sklearn==1.2.0
pandas==1.5.0
numpy==1.23.0

# Dockerfile для deployment
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY artifacts/ artifacts/
COPY src/ src/
CMD ["python", "src/inference_api.py"]

Все артефакты должны быть:

  • Воспроизводимы — можно пересоздать с теми же результатами
  • Документированы — понятно, что это и как использовать
  • Версионированы — есть история изменений
  • Доступны — легко найти и использовать
Какие артефакты должны остаться после твоей работы? | PrepBro