Start

03/08/2026

Close

Wine Quality Classification Challenge

Can Your Model Identify Premium Wines?

Challenge Rewards:

knowledge

Participants

41

Submissions

32

Wine Quality Classification Baseline Source Code

License Python System

Challenge participants: Build robust models to classify wine quality based on its chemical properties.

Table of Contents

Quick Start

Clone the repository:

git clone [email protected]:AIOZAI/wine_quality_baseline.git

or, download directly: Wine Quality Baseline

Then, navigate into the project directory and follow the steps below:

# 1. Install dependencies (Do not add any other libraries to requirements.txt file)
pip install -r requirements.txt

# 2. Start developing your solution. Follow the tutorial below to implement your AI model

# 3. Run the demo to test your implementation
python demo.py

# 4. Verify Your Submission
python -m my_ai_lib.predict_submission

Note: You need to implement your Wine Quality classification solution following the tutorial guide.

Introduction

In this challenge, you will build a machine learning model to classify wine quality based on its chemical properties. Participants will work with physicochemical data from red and white wines, each labeled with an expert-rated quality score.

The goal is to build a model that classifies the wine quality score (ranging from 0 to 10).

In this challenge, participants will be provided with:

  • Model Access: Wine Quality Baseline

    • Code baseline to develop solutions.
    • Predefined libraries and tools in requirements.txt (Do not add any other libraries to requirements.txt file).
  • Dataset Access: Wine Quality Dataset

    • Training dataset to train your AI models.
    • Testing dataset to predict labels for generating the submission file.

Goal: Build a model that predicts the quality score (0–10) of each wine sample.

Requirements

System Requirements

  • Python 3.10+

Dependencies

Install all required packages:

pip install -r requirements.txt

Project Structure

Your AI library should follow this structure:

repository/
├── my_ai_lib/                   # Your AI library
│   ├── __init__.py              # Required: Library initialization
│   ├── run.py                   # Required: Main workflow function
│   ├── predict_submission.py    # Required: Submission function
│   └── [your_modules]/          # Your custom modules
├── models/                      # Model weights directory
├── demo.py                      # Demo script
├── requirements.txt             # Dependencies
└── README.md                    # Documentation

Description

  • The input and output of the AI model are defined in my_ai_lib/run.py.
  • The AI model is designed to process a single input item.
  • In my_ai_lib/predict_submission.py, we process all items in the test dataset and save the results to result.csv in the required submission format.
  • Please refer to the instructions below for more details.

Key Components

ComponentDescriptionStatus
my_ai_lib/Core AI library directoryRequired
my_ai_lib/__init__.pyLibrary initializationRequired
my_ai_lib/predict_submission.pyGenerate predictions for challenge submission.Required
my_ai_lib/run.pyMain AI workflowRequired
demo.pyDemo and testing scriptRequired

Detailed Tutorial

Step 1: Initialize Your AI Library

1.1 Define my_ai_lib/__init__.py

from .run import run

This file exposes the run() function from run.py as an attribute of my_ai_lib, so you can call it as my_ai_lib.run().

1.2 Define Input/Output Objects in my_ai_lib/run.py

Create your custom input and output classes:

from pathlib import Path
from typing import Any, Union, Literal
from aioz_ainode_adapter.schemas import InputObject, OutputObject, FileObject

class WineQualityInput(InputObject):
    # input_text is a comma-separated string representation of wine features
    # (e.g., "red,7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4")
    input_text: str

class WineQualityOutput(OutputObject):
    # quality is the predicted score (0-10)
    quality: int

Step 2: Understanding AIOZ Schema Objects

The aioz_ainode_adapter library defines 3 core object types based on pydantic.BaseModel:

🔸 InputObject

Define the format for input when the AIOZ-AI-Node system sends to your AI library.

Default Parameters:

ParameterTypeDescription
deviceChoiceDevice for your model: ["cuda", "cpu", "gpu"]
model_storage_directoryStringDirectory containing model weights

Important: Always use model_storage_directory for model weight paths, as AIOZ-AI-Node will specify this location.

🔸 OutputObject

Define the format for output when your AI library sends to the AIOZ-AI-Node system.

🔸 FileObject

Define the format for the file, if your output has a file. This object has two fields:

FieldTypeDescription
dataChoiceFile data: io.BufferedReader, Path, or URL
nameStringFile name

Example FileObject creation:

output_file = FileObject(data=open("file/path.csv", "rb"), name="output.csv")

Note:

  • Input files must be local file paths or URLs
  • Output files must be FileObject instances

Step 3: Implement the Main Workflow

3.1 Define Your AI Task Function

def do_ai_task(
        input_text: str,
        model_storage_directory: Union[str, Path],
        device: Literal["cpu", "cuda", "gpu"] = "cpu",
        *args, **kwargs) -> int:
    """
    Predict wine quality score based on its chemical properties.

    Args:
        input_text: Comma-separated feature string
        model_storage_directory: Path to directory containing trained model weights
        device: Device to run inference on ("cpu", "cuda", or "gpu")

    Returns:
        quality: Predicted wine quality score (0-10)
    """
    # 1. Parse features from input string
    # features = input_text.split(",")

    # 2. Run prediction using your trained model
    # quality = model.predict([features])[0]
    quality = 5
    return quality

3.2 Implement the Required run() Function

def run(input_obj: InputObject) -> OutputObject:
    """
    Main entry point for the Wine Quality Classification library.

    Args:
        input_obj: Input object containing parameterized features

    Returns:
        output_obj: Object containing the predicted quality score
    """
    try:
        # Validate and parse input
        wine_input = WineQualityInput.model_validate(input_obj.model_dump())

        # Execute AI task
        quality = do_ai_task(
            input_text=wine_input.input_text,
            model_storage_directory=wine_input.model_storage_directory,
            device=wine_input.device
        )
        # Create output object
        output_obj = WineQualityOutput(quality=quality)
    except Exception as e:
        raise Exception(e)

    return output_obj

Critical: The run() function name is mandatory and cannot be changed. The do_ai_task() function can be renamed and customized.

Step 4: Create Demo Script

Create demo.py to test your implementation:

import my_ai_lib
from aioz_ainode_adapter.schemas import InputObject

def main():
    """Demo function to test the Wine Quality Classification library."""
    # Example features:
    # type,fixed_acidity,volatile_acidity,citric_acid,residual_sugar,chlorides,free_sulfur_dioxide,total_sulfur_dioxide,density,pH,sulphates,alcohol
    features = "red,7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4"

    input_obj = InputObject(
        input_text=features
    )
    output_obj = my_ai_lib.run(input_obj)
    print(f"Output: {output_obj}")

if __name__ == '__main__':
    main()

The my_ai_lib.run() function receives an InputObject and returns an OutputObject.

Run this command to test your implementation:

python demo.py

Expected console output:

Input: device='cpu' model_storage_directory='models' input_text='red,7.4,0.7,0.0,1.9,0.076,11.0,34.0,0.9978,3.51,0.56,9.4'
Output: quality=5

Step 5: Add Model Weights

Place your trained model files in the models/ directory:

models/
├── model.pkl          # Your trained model
├── config.json        # Model configuration
└── etc.

Step 6: Create Prediction Script (For Submission)

Implement the predict_submission() function in my_ai_lib/predict_submission.py

Requirements:

  • Function accepting test data folder path (string)
  • Load your trained model
  • Process test dataset (test.csv in test data folder)
  • Generate predictions
  • Save results as ./result.csv

Implementation Template:

from aioz_ainode_adapter.schemas import InputObject
import my_ai_lib
import os
import csv

def predict_submission(test_data_folder: str):
    """
    Generate predictions for challenge submission.

    Args:
        test_data_folder: Path to test data directory
    """
    # 1. Find test data (test.csv) in test data folder (using os.walk)
    test_csv_path = os.path.join(test_data_folder, "test.csv")
    if not os.path.exists(test_csv_path):
        for root, _, files in os.walk(test_data_folder):
            if "test.csv" in files:
                test_csv_path = os.path.join(root, "test.csv")
                break

    results = []

    # 2. Load model and predict on test dataset
    with open(test_csv_path, "r", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            # Prepare feature string from row columns
            feature_cols = ['type', 'fixed_acidity', 'volatile_acidity', 'citric_acid', 'residual_sugar', 'chlorides', 'free_sulfur_dioxide', 'total_sulfur_dioxide', 'density', 'pH', 'sulphates', 'alcohol']
            features = ",".join([str(row.get(col, "")) for col in feature_cols])

            output_obj = my_ai_lib.run(InputObject(input_text=features))
            results.append({"id": row["id"], "quality": output_obj.quality})

    # 3. Save to ./result.csv
    with open("./result.csv", "w", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=["id", "quality"])
        writer.writeheader()
        writer.writerows(results)

    print(f"Saved {len(results)} predictions to ./result.csv")

def main():
    """Main function for testing submission."""
    predict_submission("path/to/test/data")

if __name__ == '__main__':
    main()

Important: The result.csv must match the challenge's sample submission format.

Verify Your Submission:

python -m my_ai_lib.predict_submission

Submission Guidelines

Submission Format

The submission file has two fields:

  • id: The unique identifier for each wine sample.
  • quality: The predicted wine quality score (0-10).

Example: result.csv

id,quality
1001,3
1002,10
1003,7

License

This repository is licensed under the MIT License.