返回模型
说明文档
TDLight 分层变星分类器
一个用于天文变星分类的分层 LightGBM 分类器。该模型采用包含 7 个专门子模型的四层决策树结构,在 107 万个样本上通过 5 折交叉验证,对 10 个变星类别实现了 93.6% 的总体准确率(加权 F1 = 93.7%)。
⚡ 更新(2026-03): 这是取代之前扁平 LightGBM 的新分层模型。分层架构将准确率从 92.5% 提升至 93.6%,同时保持快速的 CPU 推理能力。
架构
该分类器采用分层决策结构,每个节点都是一个独立的 LightGBM 模型:
init
/ \
Non-var Variable
/ \
Extrinsic Intrinsic
/ \ / | \
ROT EB CEP DSCT RR LPV
/ \ / \ / \
EA EW RRAB RRC M SR
| 子模型 | 任务 | 类别 |
|---|---|---|
init |
变星与非变星区分 | Non-var, Variable |
variable |
外因性与内因性区分 | Extrinsic, Intrinsic |
extrinsic |
外因性子类型 | EB, ROT |
intrinsic |
内因性子类型 | CEP, DSCT, RR, LPV |
eb |
食双星子类型 | EA, EW |
rr |
天琴座 RR 型星子类型 | RRAB, RRC |
lpv |
长周期变星子类型 | M, SR |
性能
在完整训练集(1,068,220 个样本)上的 5 折交叉验证结果:
| 类别 | 精确率 | 召回率 | F1 分数 | 支持数 |
|---|---|---|---|---|
| CEP | 0.8886 | 0.8103 | 0.8476 | 2,451 |
| DSCT | 0.9132 | 0.8234 | 0.8660 | 18,600 |
| EA | 0.9638 | 0.9515 | 0.9576 | 48,156 |
| EW | 0.9593 | 0.9426 | 0.9509 | 334,751 |
| M | 0.9080 | 0.9878 | 0.9462 | 18,874 |
| Non-var | 0.8678 | 0.9629 | 0.9129 | 134,592 |
| ROT | 0.8642 | 0.8876 | 0.8758 | 119,116 |
| RRAB | 0.9753 | 0.9796 | 0.9775 | 41,822 |
| RRC | 0.8987 | 0.8272 | 0.8615 | 18,748 |
| SR | 0.9680 | 0.9393 | 0.9534 | 331,110 |
| 总体 | 0.9378 | 0.9362 | 0.9365 | 1,068,220 |
早期分类(不完整光变曲线)
该模型支持对不完整光变曲线进行早期分类:
| 完整度 | 准确率 | 加权 F1 |
|---|---|---|
| 30% | 74.1% | 74.3% |
| 50% | 85.0% | 85.2% |
| 70% | 89.4% | 89.5% |
| 100% | 93.6% | 93.7% |
文件
| 文件 | 格式 | 大小 | 描述 |
|---|---|---|---|
init.pkl |
pickle | 110 MB | 第一层:Non-var vs Variable |
variable.pkl |
pickle | 100 MB | 第二层:Extrinsic vs Intrinsic |
extrinsic.pkl |
pickle | 62 MB | 第三层:ROT vs EB |
intrinsic.pkl |
pickle | 51 MB | 第三层:CEP/DSCT/RR/LPV |
eb.pkl |
pickle | 18 MB | 第四层:EA vs EW |
rr.pkl |
pickle | 3.9 MB | 第四层:RRAB vs RRC |
lpv.pkl |
pickle | 5.6 MB | 第四层:M vs SR |
label_encoders.pkl |
pickle | 698 B | 所有层级的标签编码器 |
*.onnx |
ONNX | ~250 MB | 用于跨语言推理的 ONNX 版本 |
输入特征
该模型期望使用 feets 从光变曲线中提取的 15 个特征:
| # | 特征 | 描述 |
|---|---|---|
| 1 | PeriodLS |
Lomb-Scargle 周期 |
| 2 | Mean |
平均星等 |
| 3 | Rcs |
累积和范围 |
| 4 | Psi_eta |
Psi-eta 统计量 |
| 5 | StetsonK_AC |
带自相关的 Stetson K |
| 6 | Gskew |
星等差的偏度 |
| 7 | Psi_CS |
Psi 累积和 |
| 8 | Skew |
偏度 |
| 9 | Freq1_harmonics_amplitude_1 |
一次谐波振幅(第一阶) |
| 10 | Eta_e |
Eta-e 变异性指数 |
| 11 | LinearTrend |
线性趋势系数 |
| 12 | Freq1_harmonics_amplitude_0 |
一次谐波振幅(第零阶) |
| 13 | AndersonDarling |
Anderson-Darling 统计量 |
| 14 | MaxSlope |
最大斜率 |
| 15 | StetsonK |
Stetson K 指数 |
使用方法
Python(pickle)
import pickle
import joblib
import numpy as np
# 加载所有子模型
MODEL_NAMES = ['init', 'variable', 'extrinsic', 'intrinsic', 'eb', 'rr', 'lpv']
models = {}
for name in MODEL_NAMES:
models[name] = joblib.load(f'{name}.pkl')
with open('label_encoders.pkl', 'rb') as f:
label_encoders = pickle.load(f)
def hierarchical_predict(X):
\"\"\"使用分层模型预测 10 类标签。\"\"\"
n = len(X)
preds = np.array([''] * n, dtype=object)
# 第一层:Non-var vs Variable
le = label_encoders['init']
p1 = le.inverse_transform(models['init'].predict(X))
preds[p1 == 'Non-var'] = 'Non-var'
mask_var = p1 == 'Variable'
if not mask_var.any():
return preds
iv = np.where(mask_var)[0]
# 第二层:Extrinsic vs Intrinsic
le = label_encoders['variable']
p2 = le.inverse_transform(models['variable'].predict(X[mask_var]))
# Extrinsic 分支
me = np.zeros(n, dtype=bool)
me[iv[p2 == 'Extrinsic']] = True
if me.any():
le = label_encoders['extrinsic']
p3 = le.inverse_transform(models['extrinsic'].predict(X[me]))
ie = np.where(me)[0]
preds[ie[p3 == 'ROT']] = 'ROT'
mb = np.zeros(n, dtype=bool)
mb[ie[p3 == 'EB']] = True
if mb.any():
le = label_encoders['eb']
preds[mb] = le.inverse_transform(models['eb'].predict(X[mb]))
# Intrinsic 分支
mi = np.zeros(n, dtype=bool)
mi[iv[p2 == 'Intrinsic']] = True
if mi.any():
le = label_encoders['intrinsic']
p3 = le.inverse_transform(models['intrinsic'].predict(X[mi]))
ii = np.where(mi)[0]
preds[ii[p3 == 'CEP']] = 'CEP'
preds[ii[p3 == 'DSCT']] = 'DSCT'
mr = np.zeros(n, dtype=bool)
mr[ii[p3 == 'RR']] = True
if mr.any():
le = label_encoders['rr']
preds[mr] = le.inverse_transform(models['rr'].predict(X[mr]))
ml = np.zeros(n, dtype=bool)
ml[ii[p3 == 'LPV']] = True
if ml.any():
le = label_encoders['lpv']
preds[ml] = le.inverse_transform(models['lpv'].predict(X[ml]))
return preds
# 示例
X = np.random.randn(5, 15) # 替换为真实特征
predictions = hierarchical_predict(X)
print(predictions)
使用 Hugging Face Hub
from huggingface_hub import hf_hub_download
import joblib, pickle, numpy as np
repo_id = \"bestdo77/Lightcurve_lgbm_111w_15_model\"
# 下载模型文件
MODEL_NAMES = ['init', 'variable', 'extrinsic', 'intrinsic', 'eb', 'rr', 'lpv']
models = {}
for name in MODEL_NAMES:
path = hf_hub_download(repo_id=repo_id, filename=f\"{name}.pkl\")
models[name] = joblib.load(path)
le_path = hf_hub_download(repo_id=repo_id, filename=\"label_encoders.pkl\")
with open(le_path, 'rb') as f:
label_encoders = pickle.load(f)
ONNX Runtime(跨语言)
import onnxruntime as ort
import numpy as np
session = ort.InferenceSession(\"init.onnx\")
X = np.random.randn(1, 15).astype(np.float32)
pred = session.run(None, {\"input\": X})
训练详情
- 训练数据:LEAVES 数据集(约 107 万条来自 ZTF、ASAS-SN、Gaia 的标注光变曲线)
- 架构:具有无限
num_leaves的分层 LightGBM - 特征提取:feets v0.4
- 框架:TDLight 系统的一部分
引用
@software{tdlight_hierarchical_classifier,
title={TDLight Hierarchical Variable Star Classifier},
author={Yu, Xinghang and Yu, Ce and Shao, Zeguang and Yang, Bin},
year={2026},
url={https://huggingface.co/bestdo77/Lightcurve_lgbm_111w_15_model}
}
许可证
MIT License
bestdo77/Lightcurve_lgbm_111w_15_model
作者 bestdo77
tabular-classification
lightgbm
↓ 0
♥ 0
创建时间: 2026-01-07 07:04:13+00:00
更新时间: 2026-03-15 10:28:51+00:00
在 Hugging Face 上查看文件 (17)
.gitattributes
README.md
eb.onnx
ONNX
eb.pkl
extrinsic.onnx
ONNX
extrinsic.pkl
init.onnx
ONNX
init.pkl
intrinsic.onnx
ONNX
intrinsic.pkl
label_encoders.pkl
lpv.onnx
ONNX
lpv.pkl
rr.onnx
ONNX
rr.pkl
variable.onnx
ONNX
variable.pkl