Skip to main content

C5.0-like Decision Trees in Python (scikit-learn style)

Project description

c5py — C5.0‑style Decision Trees for Python (clean 0.2.0)

c5py provides transparent, easily inspectable decision trees modelled on Quinlan’s C5.0 algorithm. Both classification and regression trees are supported and expose a scikit‑learn‑like API. The implementation is written from scratch in pure Python/Numpy and includes support for numeric and categorical variables, missing values, pre‑ and post‑pruning, boosting, rule tracing/export and Graphviz visualisation.

Features

  • Scikit-learn API: fit(X, y), predict(X), score(X, y).
  • Categorical support: Pass categorical_features=[0, 2] to handle categories natively.
  • Sample weights: Supports sample_weight in fit for weighted splitting and pruning.
  • Missing values: Handles missing values using C5.0's fractional propagation strategy.
  • Boosting: Set trials=10 to train a boosted ensemble.
  • Rule export: call export_rules() to get a list of human-readable rules.
  • Graphviz export: call export_graphviz() to visualize the tree.
  • Pretty printing: call print_tree to display the learned splits in a readable nested if/else format (single trees only).

Documentation

For a comprehensive guide on how to use c50py, including advanced features and examples, please see the Usage Guide.

Installation (development mode)

Install the package into your environment in editable mode:

pip install -e .

Quickstart (Classification)

import pandas as pd
from time import perf_counter
from c50py import C5Classifier

df = pd.read_csv("titanic.csv")
t0 = perf_counter(); clf.fit(X, y); print(f"fit: {perf_counter()-t0:.3f}s")

# Inspect the tree
clf.print_tree(feature_names=features, class_names=["No", "Yes"])

# Extract rules for each sample
rules = clf.predict_rule(X, feature_names=features)
print(rules[:5])

# Export as Graphviz
path = clf.export_graphviz(
    "titanic_tree",
    feature_names=features,
    class_names=["No", "Yes"],
    format="dot"  # save a .dot file directly
)
print(f"DOT file written to {path}")

Quickstart – Regression (Diabetes)

Fit a regression tree to the diabetes dataset and obtain a visualisation:

import pandas as pd
from time import perf_counter
from c5py import C5Regressor

df = pd.read_csv("diabetes.csv")
y = df["target"].values
X_df = df.drop(columns=["target"])
X = X_df.values.astype(object)
features = list(X_df.columns)

reg = C5Regressor(
    min_samples_split=30,
    min_samples_leaf=10,
    pruning=True, cf=0.25, global_pruning=True,
    feature_names=features,
    random_state=42,
    infer_categorical=False, int_as_categorical=False,
    numeric_threshold_strategy="quantile", max_numeric_thresholds=64
)

start = perf_counter(); reg.fit(X, y); print(f"fit: {perf_counter()-start:.3f}s")

# Export to DOT (Graphviz installed optional)
dot_path = reg.export_graphviz("diabetes_tree", feature_names=features, format="dot")
print(f"Tree saved to {dot_path}")

# Export human‑readable rules (single trees only)
rules = reg.export_rules(feature_names=features)
print(rules[:3])

Performance tuning

Several hyperparameters influence model complexity and performance:

  • numeric_threshold_strategy ('quantile' | 'all'): subsample candidate numeric thresholds. With 'quantile' the number of splits considered is limited to max_numeric_thresholds per feature per node. 'all' evaluates every unique midpoint (slower on large datasets).
  • max_numeric_thresholds: number of candidate thresholds when using 'quantile' (typically 32–64).
  • categorical_features: list of names or indices marking categorical columns.
  • max_categories_exhaustive: maximum cardinality for exhaustive subset search on categorical features; beyond this a simpler one‑vs‑rest strategy is used.
  • infer_categorical/int_as_categorical: enable automatic detection of categorical/boolean/integer columns when dtype information is not explicit.
  • max_depth: optional depth limit for extremely noisy or deep trees.

When boosting (trials > 1) the same hyperparameters apply to each base tree.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

c50py-0.2.1.tar.gz (41.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

c50py-0.2.1-py3-none-any.whl (37.5 kB view details)

Uploaded Python 3

File details

Details for the file c50py-0.2.1.tar.gz.

File metadata

  • Download URL: c50py-0.2.1.tar.gz
  • Upload date:
  • Size: 41.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for c50py-0.2.1.tar.gz
Algorithm Hash digest
SHA256 f636cbe05c04ef66b0e11314042a03fd6907dcd2a123c0c99cb64e70d2f39f9b
MD5 0c4506c7578017c2240c487c9148c2ae
BLAKE2b-256 6add11c6b8fd58bb9f6a273cd1c8dbfd9ef9ad5e00b8812e8435a4ce191b4fdc

See more details on using hashes here.

File details

Details for the file c50py-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: c50py-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 37.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for c50py-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 51c19a4fedd8418de13ca049671e74c071d4d12d629c6b9f061ee77c0cbcec6a
MD5 5dba808e58cf33a8d255c84cfb5d09f6
BLAKE2b-256 ee56aa61848c0d62e03501d9b3d8863acfa4abba0e3bdb5fe6123f5865937d33

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page