Overview
LightGBM is Microsoft's gradient boosting framework. 2–10x faster than XGBoost on large datasets thanks to leaf-wise tree growth, histogram-based splitting, and native categorical feature support (no encoding required). Industry standard for high-performance tabular ML.
CLib package
Ubuntu/Debian: sudo apt install liblightgbm-dev
Binary Classification
uses lightgbm;
{ load from CSV — label in column 0 }
var train := DatasetFromCSV(ReadFile('train.csv'), 0);
var valid := DatasetFromCSV(ReadFile('valid.csv'), 0);
{ quick start }
var model := TrainDefault(train, lgbmBinary);
{ predict probabilities }
var preds := Predict(model, valid);
var i: Integer;
for i := 0 to Length(preds) - 1 do
WriteLn('P(+1) = ', preds[i]:0:4);
FreeBooster(model);
FreeDataset(train);
FreeDataset(valid);
Custom Parameters
uses lightgbm;
var params := DefaultParams(lgbmBinary);
params.NumRounds := 300;
params.NumLeaves := 63; { more leaves = more complex model }
params.LearningRate := 0.05;
params.FeatureFraction := 0.8;
params.BaggingFraction := 0.8;
params.BaggingFreq := 5;
params.EarlyStopRounds := 20; { stop if no improvement for 20 rounds }
params.EvalMetric := 'auc';
params.Verbose := -1; { silent }
var result: TLGBMTrainResult;
var model := TrainWithHistory(train, valid, params, result);
WriteLn('Best iteration: ', result.BestIteration);
WriteLn('AUC: ', result.EvalMetric:0:4);
Categorical Features
uses lightgbm;
{ LightGBM handles categoricals natively — no one-hot encoding needed }
var train := DatasetFromCSV(ReadFile('customers.csv'), 0);
{ mark columns 1 (country), 3 (plan), 5 (device) as categorical }
SetCategoricalFeatures(train, '1,3,5');
SetFeatureNames(train, 'churned,country,age,plan,income,device,tenure');
var model := TrainDefault(train, lgbmBinary);
WriteLn('Trees: ', GetNumTrees(model));
Regression
uses lightgbm;
var params := DefaultParams(lgbmRegression);
params.NumRounds := 200;
params.NumLeaves := 31;
params.LearningRate := 0.1;
params.EvalMetric := 'rmse';
var train := DatasetFromFile('housing.csv', '');
var model := Train(train, params, 0);
{ predict a single sample }
var features: array of Double;
SetLength(features, 10);
features[0] := 3.5; { rooms }
features[1] := 120.0; { sqm }
{ ... }
var price := PredictOne(model, features);
WriteLn('Estimated price: $', price:0:0);
Feature Importance
uses lightgbm;
var model := Train(train, params, 0);
{ "split" = number of times feature used in splits }
{ "gain" = total gain from splits using this feature }
var imp := GetFeatureImportance(model, 'gain');
WriteLn(imp);
{ tenure 0.312
income 0.241
age 0.187
... }
WriteLn('Features: ', GetNumFeatures(model));
WriteLn('Trees: ', GetNumTrees(model));
Save, Load & Cross-Validation
uses lightgbm;
{ cross-validation }
var cv := CrossValidate(train, params, 5);
WriteLn('5-fold CV: ', cv:0:4);
{ save model }
SaveModel(model, '/models/churn.txt');
{ load and predict later }
var loaded := LoadModel('/models/churn.txt');
var preds := Predict(loaded, testDataset);
FreeBooster(loaded);
Partial Prediction (Early Trees)
uses lightgbm;
{ predict using only first 50 trees — useful for speed/accuracy tradeoff }
var fast := PredictNumTrees(model, testDataset, 50);
{ raw scores before sigmoid/softmax }
var raw := PredictRaw(model, testDataset);
Package Info
Version1.0.0
Typeclib
CategoryAI
Authorgustavo
Native liblibpai_lightgbm.so
API
- DatasetFromFile(path,params)
- DatasetFromCSV(csv,col)
- DatasetFromArray(data,r,c,labels)
- SetCategoricalFeatures(ds,cols)
- SetFeatureNames(ds,names)
- FreeDataset(ds)
- Train(train,params,eval)
- TrainDefault(train,obj)
- TrainWithHistory(...)
- Predict(model,ds)
- PredictOne(model,features)
- PredictRaw(model,ds)
- PredictNumTrees(m,ds,n)
- Evaluate(model,ds,metric)
- CrossValidate(ds,params,k)
- GetFeatureImportance(m,type)
- GetNumFeatures(m)
- GetNumTrees(m)
- SaveModel(m,path)
- LoadModel(path)
- FreeBooster(m)
Key advantage
Native categorical support means no preprocessing for string columns. Just call SetCategoricalFeatures and pass raw integer-encoded categories.