xgboost-rust 0.1.0

Rust bindings for XGBoost, a gradient boosting library for machine learning. Downloads XGBoost binaries at build time for cross-platform compatibility.
#!/usr/bin/env python3
"""
Train a simple XGBoost model for demo purposes.

This creates a simple classification model that predicts if the sum of features > 15.
"""

import numpy as np
import xgboost as xgb

# Create simple training data
# Features: [feature_1, feature_2, feature_3]
# Label: 1 if feature_1 + feature_2 + feature_3 > 15, else 0
np.random.seed(42)

X_train = np.random.uniform(0, 10, size=(100, 3)).astype(np.float32)
y_train = (X_train.sum(axis=1) > 15).astype(int)

print(f"Training data shape: {X_train.shape}")
print(f"Label distribution: {np.bincount(y_train)}")
print(f"\nFirst 5 training samples:")
for i in range(5):
    print(f"  Features: {X_train[i]}, Sum: {X_train[i].sum():.2f}, Label: {y_train[i]}")

# Train model
dtrain = xgb.DMatrix(X_train, label=y_train)
params = {
    'objective': 'binary:logistic',
    'max_depth': 3,
    'eta': 0.3,
    'eval_metric': 'logloss'
}

print("\nTraining model...")
model = xgb.train(params, dtrain, num_boost_round=20)

# Save model
model.save_model('demo_model.json')
print("✓ Model saved to demo_model.json")

# Create test data for verification
X_test = np.array([
    [1.5, 2.3, 3.1],  # Sum: 6.9  -> Label 0
    [5.0, 5.0, 6.0],  # Sum: 16.0 -> Label 1
    [8.0, 8.0, 1.0],  # Sum: 17.0 -> Label 1
    [2.0, 3.0, 5.0],  # Sum: 10.0 -> Label 0
], dtype=np.float32)

dtest = xgb.DMatrix(X_test)
predictions = model.predict(dtest)

print("\nTest predictions:")
for i, (features, pred) in enumerate(zip(X_test, predictions)):
    print(f"  Features: {features}, Sum: {features.sum():.2f}, Prediction: {pred:.4f}")