Showing preview only (9,158K chars total). Download the full file or copy to clipboard to get everything.
Repository: DataTalksClub/mlops-zoomcamp
Branch: main
Commit: fdca5b44045e
Files: 274
Total size: 18.9 MB
Directory structure:
gitextract_69ga8un0/
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ ├── cd-deploy.yml
│ └── ci-tests.yml
├── .gitignore
├── 01-intro/
│ ├── README.md
│ ├── duration-prediction.ipynb
│ └── meta.json
├── 02-experiment-tracking/
│ ├── README.md
│ ├── duration-prediction.ipynb
│ ├── meta.json
│ ├── mlflow_on_aws.md
│ ├── model-registry.ipynb
│ ├── requirements.txt
│ └── running-mlflow-examples/
│ ├── scenario-1.ipynb
│ ├── scenario-2.ipynb
│ └── scenario-3.ipynb
├── 03-orchestration/
│ ├── README.md
│ └── code/
│ ├── commands.md
│ ├── duration-prediction.ipynb
│ └── duration-prediction.py
├── 04-deployment/
│ ├── README.md
│ ├── batch/
│ │ ├── Pipfile
│ │ ├── README.md
│ │ ├── score.ipynb
│ │ ├── score.py
│ │ ├── score_backfill.py
│ │ └── score_deploy.py
│ ├── load_model.ipynb
│ ├── meta.json
│ ├── streaming/
│ │ ├── Dockerfile
│ │ ├── Pipfile
│ │ ├── README.md
│ │ ├── lambda_function.py
│ │ ├── test.py
│ │ └── test_docker.py
│ ├── web-service/
│ │ ├── Dockerfile
│ │ ├── Pipfile
│ │ ├── README.md
│ │ ├── predict.py
│ │ └── test.py
│ └── web-service-mlflow/
│ ├── Pipfile
│ ├── README.md
│ ├── predict.py
│ ├── random-forest.ipynb
│ └── test.py
├── 05-monitoring/
│ ├── README.md
│ ├── baseline_model_nyc_taxi_data.ipynb
│ ├── config/
│ │ ├── grafana_dashboards.yaml
│ │ └── grafana_datasources.yaml
│ ├── dashboards/
│ │ └── data_drift.json
│ ├── data/
│ │ └── .gitignore
│ ├── debugging_nyc_taxi_data.ipynb
│ ├── docker-compose.yml
│ ├── dummy_metrics_calculation.py
│ ├── evidently_metrics_calculation.py
│ ├── meta.json
│ ├── models/
│ │ └── .gitignore
│ ├── post-evidently-0.7/
│ │ ├── README.md
│ │ ├── baseline_model_nyc_taxi_data.ipynb
│ │ ├── config/
│ │ │ ├── grafana_dashboards.yaml
│ │ │ └── grafana_datasources.yaml
│ │ ├── dashboards/
│ │ │ └── data_drift.json
│ │ ├── debugging_nyc_taxi_data.ipynb
│ │ ├── docker-compose.yml
│ │ ├── dummy_metrics_calculation.py
│ │ ├── evidently_metrics_calculation.py
│ │ ├── meta.json
│ │ └── requirements.txt
│ └── requirements.txt
├── 06-best-practices/
│ ├── README.md
│ ├── code/
│ │ ├── .gitignore
│ │ ├── .pre-commit-config.yaml
│ │ ├── .vscode/
│ │ │ └── settings.json
│ │ ├── Dockerfile
│ │ ├── Makefile
│ │ ├── Pipfile
│ │ ├── README.md
│ │ ├── infrastructure/
│ │ │ ├── main.tf
│ │ │ ├── modules/
│ │ │ │ ├── ecr/
│ │ │ │ │ ├── main.tf
│ │ │ │ │ └── variables.tf
│ │ │ │ ├── kinesis/
│ │ │ │ │ ├── main.tf
│ │ │ │ │ └── variables.tf
│ │ │ │ ├── lambda/
│ │ │ │ │ ├── iam.tf
│ │ │ │ │ ├── main.tf
│ │ │ │ │ └── variables.tf
│ │ │ │ └── s3/
│ │ │ │ ├── main.tf
│ │ │ │ └── variables.tf
│ │ │ ├── variables.tf
│ │ │ └── vars/
│ │ │ ├── prod.tfvars
│ │ │ └── stg.tfvars
│ │ ├── integration-test/
│ │ │ ├── docker-compose.yaml
│ │ │ ├── event.json
│ │ │ ├── model/
│ │ │ │ ├── MLmodel
│ │ │ │ ├── conda.yaml
│ │ │ │ ├── model.pkl
│ │ │ │ ├── python_env.yaml
│ │ │ │ └── requirements.txt
│ │ │ ├── run.sh
│ │ │ ├── test_docker.py
│ │ │ └── test_kinesis.py
│ │ ├── lambda_function.py
│ │ ├── model.py
│ │ ├── plan.md
│ │ ├── pyproject.toml
│ │ ├── scripts/
│ │ │ ├── deploy_manual.sh
│ │ │ ├── publish.sh
│ │ │ └── test_cloud_e2e.sh
│ │ └── tests/
│ │ ├── __init__.py
│ │ ├── data.b64
│ │ └── model_test.py
│ ├── docs.md
│ └── meta.json
├── 07-project/
│ └── README.md
├── README.md
├── after-sign-up.md
├── asking-questions.md
├── certificate.md
├── cohorts/
│ ├── 2022/
│ │ ├── 01-intro/
│ │ │ ├── homework.ipynb
│ │ │ └── homework.md
│ │ ├── 02-experiment-tracking/
│ │ │ ├── homework/
│ │ │ │ ├── hpo.py
│ │ │ │ ├── preprocess_data.py
│ │ │ │ ├── register_model.py
│ │ │ │ └── train.py
│ │ │ └── homework.md
│ │ ├── 03-orchestration/
│ │ │ ├── README.md
│ │ │ ├── code/
│ │ │ │ ├── model_training.py
│ │ │ │ ├── orchestration.py
│ │ │ │ ├── prefect_deploy.py
│ │ │ │ ├── prefect_flow.py
│ │ │ │ └── work-queue.py
│ │ │ ├── homework.md
│ │ │ ├── homework.py
│ │ │ └── homework_solution.py
│ │ ├── 04-deployment/
│ │ │ ├── homework/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── Pipfile
│ │ │ │ ├── batch.py
│ │ │ │ ├── homework.dockerfile
│ │ │ │ └── starter.ipynb
│ │ │ └── homework.md
│ │ ├── 05-monitoring/
│ │ │ ├── README.md
│ │ │ ├── homework/
│ │ │ │ ├── docker-compose-homework-solution.yml
│ │ │ │ ├── docker-compose-homework.yml
│ │ │ │ ├── model_training.py
│ │ │ │ ├── prediction_service/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── Pipfile
│ │ │ │ │ └── app.py
│ │ │ │ ├── prefect-monitoring/
│ │ │ │ │ ├── Pipfile
│ │ │ │ │ ├── clean_mongo.py
│ │ │ │ │ ├── monitor_profile.ipynb
│ │ │ │ │ ├── monitor_profile_solution.ipynb
│ │ │ │ │ ├── prefect_monitoring.py
│ │ │ │ │ ├── prefect_monitoring_solution.py
│ │ │ │ │ ├── prepare_reference_data.py
│ │ │ │ │ └── send_data.py
│ │ │ │ ├── prepare.py
│ │ │ │ ├── requirements.txt
│ │ │ │ └── test.py
│ │ │ └── homework.md
│ │ ├── 06-best-practices/
│ │ │ ├── homework/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── Pipfile
│ │ │ │ └── batch.py
│ │ │ ├── homework.md
│ │ │ └── homework_solution/
│ │ │ ├── Dockerfile
│ │ │ ├── Pipfile
│ │ │ ├── batch.py
│ │ │ ├── docker-compose.yaml
│ │ │ ├── integration_test.py
│ │ │ ├── integration_test.sh
│ │ │ └── tests/
│ │ │ ├── __init__.py
│ │ │ └── test_batch.py
│ │ ├── 07-project/
│ │ │ └── README.md
│ │ └── leaderboard.md
│ ├── 2023/
│ │ ├── 01-intro/
│ │ │ └── homework.md
│ │ ├── 02-experiment-tracking/
│ │ │ ├── homework/
│ │ │ │ ├── hpo.py
│ │ │ │ ├── preprocess_data.py
│ │ │ │ ├── register_model.py
│ │ │ │ └── train.py
│ │ │ ├── homework-wandb/
│ │ │ │ ├── preprocess_data.py
│ │ │ │ ├── sweep.py
│ │ │ │ └── train.py
│ │ │ ├── homework.md
│ │ │ ├── solution-mlflow/
│ │ │ │ ├── hpo.py
│ │ │ │ ├── preprocess_data.py
│ │ │ │ ├── register_model.py
│ │ │ │ └── train.py
│ │ │ └── wandb.md
│ │ ├── 03-orchestration/
│ │ │ ├── homework.md
│ │ │ └── prefect/
│ │ │ ├── .gitignore
│ │ │ ├── 3.2/
│ │ │ │ ├── cat_dog_facts.py
│ │ │ │ └── cat_facts.py
│ │ │ ├── 3.3/
│ │ │ │ ├── duration_prediction_explore.ipynb
│ │ │ │ ├── duration_prediction_original.ipynb
│ │ │ │ ├── orchestrate.py
│ │ │ │ └── orchestrate_pre_prefect.py
│ │ │ ├── 3.4/
│ │ │ │ └── orchestrate.py
│ │ │ ├── 3.5/
│ │ │ │ ├── create_s3_bucket_block.py
│ │ │ │ ├── orchestrate.py
│ │ │ │ └── orchestrate_s3.py
│ │ │ ├── 3.6/
│ │ │ │ ├── create_s3_bucket_block.py
│ │ │ │ └── orchestrate_s3.py
│ │ │ ├── README.md
│ │ │ ├── meta.json
│ │ │ └── requirements.txt
│ │ ├── 04-deployment/
│ │ │ ├── homework/
│ │ │ │ ├── Dockerfile
│ │ │ │ └── starter.ipynb
│ │ │ └── homework.md
│ │ ├── 05-monitoring/
│ │ │ └── homework.md
│ │ ├── 06-best-practices/
│ │ │ ├── homework/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── Pipfile
│ │ │ │ └── batch.py
│ │ │ ├── homework.md
│ │ │ └── homework_solution/
│ │ │ ├── Pipfile
│ │ │ ├── batch.py
│ │ │ ├── docker-compose.yaml
│ │ │ ├── integration_test.py
│ │ │ └── tests/
│ │ │ ├── __init__.py
│ │ │ └── test_batch.py
│ │ ├── 07-project/
│ │ │ └── README.md
│ │ └── README.md
│ ├── 2024/
│ │ ├── 01-intro/
│ │ │ └── homework.md
│ │ ├── 02-experiment-tracking/
│ │ │ ├── homework/
│ │ │ │ ├── hpo.py
│ │ │ │ ├── preprocess_data.py
│ │ │ │ ├── register_model.py
│ │ │ │ └── train.py
│ │ │ ├── homework.md
│ │ │ └── solution/
│ │ │ ├── hpo.py
│ │ │ ├── preprocess_data.py
│ │ │ ├── register_model.py
│ │ │ └── train.py
│ │ ├── 03-orchestration/
│ │ │ ├── .gitignore
│ │ │ ├── 3.0/
│ │ │ │ └── README.md
│ │ │ ├── 3.1/
│ │ │ │ └── README.md
│ │ │ ├── 3.2/
│ │ │ │ └── README.md
│ │ │ ├── 3.3/
│ │ │ │ └── README.md
│ │ │ ├── 3.4/
│ │ │ │ └── README.md
│ │ │ ├── 3.5/
│ │ │ │ └── README.md
│ │ │ ├── README.md
│ │ │ ├── homework.md
│ │ │ ├── meta.json
│ │ │ └── requirements.txt
│ │ ├── 04-deployment/
│ │ │ ├── homework/
│ │ │ │ └── starter.ipynb
│ │ │ ├── homework.md
│ │ │ └── homework_solution/
│ │ │ ├── Dockerfile
│ │ │ ├── Pipfile
│ │ │ ├── batch.py
│ │ │ ├── homework.dockerfile
│ │ │ └── solution.ipynb
│ │ ├── 05-monitoring/
│ │ │ └── homework.md
│ │ ├── 06-best-practices/
│ │ │ ├── homework/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── Pipfile
│ │ │ │ └── batch.py
│ │ │ └── homework.md
│ │ ├── README.md
│ │ └── project.md
│ └── 2025/
│ ├── 01-intro/
│ │ ├── homework.ipynb
│ │ └── homework.md
│ ├── 02-experiment-tracking/
│ │ ├── homework/
│ │ │ ├── hpo.py
│ │ │ ├── preprocess_data.py
│ │ │ ├── register_model.py
│ │ │ └── train.py
│ │ └── homework.md
│ ├── 03-orchestration/
│ │ └── homework.md
│ ├── 04-deployment/
│ │ ├── homework/
│ │ │ └── starter.ipynb
│ │ └── homework.md
│ ├── 05-monitoring/
│ │ └── homework.md
│ ├── 06-best-practices/
│ │ ├── homework/
│ │ │ ├── Dockerfile
│ │ │ ├── Pipfile
│ │ │ └── batch.py
│ │ └── homework.md
│ ├── README.md
│ ├── competition/
│ │ └── README.md
│ └── project.md
├── generate/
│ └── generate_pages.ipynb
└── learning-in-public.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/FUNDING.yml
================================================
github: alexeygrigorev
================================================
FILE: .github/workflows/cd-deploy.yml
================================================
name: CD-Deploy
on:
push:
branches:
- 'develop'
# paths:
# - '06-best-practices/code/**'
jobs:
build-push-deploy:
runs-on: ubuntu-latest
steps:
- name: Check out repo
uses: actions/checkout@v3
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "eu-west-1"
- uses: hashicorp/setup-terraform@v2
with:
terraform_wrapper: false
# Define the infrastructure
- name: TF plan
id: tf-plan
working-directory: '06-best-practices/code/infrastructure'
run: |
terraform init -backend-config="key=mlops-zoomcamp-prod.tfstate" -reconfigure && terraform plan -var-file=vars/prod.tfvars
- name: TF Apply
id: tf-apply
working-directory: '06-best-practices/code/infrastructure'
if: ${{ steps.tf-plan.outcome }} == 'success'
run: |
terraform apply -auto-approve -var-file=vars/prod.tfvars
echo "::set-output name=ecr_repo::$(terraform output ecr_repo | xargs)"
echo "::set-output name=predictions_stream_name::$(terraform output predictions_stream_name | xargs)"
echo "::set-output name=model_bucket::$(terraform output model_bucket | xargs)"
echo "::set-output name=lambda_function::$(terraform output lambda_function | xargs)"
# Build-Push
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image-step
working-directory: "06-best-practices/code"
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ steps.tf-apply.outputs.ecr_repo }}
IMAGE_TAG: "latest" # ${{ github.sha }}
run: |
docker build -t ${ECR_REGISTRY}/${ECR_REPOSITORY}:${IMAGE_TAG} .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "::set-output name=image_uri::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
# Deploy
- name: Get model artifacts
# The steps here are not suited for production.
# In practice, retrieving the latest model version or RUN_ID from a service like MLflow or DVC can also be integrated into a CI/CD pipeline.
# But due to the limited scope of this workshop, we would be keeping things simple.
# In practice, you would also have a separate training pipeline to write new model artifacts to your Model Bucket in Prod.
id: get-model-artifacts
working-directory: "06-best-practices/code"
env:
MODEL_BUCKET_DEV: "mlflow-models-alexey"
MODEL_BUCKET_PROD: ${{ steps.tf-apply.outputs.model_bucket }}
run: |
export RUN_ID=$(aws s3api list-objects-v2 --bucket ${MODEL_BUCKET_DEV} \
--query 'sort_by(Contents, &LastModified)[-1].Key' --output=text | cut -f2 -d/)
aws s3 sync s3://${MODEL_BUCKET_DEV} s3://${MODEL_BUCKET_PROD}
echo "::set-output name=run_id::${RUN_ID}"
- name: Update Lambda
env:
LAMBDA_FUNCTION: ${{ steps.tf-apply.outputs.lambda_function }}
PREDICTIONS_STREAM_NAME: ${{ steps.tf-apply.outputs.predictions_stream_name }}
MODEL_BUCKET: ${{ steps.tf-apply.outputs.model_bucket }}
RUN_ID: ${{ steps.get-model-artifacts.outputs.run_id }}
run: |
variables="{ \
PREDICTIONS_STREAM_NAME=$PREDICTIONS_STREAM_NAME, MODEL_BUCKET=$MODEL_BUCKET, RUN_ID=$RUN_ID \
}"
STATE=$(aws lambda get-function --function-name $LAMBDA_FUNCTION --region "eu-west-1" --query 'Configuration.LastUpdateStatus' --output text)
while [[ "$STATE" == "InProgress" ]]
do
echo "sleep 5sec ...."
sleep 5s
STATE=$(aws lambda get-function --function-name $LAMBDA_FUNCTION --region "eu-west-1" --query 'Configuration.LastUpdateStatus' --output text)
echo $STATE
done
aws lambda update-function-configuration --function-name $LAMBDA_FUNCTION \
--environment "Variables=${variables}"
================================================
FILE: .github/workflows/ci-tests.yml
================================================
name: CI-Tests
on:
pull_request:
branches:
- 'develop'
paths:
- '06-best-practices/code/**'
env:
AWS_DEFAULT_REGION: 'eu-west-1'
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.9
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: Install dependencies
working-directory: "06-best-practices/code"
run: pip install pipenv && pipenv install --dev
- name: Run Unit tests
working-directory: "06-best-practices/code"
run: pipenv run pytest tests/
- name: Lint
working-directory: "06-best-practices/code"
run: pipenv run pylint --recursive=y .
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_DEFAULT_REGION }}
- name: Integration Test
working-directory: '06-best-practices/code/integraton-test'
run: |
. run.sh
tf-plan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_DEFAULT_REGION }}
- uses: hashicorp/setup-terraform@v2
- name: TF plan
id: plan
working-directory: '06-best-practices/code/infrastructure'
run: |
terraform init -backend-config="key=mlops-zoomcamp-prod.tfstate" --reconfigure && terraform plan --var-file vars/prod.tfvars
================================================
FILE: .gitignore
================================================
data/
.ipynb_checkpoints
.bin
*.db
*.parquet
*.html
*.csv
.venv
venv
.idea
**/artifacts/
**/models/
__pycache__/
**.env
**.terraform/
**.terraform.lock*
**terraform.tfstate*
.DS_Store
================================================
FILE: 01-intro/README.md
================================================
# 1. Introduction
Instructor: Alexey Grigorev
## 1.1 Introduction
<a href="https://www.youtube.com/watch?v=s0uaFZSzwfI&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-1-01.jpg">
</a>
## 1.2 Environment preparation
### 1.2.1 GitHub Codespaces
<a href="https://www.youtube.com/watch?v=MzcmWXYxi2s&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK&index=2">
<img src="images/thumbnail-1-02-1.jpg" />
</a>
OR
### 1.2.2 VM in AWS
**Note**: You don't have to rent an instance in the cloud. You can follow the same instructions
for setting up your local environment.
<a href="https://www.youtube.com/watch?v=IXSiYkP23zo&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-1-02.jpg">
</a>
Code:
Recommended development environment: Linux
### Step 1: Download and install the Anaconda distribution of Python
```sh
wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh
bash Anaconda3-2022.05-Linux-x86_64.sh
```
### Step 2: Update existing packages
```sh
sudo apt update
```
### Step 3: Install Docker and Docker Compose
Follow the instructions here:
[install-using-the-repository](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)
Set up Docker's apt repository.
```sh
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```
Install the Docker packages.
```sh
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
To run docker without `sudo`:
```sh
sudo groupadd docker
sudo usermod -aG docker $USER
```
### Step 4: Run Docker
```sh
docker run hello-world
```
If you get `docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.` error, restart your VM instance, or run:
`sudo dockerd`
**Note**: If you get `It is required that your private key files are NOT accessible by others. This private key will be ignored.` error, you should change permits on the downloaded file to protect your private key:
```sh
chmod 400 name-of-your-private-key-file.pem
```
## 1.3 (Optional) Training a ride duration prediction model
**Note**: The NYC taxi data is now in parquet format, not CSV.
Here's a [video](https://www.youtube.com/watch?v=r94QjpX9vSE&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK) that explains how to
read parquet data.
<a href="https://www.youtube.com/watch?v=iRunifGSHFc&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-1-03.jpg">
</a>
Links:
* [Notebook](duration-prediction.ipynb)
## 1.4 Course overview
<a href="https://www.youtube.com/watch?v=teP9KWkP6SM&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-1-04.jpg">
</a>
## 1.5 MLOps maturity model
<a href="https://www.youtube.com/watch?v=XwTH8BDGzYk&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-1-05.jpg">
</a>
Links:
* [MLOps Maturity model](https://docs.microsoft.com/en-us/azure/architecture/example-scenario/mlops/mlops-maturity-model)
## 1.6 Homework
More information [here](../cohorts/2025/01-intro/homework.md).
## Notes
Did you take notes? Add them here:
* [Local MacOS envprep by Adetbekov](https://github.com/adetbekov/mlops-zoomcamp/blob/main/01-intro/macos-local-envprep.md)
* [Environment Setup by Ayoub](https://github.com/ayoub-berdeddouch/mlops-journey/blob/main/intro-01.md)
* [Intro, Environment Setup, and MLOps Maturity Models by Bala](https://github.com/balapriyac/DTC-MLOps-Zoomcamp/tree/main/week1)
* [GCP Environment Setup by Piyush](https://github.com/piyush-an/MLOps-ZoomCamp/blob/main/01-Introduction/infrastructure.md)
* [Microsoft Azure Environment Setup by Olaide](https://github.com/josepholaide/MLOps-Practice/blob/main/Week%201/README.md)
* [Environment Preparation using GCP and pyenv by Dani](https://github.com/syahrulhamdani/dtc-mlops/blob/main/week-1-introduction/README.md)
* [Useful links by Zioalex](https://github.com/zioalex/mlops-zoomcamp/blob/main/My_notes_week1.md)
* [Notes by Alvaro Navas](https://github.com/ziritrion/mlopszoomcamp/blob/main/notes/1_intro.md)
* [Environment setup on GCP (recycled from Data Engineering Zoomcamp)](https://gist.github.com/ziritrion/3214aa570e15ae09bf72c4587cb9d686)
* [Docker cheatsheet](https://gist.github.com/ziritrion/1842c8a4c4851602a8733bba19ab6050)
* [Conda cheatsheet](https://gist.github.com/ziritrion/8024025672ea92b8bdeb320d6015aa0d)
* [Git cheatsheet](https://gist.github.com/ziritrion/d73ca65bf4d19c79ca842a55853cb962)
* [Python and data libraries cheatseet](https://gist.github.com/ziritrion/9b80e47956adc0f20ecce209d494cd0a)
* [Cloud server setup using Deploifai (on AWS, Azure, or GCP) by 98sean98](https://github.com/98sean98/mlops-zoomcamp/blob/main/01-intro/deploifai-server/readme.md)
* [Notes from first lesson by Neimv](https://gitlab.com/neimv/mlops/-/blob/main/lessons_weeks/notes_1.md)
* [Course preliminaries (jupyterbook) by particle1331](https://particle1331.github.io/ok-transformer/nb/mlops/01-intro.html)
* [Notes by Francisco Delca (environment: local ubuntu + virtualvenv)](https://github.com/FDelca/mlops_datatalks_notes/blob/main/Week1/Week1-LearningNotes.ipynb)
* [What is MLOps? - Non-technical intro by Lorenz](https://github.com/LoHertel/Road-to-MLOps/blob/main/01-primer/README.md)
* [Notes for Week1 by Bhagabat](https://github.com/BPrasad123/MLOps_Zoomcamp/tree/main/Week1)
* [What is MLOps? - Storytime by Pathik Ghugare](https://github.com/pathikg/MLOps-Zoomcamp-DataTalks/blob/main/week-01-introduction/MLOps-Introduction.md)
* [Module 1 Notes by Stephen Barrie](https://stephen137.github.io/posts/MLOps_Zoomcamp_Week_1/MLOps_Zoomcamp_Week_1.html)
* [Module 1 Notes - MacOS + Pycharm by Hongfan (Amber)](https://github.com/Muhongfan/MLops/blob/main/01-intro/README.md)
* [Comprehensive guide to MLOps: Theory & Concepts for Beginners by Nithish Prabhu](https://ntp3105.github.io/Comprehensive-MLOps/Week-1/Introduction%20to%20MLOps.html)
* [Module 1 Notes -Video 1.2 Env Prep Ec2 troubleshooting notes for remote-ssh vscode to ec2](https://github.com/thatwonguy/mlops-zoomcamp/blob/personal/01-intro/README.md)
* [Ch1 notes by Marcus](https://github.com/mleiwe/mlops-zoomcamp/blob/Ch1_Marcus/cohorts/2024/01-intro/Ch1_Notes.md)
* [GCP setup instructions](https://github.com/mleiwe/mlops-zoomcamp/blob/Ch1_Marcus/cohorts/2024/01-intro/GoogleCloudSetUpNotes.md)
* [Machine Learning Essentials: FAQs on Linear Regression, One-Hot Encoding & RMSE](https://github.com/niting9881/course-mlops-zoomcamp/blob/main/01-intro/README.md)
* [GCP Environment Setup with Terraform + Cloud-Init by Artem](https://github.com/Ladn0/mlops-zoomcamp/tree/main/01-intro/notes)
* [Week 1 - local setup hints by hannarud](https://github.com/hannarud/mlops-zoomcamp-2025/blob/main/week1_notes.md)
* [Week-1 - Introduction to MLOps, Env Setup,Notebooks detailed Notes by Muhammad Shifa](https://github.com/MuhammadShifa/mlops-zoomcamp2025/tree/main/01-introduction#readme)
* Send a PR, add your notes above this line
================================================
FILE: 01-intro/duration-prediction.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "b2bd82d7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python 3.9.7\r\n"
]
}
],
"source": [
"!python -V"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "41062d8a",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "c984c564",
"metadata": {},
"outputs": [],
"source": [
"import pickle"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "4add538c",
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "8b135c2b",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.feature_extraction import DictVectorizer\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.linear_model import Lasso\n",
"from sklearn.linear_model import Ridge\n",
"\n",
"from sklearn.metrics import root_mean_squared_error"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "8e013caf",
"metadata": {},
"outputs": [],
"source": [
"df = pd.read_parquet('./data/green_tripdata_2021-01.parquet')\n",
"\n",
"df['duration'] = df.lpep_dropoff_datetime - df.lpep_pickup_datetime\n",
"df.duration = df.duration.apply(lambda td: td.total_seconds() / 60)\n",
"\n",
"df = df[(df.duration >= 1) & (df.duration <= 60)]\n",
"\n",
"categorical = ['PULocationID', 'DOLocationID']\n",
"numerical = ['trip_distance']\n",
"\n",
"df[categorical] = df[categorical].astype(str)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "116ff0cc",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9.775464208836793"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"train_dicts = df[categorical + numerical].to_dict(orient='records')\n",
"\n",
"dv = DictVectorizer()\n",
"X_train = dv.fit_transform(train_dicts)\n",
"\n",
"target = 'duration'\n",
"y_train = df[target].values\n",
"\n",
"lr = LinearRegression()\n",
"lr.fit(X_train, y_train)\n",
"\n",
"y_pred = lr.predict(X_train)\n",
"\n",
"root_mean_squared_error(y_train, y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b134c97b",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ubuntu/anaconda3/lib/python3.9/site-packages/seaborn/distributions.py:2619: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n",
" warnings.warn(msg, FutureWarning)\n",
"/home/ubuntu/anaconda3/lib/python3.9/site-packages/seaborn/distributions.py:2619: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n",
" warnings.warn(msg, FutureWarning)\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7fb6397fad60>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sns.distplot(y_pred, label='prediction')\n",
"sns.distplot(y_train, label='actual')\n",
"\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "f9e6479e",
"metadata": {},
"outputs": [],
"source": [
"def read_dataframe(filename):\n",
" if filename.endswith('.csv'):\n",
" df = pd.read_csv(filename)\n",
"\n",
" df.lpep_dropoff_datetime = pd.to_datetime(df.lpep_dropoff_datetime)\n",
" df.lpep_pickup_datetime = pd.to_datetime(df.lpep_pickup_datetime)\n",
" elif filename.endswith('.parquet'):\n",
" df = pd.read_parquet(filename)\n",
"\n",
" df['duration'] = df.lpep_dropoff_datetime - df.lpep_pickup_datetime\n",
" df.duration = df.duration.apply(lambda td: td.total_seconds() / 60)\n",
"\n",
" df = df[(df.duration >= 1) & (df.duration <= 60)]\n",
"\n",
" categorical = ['PULocationID', 'DOLocationID']\n",
" df[categorical] = df[categorical].astype(str)\n",
" \n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "8029eba0",
"metadata": {},
"outputs": [],
"source": [
"df_train = read_dataframe('./data/green_tripdata_2021-01.parquet')\n",
"df_val = read_dataframe('./data/green_tripdata_2021-02.parquet')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "f6f2f0eb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(73908, 61921)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(df_train), len(df_val)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "951d51ef",
"metadata": {},
"outputs": [],
"source": [
"df_train['PU_DO'] = df_train['PULocationID'] + '_' + df_train['DOLocationID']\n",
"df_val['PU_DO'] = df_val['PULocationID'] + '_' + df_val['DOLocationID']"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "c5cbfc25",
"metadata": {},
"outputs": [],
"source": [
"categorical = ['PU_DO'] #'PULocationID', 'DOLocationID']\n",
"numerical = ['trip_distance']\n",
"\n",
"dv = DictVectorizer()\n",
"\n",
"train_dicts = df_train[categorical + numerical].to_dict(orient='records')\n",
"X_train = dv.fit_transform(train_dicts)\n",
"\n",
"val_dicts = df_val[categorical + numerical].to_dict(orient='records')\n",
"X_val = dv.transform(val_dicts)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "1e9fb68b",
"metadata": {},
"outputs": [],
"source": [
"target = 'duration'\n",
"y_train = df_train[target].values\n",
"y_val = df_val[target].values"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "429e2394",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"7.479513631630414"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr = LinearRegression()\n",
"lr.fit(X_train, y_train)\n",
"\n",
"y_pred = lr.predict(X_val)\n",
"\n",
"root_mean_squared_error(y_val, y_pred)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "22bf6f8b",
"metadata": {},
"outputs": [],
"source": [
"with open('models/lin_reg.bin', 'wb') as f_out:\n",
" pickle.dump((dv, lr), f_out)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "a4999b94",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"11.167275941179728"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr = Lasso(0.01)\n",
"lr.fit(X_train, y_train)\n",
"\n",
"y_pred = lr.predict(X_val)\n",
"\n",
"root_mean_squared_error(y_val, y_pred)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "47b0eb9b",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
================================================
FILE: 01-intro/meta.json
================================================
{
"module": {
"number": 1,
"title": "Introduction"
},
"units": [
{
"number": 1,
"title": "Introduction",
"youtube": "https://www.youtube.com/watch?v=s0uaFZSzwfI"
},
{
"number": 2,
"title": "Environment preparation",
"youtube": "https://www.youtube.com/watch?v=IXSiYkP23zo"
},
{
"number": 3,
"title": "(Optional) Training a ride duration prediction model",
"youtube": "https://www.youtube.com/watch?v=iRunifGSHFc"
},
{
"number": 4,
"title": "Course overview",
"youtube": "https://www.youtube.com/watch?v=teP9KWkP6SM"
},
{
"number": 5,
"title": "MLOps maturity model",
"youtube": "https://www.youtube.com/watch?v=XwTH8BDGzYk"
},
{
"number": 6,
"title": "Homework",
"youtube": ""
}
]
}
================================================
FILE: 02-experiment-tracking/README.md
================================================
# 2. Experiment tracking and model management
* [Slides](https://drive.google.com/file/d/1YtkAtOQS3wvY7yts_nosVlXrLQBq5q37/view?usp=sharing)
* **NOTE:** `list_experiments` has been replaced by `search_experiments`. Some notebooks used in this course might need to be updated. | [Reference](https://github.com/mlflow/mlflow/issues/8941)
## 2.1 Experiment tracking intro
<a href="https://www.youtube.com/watch?v=MiA7LQin9c8&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-2-01.jpg">
</a>
## 2.2 Getting started with MLflow
<a href="https://www.youtube.com/watch?v=cESCQE9J3ZE&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-2-02.jpg">
</a>
Note: in the videos, Cristian uses Jupyter in VS code and runs everything locally
But if you set up a VM in the previous module, you can keep using it
and use the usual Jupyter from your browser. There's no significant
difference between using Jupyter with VS code and without
## 2.3 Experiment tracking with MLflow
<a href="https://www.youtube.com/watch?v=iaJz-T7VWec&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-2-03.jpg">
</a>
## 2.4 Model management
<a href="https://www.youtube.com/watch?v=OVUPIX88q88&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-2-04.jpg">
</a>
## 2.5 Model registry
<a href="https://www.youtube.com/watch?v=TKHU7HAvGH8&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-2-05.jpg">
</a>
> **Starting MLflow 2.9, model registry stages are deprecated.**
Please use model version tags and aliases instead of stages. For example, instead of `transition_model_version_stage(name, version, stage)` use `set_registered_model_alias(name, alias, version)`. More details [here](https://github.com/mlflow/mlflow/issues/10336) and [here](https://mlflow.org/docs/latest/model-registry.html).
## 2.6 MLflow in practice
<a href="https://www.youtube.com/watch?v=1ykg4YmbFVA&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-2-06.jpg">
</a>
## 2.7 MLflow: benefits, limitations and alternatives
<a href="https://www.youtube.com/watch?v=Lugy1JPsBRY&list=PL3MmuxUbc_hIUISrluw_A7wDSmfOhErJK">
<img src="images/thumbnail-2-07.jpg">
</a>
## 2.7 Homework
More information [here](../cohorts/2025/02-experiment-tracking/homework.md).
## Notes
Did you take notes? Add them here:
* [Notes/General Docs on MLflow by Ayoub](https://gist.github.com/Qfl3x/ccff6b0708358c040e437d52af0c2e43)
* [Minimalist MLflow code reference by Anna V](https://github.com/annnvv/mlops_zoomcamp/blob/main/notes/module2_notes_MLflow.md)
* [Notes from second lesson by Neimv](https://gitlab.com/neimv/mlops/-/blob/main/lessons_weeks/notes_2.md)
* [2nd Week Experiment & Tracking notes by Ayoub.B](https://github.com/ayoub-berdeddouch/mlops-journey/blob/main/experiment_tracking_02.md)
* [Experiment tracking (jupyterbook) by particle1331](https://particle1331.github.io/ok-transformer/nb/mlops/03-mlflow.html)
* [Week 2: Experiment & Tracking Notes by Bengsoon Chuah](https://github.com/bengsoon/mlops-zoomcamp/blob/main/02-experiment-tracking/notes/Experiment_Tracking_notes.md)
* [2.4 Model Management Notes by Alvaro Pena](https://github.com/alvarofps/mlops-zoomcamp/blob/main/02-experiment-tracking/my-notes/2.4%20Model%20management.md)
* [Notes by Alvaro Navas](https://github.com/ziritrion/mlopszoomcamp/blob/main/notes/2_experiment.md)
* [Notebook from froukje](https://github.com/froukje/ml-ops-zoomcamp/blob/master/02-experiment-tracking/week02.ipynb) and [notes](https://medium.com/@falbrechtg/getting-started-with-mlflow-tracking-46a0089d6a73)
* [Blog post on setting up MLFlow on GCP by Isaac Kargar](https://kargarisaac.github.io/blog/mlops/data%20engineering/2022/06/15/MLFlow-on-GCP.html).
* [Week2: Experiment tracking notes and notebook by Bhagabat](https://github.com/BPrasad123/MLOps_Zoomcamp/tree/main/Week2)
* [Notes of ML-flow by Jaime Cabrera-Salcedo](https://github.com/jaimeh94/MLOps-Zoomcamp/tree/main/02-experiment-tracking)
* [Experiment tracking with MLflow by Hongfan (Amber)](https://github.com/Muhongfan/MLops/blob/main/02-experiment-tracking/README.md)
* [Running MLflow with Docker and on Minikube](https://open.substack.com/pub/asfandqazi/p/mlflow-on-minikube?r=2o17tf&utm_campaign=post&utm_medium=web)
* [Chapter 2: Full Notes by Marcus](https://github.com/mleiwe/mlops-zoomcamp/blob/Ch2_Marcus/cohorts/2024/02-experiment-tracking/Ch2_notes.md)
* [Experiemnt Tracking and Mlflow by Annaliese Tech](https://github.com/AnnalieseTech/MLOPS_ZOOMCAMP/blob/main/02_EXPERIMENT_TRACKING/EXPERIMENT_TRACKING_NOTES.md)
* [Adding Hyperparameter Tuning to Your Notebook with MLflow and Hyperopt by Annaliese Tech](https://github.com/AnnalieseTech/MLOPS_ZOOMCAMP/blob/main/02_EXPERIMENT_TRACKING/Hyperparameter-Tuning.md)
* [MLFlow setup and Experiment Tracking by Hokfu](https://github.com/Hokfu/MLOps_Zoomcamp_Study/blob/main/02-experiment-tracking/README.md)
* [2025 Cohort | Notes on MLflow & Hyperopt by Gabi Fonseca](https://github.com/fonsecagabriella/ml_ops/blob/main/02_experiment_tracking/__notes.md)
* [Homework 2 Experiment and Tracking article by Srikanth Ganji](https://medium.com/@srikanth.unix07/mlops-zoomcamp-2025-homework-2-experiment-tracking-with-mlflow-4ea1ed783531)
* [Week-2 - Detailed Notes of MLFlow, Experiment Tracking, Notebooks, Homework by Muhammad Shifa](https://github.com/MuhammadShifa/mlops-zoomcamp2025/blob/main/02-experiment-tracking/README.md)
* Send a PR, add your notes above this line
================================================
FILE: 02-experiment-tracking/duration-prediction.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "b2bd82d7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python 3.9.12\n"
]
}
],
"source": [
"!python -V"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "41062d8a",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "c984c564",
"metadata": {},
"outputs": [],
"source": [
"import pickle"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "4add538c",
"metadata": {},
"outputs": [],
"source": [
"import seaborn as sns\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "8b135c2b",
"metadata": {},
"outputs": [],
"source": [
"from sklearn.feature_extraction import DictVectorizer\n",
"from sklearn.linear_model import LinearRegression\n",
"from sklearn.linear_model import Lasso\n",
"from sklearn.linear_model import Ridge\n",
"\n",
"from sklearn.metrics import mean_squared_error"
]
},
{
"cell_type": "code",
"execution_count": 44,
"id": "1464985f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<Experiment: artifact_location='./mlruns/1', experiment_id='1', lifecycle_stage='active', name='nyc-taxi-experiment', tags={}>"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import mlflow\n",
"\n",
"\n",
"mlflow.set_tracking_uri(\"sqlite:///mlflow.db\")\n",
"mlflow.set_experiment(\"nyc-taxi-experiment\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "f9e6479e",
"metadata": {},
"outputs": [],
"source": [
"def read_dataframe(filename):\n",
" df = pd.read_csv(filename)\n",
"\n",
" df.lpep_dropoff_datetime = pd.to_datetime(df.lpep_dropoff_datetime)\n",
" df.lpep_pickup_datetime = pd.to_datetime(df.lpep_pickup_datetime)\n",
"\n",
" df['duration'] = df.lpep_dropoff_datetime - df.lpep_pickup_datetime\n",
" df.duration = df.duration.apply(lambda td: td.total_seconds() / 60)\n",
"\n",
" df = df[(df.duration >= 1) & (df.duration <= 60)]\n",
"\n",
" categorical = ['PULocationID', 'DOLocationID']\n",
" df[categorical] = df[categorical].astype(str)\n",
" \n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "8029eba0",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/42/f9s_rgk15078ym2w50_xtc180000gq/T/ipykernel_4832/3970424726.py:2: DtypeWarning: Columns (3) have mixed types. Specify dtype option on import or set low_memory=False.\n",
" df = pd.read_csv(filename)\n"
]
}
],
"source": [
"df_train = read_dataframe('./data/green_tripdata_2021-01.csv')\n",
"df_val = read_dataframe('./data/green_tripdata_2021-02.csv')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "f6f2f0eb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(73908, 61921)"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(df_train), len(df_val)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "951d51ef",
"metadata": {},
"outputs": [],
"source": [
"df_train['PU_DO'] = df_train['PULocationID'] + '_' + df_train['DOLocationID']\n",
"df_val['PU_DO'] = df_val['PULocationID'] + '_' + df_val['DOLocationID']"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "c5cbfc25",
"metadata": {},
"outputs": [],
"source": [
"categorical = ['PU_DO'] #'PULocationID', 'DOLocationID']\n",
"numerical = ['trip_distance']\n",
"\n",
"dv = DictVectorizer()\n",
"\n",
"train_dicts = df_train[categorical + numerical].to_dict(orient='records')\n",
"X_train = dv.fit_transform(train_dicts)\n",
"\n",
"val_dicts = df_val[categorical + numerical].to_dict(orient='records')\n",
"X_val = dv.transform(val_dicts)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "1e9fb68b",
"metadata": {},
"outputs": [],
"source": [
"target = 'duration'\n",
"y_train = df_train[target].values\n",
"y_val = df_val[target].values"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "429e2394",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"7.758715210382775"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lr = LinearRegression()\n",
"lr.fit(X_train, y_train)\n",
"\n",
"y_pred = lr.predict(X_val)\n",
"\n",
"mean_squared_error(y_val, y_pred, squared=False)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "22bf6f8b",
"metadata": {},
"outputs": [],
"source": [
"with open('models/lin_reg.bin', 'wb') as f_out:\n",
" pickle.dump((dv, lr), f_out)"
]
},
{
"cell_type": "code",
"execution_count": 47,
"id": "a4999b94",
"metadata": {},
"outputs": [],
"source": [
"with mlflow.start_run():\n",
"\n",
" mlflow.set_tag(\"developer\", \"cristian\")\n",
"\n",
" mlflow.log_param(\"train-data-path\", \"./data/green_tripdata_2021-01.csv\")\n",
" mlflow.log_param(\"valid-data-path\", \"./data/green_tripdata_2021-02.csv\")\n",
"\n",
" alpha = 0.1\n",
" mlflow.log_param(\"alpha\", alpha)\n",
" lr = Lasso(alpha)\n",
" lr.fit(X_train, y_train)\n",
"\n",
" y_pred = lr.predict(X_val)\n",
" rmse = mean_squared_error(y_val, y_pred, squared=False)\n",
" mlflow.log_metric(\"rmse\", rmse)\n",
"\n",
" mlflow.log_artifact(local_path=\"models/lin_reg.bin\", artifact_path=\"models_pickle\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "47b0eb9b",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 15,
"id": "5f56e97b",
"metadata": {},
"outputs": [],
"source": [
"import xgboost as xgb"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "907dc6a2",
"metadata": {},
"outputs": [],
"source": [
"from hyperopt import fmin, tpe, hp, STATUS_OK, Trials\n",
"from hyperopt.pyll import scope"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "091ab328",
"metadata": {},
"outputs": [],
"source": [
"train = xgb.DMatrix(X_train, label=y_train)\n",
"valid = xgb.DMatrix(X_val, label=y_val)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "c2d84b26",
"metadata": {},
"outputs": [],
"source": [
"def objective(params):\n",
" with mlflow.start_run():\n",
" mlflow.set_tag(\"model\", \"xgboost\")\n",
" mlflow.log_params(params)\n",
" booster = xgb.train(\n",
" params=params,\n",
" dtrain=train,\n",
" num_boost_round=1000,\n",
" evals=[(valid, 'validation')],\n",
" early_stopping_rounds=50\n",
" )\n",
" y_pred = booster.predict(valid)\n",
" rmse = mean_squared_error(y_val, y_pred, squared=False)\n",
" mlflow.log_metric(\"rmse\", rmse)\n",
"\n",
" return {'loss': rmse, 'status': STATUS_OK}"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "6b1f77f5",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[12:38:06] WARNING: /Users/runner/work/xgboost/xgboost/python-package/build/temp.macosx-11.0-arm64-3.8/xgboost/src/objective/regression_obj.cu:203: reg:linear is now deprecated in favor of reg:squarederror.\n",
"[0]\tvalidation-rmse:11.27920 \n",
"[1]\tvalidation-rmse:8.01759 \n",
"[2]\tvalidation-rmse:7.08526 \n",
"[3]\tvalidation-rmse:6.80494 \n",
"[4]\tvalidation-rmse:6.70455 \n",
"[5]\tvalidation-rmse:6.66392 \n",
"[6]\tvalidation-rmse:6.64210 \n",
"[7]\tvalidation-rmse:6.63159 \n",
"[8]\tvalidation-rmse:6.62676 \n",
"[9]\tvalidation-rmse:6.62346 \n",
"[10]\tvalidation-rmse:6.62027 \n",
"[11]\tvalidation-rmse:6.61790 \n",
"[12]\tvalidation-rmse:6.61591 \n",
"[13]\tvalidation-rmse:6.61457 \n",
"[14]\tvalidation-rmse:6.61208 \n",
"[15]\tvalidation-rmse:6.60727 \n",
"[16]\tvalidation-rmse:6.60534 \n",
"[17]\tvalidation-rmse:6.60406 \n",
"[18]\tvalidation-rmse:6.60130 \n",
"[19]\tvalidation-rmse:6.60099 \n",
"[20]\tvalidation-rmse:6.59977 \n",
"[21]\tvalidation-rmse:6.59743 \n",
"[22]\tvalidation-rmse:6.59615 \n",
"[23]\tvalidation-rmse:6.59525 \n",
"[24]\tvalidation-rmse:6.59426 \n",
"[25]\tvalidation-rmse:6.59344 \n",
"[26]\tvalidation-rmse:6.59256 \n",
"[27]\tvalidation-rmse:6.59171 \n",
"[28]\tvalidation-rmse:6.59147 \n",
"[29]\tvalidation-rmse:6.58954 \n",
"[30]\tvalidation-rmse:6.58971 \n",
"[31]\tvalidation-rmse:6.58914 \n",
"[32]\tvalidation-rmse:6.58899 \n",
"[33]\tvalidation-rmse:6.58854 \n",
"[34]\tvalidation-rmse:6.58800 \n",
"[35]\tvalidation-rmse:6.58843 \n",
"[36]\tvalidation-rmse:6.58843 \n",
"[37]\tvalidation-rmse:6.58830 \n",
"[38]\tvalidation-rmse:6.58821 \n",
"[39]\tvalidation-rmse:6.58807 \n",
"[40]\tvalidation-rmse:6.58789 \n",
"[41]\tvalidation-rmse:6.58760 \n",
"[42]\tvalidation-rmse:6.58753 \n",
"[43]\tvalidation-rmse:6.58801 \n",
"[44]\tvalidation-rmse:6.58824 \n",
"[45]\tvalidation-rmse:6.58705 \n",
"[46]\tvalidation-rmse:6.58718 \n",
"[47]\tvalidation-rmse:6.58745 \n",
"[48]\tvalidation-rmse:6.58593 \n",
"[49]\tvalidation-rmse:6.58587 \n",
"[50]\tvalidation-rmse:6.58564 \n",
"[51]\tvalidation-rmse:6.58451 \n",
"[52]\tvalidation-rmse:6.58450 \n",
"[53]\tvalidation-rmse:6.58429 \n",
"[54]\tvalidation-rmse:6.58450 \n",
"[55]\tvalidation-rmse:6.58429 \n",
"[56]\tvalidation-rmse:6.58379 \n",
"[57]\tvalidation-rmse:6.58365 \n",
"[58]\tvalidation-rmse:6.58416 \n",
"[59]\tvalidation-rmse:6.58427 \n",
"[60]\tvalidation-rmse:6.58358 \n",
"[61]\tvalidation-rmse:6.58404 \n",
"[62]\tvalidation-rmse:6.58352 \n",
"[63]\tvalidation-rmse:6.58314 \n",
"[64]\tvalidation-rmse:6.58317 \n",
"[65]\tvalidation-rmse:6.58325 \n",
"[66]\tvalidation-rmse:6.58308 \n",
"[67]\tvalidation-rmse:6.58327 \n",
"[68]\tvalidation-rmse:6.58338 \n",
"[69]\tvalidation-rmse:6.58339 \n",
"[70]\tvalidation-rmse:6.58306 \n",
"[71]\tvalidation-rmse:6.58300 \n",
"[72]\tvalidation-rmse:6.58322 \n",
"[73]\tvalidation-rmse:6.58246 \n",
"[74]\tvalidation-rmse:6.58218 \n",
"[75]\tvalidation-rmse:6.58220 \n",
"[76]\tvalidation-rmse:6.58216 \n",
"[77]\tvalidation-rmse:6.58211 \n",
"[78]\tvalidation-rmse:6.58200 \n",
"[79]\tvalidation-rmse:6.58218 \n",
"[80]\tvalidation-rmse:6.58266 \n",
"[81]\tvalidation-rmse:6.58407 \n",
"[82]\tvalidation-rmse:6.58394 \n",
"[83]\tvalidation-rmse:6.58766 \n",
"[84]\tvalidation-rmse:6.58808 \n",
"[85]\tvalidation-rmse:6.58788 \n",
"[86]\tvalidation-rmse:6.58806 \n",
"[87]\tvalidation-rmse:6.58781 \n",
"[88]\tvalidation-rmse:6.58830 \n",
"[89]\tvalidation-rmse:6.58842 \n",
"[90]\tvalidation-rmse:6.58867 \n",
"[91]\tvalidation-rmse:6.58835 \n",
"[92]\tvalidation-rmse:6.58843 \n",
"[93]\tvalidation-rmse:6.58829 \n",
"[94]\tvalidation-rmse:6.58857 \n",
"[95]\tvalidation-rmse:6.58837 \n",
"[96]\tvalidation-rmse:6.58828 \n",
"[97]\tvalidation-rmse:6.58856 \n",
"[98]\tvalidation-rmse:6.58840 \n",
"[99]\tvalidation-rmse:6.58855 \n",
"[100]\tvalidation-rmse:6.58857 \n",
"[101]\tvalidation-rmse:6.58902 \n",
"[102]\tvalidation-rmse:6.58965 \n",
"[103]\tvalidation-rmse:6.59053 \n",
"[104]\tvalidation-rmse:6.59091 \n",
"[105]\tvalidation-rmse:6.59235 \n",
"[106]\tvalidation-rmse:6.59203 \n",
"[107]\tvalidation-rmse:6.59191 \n",
"[108]\tvalidation-rmse:6.59157 \n",
"[109]\tvalidation-rmse:6.59161 \n",
"[110]\tvalidation-rmse:6.59208 \n",
"[111]\tvalidation-rmse:6.59198 \n",
"[112]\tvalidation-rmse:6.59159 \n",
"[113]\tvalidation-rmse:6.59122 \n",
"[114]\tvalidation-rmse:6.59135 \n",
"[115]\tvalidation-rmse:6.59117 \n",
"[116]\tvalidation-rmse:6.59120 \n",
"[117]\tvalidation-rmse:6.59102 \n",
"[118]\tvalidation-rmse:6.59076 \n",
"[119]\tvalidation-rmse:6.59063 \n",
"[120]\tvalidation-rmse:6.59097 \n",
"[121]\tvalidation-rmse:6.59099 \n",
"[122]\tvalidation-rmse:6.59098 \n",
"[123]\tvalidation-rmse:6.59092 \n",
"[124]\tvalidation-rmse:6.59113 \n",
"[125]\tvalidation-rmse:6.59149 \n",
"[126]\tvalidation-rmse:6.59154 \n",
"[127]\tvalidation-rmse:6.59138 \n",
"[128]\tvalidation-rmse:6.59115 \n",
"[12:38:33] WARNING: /Users/runner/work/xgboost/xgboost/python-package/build/temp.macosx-11.0-arm64-3.8/xgboost/src/objective/regression_obj.cu:203: reg:linear is now deprecated in favor of reg:squarederror.\n",
"[0]\tvalidation-rmse:20.25179 \n",
"[1]\tvalidation-rmse:19.36542 \n",
"[2]\tvalidation-rmse:18.53081 \n",
"[3]\tvalidation-rmse:17.74354 \n",
"[4]\tvalidation-rmse:17.00251 \n",
"[5]\tvalidation-rmse:16.30619 \n",
"[6]\tvalidation-rmse:15.65125 \n",
"[7]\tvalidation-rmse:15.03645 \n",
"[8]\tvalidation-rmse:14.45918 \n",
"[9]\tvalidation-rmse:13.91665 \n",
"[10]\tvalidation-rmse:13.40839 \n",
"[11]\tvalidation-rmse:12.93222 \n",
"[12]\tvalidation-rmse:12.48605 \n",
"[13]\tvalidation-rmse:12.06667 \n",
"[14]\tvalidation-rmse:11.67720 \n",
"[15]\tvalidation-rmse:11.31099 \n",
"[16]\tvalidation-rmse:10.97043 \n",
"[17]\tvalidation-rmse:10.65298 \n",
"[18]\tvalidation-rmse:10.35607 \n",
"[19]\tvalidation-rmse:10.07940 \n",
"[20]\tvalidation-rmse:9.82233 \n",
"[21]\tvalidation-rmse:9.58395 \n",
"[22]\tvalidation-rmse:9.36035 \n",
"[23]\tvalidation-rmse:9.15318 \n",
"[24]\tvalidation-rmse:8.96136 \n",
"[25]\tvalidation-rmse:8.78314 \n",
"[26]\tvalidation-rmse:8.61892 \n",
"[27]\tvalidation-rmse:8.46559 \n",
"[28]\tvalidation-rmse:8.32417 \n",
"[29]\tvalidation-rmse:8.19099 \n",
"[30]\tvalidation-rmse:8.06830 \n",
"[31]\tvalidation-rmse:7.95539 \n",
"[32]\tvalidation-rmse:7.85188 \n",
"[33]\tvalidation-rmse:7.75502 \n",
"[34]\tvalidation-rmse:7.66505 \n",
"[35]\tvalidation-rmse:7.58240 \n",
"[36]\tvalidation-rmse:7.50501 \n",
"[37]\tvalidation-rmse:7.43425 \n",
"[38]\tvalidation-rmse:7.36901 \n",
"[39]\tvalidation-rmse:7.30826 \n",
"[40]\tvalidation-rmse:7.25269 \n",
"[41]\tvalidation-rmse:7.20014 \n",
"[42]\tvalidation-rmse:7.15171 \n",
"[43]\tvalidation-rmse:7.10687 \n",
"[44]\tvalidation-rmse:7.06611 \n",
"[45]\tvalidation-rmse:7.02806 \n",
"[46]\tvalidation-rmse:6.99265 \n",
"[47]\tvalidation-rmse:6.95892 \n",
"[48]\tvalidation-rmse:6.92809 \n",
"[49]\tvalidation-rmse:6.89924 \n",
"[50]\tvalidation-rmse:6.87288 \n",
"[51]\tvalidation-rmse:6.84795 \n",
"[52]\tvalidation-rmse:6.82460 \n",
"[53]\tvalidation-rmse:6.80294 \n",
"[54]\tvalidation-rmse:6.78241 \n",
"[55]\tvalidation-rmse:6.76295 \n",
"[56]\tvalidation-rmse:6.74590 \n",
"[57]\tvalidation-rmse:6.72979 \n",
"[58]\tvalidation-rmse:6.71470 \n",
"[59]\tvalidation-rmse:6.70015 \n",
"[60]\tvalidation-rmse:6.68690 \n",
"[61]\tvalidation-rmse:6.67426 \n",
"[62]\tvalidation-rmse:6.66181 \n",
"[63]\tvalidation-rmse:6.65059 \n",
"[64]\tvalidation-rmse:6.63985 \n",
"[65]\tvalidation-rmse:6.62990 \n",
"[66]\tvalidation-rmse:6.62034 \n",
"[67]\tvalidation-rmse:6.61137 \n",
"[68]\tvalidation-rmse:6.60324 \n",
"[69]\tvalidation-rmse:6.59522 \n",
"[70]\tvalidation-rmse:6.58749 \n",
"[71]\tvalidation-rmse:6.58042 \n",
"[72]\tvalidation-rmse:6.57371 \n",
"[73]\tvalidation-rmse:6.56754 \n",
"[74]\tvalidation-rmse:6.56178 \n",
"[75]\tvalidation-rmse:6.55569 \n",
"[76]\tvalidation-rmse:6.55086 \n",
"[77]\tvalidation-rmse:6.54554 \n",
"[78]\tvalidation-rmse:6.54087 \n",
"[79]\tvalidation-rmse:6.53628 \n",
"[80]\tvalidation-rmse:6.53199 \n",
"[81]\tvalidation-rmse:6.52792 \n",
"[82]\tvalidation-rmse:6.52447 \n",
"[83]\tvalidation-rmse:6.52091 \n",
"[84]\tvalidation-rmse:6.51810 \n",
"[85]\tvalidation-rmse:6.51494 \n",
"[86]\tvalidation-rmse:6.51163 \n",
"[87]\tvalidation-rmse:6.50891 \n",
"[88]\tvalidation-rmse:6.50658 \n",
"[89]\tvalidation-rmse:6.50427 \n",
"[90]\tvalidation-rmse:6.50226 \n",
"[91]\tvalidation-rmse:6.49986 \n",
"[92]\tvalidation-rmse:6.49808 \n",
"[93]\tvalidation-rmse:6.49611 \n",
"[94]\tvalidation-rmse:6.49413 \n",
"[95]\tvalidation-rmse:6.49235 \n",
"[96]\tvalidation-rmse:6.49057 \n",
"[97]\tvalidation-rmse:6.48907 \n",
"[98]\tvalidation-rmse:6.48752 \n",
"[99]\tvalidation-rmse:6.48619 \n",
"[100]\tvalidation-rmse:6.48484 \n",
"[101]\tvalidation-rmse:6.48354 \n",
"[102]\tvalidation-rmse:6.48240 \n",
"[103]\tvalidation-rmse:6.48114 \n",
"[104]\tvalidation-rmse:6.48014 \n",
"[105]\tvalidation-rmse:6.47892 \n",
"[106]\tvalidation-rmse:6.47794 \n",
"[107]\tvalidation-rmse:6.47678 \n",
"[108]\tvalidation-rmse:6.47583 \n",
"[109]\tvalidation-rmse:6.47496 \n",
"[110]\tvalidation-rmse:6.47400 \n",
"[111]\tvalidation-rmse:6.47329 \n",
"[112]\tvalidation-rmse:6.47217 \n",
"[113]\tvalidation-rmse:6.47119 \n",
"[114]\tvalidation-rmse:6.47028 \n",
"[115]\tvalidation-rmse:6.46962 \n",
"[116]\tvalidation-rmse:6.46903 \n",
"[117]\tvalidation-rmse:6.46802 \n",
"[118]\tvalidation-rmse:6.46745 \n",
"[119]\tvalidation-rmse:6.46670 \n",
"[120]\tvalidation-rmse:6.46586 \n",
"[121]\tvalidation-rmse:6.46499 \n",
"[122]\tvalidation-rmse:6.46439 \n",
"[123]\tvalidation-rmse:6.46347 \n",
"[124]\tvalidation-rmse:6.46272 \n",
"[125]\tvalidation-rmse:6.46183 \n",
"[126]\tvalidation-rmse:6.46088 \n",
"[127]\tvalidation-rmse:6.46006 \n",
"[128]\tvalidation-rmse:6.45929 \n",
"[129]\tvalidation-rmse:6.45859 \n",
"[130]\tvalidation-rmse:6.45807 \n",
"[131]\tvalidation-rmse:6.45737 \n",
"[132]\tvalidation-rmse:6.45700 \n",
"[133]\tvalidation-rmse:6.45650 \n",
"[134]\tvalidation-rmse:6.45598 \n",
"[135]\tvalidation-rmse:6.45556 \n",
"[136]\tvalidation-rmse:6.45514 \n",
"[137]\tvalidation-rmse:6.45463 \n",
"[138]\tvalidation-rmse:6.45426 \n",
"[139]\tvalidation-rmse:6.45381 \n",
"[140]\tvalidation-rmse:6.45300 \n",
"[141]\tvalidation-rmse:6.45255 \n",
"[142]\tvalidation-rmse:6.45177 \n",
"[143]\tvalidation-rmse:6.45140 \n",
"[144]\tvalidation-rmse:6.45080 \n",
"[145]\tvalidation-rmse:6.45042 \n",
"[146]\tvalidation-rmse:6.44977 \n",
"[147]\tvalidation-rmse:6.44933 \n",
"[148]\tvalidation-rmse:6.44894 \n",
"[149]\tvalidation-rmse:6.44866 \n",
"[150]\tvalidation-rmse:6.44828 \n",
"[151]\tvalidation-rmse:6.44777 \n",
"[152]\tvalidation-rmse:6.44722 \n",
"[153]\tvalidation-rmse:6.44681 \n",
"[154]\tvalidation-rmse:6.44645 \n",
"[155]\tvalidation-rmse:6.44628 \n",
"[156]\tvalidation-rmse:6.44598 \n",
"[157]\tvalidation-rmse:6.44543 \n",
"[158]\tvalidation-rmse:6.44503 \n",
"[159]\tvalidation-rmse:6.44431 \n",
"[160]\tvalidation-rmse:6.44401 \n",
"[161]\tvalidation-rmse:6.44353 \n",
"[162]\tvalidation-rmse:6.44325 \n",
"[163]\tvalidation-rmse:6.44270 \n",
"[164]\tvalidation-rmse:6.44252 \n",
"[165]\tvalidation-rmse:6.44223 \n",
"[166]\tvalidation-rmse:6.44168 \n",
"[167]\tvalidation-rmse:6.44116 \n",
"[168]\tvalidation-rmse:6.44102 \n",
"[169]\tvalidation-rmse:6.44082 \n",
"[170]\tvalidation-rmse:6.44024 \n",
"[171]\tvalidation-rmse:6.43970 \n",
"[172]\tvalidation-rmse:6.43954 \n",
"[173]\tvalidation-rmse:6.43922 \n",
"[174]\tvalidation-rmse:6.43901 \n",
"[175]\tvalidation-rmse:6.43870 \n",
"[176]\tvalidation-rmse:6.43837 \n",
"[177]\tvalidation-rmse:6.43793 \n",
"[178]\tvalidation-rmse:6.43753 \n",
"[179]\tvalidation-rmse:6.43693 \n",
"[180]\tvalidation-rmse:6.43678 \n",
"[181]\tvalidation-rmse:6.43632 \n",
"[182]\tvalidation-rmse:6.43606 \n",
"[183]\tvalidation-rmse:6.43566 \n",
"[184]\tvalidation-rmse:6.43550 \n",
"[185]\tvalidation-rmse:6.43513 \n",
"[186]\tvalidation-rmse:6.43489 \n",
"[187]\tvalidation-rmse:6.43469 \n",
"[188]\tvalidation-rmse:6.43447 \n",
"[189]\tvalidation-rmse:6.43426 \n",
"[190]\tvalidation-rmse:6.43402 \n",
"[191]\tvalidation-rmse:6.43357 \n",
"[192]\tvalidation-rmse:6.43319 \n",
"[193]\tvalidation-rmse:6.43305 \n",
"[194]\tvalidation-rmse:6.43278 \n",
"[195]\tvalidation-rmse:6.43269 \n",
"[196]\tvalidation-rmse:6.43246 \n",
"[197]\tvalidation-rmse:6.43207 \n",
"[198]\tvalidation-rmse:6.43179 \n",
"[199]\tvalidation-rmse:6.43138 \n",
"[200]\tvalidation-rmse:6.43120 \n",
"[201]\tvalidation-rmse:6.43070 \n",
"[202]\tvalidation-rmse:6.43048 \n",
"[203]\tvalidation-rmse:6.43003 \n",
"[204]\tvalidation-rmse:6.42985 \n",
"[205]\tvalidation-rmse:6.42947 \n",
"[206]\tvalidation-rmse:6.42934 \n",
"[207]\tvalidation-rmse:6.42918 \n",
"[208]\tvalidation-rmse:6.42887 \n",
"[209]\tvalidation-rmse:6.42867 \n",
"[210]\tvalidation-rmse:6.42851 \n",
"[211]\tvalidation-rmse:6.42833 \n",
"[212]\tvalidation-rmse:6.42802 \n",
"[213]\tvalidation-rmse:6.42771 \n",
"[214]\tvalidation-rmse:6.42739 \n",
"[215]\tvalidation-rmse:6.42718 \n",
"[216]\tvalidation-rmse:6.42701 \n",
"[217]\tvalidation-rmse:6.42684 \n",
"[218]\tvalidation-rmse:6.42678 \n",
"[219]\tvalidation-rmse:6.42660 \n",
"[220]\tvalidation-rmse:6.42630 \n",
"[221]\tvalidation-rmse:6.42603 \n",
"[222]\tvalidation-rmse:6.42559 \n",
"[223]\tvalidation-rmse:6.42535 \n",
"[224]\tvalidation-rmse:6.42497 \n",
"[225]\tvalidation-rmse:6.42489 \n",
"[226]\tvalidation-rmse:6.42451 \n",
"[227]\tvalidation-rmse:6.42431 \n",
"[228]\tvalidation-rmse:6.42396 \n",
"[229]\tvalidation-rmse:6.42365 \n",
"[230]\tvalidation-rmse:6.42332 \n",
"[231]\tvalidation-rmse:6.42315 \n",
"[232]\tvalidation-rmse:6.42310 \n",
"[233]\tvalidation-rmse:6.42275 \n",
"[234]\tvalidation-rmse:6.42239 \n",
"[235]\tvalidation-rmse:6.42223 \n",
"[236]\tvalidation-rmse:6.42207 \n",
"[237]\tvalidation-rmse:6.42190 \n",
"[238]\tvalidation-rmse:6.42157 \n",
"[239]\tvalidation-rmse:6.42130 \n",
"[240]\tvalidation-rmse:6.42111 \n",
"[241]\tvalidation-rmse:6.42096 \n",
"[242]\tvalidation-rmse:6.42082 \n",
"[243]\tvalidation-rmse:6.42057 \n",
"[244]\tvalidation-rmse:6.42051 \n",
"[245]\tvalidation-rmse:6.42033 \n",
"[246]\tvalidation-rmse:6.42021 \n",
"[247]\tvalidation-rmse:6.41994 \n",
"[248]\tvalidation-rmse:6.41961 \n",
"[249]\tvalidation-rmse:6.41945 \n",
"[250]\tvalidation-rmse:6.41913 \n",
"[251]\tvalidation-rmse:6.41906 \n",
"[252]\tvalidation-rmse:6.41865 \n",
"[253]\tvalidation-rmse:6.41845 \n",
"[254]\tvalidation-rmse:6.41813 \n",
"[255]\tvalidation-rmse:6.41790 \n",
"[256]\tvalidation-rmse:6.41768 \n",
"[257]\tvalidation-rmse:6.41755 \n",
"[258]\tvalidation-rmse:6.41720 \n",
"[259]\tvalidation-rmse:6.41716 \n",
"[260]\tvalidation-rmse:6.41706 \n",
"[261]\tvalidation-rmse:6.41682 \n",
"[262]\tvalidation-rmse:6.41660 \n",
"[263]\tvalidation-rmse:6.41633 \n",
"[264]\tvalidation-rmse:6.41619 \n",
"[265]\tvalidation-rmse:6.41606 \n",
"[266]\tvalidation-rmse:6.41568 \n",
"[267]\tvalidation-rmse:6.41557 \n",
"[268]\tvalidation-rmse:6.41549 \n",
"[269]\tvalidation-rmse:6.41538 \n",
"[270]\tvalidation-rmse:6.41524 \n",
"[271]\tvalidation-rmse:6.41505 \n",
"[272]\tvalidation-rmse:6.41499 \n",
"[273]\tvalidation-rmse:6.41485 \n",
"[274]\tvalidation-rmse:6.41477 \n",
"[275]\tvalidation-rmse:6.41451 \n",
"[276]\tvalidation-rmse:6.41439 \n",
"[277]\tvalidation-rmse:6.41425 \n",
"[278]\tvalidation-rmse:6.41391 \n",
"[279]\tvalidation-rmse:6.41386 \n",
"[280]\tvalidation-rmse:6.41360 \n",
"[281]\tvalidation-rmse:6.41344 \n",
"[282]\tvalidation-rmse:6.41312 \n",
"[283]\tvalidation-rmse:6.41300 \n",
"[284]\tvalidation-rmse:6.41274 \n",
"[285]\tvalidation-rmse:6.41269 \n",
"[286]\tvalidation-rmse:6.41243 \n",
"[287]\tvalidation-rmse:6.41239 \n",
"[288]\tvalidation-rmse:6.41217 \n",
"[289]\tvalidation-rmse:6.41196 \n",
"[290]\tvalidation-rmse:6.41191 \n",
"[291]\tvalidation-rmse:6.41189 \n",
"[292]\tvalidation-rmse:6.41174 \n",
"[293]\tvalidation-rmse:6.41153 \n",
"[294]\tvalidation-rmse:6.41135 \n",
"[295]\tvalidation-rmse:6.41101 \n",
"[296]\tvalidation-rmse:6.41083 \n",
"[297]\tvalidation-rmse:6.41070 \n",
"[298]\tvalidation-rmse:6.41052 \n",
"[299]\tvalidation-rmse:6.41040 \n",
"[300]\tvalidation-rmse:6.41026 \n",
"[301]\tvalidation-rmse:6.41014 \n",
"[302]\tvalidation-rmse:6.41004 \n",
"[303]\tvalidation-rmse:6.40998 \n",
"[304]\tvalidation-rmse:6.40992 \n",
"[305]\tvalidation-rmse:6.40983 \n",
"[306]\tvalidation-rmse:6.40954 \n",
"[307]\tvalidation-rmse:6.40945 \n",
"[308]\tvalidation-rmse:6.40939 \n",
"[309]\tvalidation-rmse:6.40915 \n",
"[310]\tvalidation-rmse:6.40908 \n",
"[311]\tvalidation-rmse:6.40875 \n",
"[312]\tvalidation-rmse:6.40861 \n",
"[313]\tvalidation-rmse:6.40833 \n",
"[314]\tvalidation-rmse:6.40821 \n",
"[315]\tvalidation-rmse:6.40791 \n",
"[316]\tvalidation-rmse:6.40791 \n",
"[317]\tvalidation-rmse:6.40769 \n",
"[318]\tvalidation-rmse:6.40764 \n",
"[319]\tvalidation-rmse:6.40738 \n",
"[320]\tvalidation-rmse:6.40728 \n",
"[321]\tvalidation-rmse:6.40702 \n",
"[322]\tvalidation-rmse:6.40682 \n",
"[323]\tvalidation-rmse:6.40679 \n",
"[324]\tvalidation-rmse:6.40667 \n",
"[325]\tvalidation-rmse:6.40658 \n",
"[326]\tvalidation-rmse:6.40644 \n",
"[327]\tvalidation-rmse:6.40631 \n",
"[328]\tvalidation-rmse:6.40608 \n",
"[329]\tvalidation-rmse:6.40593 \n",
"[330]\tvalidation-rmse:6.40580 \n",
"[331]\tvalidation-rmse:6.40567 \n",
"[332]\tvalidation-rmse:6.40541 \n",
"[333]\tvalidation-rmse:6.40534 \n",
"[334]\tvalidation-rmse:6.40523 \n",
"[335]\tvalidation-rmse:6.40509 \n",
"[336]\tvalidation-rmse:6.40509 \n",
"[337]\tvalidation-rmse:6.40497 \n",
"[338]\tvalidation-rmse:6.40482 \n",
"[339]\tvalidation-rmse:6.40468 \n",
"[340]\tvalidation-rmse:6.40461 \n",
"[341]\tvalidation-rmse:6.40454 \n",
"[342]\tvalidation-rmse:6.40438 \n",
"[343]\tvalidation-rmse:6.40432 \n",
"[344]\tvalidation-rmse:6.40424 \n",
"[345]\tvalidation-rmse:6.40416 \n",
"[346]\tvalidation-rmse:6.40388 \n",
"[347]\tvalidation-rmse:6.40373 \n",
"[348]\tvalidation-rmse:6.40354 \n",
"[349]\tvalidation-rmse:6.40331 \n",
"[350]\tvalidation-rmse:6.40327 \n",
"[351]\tvalidation-rmse:6.40299 \n",
"[352]\tvalidation-rmse:6.40305 \n",
"[353]\tvalidation-rmse:6.40281 \n",
"[354]\tvalidation-rmse:6.40267 \n",
"[355]\tvalidation-rmse:6.40244 \n",
"[356]\tvalidation-rmse:6.40228 \n",
"[357]\tvalidation-rmse:6.40201 \n",
"[358]\tvalidation-rmse:6.40182 \n",
"[359]\tvalidation-rmse:6.40182 \n",
"[360]\tvalidation-rmse:6.40173 \n",
"[361]\tvalidation-rmse:6.40164 \n",
"[362]\tvalidation-rmse:6.40161 \n",
"[363]\tvalidation-rmse:6.40139 \n",
"[364]\tvalidation-rmse:6.40121 \n",
"[365]\tvalidation-rmse:6.40107 \n",
"[366]\tvalidation-rmse:6.40097 \n",
"[367]\tvalidation-rmse:6.40096 \n",
"[368]\tvalidation-rmse:6.40076 \n",
"[369]\tvalidation-rmse:6.40066 \n",
"[370]\tvalidation-rmse:6.40054 \n",
"[371]\tvalidation-rmse:6.40037 \n",
"[372]\tvalidation-rmse:6.40020 \n",
"[373]\tvalidation-rmse:6.40002 \n",
"[374]\tvalidation-rmse:6.39997 \n",
"[375]\tvalidation-rmse:6.40006 \n",
"[376]\tvalidation-rmse:6.39993 \n",
"[377]\tvalidation-rmse:6.39979 \n",
"[378]\tvalidation-rmse:6.39976 \n",
"[379]\tvalidation-rmse:6.39968 \n",
"[380]\tvalidation-rmse:6.39957 \n",
"[381]\tvalidation-rmse:6.39946 \n",
"[382]\tvalidation-rmse:6.39943 \n",
"[383]\tvalidation-rmse:6.39932 \n",
"[384]\tvalidation-rmse:6.39920 \n",
"[385]\tvalidation-rmse:6.39909 \n",
"[386]\tvalidation-rmse:6.39884 \n",
"[387]\tvalidation-rmse:6.39877 \n",
"[388]\tvalidation-rmse:6.39873 \n",
"[389]\tvalidation-rmse:6.39856 \n",
"[390]\tvalidation-rmse:6.39845 \n",
"[391]\tvalidation-rmse:6.39822 \n",
"[392]\tvalidation-rmse:6.39810 \n",
"[393]\tvalidation-rmse:6.39777 \n",
"[394]\tvalidation-rmse:6.39767 \n",
"[395]\tvalidation-rmse:6.39751 \n",
"[396]\tvalidation-rmse:6.39737 \n",
"[397]\tvalidation-rmse:6.39713 \n",
"[398]\tvalidation-rmse:6.39694 \n",
"[399]\tvalidation-rmse:6.39692 \n",
"[400]\tvalidation-rmse:6.39689 \n",
"[401]\tvalidation-rmse:6.39681 \n",
"[402]\tvalidation-rmse:6.39665 \n",
"[403]\tvalidation-rmse:6.39661 \n",
"[404]\tvalidation-rmse:6.39650 \n",
"[405]\tvalidation-rmse:6.39641 \n",
"[406]\tvalidation-rmse:6.39631 \n",
"[407]\tvalidation-rmse:6.39617 \n",
"[408]\tvalidation-rmse:6.39610 \n",
"[409]\tvalidation-rmse:6.39601 \n",
"[410]\tvalidation-rmse:6.39589 \n",
"[411]\tvalidation-rmse:6.39587 \n",
"[412]\tvalidation-rmse:6.39568 \n",
"[413]\tvalidation-rmse:6.39555 \n",
"[414]\tvalidation-rmse:6.39542 \n",
"[415]\tvalidation-rmse:6.39538 \n",
"[416]\tvalidation-rmse:6.39542 \n",
"[417]\tvalidation-rmse:6.39531 \n",
"[418]\tvalidation-rmse:6.39522 \n",
"[419]\tvalidation-rmse:6.39521 \n",
"[420]\tvalidation-rmse:6.39512 \n",
"[421]\tvalidation-rmse:6.39506 \n",
"[422]\tvalidation-rmse:6.39501 \n",
"[423]\tvalidation-rmse:6.39493 \n",
"[424]\tvalidation-rmse:6.39483 \n",
"[425]\tvalidation-rmse:6.39471 \n",
"[426]\tvalidation-rmse:6.39447 \n",
"[427]\tvalidation-rmse:6.39440 \n",
"[428]\tvalidation-rmse:6.39431 \n",
"[429]\tvalidation-rmse:6.39423 \n",
"[430]\tvalidation-rmse:6.39416 \n",
"[431]\tvalidation-rmse:6.39395 \n",
"[432]\tvalidation-rmse:6.39385 \n",
"[433]\tvalidation-rmse:6.39371 \n",
"[434]\tvalidation-rmse:6.39357 \n",
"[435]\tvalidation-rmse:6.39337 \n",
"[436]\tvalidation-rmse:6.39323 \n",
"[437]\tvalidation-rmse:6.39301 \n",
"[438]\tvalidation-rmse:6.39298 \n",
"[439]\tvalidation-rmse:6.39285 \n",
"[440]\tvalidation-rmse:6.39273 \n",
"[441]\tvalidation-rmse:6.39276 \n",
"[442]\tvalidation-rmse:6.39259 \n",
"[443]\tvalidation-rmse:6.39250 \n",
"[444]\tvalidation-rmse:6.39250 \n",
"[445]\tvalidation-rmse:6.39238 \n",
"[446]\tvalidation-rmse:6.39222 \n",
"[447]\tvalidation-rmse:6.39214 \n",
"[448]\tvalidation-rmse:6.39204 \n",
"[449]\tvalidation-rmse:6.39162 \n",
"[450]\tvalidation-rmse:6.39159 \n",
"[451]\tvalidation-rmse:6.39148 \n",
"[452]\tvalidation-rmse:6.39145 \n",
"[453]\tvalidation-rmse:6.39138 \n",
"[454]\tvalidation-rmse:6.39125 \n",
"[455]\tvalidation-rmse:6.39107 \n",
"[456]\tvalidation-rmse:6.39102 \n",
"[457]\tvalidation-rmse:6.39105 \n",
"[458]\tvalidation-rmse:6.39109 \n",
"[459]\tvalidation-rmse:6.39094 \n",
"[460]\tvalidation-rmse:6.39085 \n",
"[461]\tvalidation-rmse:6.39079 \n",
"[462]\tvalidation-rmse:6.39085 \n",
"[463]\tvalidation-rmse:6.39083 \n",
"[464]\tvalidation-rmse:6.39031 \n",
"[465]\tvalidation-rmse:6.39019 \n",
"[466]\tvalidation-rmse:6.39015 \n",
"[467]\tvalidation-rmse:6.38991 \n",
"[468]\tvalidation-rmse:6.38973 \n",
"[469]\tvalidation-rmse:6.38968 \n",
"[470]\tvalidation-rmse:6.38968 \n",
"[471]\tvalidation-rmse:6.38960 \n",
"[472]\tvalidation-rmse:6.38949 \n",
"[473]\tvalidation-rmse:6.38926 \n",
"[474]\tvalidation-rmse:6.38918 \n",
"[475]\tvalidation-rmse:6.38909 \n",
"[476]\tvalidation-rmse:6.38898 \n",
"[477]\tvalidation-rmse:6.38885 \n",
"[478]\tvalidation-rmse:6.38879 \n",
"[479]\tvalidation-rmse:6.38871 \n",
"[480]\tvalidation-rmse:6.38855 \n",
"[481]\tvalidation-rmse:6.38840 \n",
"[482]\tvalidation-rmse:6.38840 \n",
"[483]\tvalidation-rmse:6.38818 \n",
"[484]\tvalidation-rmse:6.38806 \n",
"[485]\tvalidation-rmse:6.38810 \n",
"[486]\tvalidation-rmse:6.38790 \n",
"[487]\tvalidation-rmse:6.38786 \n",
"[488]\tvalidation-rmse:6.38776 \n",
"[489]\tvalidation-rmse:6.38768 \n",
"[490]\tvalidation-rmse:6.38746 \n",
"[491]\tvalidation-rmse:6.38736 \n",
"[492]\tvalidation-rmse:6.38732 \n",
"[493]\tvalidation-rmse:6.38737 \n",
"[494]\tvalidation-rmse:6.38731 \n",
"[495]\tvalidation-rmse:6.38725 \n",
"[496]\tvalidation-rmse:6.38710 \n",
"[497]\tvalidation-rmse:6.38703 \n",
"[498]\tvalidation-rmse:6.38685 \n",
"[499]\tvalidation-rmse:6.38689 \n",
"[500]\tvalidation-rmse:6.38665 \n",
"[501]\tvalidation-rmse:6.38662 \n",
"[502]\tvalidation-rmse:6.38650 \n",
"[503]\tvalidation-rmse:6.38640 \n",
"[504]\tvalidation-rmse:6.38618 \n",
"[505]\tvalidation-rmse:6.38605 \n",
"[506]\tvalidation-rmse:6.38595 \n",
"[507]\tvalidation-rmse:6.38586 \n",
"[508]\tvalidation-rmse:6.38584 \n",
"[509]\tvalidation-rmse:6.38583 \n",
"[510]\tvalidation-rmse:6.38583 \n",
"[511]\tvalidation-rmse:6.38568 \n",
"[512]\tvalidation-rmse:6.38569 \n",
"[513]\tvalidation-rmse:6.38558 \n",
"[514]\tvalidation-rmse:6.38548 \n",
"[515]\tvalidation-rmse:6.38534 \n",
"[516]\tvalidation-rmse:6.38546 \n",
"[517]\tvalidation-rmse:6.38541 \n",
"[518]\tvalidation-rmse:6.38528 \n",
"[519]\tvalidation-rmse:6.38518 \n",
"[520]\tvalidation-rmse:6.38502 \n",
"[521]\tvalidation-rmse:6.38501 \n",
"[522]\tvalidation-rmse:6.38494 \n",
"[523]\tvalidation-rmse:6.38478 \n",
"[524]\tvalidation-rmse:6.38473 \n",
"[525]\tvalidation-rmse:6.38466 \n",
"[526]\tvalidation-rmse:6.38466 \n",
"[527]\tvalidation-rmse:6.38454 \n",
"[528]\tvalidation-rmse:6.38459 \n",
"[529]\tvalidation-rmse:6.38454 \n",
"[530]\tvalidation-rmse:6.38454 \n",
"[531]\tvalidation-rmse:6.38452 \n",
"[532]\tvalidation-rmse:6.38447 \n",
"[533]\tvalidation-rmse:6.38443 \n",
"[534]\tvalidation-rmse:6.38435 \n",
"[535]\tvalidation-rmse:6.38432 \n",
"[536]\tvalidation-rmse:6.38435 \n",
"[537]\tvalidation-rmse:6.38432 \n",
"[538]\tvalidation-rmse:6.38412 \n",
"[539]\tvalidation-rmse:6.38403 \n",
"[540]\tvalidation-rmse:6.38392 \n",
"[541]\tvalidation-rmse:6.38387 \n",
"[542]\tvalidation-rmse:6.38389 \n",
"[543]\tvalidation-rmse:6.38372 \n",
"[544]\tvalidation-rmse:6.38362 \n",
"[545]\tvalidation-rmse:6.38368 \n",
"[546]\tvalidation-rmse:6.38354 \n",
"[547]\tvalidation-rmse:6.38340 \n",
"[548]\tvalidation-rmse:6.38334 \n",
"[549]\tvalidation-rmse:6.38320 \n",
"[550]\tvalidation-rmse:6.38315 \n",
"[551]\tvalidation-rmse:6.38318 \n",
"[552]\tvalidation-rmse:6.38303 \n",
"[553]\tvalidation-rmse:6.38290 \n",
"[554]\tvalidation-rmse:6.38278 \n",
"[555]\tvalidation-rmse:6.38277 \n",
"[556]\tvalidation-rmse:6.38246 \n",
"[557]\tvalidation-rmse:6.38238 \n",
"[558]\tvalidation-rmse:6.38224 \n",
"[559]\tvalidation-rmse:6.38230 \n",
"[560]\tvalidation-rmse:6.38220 \n",
"[561]\tvalidation-rmse:6.38216 \n",
"[562]\tvalidation-rmse:6.38219 \n",
"[563]\tvalidation-rmse:6.38209 \n",
"[564]\tvalidation-rmse:6.38211 \n",
"[565]\tvalidation-rmse:6.38199 \n",
"[566]\tvalidation-rmse:6.38183 \n",
"[567]\tvalidation-rmse:6.38179 \n",
"[568]\tvalidation-rmse:6.38170 \n",
"[569]\tvalidation-rmse:6.38170 \n",
"[570]\tvalidation-rmse:6.38173 \n",
"[571]\tvalidation-rmse:6.38162 \n",
"[572]\tvalidation-rmse:6.38155 \n",
"[573]\tvalidation-rmse:6.38141 \n",
"[574]\tvalidation-rmse:6.38135 \n",
"[575]\tvalidation-rmse:6.38133 \n",
"[576]\tvalidation-rmse:6.38123 \n",
"[577]\tvalidation-rmse:6.38115 \n",
"[578]\tvalidation-rmse:6.38097 \n",
"[579]\tvalidation-rmse:6.38098 \n",
"[580]\tvalidation-rmse:6.38103 \n",
"[581]\tvalidation-rmse:6.38096 \n",
"[582]\tvalidation-rmse:6.38096 \n",
"[583]\tvalidation-rmse:6.38092 \n",
"[584]\tvalidation-rmse:6.38086 \n",
"[585]\tvalidation-rmse:6.38082 \n",
"[586]\tvalidation-rmse:6.38072 \n",
"[587]\tvalidation-rmse:6.38068 \n",
"[588]\tvalidation-rmse:6.38064 \n",
"[589]\tvalidation-rmse:6.38056 \n",
"[590]\tvalidation-rmse:6.38051 \n",
"[591]\tvalidation-rmse:6.38045 \n",
"[592]\tvalidation-rmse:6.38039 \n",
"[593]\tvalidation-rmse:6.38035 \n",
"[594]\tvalidation-rmse:6.38027 \n",
"[595]\tvalidation-rmse:6.38020 \n",
"[596]\tvalidation-rmse:6.38008 \n",
"[597]\tvalidation-rmse:6.38001 \n",
"[598]\tvalidation-rmse:6.37997 \n",
"[599]\tvalidation-rmse:6.37995 \n",
"[600]\tvalidation-rmse:6.37993 \n",
"[601]\tvalidation-rmse:6.37991 \n",
"[602]\tvalidation-rmse:6.37983 \n",
"[603]\tvalidation-rmse:6.37969 \n",
"[604]\tvalidation-rmse:6.37967 \n",
"[605]\tvalidation-rmse:6.37960 \n",
"[606]\tvalidation-rmse:6.37955 \n",
"[607]\tvalidation-rmse:6.37958 \n",
"[608]\tvalidation-rmse:6.37960 \n",
"[609]\tvalidation-rmse:6.37949 \n",
"[610]\tvalidation-rmse:6.37953 \n",
"[611]\tvalidation-rmse:6.37957 \n",
"[612]\tvalidation-rmse:6.37951 \n",
"[613]\tvalidation-rmse:6.37940 \n",
"[614]\tvalidation-rmse:6.37928 \n",
"[615]\tvalidation-rmse:6.37927 \n",
"[616]\tvalidation-rmse:6.37917 \n",
"[617]\tvalidation-rmse:6.37908 \n",
"[618]\tvalidation-rmse:6.37900 \n",
"[619]\tvalidation-rmse:6.37902 \n",
"[620]\tvalidation-rmse:6.37911 \n",
"[621]\tvalidation-rmse:6.37904 \n",
"[622]\tvalidation-rmse:6.37901 \n",
"[623]\tvalidation-rmse:6.37914 \n",
"[624]\tvalidation-rmse:6.37912 \n",
"[625]\tvalidation-rmse:6.37906 \n",
"[626]\tvalidation-rmse:6.37903 \n",
"[627]\tvalidation-rmse:6.37899 \n",
"[628]\tvalidation-rmse:6.37903 \n",
"[629]\tvalidation-rmse:6.37893 \n",
"[630]\tvalidation-rmse:6.37896 \n",
"[631]\tvalidation-rmse:6.37894 \n",
"[632]\tvalidation-rmse:6.37876 \n",
"[633]\tvalidation-rmse:6.37871 \n",
"[634]\tvalidation-rmse:6.37869 \n",
"[635]\tvalidation-rmse:6.37869 \n",
"[636]\tvalidation-rmse:6.37864 \n",
"[637]\tvalidation-rmse:6.37867 \n",
"[638]\tvalidation-rmse:6.37861 \n",
"[639]\tvalidation-rmse:6.37859 \n",
"[640]\tvalidation-rmse:6.37852 \n",
"[641]\tvalidation-rmse:6.37846 \n",
"[642]\tvalidation-rmse:6.37833 \n",
"[643]\tvalidation-rmse:6.37835 \n",
"[644]\tvalidation-rmse:6.37828 \n",
"[645]\tvalidation-rmse:6.37819 \n",
"[646]\tvalidation-rmse:6.37805 \n",
"[647]\tvalidation-rmse:6.37800 \n",
"[648]\tvalidation-rmse:6.37791 \n",
"[649]\tvalidation-rmse:6.37776 \n",
"[650]\tvalidation-rmse:6.37772 \n",
"[651]\tvalidation-rmse:6.37754 \n",
"[652]\tvalidation-rmse:6.37743 \n",
"[653]\tvalidation-rmse:6.37743 \n",
"[654]\tvalidation-rmse:6.37742 \n",
"[655]\tvalidation-rmse:6.37725 \n",
"[656]\tvalidation-rmse:6.37715 \n",
"[657]\tvalidation-rmse:6.37712 \n",
"[658]\tvalidation-rmse:6.37703 \n",
"[659]\tvalidation-rmse:6.37709 \n",
"[660]\tvalidation-rmse:6.37701 \n",
"[661]\tvalidation-rmse:6.37698 \n",
"[662]\tvalidation-rmse:6.37689 \n",
"[663]\tvalidation-rmse:6.37689 \n",
"[664]\tvalidation-rmse:6.37693 \n",
"[665]\tvalidation-rmse:6.37689 \n",
"[666]\tvalidation-rmse:6.37692 \n",
"[667]\tvalidation-rmse:6.37693 \n",
"[668]\tvalidation-rmse:6.37681 \n",
"[669]\tvalidation-rmse:6.37675 \n",
"[670]\tvalidation-rmse:6.37661 \n",
"[671]\tvalidation-rmse:6.37658 \n",
"[672]\tvalidation-rmse:6.37651 \n",
"[673]\tvalidation-rmse:6.37645 \n",
"[674]\tvalidation-rmse:6.37638 \n",
"[675]\tvalidation-rmse:6.37640 \n",
"[676]\tvalidation-rmse:6.37650 \n",
"[677]\tvalidation-rmse:6.37652 \n",
"[678]\tvalidation-rmse:6.37652 \n",
"[679]\tvalidation-rmse:6.37650 \n",
"[680]\tvalidation-rmse:6.37652 \n",
"[681]\tvalidation-rmse:6.37649 \n",
"[682]\tvalidation-rmse:6.37646 \n",
"[683]\tvalidation-rmse:6.37653 \n",
"[684]\tvalidation-rmse:6.37658 \n",
"[685]\tvalidation-rmse:6.37649 \n",
"[686]\tvalidation-rmse:6.37647 \n",
"[687]\tvalidation-rmse:6.37647 \n",
"[688]\tvalidation-rmse:6.37645 \n",
"[689]\tvalidation-rmse:6.37638 \n",
"[690]\tvalidation-rmse:6.37638 \n",
"[691]\tvalidation-rmse:6.37626 \n",
"[692]\tvalidation-rmse:6.37622 \n",
"[693]\tvalidation-rmse:6.37610 \n",
"[694]\tvalidation-rmse:6.37603 \n",
"[695]\tvalidation-rmse:6.37585 \n",
"[696]\tvalidation-rmse:6.37580 \n",
"[697]\tvalidation-rmse:6.37579 \n",
"[698]\tvalidation-rmse:6.37581 \n",
"[699]\tvalidation-rmse:6.37583 \n",
"[700]\tvalidation-rmse:6.37573 \n",
"[701]\tvalidation-rmse:6.37569 \n",
"[702]\tvalidation-rmse:6.37578 \n",
"[703]\tvalidation-rmse:6.37588 \n",
"[704]\tvalidation-rmse:6.37588 \n",
"[705]\tvalidation-rmse:6.37579 \n",
"[706]\tvalidation-rmse:6.37576 \n",
"[707]\tvalidation-rmse:6.37575 \n",
"[708]\tvalidation-rmse:6.37574 \n",
"[709]\tvalidation-rmse:6.37566 \n",
"[710]\tvalidation-rmse:6.37558 \n",
"[711]\tvalidation-rmse:6.37553 \n",
"[712]\tvalidation-rmse:6.37548 \n",
"[713]\tvalidation-rmse:6.37547 \n",
"[714]\tvalidation-rmse:6.37542 \n",
"[715]\tvalidation-rmse:6.37538 \n",
"[716]\tvalidation-rmse:6.37539 \n",
"[717]\tvalidation-rmse:6.37536 \n",
"[718]\tvalidation-rmse:6.37535 \n",
"[719]\tvalidation-rmse:6.37527 \n",
"[720]\tvalidation-rmse:6.37530 \n",
"[721]\tvalidation-rmse:6.37524 \n",
"[722]\tvalidation-rmse:6.37522 \n",
"[723]\tvalidation-rmse:6.37520 \n",
"[724]\tvalidation-rmse:6.37518 \n",
"[725]\tvalidation-rmse:6.37510 \n",
"[726]\tvalidation-rmse:6.37520 \n",
"[727]\tvalidation-rmse:6.37517 \n",
"[728]\tvalidation-rmse:6.37518 \n",
"[729]\tvalidation-rmse:6.37518 \n",
"[730]\tvalidation-rmse:6.37518 \n",
"[731]\tvalidation-rmse:6.37516 \n",
"[732]\tvalidation-rmse:6.37509 \n",
"[733]\tvalidation-rmse:6.37507 \n",
"[734]\tvalidation-rmse:6.37501 \n",
"[735]\tvalidation-rmse:6.37505 \n",
"[736]\tvalidation-rmse:6.37504 \n",
"[737]\tvalidation-rmse:6.37499 \n",
"[738]\tvalidation-rmse:6.37516 \n",
"[739]\tvalidation-rmse:6.37517 \n",
"[740]\tvalidation-rmse:6.37511 \n",
"[741]\tvalidation-rmse:6.37516 \n",
"[742]\tvalidation-rmse:6.37516 \n",
"[743]\tvalidation-rmse:6.37512 \n",
"[744]\tvalidation-rmse:6.37511 \n",
"[745]\tvalidation-rmse:6.37517 \n",
"[746]\tvalidation-rmse:6.37512 \n",
"[747]\tvalidation-rmse:6.37511 \n",
"[748]\tvalidation-rmse:6.37504 \n",
"[749]\tvalidation-rmse:6.37502 \n",
"[750]\tvalidation-rmse:6.37489 \n",
"[751]\tvalidation-rmse:6.37492 \n",
"[752]\tvalidation-rmse:6.37489 \n",
"[753]\tvalidation-rmse:6.37491 \n",
"[754]\tvalidation-rmse:6.37485 \n",
"[755]\tvalidation-rmse:6.37486 \n",
"[756]\tvalidation-rmse:6.37486 \n",
"[757]\tvalidation-rmse:6.37476 \n",
"[758]\tvalidation-rmse:6.37470 \n",
"[759]\tvalidation-rmse:6.37463 \n",
"[760]\tvalidation-rmse:6.37459 \n",
"[761]\tvalidation-rmse:6.37454 \n",
"[762]\tvalidation-rmse:6.37451 \n",
"[763]\tvalidation-rmse:6.37451 \n",
"[764]\tvalidation-rmse:6.37449 \n",
"[765]\tvalidation-rmse:6.37448 \n",
"[766]\tvalidation-rmse:6.37471 \n",
"[767]\tvalidation-rmse:6.37469 \n",
"[768]\tvalidation-rmse:6.37460 \n",
"[769]\tvalidation-rmse:6.37446 \n",
"[770]\tvalidation-rmse:6.37440 \n",
"[771]\tvalidation-rmse:6.37446 \n",
"[772]\tvalidation-rmse:6.37437 \n",
"[773]\tvalidation-rmse:6.37434 \n",
"[774]\tvalidation-rmse:6.37423 \n",
"[775]\tvalidation-rmse:6.37428 \n",
"[776]\tvalidation-rmse:6.37426 \n",
"[777]\tvalidation-rmse:6.37426 \n",
"[778]\tvalidation-rmse:6.37417 \n",
"[779]\tvalidation-rmse:6.37411 \n",
"[780]\tvalidation-rmse:6.37404 \n",
"[781]\tvalidation-rmse:6.37402 \n",
"[782]\tvalidation-rmse:6.37409 \n",
"[783]\tvalidation-rmse:6.37427 \n",
"[784]\tvalidation-rmse:6.37428 \n",
"[785]\tvalidation-rmse:6.37441 \n",
"[786]\tvalidation-rmse:6.37450 \n",
"[787]\tvalidation-rmse:6.37452 \n",
"[788]\tvalidation-rmse:6.37454 \n",
"[789]\tvalidation-rmse:6.37456 \n",
"[790]\tvalidation-rmse:6.37442 \n",
"[791]\tvalidation-rmse:6.37442 \n",
"[792]\tvalidation-rmse:6.37438 \n",
"[793]\tvalidation-rmse:6.37431 \n",
"[794]\tvalidation-rmse:6.37441 \n",
"[795]\tvalidation-rmse:6.37460 \n",
"[796]\tvalidation-rmse:6.37457 \n",
"[797]\tvalidation-rmse:6.37452 \n",
"[798]\tvalidation-rmse:6.37448 \n",
"[799]\tvalidation-rmse:6.37441 \n",
"[800]\tvalidation-rmse:6.37434 \n",
"[801]\tvalidation-rmse:6.37425 \n",
"[802]\tvalidation-rmse:6.37425 \n",
"[803]\tvalidation-rmse:6.37424 \n",
"[804]\tvalidation-rmse:6.37411 \n",
"[805]\tvalidation-rmse:6.37415 \n",
"[806]\tvalidation-rmse:6.37422 \n",
"[807]\tvalidation-rmse:6.37432 \n",
"[808]\tvalidation-rmse:6.37434 \n",
"[809]\tvalidation-rmse:6.37434 \n",
"[810]\tvalidation-rmse:6.37434 \n",
"[811]\tvalidation-rmse:6.37419 \n",
"[812]\tvalidation-rmse:6.37407 \n",
"[813]\tvalidation-rmse:6.37399 \n",
"[814]\tvalidation-rmse:6.37402 \n",
"[815]\tvalidation-rmse:6.37404 \n",
"[816]\tvalidation-rmse:6.37401 \n",
"[817]\tvalidation-rmse:6.37399 \n",
"[818]\tvalidation-rmse:6.37400 \n",
"[819]\tvalidation-rmse:6.37396 \n",
"[820]\tvalidation-rmse:6.37386 \n",
"[821]\tvalidation-rmse:6.37381 \n",
"[822]\tvalidation-rmse:6.37380 \n",
"[823]\tvalidation-rmse:6.37378 \n",
"[824]\tvalidation-rmse:6.37367 \n",
"[825]\tvalidation-rmse:6.37360 \n",
"[826]\tvalidation-rmse:6.37352 \n",
"[827]\tvalidation-rmse:6.37346 \n",
"[828]\tvalidation-rmse:6.37349 \n",
"[829]\tvalidation-rmse:6.37344 \n",
"[830]\tvalidation-rmse:6.37361 \n",
"[831]\tvalidation-rmse:6.37359 \n",
"[832]\tvalidation-rmse:6.37350 \n",
"[833]\tvalidation-rmse:6.37344 \n",
"[834]\tvalidation-rmse:6.37344 \n",
"[835]\tvalidation-rmse:6.37340 \n",
"[836]\tvalidation-rmse:6.37338 \n",
"[837]\tvalidation-rmse:6.37337 \n",
"[838]\tvalidation-rmse:6.37331 \n",
"[839]\tvalidation-rmse:6.37352 \n",
"[840]\tvalidation-rmse:6.37347 \n",
"[841]\tvalidation-rmse:6.37344 \n",
"[842]\tvalidation-rmse:6.37334 \n",
"[843]\tvalidation-rmse:6.37337 \n",
"[844]\tvalidation-rmse:6.37340 \n",
"[845]\tvalidation-rmse:6.37353 \n",
"[846]\tvalidation-rmse:6.37352 \n",
"[847]\tvalidation-rmse:6.37354 \n",
"[848]\tvalidation-rmse:6.37351 \n",
"[849]\tvalidation-rmse:6.37351 \n",
"[850]\tvalidation-rmse:6.37349 \n",
"[851]\tvalidation-rmse:6.37345 \n",
"[852]\tvalidation-rmse:6.37343 \n",
"[853]\tvalidation-rmse:6.37339 \n",
"[854]\tvalidation-rmse:6.37341 \n",
"[855]\tvalidation-rmse:6.37331 \n",
"[856]\tvalidation-rmse:6.37333 \n",
"[857]\tvalidation-rmse:6.37325 \n",
"[858]\tvalidation-rmse:6.37328 \n",
"[859]\tvalidation-rmse:6.37324 \n",
"[860]\tvalidation-rmse:6.37324 \n",
"[861]\tvalidation-rmse:6.37335 \n",
"[862]\tvalidation-rmse:6.37354 \n",
"[863]\tvalidation-rmse:6.37381 \n",
"[864]\tvalidation-rmse:6.37390 \n",
"[865]\tvalidation-rmse:6.37399 \n",
"[866]\tvalidation-rmse:6.37395 \n",
"[867]\tvalidation-rmse:6.37392 \n",
"[868]\tvalidation-rmse:6.37394 \n",
"[869]\tvalidation-rmse:6.37393 \n",
"[870]\tvalidation-rmse:6.37395 \n",
"[871]\tvalidation-rmse:6.37399 \n",
"[872]\tvalidation-rmse:6.37397 \n",
"[873]\tvalidation-rmse:6.37402 \n",
"[874]\tvalidation-rmse:6.37400 \n",
"[875]\tvalidation-rmse:6.37427 \n",
"[876]\tvalidation-rmse:6.37426 \n",
"[877]\tvalidation-rmse:6.37429 \n",
"[878]\tvalidation-rmse:6.37429 \n",
"[879]\tvalidation-rmse:6.37419 \n",
"[880]\tvalidation-rmse:6.37433 \n",
"[881]\tvalidation-rmse:6.37432 \n",
"[882]\tvalidation-rmse:6.37429 \n",
"[883]\tvalidation-rmse:6.37432 \n",
"[884]\tvalidation-rmse:6.37421 \n",
"[885]\tvalidation-rmse:6.37415 \n",
"[886]\tvalidation-rmse:6.37413 \n",
"[887]\tvalidation-rmse:6.37408 \n",
"[888]\tvalidation-rmse:6.37404 \n",
"[889]\tvalidation-rmse:6.37397 \n",
"[890]\tvalidation-rmse:6.37398 \n",
"[891]\tvalidation-rmse:6.37401 \n",
"[892]\tvalidation-rmse:6.37399 \n",
"[893]\tvalidation-rmse:6.37390 \n",
"[894]\tvalidation-rmse:6.37387 \n",
"[895]\tvalidation-rmse:6.37386 \n",
"[896]\tvalidation-rmse:6.37382 \n",
"[897]\tvalidation-rmse:6.37379 \n",
"[898]\tvalidation-rmse:6.37373 \n",
"[899]\tvalidation-rmse:6.37369 \n",
"[900]\tvalidation-rmse:6.37362 \n",
"[901]\tvalidation-rmse:6.37367 \n",
"[902]\tvalidation-rmse:6.37352 \n",
"[903]\tvalidation-rmse:6.37354 \n",
"[904]\tvalidation-rmse:6.37336 \n",
"[905]\tvalidation-rmse:6.37332 \n",
"[906]\tvalidation-rmse:6.37328 \n",
"[907]\tvalidation-rmse:6.37329 \n",
"[908]\tvalidation-rmse:6.37321 \n",
"[909]\tvalidation-rmse:6.37319 \n",
"[910]\tvalidation-rmse:6.37318 \n",
"[911]\tvalidation-rmse:6.37343 \n",
"[912]\tvalidation-rmse:6.37349 \n",
"[913]\tvalidation-rmse:6.37351 \n",
"[914]\tvalidation-rmse:6.37354 \n",
"[915]\tvalidation-rmse:6.37353 \n",
"[916]\tvalidation-rmse:6.37350 \n",
"[917]\tvalidation-rmse:6.37363 \n",
"[918]\tvalidation-rmse:6.37363 \n",
"[919]\tvalidation-rmse:6.37389 \n",
"[920]\tvalidation-rmse:6.37380 \n",
"[921]\tvalidation-rmse:6.37379 \n",
"[922]\tvalidation-rmse:6.37384 \n",
"[923]\tvalidation-rmse:6.37374 \n",
"[924]\tvalidation-rmse:6.37378 \n",
"[925]\tvalidation-rmse:6.37382 \n",
"[926]\tvalidation-rmse:6.37381 \n",
"[927]\tvalidation-rmse:6.37374 \n",
"[928]\tvalidation-rmse:6.37375 \n",
"[929]\tvalidation-rmse:6.37370 \n",
"[930]\tvalidation-rmse:6.37364 \n",
"[931]\tvalidation-rmse:6.37373 \n",
"[932]\tvalidation-rmse:6.37372 \n",
"[933]\tvalidation-rmse:6.37372 \n",
"[934]\tvalidation-rmse:6.37356 \n",
"[935]\tvalidation-rmse:6.37350 \n",
"[936]\tvalidation-rmse:6.37347 \n",
"[937]\tvalidation-rmse:6.37347 \n",
"[938]\tvalidation-rmse:6.37335 \n",
"[939]\tvalidation-rmse:6.37338 \n",
"[940]\tvalidation-rmse:6.37341 \n",
"[941]\tvalidation-rmse:6.37339 \n",
"[942]\tvalidation-rmse:6.37348 \n",
"[943]\tvalidation-rmse:6.37347 \n",
"[944]\tvalidation-rmse:6.37350 \n",
"[945]\tvalidation-rmse:6.37362 \n",
"[946]\tvalidation-rmse:6.37352 \n",
"[947]\tvalidation-rmse:6.37355 \n",
"[948]\tvalidation-rmse:6.37360 \n",
"[949]\tvalidation-rmse:6.37354 \n",
"[950]\tvalidation-rmse:6.37355 \n",
"[951]\tvalidation-rmse:6.37348 \n",
"[952]\tvalidation-rmse:6.37345 \n",
"[953]\tvalidation-rmse:6.37347 \n",
"[954]\tvalidation-rmse:6.37348 \n",
"[955]\tvalidation-rmse:6.37345 \n",
"[956]\tvalidation-rmse:6.37343 \n",
"[957]\tvalidation-rmse:6.37362 \n",
"[958]\tvalidation-rmse:6.37361 \n",
"[959]\tvalidation-rmse:6.37364 \n",
"[12:43:06] WARNING: /Users/runner/work/xgboost/xgboost/python-package/build/temp.macosx-11.0-arm64-3.8/xgboost/src/objective/regression_obj.cu:203: reg:linear is now deprecated in favor of reg:squarederror.\n",
"[0]\tvalidation-rmse:19.55573 \n",
"[1]\tvalidation-rmse:18.08340 \n",
"[2]\tvalidation-rmse:16.76415 \n",
"[3]\tvalidation-rmse:15.58150 \n",
"[4]\tvalidation-rmse:14.52593 \n",
"[5]\tvalidation-rmse:13.58520 \n",
"[6]\tvalidation-rmse:12.74715 \n",
"[7]\tvalidation-rmse:12.00336 \n",
"[8]\tvalidation-rmse:11.34568 \n",
"[9]\tvalidation-rmse:10.76410 \n",
"[10]\tvalidation-rmse:10.25369 \n",
"[11]\tvalidation-rmse:9.80442 \n",
"[12]\tvalidation-rmse:9.41014 \n",
"[13]\tvalidation-rmse:9.06520 \n",
"[14]\tvalidation-rmse:8.76445 \n",
"[15]\tvalidation-rmse:8.50223 \n",
"[16]\tvalidation-rmse:8.27392 \n",
"[17]\tvalidation-rmse:8.07620 \n",
"[18]\tvalidation-rmse:7.90389 \n",
"[19]\tvalidation-rmse:7.75426 \n",
"[20]\tvalidation-rmse:7.62363 \n",
"[21]\tvalidation-rmse:7.51117 \n",
"[22]\tvalidation-rmse:7.41330 \n",
"[23]\tvalidation-rmse:7.32761 \n",
"[24]\tvalidation-rmse:7.25395 \n",
"[25]\tvalidation-rmse:7.18943 \n",
"[26]\tvalidation-rmse:7.13277 \n",
"[27]\tvalidation-rmse:7.08359 \n",
"[28]\tvalidation-rmse:7.04075 \n",
"[29]\tvalidation-rmse:7.00289 \n",
"[30]\tvalidation-rmse:6.97012 \n",
"[31]\tvalidation-rmse:6.94004 \n",
"[32]\tvalidation-rmse:6.91411 \n",
"[33]\tvalidation-rmse:6.89125 \n",
"[34]\tvalidation-rmse:6.87076 \n",
"[35]\tvalidation-rmse:6.85254 \n",
"[36]\tvalidation-rmse:6.83721 \n",
"[37]\tvalidation-rmse:6.82334 \n",
"[38]\tvalidation-rmse:6.81035 \n",
"[39]\tvalidation-rmse:6.79856 \n",
"[40]\tvalidation-rmse:6.78916 \n",
"[41]\tvalidation-rmse:6.77952 \n",
"[42]\tvalidation-rmse:6.77186 \n",
"[43]\tvalidation-rmse:6.76432 \n",
"[44]\tvalidation-rmse:6.75814 \n",
"[45]\tvalidation-rmse:6.75243 \n",
"[46]\tvalidation-rmse:6.74604 \n",
"[47]\tvalidation-rmse:6.74150 \n",
"[48]\tvalidation-rmse:6.73749 \n",
"[49]\tvalidation-rmse:6.73269 \n",
"[50]\tvalidation-rmse:6.72941 \n",
"[51]\tvalidation-rmse:6.72650 \n",
"[52]\tvalidation-rmse:6.72347 \n",
"[53]\tvalidation-rmse:6.72109 \n",
"[54]\tvalidation-rmse:6.71855 \n",
"[55]\tvalidation-rmse:6.71600 \n",
"[56]\tvalidation-rmse:6.71417 \n",
"[57]\tvalidation-rmse:6.71242 \n",
"[58]\tvalidation-rmse:6.70960 \n",
"[59]\tvalidation-rmse:6.70811 \n",
"[60]\tvalidation-rmse:6.70656 \n",
"[61]\tvalidation-rmse:6.70534 \n",
"[62]\tvalidation-rmse:6.70380 \n",
"[63]\tvalidation-rmse:6.70224 \n",
"[64]\tvalidation-rmse:6.70069 \n",
"[65]\tvalidation-rmse:6.69958 \n",
"[66]\tvalidation-rmse:6.69860 \n",
"[67]\tvalidation-rmse:6.69701 \n",
"[68]\tvalidation-rmse:6.69596 \n",
"[69]\tvalidation-rmse:6.69505 \n",
"[70]\tvalidation-rmse:6.69423 \n",
"[71]\tvalidation-rmse:6.69317 \n",
"[72]\tvalidation-rmse:6.69177 \n",
"[73]\tvalidation-rmse:6.69012 \n",
"[74]\tvalidation-rmse:6.68947 \n",
"[75]\tvalidation-rmse:6.68876 \n",
"[76]\tvalidation-rmse:6.68816 \n",
"[77]\tvalidation-rmse:6.68750 \n",
"[78]\tvalidation-rmse:6.68677 \n",
"[79]\tvalidation-rmse:6.68624 \n",
"[80]\tvalidation-rmse:6.68539 \n",
"[81]\tvalidation-rmse:6.68499 \n",
"[82]\tvalidation-rmse:6.68442 \n",
"[83]\tvalidation-rmse:6.68370 \n",
"[84]\tvalidation-rmse:6.68272 \n",
"[85]\tvalidation-rmse:6.68079 \n",
"[86]\tvalidation-rmse:6.67992 \n",
"[87]\tvalidation-rmse:6.67959 \n",
"[88]\tvalidation-rmse:6.67854 \n",
"[89]\tvalidation-rmse:6.67770 \n",
"[90]\tvalidation-rmse:6.67727 \n",
"[91]\tvalidation-rmse:6.67647 \n",
"[92]\tvalidation-rmse:6.67576 \n",
"[93]\tvalidation-rmse:6.67516 \n",
"[94]\tvalidation-rmse:6.67482 \n",
"[95]\tvalidation-rmse:6.67427 \n",
"[96]\tvalidation-rmse:6.67340 \n",
"[97]\tvalidation-rmse:6.67317 \n",
"[98]\tvalidation-rmse:6.67268 \n",
"[99]\tvalidation-rmse:6.67193 \n",
"[100]\tvalidation-rmse:6.67148 \n",
"[101]\tvalidation-rmse:6.67110 \n",
"[102]\tvalidation-rmse:6.67053 \n",
"[103]\tvalidation-rmse:6.67006 \n",
"[104]\tvalidation-rmse:6.66968 \n",
"[105]\tvalidation-rmse:6.66910 \n",
"[106]\tvalidation-rmse:6.66891 \n",
"[107]\tvalidation-rmse:6.66852 \n",
"[108]\tvalidation-rmse:6.66809 \n",
"[109]\tvalidation-rmse:6.66780 \n",
"[110]\tvalidation-rmse:6.66748 \n",
"[111]\tvalidation-rmse:6.66699 \n",
"[112]\tvalidation-rmse:6.66616 \n",
"[113]\tvalidation-rmse:6.66566 \n",
"[114]\tvalidation-rmse:6.66518 \n",
"[115]\tvalidation-rmse:6.66468 \n",
"[116]\tvalidation-rmse:6.66413 \n",
"[117]\tvalidation-rmse:6.66354 \n",
"[118]\tvalidation-rmse:6.66248 \n",
"[119]\tvalidation-rmse:6.66207 \n",
"[120]\tvalidation-rmse:6.66187 \n",
"[121]\tvalidation-rmse:6.66139 \n",
"[122]\tvalidation-rmse:6.66071 \n",
"[123]\tvalidation-rmse:6.66048 \n",
"[124]\tvalidation-rmse:6.65975 \n",
"[125]\tvalidation-rmse:6.65930 \n",
"[126]\tvalidation-rmse:6.65865 \n",
"[127]\tvalidation-rmse:6.65821 \n",
"[128]\tvalidation-rmse:6.65782 \n",
"[129]\tvalidation-rmse:6.65758 \n",
"[130]\tvalidation-rmse:6.65727 \n",
"[131]\tvalidation-rmse:6.65691 \n",
"[132]\tvalidation-rmse:6.65678 \n",
"[133]\tvalidation-rmse:6.65607 \n",
"[134]\tvalidation-rmse:6.65562 \n",
"[135]\tvalidation-rmse:6.65530 \n",
"[136]\tvalidation-rmse:6.65475 \n",
"[137]\tvalidation-rmse:6.65434 \n",
"[138]\tvalidation-rmse:6.65370 \n",
"[139]\tvalidation-rmse:6.65330 \n",
"[140]\tvalidation-rmse:6.65288 \n",
"[141]\tvalidation-rmse:6.65234 \n",
"[142]\tvalidation-rmse:6.65177 \n",
"[143]\tvalidation-rmse:6.65150 \n",
"[144]\tvalidation-rmse:6.65119 \n",
"[145]\tvalidation-rmse:6.65065 \n",
"[146]\tvalidation-rmse:6.65045 \n",
"[147]\tvalidation-rmse:6.65015 \n",
"[148]\tvalidation-rmse:6.64981 \n",
"[149]\tvalidation-rmse:6.64964 \n",
"[150]\tvalidation-rmse:6.64933 \n",
"[151]\tvalidation-rmse:6.64894 \n",
"[152]\tvalidation-rmse:6.64868 \n",
"[153]\tvalidation-rmse:6.64818 \n",
"[154]\tvalidation-rmse:6.64801 \n",
"[155]\tvalidation-rmse:6.64763 \n",
"[156]\tvalidation-rmse:6.64728 \n",
"[157]\tvalidation-rmse:6.64680 \n",
"[158]\tvalidation-rmse:6.64622 \n",
"[159]\tvalidation-rmse:6.64585 \n",
"[160]\tvalidation-rmse:6.64558 \n",
"[161]\tvalidation-rmse:6.64524 \n",
"[162]\tvalidation-rmse:6.64498 \n",
"[163]\tvalidation-rmse:6.64461 \n",
"[164]\tvalidation-rmse:6.64407 \n",
"[165]\tvalidation-rmse:6.64371 \n",
"[166]\tvalidation-rmse:6.64361 \n",
"[167]\tvalidation-rmse:6.64351 \n",
"[168]\tvalidation-rmse:6.64291 \n",
"[169]\tvalidation-rmse:6.64236 \n",
"[170]\tvalidation-rmse:6.64215 \n",
"[171]\tvalidation-rmse:6.64158 \n",
"[172]\tvalidation-rmse:6.64108 \n",
"[173]\tvalidation-rmse:6.64088 \n",
"[174]\tvalidation-rmse:6.64020 \n",
"[175]\tvalidation-rmse:6.63994 \n",
"[176]\tvalidation-rmse:6.63978 \n",
"[177]\tvalidation-rmse:6.63954 \n",
"[178]\tvalidation-rmse:6.63898 \n",
"[179]\tvalidation-rmse:6.63871 \n",
"[180]\tvalidation-rmse:6.63840 \n",
"[181]\tvalidation-rmse:6.63806 \n",
"[182]\tvalidation-rmse:6.63795 \n",
"[183]\tvalidation-rmse:6.63764 \n",
"[184]\tvalidation-rmse:6.63722 \n",
"[185]\tvalidation-rmse:6.63692 \n",
"[186]\tvalidation-rmse:6.63672 \n",
"[187]\tvalidation-rmse:6.63624 \n",
"[188]\tvalidation-rmse:6.63600 \n",
"[189]\tvalidation-rmse:6.63558 \n",
"[190]\tvalidation-rmse:6.63501 \n",
"[191]\tvalidation-rmse:6.63458 \n",
"[192]\tvalidation-rmse:6.63434 \n",
"[193]\tvalidation-rmse:6.63354 \n",
"[194]\tvalidation-rmse:6.63321 \n",
"[195]\tvalidation-rmse:6.63278 \n",
"[196]\tvalidation-rmse:6.63200 \n",
"[197]\tvalidation-rmse:6.63170 \n",
"[198]\tvalidation-rmse:6.63128 \n",
"[199]\tvalidation-rmse:6.63114 \n",
"[200]\tvalidation-rmse:6.63104 \n",
"[201]\tvalidation-rmse:6.63075 \n",
"[202]\tvalidation-rmse:6.63040 \n",
"[203]\tvalidation-rmse:6.63018 \n",
"[204]\tvalidation-rmse:6.62970 \n",
"[205]\tvalidation-rmse:6.62972 \n",
"[206]\tvalidation-rmse:6.62931 \n",
"[207]\tvalidation-rmse:6.62910 \n",
"[208]\tvalidation-rmse:6.62886 \n",
"[209]\tvalidation-rmse:6.62851 \n",
"[210]\tvalidation-rmse:6.62817 \n",
"[211]\tvalidation-rmse:6.62802 \n",
"[212]\tvalidation-rmse:6.62782 \n",
"[213]\tvalidation-rmse:6.62771 \n",
"[214]\tvalidation-rmse:6.62722 \n",
"[215]\tvalidation-rmse:6.62693 \n",
"[216]\tvalidation-rmse:6.62665 \n",
"[217]\tvalidation-rmse:6.62621 \n",
"[218]\tvalidation-rmse:6.62594 \n",
"[219]\tvalidation-rmse:6.62561 \n",
"[220]\tvalidation-rmse:6.62509 \n",
"[221]\tvalidation-rmse:6.62479 \n",
"[222]\tvalidation-rmse:6.62439 \n",
"[223]\tvalidation-rmse:6.62410 \n",
"[224]\tvalidation-rmse:6.62391 \n",
"[225]\tvalidation-rmse:6.62372 \n",
"[226]\tvalidation-rmse:6.62360 \n",
"[227]\tvalidation-rmse:6.62338 \n",
"[228]\tvalidation-rmse:6.62289 \n",
"[229]\tvalidation-rmse:6.62228 \n",
"[230]\tvalidation-rmse:6.62220 \n",
"[231]\tvalidation-rmse:6.62198 \n",
"[232]\tvalidation-rmse:6.62164 \n",
"[233]\tvalidation-rmse:6.62122 \n",
"[234]\tvalidation-rmse:6.62096 \n",
"[235]\tvalidation-rmse:6.62070 \n",
"[236]\tvalidation-rmse:6.62052 \n",
"[237]\tvalidation-rmse:6.62005 \n",
"[238]\tvalidation-rmse:6.61955 \n",
"[239]\tvalidation-rmse:6.61941 \n",
"[240]\tvalidation-rmse:6.61909 \n",
"[241]\tvalidation-rmse:6.61872 \n",
"[242]\tvalidation-rmse:6.61830 \n",
"[243]\tvalidation-rmse:6.61795 \n",
"[244]\tvalidation-rmse:6.61776 \n",
"[245]\tvalidation-rmse:6.61746 \n",
"[246]\tvalidation-rmse:6.61719 \n",
"[247]\tvalidation-rmse:6.61694 \n",
"[248]\tvalidation-rmse:6.61678 \n",
"[249]\tvalidation-rmse:6.61649 \n",
"[250]\tvalidation-rmse:6.61633 \n",
"[251]\tvalidation-rmse:6.61595 \n",
"[252]\tvalidation-rmse:6.61566 \n",
"[253]\tvalidation-rmse:6.61551 \n",
"[254]\tvalidation-rmse:6.61541 \n",
"[255]\tvalidation-rmse:6.61523 \n",
"[256]\tvalidation-rmse:6.61480 \n",
"[257]\tvalidation-rmse:6.61458 \n",
"[258]\tvalidation-rmse:6.61429 \n",
"[259]\tvalidation-rmse:6.61409 \n",
"[260]\tvalidation-rmse:6.61386 \n",
"[261]\tvalidation-rmse:6.61352 \n",
"[262]\tvalidation-rmse:6.61336 \n",
"[263]\tvalidation-rmse:6.61298 \n",
"[264]\tvalidation-rmse:6.61279 \n",
"[265]\tvalidation-rmse:6.61240 \n",
"[266]\tvalidation-rmse:6.61195 \n",
"[267]\tvalidation-rmse:6.61125 \n",
"[268]\tvalidation-rmse:6.61089 \n",
"[269]\tvalidation-rmse:6.61066 \n",
"[270]\tvalidation-rmse:6.61045 \n",
"[271]\tvalidation-rmse:6.61003 \n",
"[272]\tvalidation-rmse:6.60979 \n",
"[273]\tvalidation-rmse:6.60960 \n",
"[274]\tvalidation-rmse:6.60942 \n",
"[275]\tvalidation-rmse:6.60908 \n",
"[276]\tvalidation-rmse:6.60891 \n",
"[277]\tvalidation-rmse:6.60813 \n",
"[278]\tvalidation-rmse:6.60791 \n",
"[279]\tvalidation-rmse:6.60766 \n",
"[280]\tvalidation-rmse:6.60752 \n",
"[281]\tvalidation-rmse:6.60729 \n",
"[282]\tvalidation-rmse:6.60731 \n",
"[283]\tvalidation-rmse:6.60697 \n",
"[284]\tvalidation-rmse:6.60670 \n",
"[285]\tvalidation-rmse:6.60644 \n",
"[286]\tvalidation-rmse:6.60617 \n",
"[287]\tvalidation-rmse:6.60611 \n",
"[288]\tvalidation-rmse:6.60588 \n",
"[289]\tvalidation-rmse:6.60578 \n",
"[290]\tvalidation-rmse:6.60559 \n",
"[291]\tvalidation-rmse:6.60541 \n",
"[292]\tvalidation-rmse:6.60526 \n",
"[293]\tvalidation-rmse:6.60510 \n",
"[294]\tvalidation-rmse:6.60471 \n",
"[295]\tvalidation-rmse:6.60445 \n",
"[296]\tvalidation-rmse:6.60413 \n",
"[297]\tvalidation-rmse:6.60371 \n",
"[298]\tvalidation-rmse:6.60364 \n",
"[299]\tvalidation-rmse:6.60321 \n",
"[300]\tvalidation-rmse:6.60284 \n",
"[301]\tvalidation-rmse:6.60234 \n",
"[302]\tvalidation-rmse:6.60208 \n",
"[303]\tvalidation-rmse:6.60165 \n",
"[304]\tvalidation-rmse:6.60146 \n",
"[305]\tvalidation-rmse:6.60120 \n",
"[306]\tvalidation-rmse:6.60097 \n",
"[307]\tvalidation-rmse:6.60077 \n",
"[308]\tvalidation-rmse:6.60052 \n",
"[309]\tvalidation-rmse:6.60020 \n",
"[310]\tvalidation-rmse:6.60007 \n",
"[311]\tvalidation-rmse:6.59973 \n",
"[312]\tvalidation-rmse:6.59942 \n",
"[313]\tvalidation-rmse:6.59904 \n",
"[314]\tvalidation-rmse:6.59900 \n",
"[315]\tvalidation-rmse:6.59885 \n",
"[316]\tvalidation-rmse:6.59872 \n",
"[317]\tvalidation-rmse:6.59808 \n",
"[318]\tvalidation-rmse:6.59777 \n",
"[319]\tvalidation-rmse:6.59735 \n",
"[320]\tvalidation-rmse:6.59713 \n",
"[321]\tvalidation-rmse:6.59682 \n",
"[322]\tvalidation-rmse:6.59668 \n",
"[323]\tvalidation-rmse:6.59635 \n",
"[324]\tvalidation-rmse:6.59588 \n",
"[325]\tvalidation-rmse:6.59562 \n",
"[326]\tvalidation-rmse:6.59552 \n",
"[327]\tvalidation-rmse:6.59517 \n",
"[328]\tvalidation-rmse:6.59479 \n",
"[329]\tvalidation-rmse:6.59444 \n",
"[330]\tvalidation-rmse:6.59427 \n",
"[331]\tvalidation-rmse:6.59406 \n",
"[332]\tvalidation-rmse:6.59395 \n",
"[333]\tvalidation-rmse:6.59362 \n",
"[334]\tvalidation-rmse:6.59325 \n",
"[335]\tvalidation-rmse:6.59312 \n",
"[336]\tvalidation-rmse:6.59290 \n",
"[337]\tvalidation-rmse:6.59294 \n",
"[338]\tvalidation-rmse:6.59266 \n",
"[339]\tvalidation-rmse:6.59246 \n",
"[340]\tvalidation-rmse:6.59233 \n",
"[341]\tvalidation-rmse:6.59194 \n",
"[342]\tvalidation-rmse:6.59159 \n",
"[343]\tvalidation-rmse:6.59150 \n",
"[344]\tvalidation-rmse:6.59120 \n",
"[345]\tvalidation-rmse:6.59099 \n",
"[346]\tvalidation-rmse:6.59091 \n",
"[347]\tvalidation-rmse:6.59078 \n",
"[348]\tvalidation-rmse:6.59063 \n",
"[349]\tvalidation-rmse:6.59054 \n",
"[350]\tvalidation-rmse:6.59037 \n",
"[351]\tvalidation-rmse:6.59015 \n",
"[352]\tvalidation-rmse:6.58980 \n",
"[353]\tvalidation-rmse:6.58951 \n",
"[354]\tvalidation-rmse:6.58935 \n",
"[355]\tvalidation-rmse:6.58897 \n",
"[356]\tvalidation-rmse:6.58870 \n",
"[357]\tvalidation-rmse:6.58857 \n",
"[358]\tvalidation-rmse:6.58836 \n",
"[359]\tvalidation-rmse:6.58808 \n",
"[360]\tvalidation-rmse:6.58788 \n",
"[361]\tvalidation-rmse:6.58755 \n",
"[362]\tvalidation-rmse:6.58730 \n",
"[363]\tvalidation-rmse:6.58708 \n",
"[364]\tvalidation-rmse:6.58683 \n",
"[365]\tvalidation-rmse:6.58665 \n",
"[366]\tvalidation-rmse:6.58622 \n",
"[367]\tvalidation-rmse:6.58591 \n",
"[368]\tvalidation-rmse:6.58578 \n",
"[369]\tvalidation-rmse:6.58561 \n",
"[370]\tvalidation-rmse:6.58536 \n",
"[371]\tvalidation-rmse:6.58521 \n",
"[372]\tvalidation-rmse:6.58509 \n",
"[373]\tvalidation-rmse:6.58492 \n",
"[374]\tvalidation-rmse:6.58471 \n",
"[375]\tvalidation-rmse:6.58449 \n",
"[376]\tvalidation-rmse:6.58435 \n",
"[377]\tvalidation-rmse:6.58399 \n",
"[378]\tvalidation-rmse:6.58362 \n",
"[379]\tvalidation-rmse:6.58356 \n",
"[380]\tvalidation-rmse:6.58341 \n",
"[381]\tvalidation-rmse:6.58318 \n",
"[382]\tvalidation-rmse:6.58297 \n",
"[383]\tvalidation-rmse:6.58273 \n",
"[384]\tvalidation-rmse:6.58257 \n",
"[385]\tvalidation-rmse:6.58235 \n",
"[386]\tvalidation-rmse:6.58226 \n",
"[387]\tvalidation-rmse:6.58218 \n",
"[388]\tvalidation-rmse:6.58215 \n",
"[389]\tvalidation-rmse:6.58190 \n",
"[390]\tvalidation-rmse:6.58171 \n",
"[391]\tvalidation-rmse:6.58165 \n",
"[392]\tvalidation-rmse:6.58155 \n",
"[393]\tvalidation-rmse:6.58138 \n",
"[394]\tvalidation-rmse:6.58127 \n",
"[395]\tvalidation-rmse:6.58104 \n",
"[396]\tvalidation-rmse:6.58078 \n",
"[397]\tvalidation-rmse:6.58052 \n",
"[398]\tvalidation-rmse:6.58033 \n",
"[399]\tvalidation-rmse:6.58017 \n",
"[400]\tvalidation-rmse:6.57997 \n",
"[401]\tvalidation-rmse:6.57986 \n",
"[402]\tvalidation-rmse:6.57974 \n",
"[403]\tvalidation-rmse:6.57945 \n",
"[404]\tvalidation-rmse:6.57904 \n",
"[405]\tvalidation-rmse:6.57880 \n",
"[406]\tvalidation-rmse:6.57838 \n",
"[407]\tvalidation-rmse:6.57804 \n",
"[408]\tvalidation-rmse:6.57784 \n",
"[409]\tvalidation-rmse:6.57753 \n",
"[410]\tvalidation-rmse:6.57728 \n",
"[411]\tvalidation-rmse:6.57720 \n",
"[412]\tvalidation-rmse:6.57707 \n",
"[413]\tvalidation-rmse:6.57681 \n",
"[414]\tvalidation-rmse:6.57680 \n",
"[415]\tvalidation-rmse:6.57665 \n",
"[416]\tvalidation-rmse:6.57641 \n",
"[417]\tvalidation-rmse:6.57626 \n",
"[418]\tvalidation-rmse:6.57599 \n",
"[419]\tvalidation-rmse:6.57567
gitextract_69ga8un0/ ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ ├── cd-deploy.yml │ └── ci-tests.yml ├── .gitignore ├── 01-intro/ │ ├── README.md │ ├── duration-prediction.ipynb │ └── meta.json ├── 02-experiment-tracking/ │ ├── README.md │ ├── duration-prediction.ipynb │ ├── meta.json │ ├── mlflow_on_aws.md │ ├── model-registry.ipynb │ ├── requirements.txt │ └── running-mlflow-examples/ │ ├── scenario-1.ipynb │ ├── scenario-2.ipynb │ └── scenario-3.ipynb ├── 03-orchestration/ │ ├── README.md │ └── code/ │ ├── commands.md │ ├── duration-prediction.ipynb │ └── duration-prediction.py ├── 04-deployment/ │ ├── README.md │ ├── batch/ │ │ ├── Pipfile │ │ ├── README.md │ │ ├── score.ipynb │ │ ├── score.py │ │ ├── score_backfill.py │ │ └── score_deploy.py │ ├── load_model.ipynb │ ├── meta.json │ ├── streaming/ │ │ ├── Dockerfile │ │ ├── Pipfile │ │ ├── README.md │ │ ├── lambda_function.py │ │ ├── test.py │ │ └── test_docker.py │ ├── web-service/ │ │ ├── Dockerfile │ │ ├── Pipfile │ │ ├── README.md │ │ ├── predict.py │ │ └── test.py │ └── web-service-mlflow/ │ ├── Pipfile │ ├── README.md │ ├── predict.py │ ├── random-forest.ipynb │ └── test.py ├── 05-monitoring/ │ ├── README.md │ ├── baseline_model_nyc_taxi_data.ipynb │ ├── config/ │ │ ├── grafana_dashboards.yaml │ │ └── grafana_datasources.yaml │ ├── dashboards/ │ │ └── data_drift.json │ ├── data/ │ │ └── .gitignore │ ├── debugging_nyc_taxi_data.ipynb │ ├── docker-compose.yml │ ├── dummy_metrics_calculation.py │ ├── evidently_metrics_calculation.py │ ├── meta.json │ ├── models/ │ │ └── .gitignore │ ├── post-evidently-0.7/ │ │ ├── README.md │ │ ├── baseline_model_nyc_taxi_data.ipynb │ │ ├── config/ │ │ │ ├── grafana_dashboards.yaml │ │ │ └── grafana_datasources.yaml │ │ ├── dashboards/ │ │ │ └── data_drift.json │ │ ├── debugging_nyc_taxi_data.ipynb │ │ ├── docker-compose.yml │ │ ├── dummy_metrics_calculation.py │ │ ├── evidently_metrics_calculation.py │ │ ├── meta.json │ │ └── requirements.txt │ └── requirements.txt ├── 06-best-practices/ │ ├── README.md │ ├── code/ │ │ ├── .gitignore │ │ ├── .pre-commit-config.yaml │ │ ├── .vscode/ │ │ │ └── settings.json │ │ ├── Dockerfile │ │ ├── Makefile │ │ ├── Pipfile │ │ ├── README.md │ │ ├── infrastructure/ │ │ │ ├── main.tf │ │ │ ├── modules/ │ │ │ │ ├── ecr/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── variables.tf │ │ │ │ ├── kinesis/ │ │ │ │ │ ├── main.tf │ │ │ │ │ └── variables.tf │ │ │ │ ├── lambda/ │ │ │ │ │ ├── iam.tf │ │ │ │ │ ├── main.tf │ │ │ │ │ └── variables.tf │ │ │ │ └── s3/ │ │ │ │ ├── main.tf │ │ │ │ └── variables.tf │ │ │ ├── variables.tf │ │ │ └── vars/ │ │ │ ├── prod.tfvars │ │ │ └── stg.tfvars │ │ ├── integration-test/ │ │ │ ├── docker-compose.yaml │ │ │ ├── event.json │ │ │ ├── model/ │ │ │ │ ├── MLmodel │ │ │ │ ├── conda.yaml │ │ │ │ ├── model.pkl │ │ │ │ ├── python_env.yaml │ │ │ │ └── requirements.txt │ │ │ ├── run.sh │ │ │ ├── test_docker.py │ │ │ └── test_kinesis.py │ │ ├── lambda_function.py │ │ ├── model.py │ │ ├── plan.md │ │ ├── pyproject.toml │ │ ├── scripts/ │ │ │ ├── deploy_manual.sh │ │ │ ├── publish.sh │ │ │ └── test_cloud_e2e.sh │ │ └── tests/ │ │ ├── __init__.py │ │ ├── data.b64 │ │ └── model_test.py │ ├── docs.md │ └── meta.json ├── 07-project/ │ └── README.md ├── README.md ├── after-sign-up.md ├── asking-questions.md ├── certificate.md ├── cohorts/ │ ├── 2022/ │ │ ├── 01-intro/ │ │ │ ├── homework.ipynb │ │ │ └── homework.md │ │ ├── 02-experiment-tracking/ │ │ │ ├── homework/ │ │ │ │ ├── hpo.py │ │ │ │ ├── preprocess_data.py │ │ │ │ ├── register_model.py │ │ │ │ └── train.py │ │ │ └── homework.md │ │ ├── 03-orchestration/ │ │ │ ├── README.md │ │ │ ├── code/ │ │ │ │ ├── model_training.py │ │ │ │ ├── orchestration.py │ │ │ │ ├── prefect_deploy.py │ │ │ │ ├── prefect_flow.py │ │ │ │ └── work-queue.py │ │ │ ├── homework.md │ │ │ ├── homework.py │ │ │ └── homework_solution.py │ │ ├── 04-deployment/ │ │ │ ├── homework/ │ │ │ │ ├── Dockerfile │ │ │ │ ├── Pipfile │ │ │ │ ├── batch.py │ │ │ │ ├── homework.dockerfile │ │ │ │ └── starter.ipynb │ │ │ └── homework.md │ │ ├── 05-monitoring/ │ │ │ ├── README.md │ │ │ ├── homework/ │ │ │ │ ├── docker-compose-homework-solution.yml │ │ │ │ ├── docker-compose-homework.yml │ │ │ │ ├── model_training.py │ │ │ │ ├── prediction_service/ │ │ │ │ │ ├── Dockerfile │ │ │ │ │ ├── Pipfile │ │ │ │ │ └── app.py │ │ │ │ ├── prefect-monitoring/ │ │ │ │ │ ├── Pipfile │ │ │ │ │ ├── clean_mongo.py │ │ │ │ │ ├── monitor_profile.ipynb │ │ │ │ │ ├── monitor_profile_solution.ipynb │ │ │ │ │ ├── prefect_monitoring.py │ │ │ │ │ ├── prefect_monitoring_solution.py │ │ │ │ │ ├── prepare_reference_data.py │ │ │ │ │ └── send_data.py │ │ │ │ ├── prepare.py │ │ │ │ ├── requirements.txt │ │ │ │ └── test.py │ │ │ └── homework.md │ │ ├── 06-best-practices/ │ │ │ ├── homework/ │ │ │ │ ├── Dockerfile │ │ │ │ ├── Pipfile │ │ │ │ └── batch.py │ │ │ ├── homework.md │ │ │ └── homework_solution/ │ │ │ ├── Dockerfile │ │ │ ├── Pipfile │ │ │ ├── batch.py │ │ │ ├── docker-compose.yaml │ │ │ ├── integration_test.py │ │ │ ├── integration_test.sh │ │ │ └── tests/ │ │ │ ├── __init__.py │ │ │ └── test_batch.py │ │ ├── 07-project/ │ │ │ └── README.md │ │ └── leaderboard.md │ ├── 2023/ │ │ ├── 01-intro/ │ │ │ └── homework.md │ │ ├── 02-experiment-tracking/ │ │ │ ├── homework/ │ │ │ │ ├── hpo.py │ │ │ │ ├── preprocess_data.py │ │ │ │ ├── register_model.py │ │ │ │ └── train.py │ │ │ ├── homework-wandb/ │ │ │ │ ├── preprocess_data.py │ │ │ │ ├── sweep.py │ │ │ │ └── train.py │ │ │ ├── homework.md │ │ │ ├── solution-mlflow/ │ │ │ │ ├── hpo.py │ │ │ │ ├── preprocess_data.py │ │ │ │ ├── register_model.py │ │ │ │ └── train.py │ │ │ └── wandb.md │ │ ├── 03-orchestration/ │ │ │ ├── homework.md │ │ │ └── prefect/ │ │ │ ├── .gitignore │ │ │ ├── 3.2/ │ │ │ │ ├── cat_dog_facts.py │ │ │ │ └── cat_facts.py │ │ │ ├── 3.3/ │ │ │ │ ├── duration_prediction_explore.ipynb │ │ │ │ ├── duration_prediction_original.ipynb │ │ │ │ ├── orchestrate.py │ │ │ │ └── orchestrate_pre_prefect.py │ │ │ ├── 3.4/ │ │ │ │ └── orchestrate.py │ │ │ ├── 3.5/ │ │ │ │ ├── create_s3_bucket_block.py │ │ │ │ ├── orchestrate.py │ │ │ │ └── orchestrate_s3.py │ │ │ ├── 3.6/ │ │ │ │ ├── create_s3_bucket_block.py │ │ │ │ └── orchestrate_s3.py │ │ │ ├── README.md │ │ │ ├── meta.json │ │ │ └── requirements.txt │ │ ├── 04-deployment/ │ │ │ ├── homework/ │ │ │ │ ├── Dockerfile │ │ │ │ └── starter.ipynb │ │ │ └── homework.md │ │ ├── 05-monitoring/ │ │ │ └── homework.md │ │ ├── 06-best-practices/ │ │ │ ├── homework/ │ │ │ │ ├── Dockerfile │ │ │ │ ├── Pipfile │ │ │ │ └── batch.py │ │ │ ├── homework.md │ │ │ └── homework_solution/ │ │ │ ├── Pipfile │ │ │ ├── batch.py │ │ │ ├── docker-compose.yaml │ │ │ ├── integration_test.py │ │ │ └── tests/ │ │ │ ├── __init__.py │ │ │ └── test_batch.py │ │ ├── 07-project/ │ │ │ └── README.md │ │ └── README.md │ ├── 2024/ │ │ ├── 01-intro/ │ │ │ └── homework.md │ │ ├── 02-experiment-tracking/ │ │ │ ├── homework/ │ │ │ │ ├── hpo.py │ │ │ │ ├── preprocess_data.py │ │ │ │ ├── register_model.py │ │ │ │ └── train.py │ │ │ ├── homework.md │ │ │ └── solution/ │ │ │ ├── hpo.py │ │ │ ├── preprocess_data.py │ │ │ ├── register_model.py │ │ │ └── train.py │ │ ├── 03-orchestration/ │ │ │ ├── .gitignore │ │ │ ├── 3.0/ │ │ │ │ └── README.md │ │ │ ├── 3.1/ │ │ │ │ └── README.md │ │ │ ├── 3.2/ │ │ │ │ └── README.md │ │ │ ├── 3.3/ │ │ │ │ └── README.md │ │ │ ├── 3.4/ │ │ │ │ └── README.md │ │ │ ├── 3.5/ │ │ │ │ └── README.md │ │ │ ├── README.md │ │ │ ├── homework.md │ │ │ ├── meta.json │ │ │ └── requirements.txt │ │ ├── 04-deployment/ │ │ │ ├── homework/ │ │ │ │ └── starter.ipynb │ │ │ ├── homework.md │ │ │ └── homework_solution/ │ │ │ ├── Dockerfile │ │ │ ├── Pipfile │ │ │ ├── batch.py │ │ │ ├── homework.dockerfile │ │ │ └── solution.ipynb │ │ ├── 05-monitoring/ │ │ │ └── homework.md │ │ ├── 06-best-practices/ │ │ │ ├── homework/ │ │ │ │ ├── Dockerfile │ │ │ │ ├── Pipfile │ │ │ │ └── batch.py │ │ │ └── homework.md │ │ ├── README.md │ │ └── project.md │ └── 2025/ │ ├── 01-intro/ │ │ ├── homework.ipynb │ │ └── homework.md │ ├── 02-experiment-tracking/ │ │ ├── homework/ │ │ │ ├── hpo.py │ │ │ ├── preprocess_data.py │ │ │ ├── register_model.py │ │ │ └── train.py │ │ └── homework.md │ ├── 03-orchestration/ │ │ └── homework.md │ ├── 04-deployment/ │ │ ├── homework/ │ │ │ └── starter.ipynb │ │ └── homework.md │ ├── 05-monitoring/ │ │ └── homework.md │ ├── 06-best-practices/ │ │ ├── homework/ │ │ │ ├── Dockerfile │ │ │ ├── Pipfile │ │ │ └── batch.py │ │ └── homework.md │ ├── README.md │ ├── competition/ │ │ └── README.md │ └── project.md ├── generate/ │ └── generate_pages.ipynb └── learning-in-public.md
SYMBOL INDEX (242 symbols across 74 files)
FILE: 03-orchestration/code/duration-prediction.py
function read_dataframe (line 23) | def read_dataframe(year, month):
function create_X (line 40) | def create_X(df, dv=None):
function train_model (line 54) | def train_model(X_train, y_train, X_val, y_val, dv):
function run (line 92) | def run(year, month):
FILE: 04-deployment/batch/score.py
function generate_uuids (line 27) | def generate_uuids(n):
function read_dataframe (line 34) | def read_dataframe(filename: str):
function prepare_dictionaries (line 46) | def prepare_dictionaries(df: pd.DataFrame):
function load_model (line 58) | def load_model(run_id):
function save_results (line 64) | def save_results(df, y_pred, run_id, output_file):
function apply_model (line 79) | def apply_model(input_file, run_id, output_file):
function get_paths (line 98) | def get_paths(run_date, taxi_type, run_id):
function ride_duration_prediction (line 110) | def ride_duration_prediction(
function run (line 127) | def run():
FILE: 04-deployment/batch/score_backfill.py
function ride_duration_prediction_backfill (line 10) | def ride_duration_prediction_backfill():
FILE: 04-deployment/streaming/lambda_function.py
function prepare_features (line 22) | def prepare_features(ride):
function predict (line 29) | def predict(features):
function lambda_handler (line 34) | def lambda_handler(event, context):
FILE: 04-deployment/web-service-mlflow/predict.py
function prepare_features (line 15) | def prepare_features(ride):
function predict (line 22) | def predict(features):
function predict_endpoint (line 31) | def predict_endpoint():
FILE: 04-deployment/web-service/predict.py
function prepare_features (line 9) | def prepare_features(ride):
function predict (line 16) | def predict(features):
function predict_endpoint (line 26) | def predict_endpoint():
FILE: 05-monitoring/dummy_metrics_calculation.py
function prep_db (line 26) | def prep_db():
function calculate_dummy_metrics_postgresql (line 34) | def calculate_dummy_metrics_postgresql(curr):
function main (line 44) | def main():
FILE: 05-monitoring/evidently_metrics_calculation.py
function prep_db (line 56) | def prep_db():
function calculate_metrics_postgresql (line 65) | def calculate_metrics_postgresql(curr, i):
function batch_monitoring_backfill (line 87) | def batch_monitoring_backfill():
FILE: 05-monitoring/post-evidently-0.7/dummy_metrics_calculation.py
function prep_db (line 26) | def prep_db():
function calculate_dummy_metrics_postgresql (line 34) | def calculate_dummy_metrics_postgresql(curr):
function main (line 44) | def main():
FILE: 05-monitoring/post-evidently-0.7/evidently_metrics_calculation.py
function prep_db (line 60) | def prep_db():
function calculate_metrics_postgresql (line 69) | def calculate_metrics_postgresql(i):
function batch_monitoring_backfill (line 94) | def batch_monitoring_backfill():
FILE: 06-best-practices/code/lambda_function.py
function lambda_handler (line 17) | def lambda_handler(event, context):
FILE: 06-best-practices/code/model.py
function get_model_location (line 9) | def get_model_location(run_id):
function load_model (line 22) | def load_model(run_id):
function base64_decode (line 28) | def base64_decode(encoded_data):
class ModelService (line 34) | class ModelService:
method __init__ (line 35) | def __init__(self, model, model_version=None, callbacks=None):
method prepare_features (line 40) | def prepare_features(self, ride):
method predict (line 46) | def predict(self, features):
method lambda_handler (line 50) | def lambda_handler(self, event):
class KinesisCallback (line 80) | class KinesisCallback:
method __init__ (line 81) | def __init__(self, kinesis_client, prediction_stream_name):
method put_record (line 85) | def put_record(self, prediction_event):
function create_kinesis_client (line 95) | def create_kinesis_client():
function init (line 104) | def init(prediction_stream_name: str, run_id: str, test_run: bool):
FILE: 06-best-practices/code/tests/model_test.py
function read_text (line 6) | def read_text(file):
function test_base64_decode (line 13) | def test_base64_decode():
function test_prepare_features (line 29) | def test_prepare_features():
class ModelMock (line 48) | class ModelMock:
method __init__ (line 49) | def __init__(self, value):
method predict (line 52) | def predict(self, X):
function test_predict (line 57) | def test_predict():
function test_lambda_handler (line 72) | def test_lambda_handler():
FILE: cohorts/2022/02-experiment-tracking/homework/hpo.py
function load_pickle (line 16) | def load_pickle(filename):
function run (line 21) | def run(data_path, num_trials):
FILE: cohorts/2022/02-experiment-tracking/homework/preprocess_data.py
function dump_pickle (line 9) | def dump_pickle(obj, filename):
function read_dataframe (line 14) | def read_dataframe(filename: str):
function preprocess (line 27) | def preprocess(df: pd.DataFrame, dv: DictVectorizer, fit_dv: bool = False):
function run (line 39) | def run(raw_data_path: str, dest_path: str, dataset: str = "green"):
FILE: cohorts/2022/02-experiment-tracking/homework/register_model.py
function load_pickle (line 29) | def load_pickle(filename):
function train_and_log_model (line 34) | def train_and_log_model(data_path, params):
function run (line 51) | def run(data_path, log_top):
FILE: cohorts/2022/02-experiment-tracking/homework/train.py
function load_pickle (line 9) | def load_pickle(filename: str):
function run (line 14) | def run(data_path):
FILE: cohorts/2022/03-orchestration/code/model_training.py
function read_dataframe (line 19) | def read_dataframe(filename):
function add_features (line 35) | def add_features(train_path="./data/green_tripdata_2021-01.parquet",
function train_model_search (line 93) | def train_model_search(train, valid, y_val):
function train_best_model (line 130) | def train_best_model(train, valid, y_val, dv):
FILE: cohorts/2022/03-orchestration/code/orchestration.py
function read_dataframe (line 18) | def read_dataframe(filename):
function add_features (line 35) | def add_features(df_train, df_val):
function train_model_search (line 58) | def train_model_search(train, valid, y_val):
function train_best_model (line 96) | def train_best_model(X_train, X_val, y_train, y_val, dv):
function main_flow (line 133) | def main_flow(train_path: str = './data/green_tripdata_2021-01.parquet',
FILE: cohorts/2022/03-orchestration/code/prefect_deploy.py
function read_dataframe (line 17) | def read_dataframe(filename):
function add_features (line 34) | def add_features(df_train, df_val):
function train_model_search (line 62) | def train_model_search(train, valid, y_val):
function train_best_model (line 100) | def train_best_model(train, valid, y_val, dv):
function main (line 134) | def main(train_path: str="./data/green_tripdata_2021-01.parquet",
FILE: cohorts/2022/03-orchestration/code/prefect_flow.py
function read_dataframe (line 17) | def read_dataframe(filename):
function add_features (line 34) | def add_features(df_train, df_val):
function train_model_search (line 62) | def train_model_search(train, valid, y_val):
function train_best_model (line 100) | def train_best_model(train, valid, y_val, dv):
function main (line 134) | def main(train_path: str="./data/green_tripdata_2021-01.parquet",
FILE: cohorts/2022/03-orchestration/code/work-queue.py
function myflow (line 4) | def myflow():
FILE: cohorts/2022/03-orchestration/homework.py
function read_data (line 7) | def read_data(path):
function prepare_features (line 11) | def prepare_features(df, categorical, train=True):
function train_model (line 25) | def train_model(df, categorical):
function run_model (line 42) | def run_model(df, categorical, dv, lr):
function main (line 52) | def main(train_path: str = './data/fhv_tripdata_2021-01.parquet',
FILE: cohorts/2022/03-orchestration/homework_solution.py
function read_data (line 12) | def read_data(path):
function prepare_features (line 17) | def prepare_features(df, categorical, train=True):
function train_model (line 33) | def train_model(df, categorical):
function run_model (line 51) | def run_model(df, categorical, dv, lr):
function get_paths (line 63) | def get_paths(date):
function main (line 76) | def main(date=None):
FILE: cohorts/2022/04-deployment/homework/batch.py
function read_data (line 22) | def read_data(filename):
FILE: cohorts/2022/05-monitoring/homework/model_training.py
function read_dataframe (line 9) | def read_dataframe(filename):
function add_features (line 25) | def add_features(train_data="./datasets/green_tripdata_2021-03.parquet",
FILE: cohorts/2022/05-monitoring/homework/prediction_service/app.py
function prepare_features (line 28) | def prepare_features(ride):
function save_db (line 39) | def save_db(record, pred_result):
function get_info (line 49) | def get_info():
function predict_duration (line 66) | def predict_duration():
FILE: cohorts/2022/05-monitoring/homework/prefect-monitoring/prefect_monitoring.py
function upload_target (line 25) | def upload_target(filename):
function load_reference_data (line 38) | def load_reference_data(filename):
function fetch_data (line 57) | def fetch_data():
function run_evidently (line 64) | def run_evidently(ref_data, data):
function save_report (line 81) | def save_report(result):
function save_html_report (line 85) | def save_html_report(result):
function batch_analyze (line 90) | def batch_analyze():
FILE: cohorts/2022/05-monitoring/homework/prefect-monitoring/prefect_monitoring_solution.py
function upload_target (line 26) | def upload_target(filename):
function load_reference_data (line 39) | def load_reference_data(filename):
function fetch_data (line 58) | def fetch_data():
function run_evidently (line 65) | def run_evidently(ref_data, data):
function save_report (line 82) | def save_report(result):
function save_html_report (line 90) | def save_html_report(result, filename_suffix=None):
function batch_analyze (line 100) | def batch_analyze():
FILE: cohorts/2022/05-monitoring/homework/prefect-monitoring/send_data.py
class DateTimeEncoder (line 14) | class DateTimeEncoder(json.JSONEncoder):
method default (line 15) | def default(self, o):
FILE: cohorts/2022/06-best-practices/homework/batch.py
function read_data (line 22) | def read_data(filename):
FILE: cohorts/2022/06-best-practices/homework_solution/batch.py
function prepare_data (line 10) | def prepare_data(df, categorical):
function read_data (line 20) | def read_data(filename, categorical):
function write_date (line 37) | def write_date(filename, df):
function get_input_path (line 52) | def get_input_path(year, month):
function get_output_path (line 58) | def get_output_path(year, month):
function main (line 64) | def main(year, month):
FILE: cohorts/2022/06-best-practices/homework_solution/integration_test.py
function dt (line 8) | def dt(hour, minute, second=0):
FILE: cohorts/2022/06-best-practices/homework_solution/tests/test_batch.py
function dt (line 8) | def dt(hour, minute, second=0):
function test_prepare_data (line 12) | def test_prepare_data():
FILE: cohorts/2023/02-experiment-tracking/homework-wandb/preprocess_data.py
function dump_pickle (line 11) | def dump_pickle(obj, filename: str):
function read_dataframe (line 16) | def read_dataframe(filename: str):
function preprocess (line 29) | def preprocess(df: pd.DataFrame, dv: DictVectorizer, fit_dv: bool = False):
function run_data_prep (line 48) | def run_data_prep(
FILE: cohorts/2023/02-experiment-tracking/homework-wandb/sweep.py
function load_pickle (line 12) | def load_pickle(filename: str):
function run_train (line 17) | def run_train(data_artifact: str):
function run_sweep (line 81) | def run_sweep(wandb_project: str, wandb_entity: str, data_artifact: str,...
FILE: cohorts/2023/02-experiment-tracking/homework-wandb/train.py
function load_pickle (line 11) | def load_pickle(filename: str):
function run_train (line 25) | def run_train(
FILE: cohorts/2023/02-experiment-tracking/homework/hpo.py
function load_pickle (line 15) | def load_pickle(filename):
function run_optimization (line 31) | def run_optimization(data_path: str, num_trials: int):
FILE: cohorts/2023/02-experiment-tracking/homework/preprocess_data.py
function dump_pickle (line 9) | def dump_pickle(obj, filename: str):
function read_dataframe (line 14) | def read_dataframe(filename: str):
function preprocess (line 27) | def preprocess(df: pd.DataFrame, dv: DictVectorizer, fit_dv: bool = False):
function run_data_prep (line 48) | def run_data_prep(raw_data_path: str, dest_path: str, dataset: str = "gr...
FILE: cohorts/2023/02-experiment-tracking/homework/register_model.py
function load_pickle (line 20) | def load_pickle(filename):
function train_and_log_model (line 25) | def train_and_log_model(data_path, params):
function run_register_model (line 56) | def run_register_model(data_path: str, top_n: int):
FILE: cohorts/2023/02-experiment-tracking/homework/train.py
function load_pickle (line 9) | def load_pickle(filename: str):
function run_train (line 20) | def run_train(data_path: str):
FILE: cohorts/2023/02-experiment-tracking/solution-mlflow/hpo.py
function load_pickle (line 15) | def load_pickle(filename):
function run_optimization (line 31) | def run_optimization(data_path: str, num_trials: int):
FILE: cohorts/2023/02-experiment-tracking/solution-mlflow/preprocess_data.py
function dump_pickle (line 9) | def dump_pickle(obj, filename: str):
function read_dataframe (line 14) | def read_dataframe(filename: str):
function preprocess (line 27) | def preprocess(df: pd.DataFrame, dv: DictVectorizer, fit_dv: bool = False):
function run_data_prep (line 48) | def run_data_prep(raw_data_path: str, dest_path: str, dataset: str = "gr...
FILE: cohorts/2023/02-experiment-tracking/solution-mlflow/register_model.py
function load_pickle (line 20) | def load_pickle(filename):
function train_and_log_model (line 25) | def train_and_log_model(data_path, params):
function run_register_model (line 56) | def run_register_model(data_path: str, top_n: int):
FILE: cohorts/2023/02-experiment-tracking/solution-mlflow/train.py
function load_pickle (line 14) | def load_pickle(filename: str):
function run_train (line 25) | def run_train(data_path: str):
FILE: cohorts/2023/03-orchestration/prefect/3.2/cat_dog_facts.py
function fetch_cat_fact (line 5) | def fetch_cat_fact():
function fetch_dog_fact (line 10) | def fetch_dog_fact():
function animal_facts (line 18) | def animal_facts():
FILE: cohorts/2023/03-orchestration/prefect/3.2/cat_facts.py
function fetch_cat_fact (line 6) | def fetch_cat_fact():
function fetch (line 15) | def fetch():
FILE: cohorts/2023/03-orchestration/prefect/3.3/orchestrate.py
function read_data (line 15) | def read_data(filename: str) -> pd.DataFrame:
function add_features (line 34) | def add_features(
function train_best_model (line 66) | def train_best_model(
function main_flow (line 113) | def main_flow(
FILE: cohorts/2023/03-orchestration/prefect/3.3/orchestrate_pre_prefect.py
function read_data (line 14) | def read_data(filename: str) -> pd.DataFrame:
function add_features (line 32) | def add_features(
function train_best_model (line 63) | def train_best_model(
function main_flow (line 109) | def main_flow(
FILE: cohorts/2023/03-orchestration/prefect/3.4/orchestrate.py
function read_data (line 15) | def read_data(filename: str) -> pd.DataFrame:
function add_features (line 34) | def add_features(
function train_best_model (line 66) | def train_best_model(
function main_flow (line 113) | def main_flow(
FILE: cohorts/2023/03-orchestration/prefect/3.5/create_s3_bucket_block.py
function create_aws_creds_block (line 5) | def create_aws_creds_block():
function create_s3_bucket_block (line 12) | def create_s3_bucket_block():
FILE: cohorts/2023/03-orchestration/prefect/3.5/orchestrate.py
function read_data (line 15) | def read_data(filename: str) -> pd.DataFrame:
function add_features (line 34) | def add_features(
function train_best_model (line 66) | def train_best_model(
function main_flow (line 113) | def main_flow(
FILE: cohorts/2023/03-orchestration/prefect/3.5/orchestrate_s3.py
function read_data (line 18) | def read_data(filename: str) -> pd.DataFrame:
function add_features (line 37) | def add_features(
function train_best_model (line 69) | def train_best_model(
function main_flow_s3 (line 134) | def main_flow_s3(
FILE: cohorts/2023/03-orchestration/prefect/3.6/create_s3_bucket_block.py
function create_aws_creds_block (line 5) | def create_aws_creds_block():
function create_s3_bucket_block (line 12) | def create_s3_bucket_block():
FILE: cohorts/2023/03-orchestration/prefect/3.6/orchestrate_s3.py
function read_data (line 18) | def read_data(filename: str) -> pd.DataFrame:
function add_features (line 37) | def add_features(
function train_best_model (line 69) | def train_best_model(
function main_flow_s3 (line 134) | def main_flow_s3(
FILE: cohorts/2023/06-best-practices/homework/batch.py
function read_data (line 22) | def read_data(filename):
FILE: cohorts/2023/06-best-practices/homework_solution/batch.py
function prepare_data (line 10) | def prepare_data(df, categorical):
function read_data (line 21) | def read_data(filename, categorical):
function save_data (line 38) | def save_data(filename, df):
function get_input_path (line 53) | def get_input_path(year, month):
function get_output_path (line 59) | def get_output_path(year, month):
function main (line 65) | def main(year, month):
FILE: cohorts/2023/06-best-practices/homework_solution/integration_test.py
function dt (line 8) | def dt(hour, minute, second=0):
FILE: cohorts/2023/06-best-practices/homework_solution/tests/test_batch.py
function dt (line 7) | def dt(hour, minute, second=0):
function test_prepare_data (line 11) | def test_prepare_data():
FILE: cohorts/2024/02-experiment-tracking/homework/hpo.py
function load_pickle (line 15) | def load_pickle(filename: str):
function run_optimization (line 31) | def run_optimization(data_path: str, num_trials: int):
FILE: cohorts/2024/02-experiment-tracking/homework/preprocess_data.py
function dump_pickle (line 9) | def dump_pickle(obj, filename: str):
function read_dataframe (line 14) | def read_dataframe(filename: str):
function preprocess (line 27) | def preprocess(df: pd.DataFrame, dv: DictVectorizer, fit_dv: bool = False):
function run_data_prep (line 48) | def run_data_prep(raw_data_path: str, dest_path: str, dataset: str = "gr...
FILE: cohorts/2024/02-experiment-tracking/homework/register_model.py
function load_pickle (line 20) | def load_pickle(filename):
function train_and_log_model (line 25) | def train_and_log_model(data_path, params):
function run_register_model (line 57) | def run_register_model(data_path: str, top_n: int):
FILE: cohorts/2024/02-experiment-tracking/homework/train.py
function load_pickle (line 9) | def load_pickle(filename: str):
function run_train (line 20) | def run_train(data_path: str):
FILE: cohorts/2024/02-experiment-tracking/solution/hpo.py
function load_pickle (line 15) | def load_pickle(filename: str):
function run_optimization (line 31) | def run_optimization(data_path: str, num_trials: int):
FILE: cohorts/2024/02-experiment-tracking/solution/preprocess_data.py
function dump_pickle (line 9) | def dump_pickle(obj, filename: str):
function read_dataframe (line 14) | def read_dataframe(filename: str):
function preprocess (line 27) | def preprocess(df: pd.DataFrame, dv: DictVectorizer, fit_dv: bool = False):
function run_data_prep (line 48) | def run_data_prep(raw_data_path: str, dest_path: str, dataset: str = "gr...
FILE: cohorts/2024/02-experiment-tracking/solution/register_model.py
function load_pickle (line 20) | def load_pickle(filename):
function train_and_log_model (line 25) | def train_and_log_model(data_path, params):
function run_register_model (line 56) | def run_register_model(data_path: str, top_n: int):
FILE: cohorts/2024/02-experiment-tracking/solution/train.py
function load_pickle (line 14) | def load_pickle(filename: str):
function run_train (line 25) | def run_train(data_path: str):
FILE: cohorts/2024/04-deployment/homework_solution/batch.py
function read_data (line 25) | def read_data(filename):
FILE: cohorts/2024/06-best-practices/homework/batch.py
function read_data (line 22) | def read_data(filename):
FILE: cohorts/2025/02-experiment-tracking/homework/hpo.py
function load_pickle (line 15) | def load_pickle(filename: str):
function run_optimization (line 31) | def run_optimization(data_path: str, num_trials: int):
FILE: cohorts/2025/02-experiment-tracking/homework/preprocess_data.py
function dump_pickle (line 9) | def dump_pickle(obj, filename: str):
function read_dataframe (line 14) | def read_dataframe(filename: str):
function preprocess (line 27) | def preprocess(df: pd.DataFrame, dv: DictVectorizer, fit_dv: bool = False):
function run_data_prep (line 48) | def run_data_prep(raw_data_path: str, dest_path: str, dataset: str = "gr...
FILE: cohorts/2025/02-experiment-tracking/homework/register_model.py
function load_pickle (line 20) | def load_pickle(filename):
function train_and_log_model (line 25) | def train_and_log_model(data_path, params):
function run_register_model (line 57) | def run_register_model(data_path: str, top_n: int):
FILE: cohorts/2025/02-experiment-tracking/homework/train.py
function load_pickle (line 9) | def load_pickle(filename: str):
function run_train (line 20) | def run_train(data_path: str):
FILE: cohorts/2025/06-best-practices/homework/batch.py
function read_data (line 22) | def read_data(filename):
Condensed preview — 274 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,645K chars).
[
{
"path": ".github/FUNDING.yml",
"chars": 23,
"preview": "github: alexeygrigorev\n"
},
{
"path": ".github/workflows/cd-deploy.yml",
"chars": 4382,
"preview": "name: CD-Deploy\non:\n push:\n branches:\n - 'develop'\n# paths:\n# - '06-best-practices/code/**'\n\njobs:\n bu"
},
{
"path": ".github/workflows/ci-tests.yml",
"chars": 1944,
"preview": "name: CI-Tests\non:\n pull_request:\n branches:\n - 'develop'\n paths:\n - '06-best-practices/code/**'\n\nenv:\n"
},
{
"path": ".gitignore",
"chars": 188,
"preview": "data/\n.ipynb_checkpoints\n.bin\n*.db\n\n*.parquet\n*.html\n*.csv\n\n.venv\nvenv\n.idea\n**/artifacts/\n**/models/\n\n__pycache__/\n**.e"
},
{
"path": "01-intro/README.md",
"chars": 7650,
"preview": "# 1. Introduction\n\nInstructor: Alexey Grigorev\n\n## 1.1 Introduction\n\n<a href=\"https://www.youtube.com/watch?v=s0uaFZSzwf"
},
{
"path": "01-intro/duration-prediction.ipynb",
"chars": 32718,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"id\": \"b2bd82d7\",\n \"metadata\": {},\n \"outputs\":"
},
{
"path": "01-intro/meta.json",
"chars": 854,
"preview": "{\n \"module\": {\n \"number\": 1,\n \"title\": \"Introduction\"\n },\n \"units\": [\n {\n \"number\": 1,\n \"title\": \""
},
{
"path": "02-experiment-tracking/README.md",
"chars": 5540,
"preview": "# 2. Experiment tracking and model management\n\n\n* [Slides](https://drive.google.com/file/d/1YtkAtOQS3wvY7yts_nosVlXrLQBq"
},
{
"path": "02-experiment-tracking/duration-prediction.ipynb",
"chars": 860650,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"id\": \"b2bd82d7\",\n \"metadata\": {},\n \"outputs\":"
},
{
"path": "02-experiment-tracking/meta.json",
"chars": 1165,
"preview": "{\n \"module\": {\n \"number\": 2,\n \"title\": \"Experiment tracking and model management\"\n },\n \"units\": [\n {\n \""
},
{
"path": "02-experiment-tracking/mlflow_on_aws.md",
"chars": 4744,
"preview": "# Basic AWS setup\n\nThis tutorials explains how to configure a remote tracking server on AWS. We will use an RDS database"
},
{
"path": "02-experiment-tracking/model-registry.ipynb",
"chars": 15480,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## MLflow's Model Registry\"\n ]\n "
},
{
"path": "02-experiment-tracking/requirements.txt",
"chars": 77,
"preview": "mlflow\njupyter\nscikit-learn\npandas\nseaborn\nhyperopt\nxgboost\nfastparquet\nboto3"
},
{
"path": "02-experiment-tracking/running-mlflow-examples/scenario-1.ipynb",
"chars": 3532,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Scenario 1: A single data scient"
},
{
"path": "02-experiment-tracking/running-mlflow-examples/scenario-2.ipynb",
"chars": 3778,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Scenario 2: A cross-functional t"
},
{
"path": "02-experiment-tracking/running-mlflow-examples/scenario-3.ipynb",
"chars": 4286,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"## Scenario 3: Multiple data scient"
},
{
"path": "03-orchestration/README.md",
"chars": 3270,
"preview": "# 3. Orchestration and ML Pipelines\n\n## 3.1 Introduction to ML Pipelines\n\n<a href=\"https://www.youtube.com/watch?v=uAR4B"
},
{
"path": "03-orchestration/code/commands.md",
"chars": 522,
"preview": "```bash\npip install mlflow jupyter pandas numpy scikit-learn xgboost hyperopt \nwget https://raw.githubusercontent.com/Da"
},
{
"path": "03-orchestration/code/duration-prediction.ipynb",
"chars": 8939,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"id\": \"b2bd82d7\",\n \"metadata\": {},\n \"outputs\":"
},
{
"path": "03-orchestration/code/duration-prediction.py",
"chars": 3466,
"preview": "#!/usr/bin/env python\n# coding: utf-8\n\nimport pickle\nfrom pathlib import Path\n\nimport pandas as pd\nimport xgboost as xgb"
},
{
"path": "04-deployment/README.md",
"chars": 3116,
"preview": "# 4. Model Deployment\n\n## 4.1 Three ways of deploying a model\n\n<a href=\"https://www.youtube.com/watch?v=JMGe4yIoBRA&list"
},
{
"path": "04-deployment/batch/Pipfile",
"chars": 246,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nscikit-learn = \"==1.0.2\"\nprefect "
},
{
"path": "04-deployment/batch/README.md",
"chars": 163,
"preview": "## Batch deployment\n\n* Turn the notebook for training a model into a notebook for applying the model\n* Turn the notebook"
},
{
"path": "04-deployment/batch/score.ipynb",
"chars": 4545,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"id\": \"2e25cf66\",\n \"metadata\": {},\n \"outputs\":"
},
{
"path": "04-deployment/batch/score.py",
"chars": 3761,
"preview": "#!/usr/bin/env python\n# coding: utf-8\n\nimport os\nimport sys\n\nimport uuid\nimport pickle\n\nfrom datetime import datetime\n\ni"
},
{
"path": "04-deployment/batch/score_backfill.py",
"chars": 586,
"preview": "from datetime import datetime\nfrom dateutil.relativedelta import relativedelta\n\nfrom prefect import flow\n\nimport score\n\n"
},
{
"path": "04-deployment/batch/score_deploy.py",
"chars": 458,
"preview": "from prefect.deployments import Deployment\nfrom prefect.orion.schemas.schedules import CronSchedule\nfrom score import ri"
},
{
"path": "04-deployment/load_model.ipynb",
"chars": 2743,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 3,\n \"id\": \"d84f7be2\",\n \"metadata\": {},\n \"outputs\":"
},
{
"path": "04-deployment/meta.json",
"chars": 1164,
"preview": "{\n \"module\": {\n \"number\": 4,\n \"title\": \"Model Deployment\"\n },\n \"units\": [\n {\n \"number\": 1,\n \"title"
},
{
"path": "04-deployment/streaming/Dockerfile",
"chars": 245,
"preview": "FROM public.ecr.aws/lambda/python:3.9\n\nRUN pip install -U pip\nRUN pip install pipenv \n\nCOPY [ \"Pipfile\", \"Pipfile.lock\","
},
{
"path": "04-deployment/streaming/Pipfile",
"chars": 188,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nboto3 = \"*\"\nmlflow = \"*\"\nscikit-l"
},
{
"path": "04-deployment/streaming/README.md",
"chars": 4446,
"preview": "## Machine Learning for Streaming\n\n* Scenario\n* Creating the role \n* Create a Lambda function, test it\n* Create a Kinesi"
},
{
"path": "04-deployment/streaming/lambda_function.py",
"chars": 1820,
"preview": "import os\nimport json\nimport boto3\nimport base64\n\nimport mlflow\n\nkinesis_client = boto3.client('kinesis')\n\nPREDICTIONS_S"
},
{
"path": "04-deployment/streaming/test.py",
"chars": 1116,
"preview": "\nimport lambda_function\n\nevent = {\n \"Records\": [\n {\n \"kinesis\": {\n \"kinesisSchemaVer"
},
{
"path": "04-deployment/streaming/test_docker.py",
"chars": 1179,
"preview": "import requests \n\nevent = {\n \"Records\": [\n {\n \"kinesis\": {\n \"kinesisSchemaVersion\": "
},
{
"path": "04-deployment/web-service/Dockerfile",
"chars": 286,
"preview": "FROM python:3.9.7-slim\n\nRUN pip install -U pip\nRUN pip install pipenv \n\nWORKDIR /app\n\nCOPY [ \"Pipfile\", \"Pipfile.lock\", "
},
{
"path": "04-deployment/web-service/Pipfile",
"chars": 205,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nscikit-learn = \"==1.0.2\"\nflask = "
},
{
"path": "04-deployment/web-service/README.md",
"chars": 340,
"preview": "## Deploying a model as a web-service\n\n* Creating a virtual environment with Pipenv\n* Creating a script for predictiong "
},
{
"path": "04-deployment/web-service/predict.py",
"chars": 803,
"preview": "import pickle\n\nfrom flask import Flask, request, jsonify\n\nwith open('lin_reg.bin', 'rb') as f_in:\n (dv, model) = pick"
},
{
"path": "04-deployment/web-service/test.py",
"chars": 203,
"preview": "import requests\n\nride = {\n \"PULocationID\": 10,\n \"DOLocationID\": 50,\n \"trip_distance\": 40\n}\n\nurl = 'http://local"
},
{
"path": "04-deployment/web-service-mlflow/Pipfile",
"chars": 230,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nscikit-learn = \"==1.0.2\"\nflask = "
},
{
"path": "04-deployment/web-service-mlflow/README.md",
"chars": 681,
"preview": "## Getting the model for deployment from MLflow\n\n* Take the code from the previous video\n* Train another model, register"
},
{
"path": "04-deployment/web-service-mlflow/predict.py",
"chars": 951,
"preview": "import os\nimport pickle\n\nimport mlflow\nfrom flask import Flask, request, jsonify\n\n\nRUN_ID = os.getenv('RUN_ID')\n\nlogged_"
},
{
"path": "04-deployment/web-service-mlflow/random-forest.ipynb",
"chars": 5680,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"id\": \"2e25cf66\",\n \"metadata\": {},\n \"outputs\":"
},
{
"path": "04-deployment/web-service-mlflow/test.py",
"chars": 203,
"preview": "import requests\n\nride = {\n \"PULocationID\": 10,\n \"DOLocationID\": 50,\n \"trip_distance\": 40\n}\n\nurl = 'http://local"
},
{
"path": "05-monitoring/README.md",
"chars": 4793,
"preview": "# 5. Model Monitoring\n\n## 5.1 Intro to ML monitoring\n\n<a href=\"https://www.youtube.com/watch?v=SQ0jBwd_3kk&list=PL3MmuxU"
},
{
"path": "05-monitoring/config/grafana_dashboards.yaml",
"chars": 877,
"preview": "apiVersion: 1\n\nproviders:\n # <string> an unique provider name. Required\n - name: 'Evidently Dashboards'\n # <int> Or"
},
{
"path": "05-monitoring/config/grafana_datasources.yaml",
"chars": 336,
"preview": "# config file version\napiVersion: 1\n\n# list of datasources to insert/update\n# available in the database\ndatasources:\n -"
},
{
"path": "05-monitoring/dashboards/data_drift.json",
"chars": 9844,
"preview": "{\n \"annotations\": {\n \"list\": [\n {\n \"builtIn\": 1,\n \"datasource\": {\n \"type\": \"grafana\",\n "
},
{
"path": "05-monitoring/data/.gitignore",
"chars": 12,
"preview": "!.gitignore\n"
},
{
"path": "05-monitoring/debugging_nyc_taxi_data.ipynb",
"chars": 5812900,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"ef3de2e5\",\n \"metadata\": {},\n \"source\": [\n \"# Debugging wi"
},
{
"path": "05-monitoring/docker-compose.yml",
"chars": 809,
"preview": "version: '3.7'\n\nvolumes: \n grafana_data: {}\n\nnetworks:\n front-tier:\n back-tier:\n\nservices:\n db:\n image: postgres\n"
},
{
"path": "05-monitoring/dummy_metrics_calculation.py",
"chars": 1815,
"preview": "import datetime\nimport time\nimport random\nimport logging \nimport uuid\nimport pytz\nimport pandas as pd\nimport io\nimport p"
},
{
"path": "05-monitoring/evidently_metrics_calculation.py",
"chars": 3440,
"preview": "import datetime\nimport time\nimport random\nimport logging \nimport uuid\nimport pytz\nimport pandas as pd\nimport io\nimport p"
},
{
"path": "05-monitoring/meta.json",
"chars": 1190,
"preview": "{\n \"module\": {\n \"number\": 5,\n \"title\": \"ML Monitoring\"\n },\n \"units\": [\n {\n \"number\": 1,\n \"title\": "
},
{
"path": "05-monitoring/models/.gitignore",
"chars": 12,
"preview": "!.gitignore\n"
},
{
"path": "05-monitoring/post-evidently-0.7/README.md",
"chars": 4466,
"preview": "# 5. Model Monitoring\n\n## 5.1 Intro to ML monitoring\n\n<a href=\"https://www.youtube.com/watch?v=SQ0jBwd_3kk&list=PL3MmuxU"
},
{
"path": "05-monitoring/post-evidently-0.7/baseline_model_nyc_taxi_data.ipynb",
"chars": 13299,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"edab3cd3-e5a8-4b63-8b8d-c9ef758571b8\",\n \"metadata\": {},\n \"so"
},
{
"path": "05-monitoring/post-evidently-0.7/config/grafana_dashboards.yaml",
"chars": 877,
"preview": "apiVersion: 1\n\nproviders:\n # <string> an unique provider name. Required\n - name: 'Evidently Dashboards'\n # <int> Or"
},
{
"path": "05-monitoring/post-evidently-0.7/config/grafana_datasources.yaml",
"chars": 336,
"preview": "# config file version\napiVersion: 1\n\n# list of datasources to insert/update\n# available in the database\ndatasources:\n -"
},
{
"path": "05-monitoring/post-evidently-0.7/dashboards/data_drift.json",
"chars": 9844,
"preview": "{\n \"annotations\": {\n \"list\": [\n {\n \"builtIn\": 1,\n \"datasource\": {\n \"type\": \"grafana\",\n "
},
{
"path": "05-monitoring/post-evidently-0.7/debugging_nyc_taxi_data.ipynb",
"chars": 4563,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"09fa0727-544d-42b8-96bc-2e63a55cb530\",\n \"metadata\": {},\n \"so"
},
{
"path": "05-monitoring/post-evidently-0.7/docker-compose.yml",
"chars": 809,
"preview": "version: '3.7'\n\nvolumes: \n grafana_data: {}\n\nnetworks:\n front-tier:\n back-tier:\n\nservices:\n db:\n image: postgres\n"
},
{
"path": "05-monitoring/post-evidently-0.7/dummy_metrics_calculation.py",
"chars": 1815,
"preview": "import datetime\nimport time\nimport random\nimport logging \nimport uuid\nimport pytz\nimport pandas as pd\nimport io\nimport p"
},
{
"path": "05-monitoring/post-evidently-0.7/evidently_metrics_calculation.py",
"chars": 3485,
"preview": "import datetime\nimport time\nimport random\nimport logging \nimport uuid\nimport pytz\nimport pandas as pd\nimport io\nimport p"
},
{
"path": "05-monitoring/post-evidently-0.7/meta.json",
"chars": 1190,
"preview": "{\n \"module\": {\n \"number\": 5,\n \"title\": \"ML Monitoring\"\n },\n \"units\": [\n {\n \"number\": 1,\n \"title\": "
},
{
"path": "05-monitoring/post-evidently-0.7/requirements.txt",
"chars": 115,
"preview": "prefect\ntqdm\nrequests\njoblib\npyarrow\npsycopg\npsycopg_binary\nevidently\npandas\nnumpy\nscikit-learn\njupyter\nmatplotlib\n"
},
{
"path": "05-monitoring/requirements.txt",
"chars": 122,
"preview": "prefect\ntqdm\nrequests\njoblib\npyarrow\npsycopg\npsycopg_binary\nevidently==0.6.7\npandas\nnumpy\nscikit-learn\njupyter\nmatplotli"
},
{
"path": "06-best-practices/README.md",
"chars": 5935,
"preview": "# 6. Best Practices\n\n## Part A\n\n(Part B below)\n\n### 6.1 Testing Python code with pytest\n\n<a href=\"https://www.youtube.co"
},
{
"path": "06-best-practices/code/.gitignore",
"chars": 12,
"preview": "__pycache__\n"
},
{
"path": "06-best-practices/code/.pre-commit-config.yaml",
"chars": 972,
"preview": "# See https://pre-commit.com for more information\n# See https://pre-commit.com/hooks.html for more hooks\nrepos:\n- repo: "
},
{
"path": "06-best-practices/code/.vscode/settings.json",
"chars": 226,
"preview": "{\n \"python.testing.pytestArgs\": [\n \"tests\"\n ],\n \"python.testing.unittestEnabled\": false,\n \"python.tes"
},
{
"path": "06-best-practices/code/Dockerfile",
"chars": 256,
"preview": "FROM public.ecr.aws/lambda/python:3.9\n\nRUN pip install -U pip\nRUN pip install pipenv\n\nCOPY [ \"Pipfile\", \"Pipfile.lock\", "
},
{
"path": "06-best-practices/code/Makefile",
"chars": 479,
"preview": "LOCAL_TAG:=$(shell date +\"%Y-%m-%d-%H-%M\")\nLOCAL_IMAGE_NAME:=stream-model-duration:${LOCAL_TAG}\n\ntest:\n\tpytest tests/\n\nq"
},
{
"path": "06-best-practices/code/Pipfile",
"chars": 277,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nboto3 = \"*\"\nmlflow = \"*\"\nscikit-l"
},
{
"path": "06-best-practices/code/README.md",
"chars": 4159,
"preview": "## Code snippets\n\n### Building and running Docker images\n\n```bash\ndocker build -t stream-model-duration:v2 .\n```\n\n```bas"
},
{
"path": "06-best-practices/code/infrastructure/main.tf",
"chars": 2051,
"preview": "# Make sure to create state bucket beforehand\nterraform {\n required_version = \">= 1.0\"\n backend \"s3\" {\n bucket = \""
},
{
"path": "06-best-practices/code/infrastructure/modules/ecr/main.tf",
"chars": 1463,
"preview": "resource \"aws_ecr_repository\" \"repo\" {\n name = var.ecr_repo_name\n image_tag_mutability = \"MUTABLE\"\n\n "
},
{
"path": "06-best-practices/code/infrastructure/modules/ecr/variables.tf",
"chars": 570,
"preview": "variable \"ecr_repo_name\" {\n type = string\n description = \"ECR repo name\"\n}\n\nvariable \"ecr_image_tag\" {\n "
},
{
"path": "06-best-practices/code/infrastructure/modules/kinesis/main.tf",
"chars": 342,
"preview": "# Create Kinesis Data Stream\n\nresource \"aws_kinesis_stream\" \"stream\" {\n name = var.stream_name\n shard_coun"
},
{
"path": "06-best-practices/code/infrastructure/modules/kinesis/variables.tf",
"chars": 729,
"preview": "variable \"stream_name\" {\n type = string\n description = \"Kinesis stream name\"\n}\n\nvariable \"shard_count\" {\n "
},
{
"path": "06-best-practices/code/infrastructure/modules/lambda/iam.tf",
"chars": 3725,
"preview": "resource \"aws_iam_role\" \"iam_lambda\" {\n name = \"iam_${var.lambda_function_name}\"\n assume_role_policy = <<EOF\n{\n \"Vers"
},
{
"path": "06-best-practices/code/infrastructure/modules/lambda/main.tf",
"chars": 1312,
"preview": "resource \"aws_lambda_function\" \"kinesis_lambda\" {\n function_name = var.lambda_function_name\n # This can also be any ba"
},
{
"path": "06-best-practices/code/infrastructure/modules/lambda/variables.tf",
"chars": 657,
"preview": "variable \"source_stream_name\" {\n type = string\n description = \"Source Kinesis Data Streams stream name\"\n}\n\nvari"
},
{
"path": "06-best-practices/code/infrastructure/modules/s3/main.tf",
"chars": 172,
"preview": "resource \"aws_s3_bucket\" \"s3_bucket\" {\n bucket = var.bucket_name\n acl = \"private\"\n force_destroy = true\n}\n\noutput "
},
{
"path": "06-best-practices/code/infrastructure/modules/s3/variables.tf",
"chars": 64,
"preview": "variable \"bucket_name\" {\n description = \"Name of the bucket\"\n}\n"
},
{
"path": "06-best-practices/code/infrastructure/variables.tf",
"chars": 578,
"preview": "variable \"aws_region\" {\n description = \"AWS region to create resources\"\n default = \"eu-west-1\"\n}\n\nvariable \"projec"
},
{
"path": "06-best-practices/code/infrastructure/vars/prod.tfvars",
"chars": 321,
"preview": "source_stream_name = \"prod_ride_events\"\noutput_stream_name = \"prod_ride_predictions\"\nmodel_bucket = \"prod-mlflow-models-"
},
{
"path": "06-best-practices/code/infrastructure/vars/stg.tfvars",
"chars": 316,
"preview": "source_stream_name = \"stg_ride_events\"\noutput_stream_name = \"stg_ride_predictions\"\nmodel_bucket = \"stg-mlflow-models-cod"
},
{
"path": "06-best-practices/code/integration-test/docker-compose.yaml",
"chars": 526,
"preview": "services:\n backend:\n image: ${LOCAL_IMAGE_NAME}\n ports:\n - \"8080:8080\"\n environment:\n - PREDICTIONS_"
},
{
"path": "06-best-practices/code/integration-test/event.json",
"chars": 1014,
"preview": "{\n \"Records\": [\n {\n \"kinesis\": {\n \"kinesisSchemaVersion\": \"1.0\",\n \"pa"
},
{
"path": "06-best-practices/code/integration-test/model/MLmodel",
"chars": 431,
"preview": "artifact_path: model\nflavors:\n python_function:\n env: conda.yaml\n loader_module: mlflow.sklearn\n model_path: m"
},
{
"path": "06-best-practices/code/integration-test/model/conda.yaml",
"chars": 197,
"preview": "channels:\n- conda-forge\ndependencies:\n- python=3.9.7\n- pip<=22.1\n- pip:\n - mlflow\n - cloudpickle==2.0.0\n - psutil==5."
},
{
"path": "06-best-practices/code/integration-test/model/python_env.yaml",
"chars": 119,
"preview": "python: 3.9.7\nbuild_dependencies:\n- pip==22.1\n- setuptools==58.0.4\n- wheel==0.37.0\ndependencies:\n- -r requirements.txt\n"
},
{
"path": "06-best-practices/code/integration-test/model/requirements.txt",
"chars": 88,
"preview": "mlflow\ncloudpickle==2.0.0\npsutil==5.8.0\nscikit-learn==1.0.2\ntyping-extensions==3.10.0.2\n"
},
{
"path": "06-best-practices/code/integration-test/run.sh",
"chars": 984,
"preview": "#!/usr/bin/env bash\n\nif [[ -z \"${GITHUB_ACTIONS}\" ]]; then\n cd \"$(dirname \"$0\")\"\nfi\n\nif [ \"${LOCAL_IMAGE_NAME}\" == \"\" ]"
},
{
"path": "06-best-practices/code/integration-test/test_docker.py",
"chars": 825,
"preview": "# pylint: disable=duplicate-code\n\nimport json\n\nimport requests\nfrom deepdiff import DeepDiff\n\nwith open('event.json', 'r"
},
{
"path": "06-best-practices/code/integration-test/test_kinesis.py",
"chars": 1215,
"preview": "# pylint: disable=duplicate-code\n\nimport os\nimport json\nfrom pprint import pprint\n\nimport boto3\nfrom deepdiff import Dee"
},
{
"path": "06-best-practices/code/lambda_function.py",
"chars": 438,
"preview": "import os\n\nimport model\n\nPREDICTIONS_STREAM_NAME = os.getenv('PREDICTIONS_STREAM_NAME', 'ride_predictions')\nRUN_ID = os."
},
{
"path": "06-best-practices/code/model.py",
"chars": 3333,
"preview": "import os\nimport json\nimport base64\n\nimport boto3\nimport mlflow\n\n\ndef get_model_location(run_id):\n model_location = o"
},
{
"path": "06-best-practices/code/plan.md",
"chars": 342,
"preview": "## Plan\n\n- [x] Testing the code: unit tests with pytest\n- [x] Integration tests with docker-compose\n- [x] Testing cloud "
},
{
"path": "06-best-practices/code/pyproject.toml",
"chars": 366,
"preview": "[tool.pylint.messages_control]\n\ndisable = [\n \"missing-function-docstring\",\n \"missing-final-newline\",\n \"missing-"
},
{
"path": "06-best-practices/code/scripts/deploy_manual.sh",
"chars": 1205,
"preview": "AWS_REGION=\"eu-west-1\"\n\n# Dynamically generated by TF\nexport MODEL_BUCKET_PROD=\"stg-mlflow-models-code-owners-mlops-zoom"
},
{
"path": "06-best-practices/code/scripts/publish.sh",
"chars": 74,
"preview": "#!/usr/bin/env bash\n\necho \"publishing image ${LOCAL_IMAGE_NAME} to ECR...\""
},
{
"path": "06-best-practices/code/scripts/test_cloud_e2e.sh",
"chars": 713,
"preview": "export KINESIS_STREAM_INPUT=\"stg_ride_events-mlops-zoomcamp\"\nexport KINESIS_STREAM_OUTPUT=\"stg_ride_predictions-mlops-zo"
},
{
"path": "06-best-practices/code/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "06-best-practices/code/tests/data.b64",
"chars": 217,
"preview": "ewogICAgICAgICJyaWRlIjogewogICAgICAgICAgICAiUFVMb2NhdGlvbklEIjogMTMwLAogICAgICAgICAgICAiRE9Mb2NhdGlvbklEIjogMjA1LAogICAg"
},
{
"path": "06-best-practices/code/tests/model_test.py",
"chars": 2249,
"preview": "from pathlib import Path\n\nimport model\n\n\ndef read_text(file):\n test_directory = Path(__file__).parent\n\n with open("
},
{
"path": "06-best-practices/docs.md",
"chars": 3869,
"preview": "## Extra Material\n\n### Concepts of IaC and Terraform\n\n#### Summary\n\n**Infrastructure-as-Code (IaC)**:\n* Define and autom"
},
{
"path": "06-best-practices/meta.json",
"chars": 1042,
"preview": "{\n \"module\": {\n \"number\": 6,\n \"title\": \"Best Practices\"\n },\n \"units\": [\n {\n \"number\": \"1\",\n \"title"
},
{
"path": "07-project/README.md",
"chars": 5357,
"preview": "## Course Project\n\n<a href=\"https://www.loom.com/share/8f99d25893de4fb8aaa95c0395c740b6\">\n <img src=\"images/thumbnail-7"
},
{
"path": "README.md",
"chars": 5863,
"preview": "<p align=\"center\">\n <img width=\"80%\" src=\"images/banner-2025.jpg\" alt=\"MLOps Zoomcamp\">\n</p>\n\n<h1 align=\"center\">\n <"
},
{
"path": "after-sign-up.md",
"chars": 1077,
"preview": "## Thank you!\n\nThanks for signining up for the course.\n\nThe process of adding you to the mailing list is not automated y"
},
{
"path": "asking-questions.md",
"chars": 1260,
"preview": "## Asking questions\n\nIf you have any questions, ask them \nin the [`#course-mlops-zoomcamp`](https://app.slack.com/client"
},
{
"path": "certificate.md",
"chars": 1505,
"preview": "## Getting your certificate\n\nCongratulations on finishing the course!\n\nHere's how you can get your certificate.\n\nFirst, "
},
{
"path": "cohorts/2022/01-intro/homework.ipynb",
"chars": 6737,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 42,\n \"id\": \"7525e867\",\n \"metadata\": {},\n \"outputs\""
},
{
"path": "cohorts/2022/01-intro/homework.md",
"chars": 2619,
"preview": "## 1.6 Homework\n\nThe goal of this homework is to train a simple model for predicting the duration of a ride - similar to"
},
{
"path": "cohorts/2022/02-experiment-tracking/homework/hpo.py",
"chars": 1974,
"preview": "import argparse\nimport os\nimport pickle\n\nimport mlflow\nimport numpy as np\nfrom hyperopt import STATUS_OK, Trials, fmin, "
},
{
"path": "cohorts/2022/02-experiment-tracking/homework/preprocess_data.py",
"chars": 2640,
"preview": "import argparse\nimport os\nimport pickle\n\nimport pandas as pd\nfrom sklearn.feature_extraction import DictVectorizer\n\n\ndef"
},
{
"path": "cohorts/2022/02-experiment-tracking/homework/register_model.py",
"chars": 2862,
"preview": "import argparse\nimport os\nimport pickle\n\nimport mlflow\nfrom hyperopt import hp, space_eval\nfrom hyperopt.pyll import sco"
},
{
"path": "cohorts/2022/02-experiment-tracking/homework/train.py",
"chars": 886,
"preview": "import argparse\nimport os\nimport pickle\n\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.metrics import "
},
{
"path": "cohorts/2022/02-experiment-tracking/homework.md",
"chars": 5718,
"preview": "## Homework\n\nThe goal of this homework is to get familiar with MLflow.\n\n\n## Q1. Install MLflow\n\nTo get started with MLfl"
},
{
"path": "cohorts/2022/03-orchestration/README.md",
"chars": 3547,
"preview": "# 3. Orchestration and ML Pipelines\n\n**Note:** [`orchestration.py`](orchestration.py) is a ready final version. The rest"
},
{
"path": "cohorts/2022/03-orchestration/code/model_training.py",
"chars": 5327,
"preview": "from audioop import add\nimport pandas as pd\nimport pickle\n\nfrom sklearn.feature_extraction import DictVectorizer\nfrom sk"
},
{
"path": "cohorts/2022/03-orchestration/code/orchestration.py",
"chars": 4974,
"preview": "import pandas as pd\nimport pickle\n\nfrom sklearn.feature_extraction import DictVectorizer\nfrom sklearn.linear_model impor"
},
{
"path": "cohorts/2022/03-orchestration/code/prefect_deploy.py",
"chars": 4826,
"preview": "import pandas as pd\nimport pickle\n\nfrom sklearn.feature_extraction import DictVectorizer\nfrom sklearn.metrics import mea"
},
{
"path": "cohorts/2022/03-orchestration/code/prefect_flow.py",
"chars": 4496,
"preview": "import pandas as pd\nimport pickle\n\nfrom sklearn.feature_extraction import DictVectorizer\nfrom sklearn.metrics import mea"
},
{
"path": "cohorts/2022/03-orchestration/code/work-queue.py",
"chars": 622,
"preview": "from prefect import flow\n\n@flow\ndef myflow():\n print(\"hello\")\n\nfrom prefect.deployments import Deployment\nfrom prefec"
},
{
"path": "cohorts/2022/03-orchestration/homework.md",
"chars": 11047,
"preview": "## 3.6 Homework\n\nThe goal of this homework is to familiarize users with workflow orchestration. We start from the soluti"
},
{
"path": "cohorts/2022/03-orchestration/homework.py",
"chars": 2156,
"preview": "import pandas as pd\n\nfrom sklearn.feature_extraction import DictVectorizer\nfrom sklearn.linear_model import LinearRegres"
},
{
"path": "cohorts/2022/03-orchestration/homework_solution.py",
"chars": 3368,
"preview": "import pandas as pd\n\nfrom sklearn.feature_extraction import DictVectorizer\nfrom sklearn.linear_model import LinearRegres"
},
{
"path": "cohorts/2022/04-deployment/homework/Dockerfile",
"chars": 76,
"preview": "FROM python:3.9.7-slim\n\nWORKDIR /app\nCOPY [ \"model2.bin\", \"model.bin\" ]\n "
},
{
"path": "cohorts/2022/04-deployment/homework/Pipfile",
"chars": 201,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nscikit-learn = \"==1.0.2\"\npandas ="
},
{
"path": "cohorts/2022/04-deployment/homework/batch.py",
"chars": 1278,
"preview": "#!/usr/bin/env python\n# coding: utf-8\n\nimport sys\nimport pickle\nimport pandas as pd\n\n\nyear = int(sys.argv[1]) # 2021\nmon"
},
{
"path": "cohorts/2022/04-deployment/homework/homework.dockerfile",
"chars": 258,
"preview": "FROM agrigorev/zoomcamp-model:mlops-3.9.7-slim\n\nRUN pip install -U pip\nRUN pip install pipenv \n\nWORKDIR /app\n\nCOPY [ \"Pi"
},
{
"path": "cohorts/2022/04-deployment/homework/starter.ipynb",
"chars": 4119,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"id\": \"2c51efaa\",\n \"metadata\": {},\n \"outputs\":"
},
{
"path": "cohorts/2022/04-deployment/homework.md",
"chars": 4452,
"preview": "## 4.8 Homework\n\nIn this homework, we'll deploy the ride duration model in batch mode. Like in homework 1 and 3, we'll u"
},
{
"path": "cohorts/2022/05-monitoring/README.md",
"chars": 3140,
"preview": "# 5. Model Monitoring\n\n## 5.1 Monitoring for ML-based services\n\n<a href=\"https://www.youtube.com/watch?v=gMiT11Bp05A&lis"
},
{
"path": "cohorts/2022/05-monitoring/homework/docker-compose-homework-solution.yml",
"chars": 621,
"preview": "version: \"3.7\"\n\nvolumes:\n mongo_data: {}\n\nnetworks:\n front-tier:\n back-tier:\n\nservices:\n prediction_service:\n b"
},
{
"path": "cohorts/2022/05-monitoring/homework/docker-compose-homework.yml",
"chars": 618,
"preview": "version: \"3.7\"\n\nvolumes:\n mongo_data: {}\n\nnetworks:\n front-tier:\n back-tier:\n\nservices:\n prediction_service:\n b"
},
{
"path": "cohorts/2022/05-monitoring/homework/model_training.py",
"chars": 2063,
"preview": "import pickle\n\nimport pandas as pd\nimport pyarrow.parquet as pq\nfrom sklearn.feature_extraction import DictVectorizer\nfr"
},
{
"path": "cohorts/2022/05-monitoring/homework/prediction_service/Dockerfile",
"chars": 301,
"preview": "FROM python:3.8-slim-buster\n\nRUN pip install -U pip\nRUN pip install pipenv \n\nWORKDIR /app\n\nCOPY [ \"Pipfile\", \"Pipfile.lo"
},
{
"path": "cohorts/2022/05-monitoring/homework/prediction_service/Pipfile",
"chars": 259,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nscikit-learn = \"==1.0.2\"\nflask = "
},
{
"path": "cohorts/2022/05-monitoring/homework/prediction_service/app.py",
"chars": 2394,
"preview": "import logging\nimport os\nimport pickle\nimport uuid\n\nfrom flask import Flask, jsonify, request\nfrom pymongo import MongoC"
},
{
"path": "cohorts/2022/05-monitoring/homework/prefect-monitoring/Pipfile",
"chars": 259,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nscikit-learn = \"==1.0.2\"\npyarrow "
},
{
"path": "cohorts/2022/05-monitoring/homework/prefect-monitoring/clean_mongo.py",
"chars": 240,
"preview": "from pymongo import MongoClient\n\nMONGO_CLIENT_ADDRESS = \"mongodb://localhost:27017/\"\nMONGO_DATABASE = \"prediction_servic"
},
{
"path": "cohorts/2022/05-monitoring/homework/prefect-monitoring/monitor_profile.ipynb",
"chars": 810,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 48,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n"
},
{
"path": "cohorts/2022/05-monitoring/homework/prefect-monitoring/monitor_profile_solution.ipynb",
"chars": 1629,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "cohorts/2022/05-monitoring/homework/prefect-monitoring/prefect_monitoring.py",
"chars": 3594,
"preview": "import json\nimport os\nimport pickle\n\nimport pandas\nimport pyarrow.parquet as pq\nfrom evidently import ColumnMapping\nfrom"
},
{
"path": "cohorts/2022/05-monitoring/homework/prefect-monitoring/prefect_monitoring_solution.py",
"chars": 4108,
"preview": "import json\nimport os\nimport pickle\nfrom datetime import datetime\n\nimport pandas\nimport pyarrow.parquet as pq\nfrom evide"
},
{
"path": "cohorts/2022/05-monitoring/homework/prefect-monitoring/prepare_reference_data.py",
"chars": 441,
"preview": "import pandas as pd\nimport pyarrow.parquet as pq\n\n\ndata_files = [\"../datasets/green_tripdata_2021-03.parquet\", \"../datas"
},
{
"path": "cohorts/2022/05-monitoring/homework/prefect-monitoring/send_data.py",
"chars": 1045,
"preview": "import json\nimport uuid\nfrom datetime import datetime\n\nimport pyarrow.parquet as pq\nimport requests\n\ntable = pq.read_tab"
},
{
"path": "cohorts/2022/05-monitoring/homework/prepare.py",
"chars": 719,
"preview": "from tqdm import tqdm\nimport requests\n\nfiles = [\"green_tripdata_2021-03.parquet\", \"green_tripdata_2021-04.parquet\", \"gre"
},
{
"path": "cohorts/2022/05-monitoring/homework/requirements.txt",
"chars": 190,
"preview": "scikit-learn==1.0.2\ndataclasses==0.6\nFlask~=2.0.1\npandas>=1.1.5\nWerkzeug~=2.0.1\nrequests~=2.26.0\nprometheus_client~=0.11"
},
{
"path": "cohorts/2022/05-monitoring/homework/test.py",
"chars": 586,
"preview": "import os\nimport pprint\nfrom pymongo import MongoClient\n\nimport requests\n\nMONGODB_ADDRESS = os.getenv(\"MONGODB_ADDRESS\","
},
{
"path": "cohorts/2022/05-monitoring/homework.md",
"chars": 6998,
"preview": "## 5.5 Homework\n\n> This homework is prepared by [Nakul Bajaj](https://github.com/Nakulbajaj101). Thank you Nakul!\n\nIn th"
},
{
"path": "cohorts/2022/06-best-practices/homework/Dockerfile",
"chars": 268,
"preview": "FROM python:3.9.7-slim\n\nRUN pip install -U pip\nRUN pip install pipenv \n\nWORKDIR /app\n\nCOPY [ \"Pipfile\", \"Pipfile.lock\", "
},
{
"path": "cohorts/2022/06-best-practices/homework/Pipfile",
"chars": 201,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nscikit-learn = \"==1.0.2\"\npandas ="
},
{
"path": "cohorts/2022/06-best-practices/homework/batch.py",
"chars": 1285,
"preview": "#!/usr/bin/env python\n# coding: utf-8\n\nimport sys\nimport pickle\nimport pandas as pd\n\n\nyear = int(sys.argv[1])\nmonth = in"
},
{
"path": "cohorts/2022/06-best-practices/homework.md",
"chars": 7609,
"preview": "## 6.7 Homework\n\nIn this homework, we'll take the ride duration prediction model\nthat we deployed in batch mode in homew"
},
{
"path": "cohorts/2022/06-best-practices/homework_solution/Dockerfile",
"chars": 268,
"preview": "FROM python:3.9.7-slim\n\nRUN pip install -U pip\nRUN pip install pipenv \n\nWORKDIR /app\n\nCOPY [ \"Pipfile\", \"Pipfile.lock\", "
},
{
"path": "cohorts/2022/06-best-practices/homework_solution/Pipfile",
"chars": 214,
"preview": "[[source]]\nurl = \"https://pypi.org/simple\"\nverify_ssl = true\nname = \"pypi\"\n\n[packages]\nscikit-learn = \"==1.0.2\"\npandas ="
},
{
"path": "cohorts/2022/06-best-practices/homework_solution/batch.py",
"chars": 2646,
"preview": "#!/usr/bin/env python\n# coding: utf-8\n\nimport os\nimport sys\nimport pickle\nimport pandas as pd\n\n\ndef prepare_data(df, cat"
},
{
"path": "cohorts/2022/06-best-practices/homework_solution/docker-compose.yaml",
"chars": 116,
"preview": "services:\n s3:\n image: localstack/localstack\n ports:\n - \"4566:4566\"\n environment:\n - SERVICES=s3"
},
{
"path": "cohorts/2022/06-best-practices/homework_solution/integration_test.py",
"chars": 984,
"preview": "import os\n\nfrom datetime import datetime\nimport pandas as pd\n\nimport batch\n\ndef dt(hour, minute, second=0):\n return d"
},
{
"path": "cohorts/2022/06-best-practices/homework_solution/integration_test.sh",
"chars": 534,
"preview": "#!/usr/bin/env bash\n\n\n\ndocker-compose up -d\n\nsleep 5\n\nexport INPUT_FILE_PATTERN=\"s3://nyc-duration/in/{year:04d}-{month:"
},
{
"path": "cohorts/2022/06-best-practices/homework_solution/tests/__init__.py",
"chars": 0,
"preview": ""
},
{
"path": "cohorts/2022/06-best-practices/homework_solution/tests/test_batch.py",
"chars": 1085,
"preview": "from datetime import datetime\n\nimport pandas as pd\n\nimport batch\n\n\ndef dt(hour, minute, second=0):\n return datetime(2"
},
{
"path": "cohorts/2022/07-project/README.md",
"chars": 1793,
"preview": "## Course Project\n\nThe goal of this project is to apply everything we learned\nin this course and build an end-to-end mac"
},
{
"path": "cohorts/2022/leaderboard.md",
"chars": 30264,
"preview": "## Leaderboard \n\nThis is the top [100 leaderboard]([https://docs.google.com/spreadsheets/d/e/2PACX-1vQHj_Y138-aWhkPvwZFP"
},
{
"path": "cohorts/2023/01-intro/homework.md",
"chars": 2306,
"preview": "## Homework\n\nThe goal of this homework is to train a simple model for predicting the duration of a ride - similar to wha"
},
{
"path": "cohorts/2023/02-experiment-tracking/homework/hpo.py",
"chars": 1700,
"preview": "import os\nimport pickle\nimport click\nimport mlflow\nimport optuna\n\nfrom optuna.samplers import TPESampler\nfrom sklearn.en"
},
{
"path": "cohorts/2023/02-experiment-tracking/homework/preprocess_data.py",
"chars": 2512,
"preview": "import os\nimport pickle\nimport click\nimport pandas as pd\n\nfrom sklearn.feature_extraction import DictVectorizer\n\n\ndef du"
},
{
"path": "cohorts/2023/02-experiment-tracking/homework/register_model.py",
"chars": 2480,
"preview": "import os\nimport pickle\nimport click\nimport mlflow\n\nfrom mlflow.entities import ViewType\nfrom mlflow.tracking import Mlf"
},
{
"path": "cohorts/2023/02-experiment-tracking/homework/train.py",
"chars": 790,
"preview": "import os\nimport pickle\nimport click\n\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.metrics import mea"
},
{
"path": "cohorts/2023/02-experiment-tracking/homework-wandb/preprocess_data.py",
"chars": 2980,
"preview": "import os\nimport pickle\nimport click\nimport pandas as pd\n\nimport wandb\n\nfrom sklearn.feature_extraction import DictVecto"
},
{
"path": "cohorts/2023/02-experiment-tracking/homework-wandb/sweep.py",
"chars": 2612,
"preview": "import os\nimport pickle\nimport click\nfrom functools import partial\n\nimport wandb\n\nfrom sklearn.ensemble import RandomFor"
},
{
"path": "cohorts/2023/02-experiment-tracking/homework-wandb/train.py",
"chars": 1855,
"preview": "import os\nimport pickle\nimport click\n\nimport wandb\n\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.metr"
},
{
"path": "cohorts/2023/02-experiment-tracking/homework.md",
"chars": 5903,
"preview": "## Homework\n\nThe goal of this homework is to get familiar with tools like MLflow for experiment tracking and \nmodel mana"
},
{
"path": "cohorts/2023/02-experiment-tracking/solution-mlflow/hpo.py",
"chars": 1871,
"preview": "import os\nimport pickle\nimport click\nimport mlflow\nimport optuna\n\nfrom optuna.samplers import TPESampler\nfrom sklearn.en"
},
{
"path": "cohorts/2023/02-experiment-tracking/solution-mlflow/preprocess_data.py",
"chars": 2512,
"preview": "import os\nimport pickle\nimport click\nimport pandas as pd\n\nfrom sklearn.feature_extraction import DictVectorizer\n\n\ndef du"
},
{
"path": "cohorts/2023/02-experiment-tracking/solution-mlflow/register_model.py",
"chars": 2738,
"preview": "import os\nimport pickle\nimport click\nimport mlflow\n\nfrom mlflow.entities import ViewType\nfrom mlflow.tracking import Mlf"
},
{
"path": "cohorts/2023/02-experiment-tracking/solution-mlflow/train.py",
"chars": 972,
"preview": "import os\nimport pickle\nimport click\nimport mlflow\n\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.metr"
},
{
"path": "cohorts/2023/02-experiment-tracking/wandb.md",
"chars": 7823,
"preview": "## Weights & Biases workshop\n\n* Video: https://www.youtube.com/watch?v=yNyqFMwEyL4\n* Github repository: https://wandb.me"
},
{
"path": "cohorts/2023/03-orchestration/homework.md",
"chars": 4551,
"preview": "## Homework\n\nThe goal of this homework is to familiarize users with workflow orchestration. \n\nStart with the orchestrate"
},
{
"path": "cohorts/2023/03-orchestration/prefect/.gitignore",
"chars": 78,
"preview": "data/\n.ipynb_checkpoints\nmodels/*\nmlruns/*\n.vscode/\n./DS_Store\n*.db\n*.DS_Store"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.2/cat_dog_facts.py",
"chars": 610,
"preview": "import httpx\nfrom prefect import flow\n\n@flow\ndef fetch_cat_fact():\n '''A flow that gets a cat fact'''\n return http"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.2/cat_facts.py",
"chars": 415,
"preview": "import httpx\nfrom prefect import flow, task\n\n\n@task(retries=4, retry_delay_seconds=0.1, log_prints=True)\ndef fetch_cat_f"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.3/duration_prediction_explore.ipynb",
"chars": 865269,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"id\": \"137dd095\",\n \"metadata\": {},\n \"source\":"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.3/duration_prediction_original.ipynb",
"chars": 860829,
"preview": "{\n \"cells\": [\n {\n \"attachments\": {},\n \"cell_type\": \"markdown\",\n \"id\": \"55a306f4\",\n \"metadata\": {},\n \"source\":"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.3/orchestrate.py",
"chars": 3916,
"preview": "import pathlib\nimport pickle\nimport pandas as pd\nimport numpy as np\nimport scipy\nimport sklearn\nfrom sklearn.feature_ext"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.3/orchestrate_pre_prefect.py",
"chars": 3841,
"preview": "import pathlib\nimport pickle\nimport pandas as pd\nimport numpy as np\nimport scipy\nimport sklearn\nfrom sklearn.feature_ext"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.4/orchestrate.py",
"chars": 3916,
"preview": "import pathlib\nimport pickle\nimport pandas as pd\nimport numpy as np\nimport scipy\nimport sklearn\nfrom sklearn.feature_ext"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.5/create_s3_bucket_block.py",
"chars": 635,
"preview": "from time import sleep\nfrom prefect_aws import S3Bucket, AwsCredentials\n\n\ndef create_aws_creds_block():\n my_aws_creds"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.5/orchestrate.py",
"chars": 3916,
"preview": "import pathlib\nimport pickle\nimport pandas as pd\nimport numpy as np\nimport scipy\nimport sklearn\nfrom sklearn.feature_ext"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.5/orchestrate_s3.py",
"chars": 4481,
"preview": "import pathlib\nimport pickle\nimport pandas as pd\nimport numpy as np\nimport scipy\nimport sklearn\nfrom sklearn.feature_ext"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.6/create_s3_bucket_block.py",
"chars": 635,
"preview": "from time import sleep\nfrom prefect_aws import S3Bucket, AwsCredentials\n\n\ndef create_aws_creds_block():\n my_aws_creds"
},
{
"path": "cohorts/2023/03-orchestration/prefect/3.6/orchestrate_s3.py",
"chars": 4537,
"preview": "import pathlib\nimport pickle\nimport pandas as pd\nimport numpy as np\nimport scipy\nimport sklearn\nfrom sklearn.feature_ext"
},
{
"path": "cohorts/2023/03-orchestration/prefect/README.md",
"chars": 2818,
"preview": "# 3. Orchestration and ML Pipelines\n\nThis section of the repo contains Python code to accompany the videos that show how"
},
{
"path": "cohorts/2023/03-orchestration/prefect/meta.json",
"chars": 1011,
"preview": "{\n \"module\": {\n \"number\": 3,\n \"title\": \"Orchestration and ML Pipelines\"\n },\n \"units\": [\n {\n \"number\": 1"
}
]
// ... and 74 more files (download for full content)
About this extraction
This page contains the full source code of the DataTalksClub/mlops-zoomcamp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 274 files (18.9 MB), approximately 2.3M tokens, and a symbol index with 242 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.