ONNX 模型库
返回模型

说明文档

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