XGBoost - 分类器训练

1. 目标

预测一个分子molecule的kpuu性质大于0.5的概率。

由于数据不足,训练回归模型,性能较差,所以改成分类模型。

2. 设计思路

2.1. 数据清洗

训练集train_val.csv

  • Drug列,分子smiles
  • Kpuu列,groundtruth
  • Y列,Kpuu>=0.5为1,Kpuu<0.5为0

2.2. 分子特征(分子指纹)

这里采用rdkit200指纹,一共200维。

2.3. 训练XGBoost分类模型

采用5折交叉验证,选用不同的seed,训练5个子模型。
每个子模型的训练步骤是:特征降维、训练模型、模型评估。

特征降维

优点:提高训练效率,减轻过拟合
缺点:可能会丢失重要信息

  • 基于方差筛选

去除那些方差非常小的特征,因为方差小意味着该特征在数据中的变化不大,可能对模型的贡献较小。

  • 去除相同列

确保没有完全相同的列存在。

  • 基于相关性筛选

计算筛选之后特征的相关系数矩阵。

对于上三角矩阵中相关系数大于corr的特征对,删除其中一个特征(通过删除对应的列索引)。这样可以去除高度相关的特征,避免冗余信息对模型的影响。

def reduce_features(train_data: np.ndarray, valid_data: np.ndarray):
    var, corr = 0.01, 0.95
    data = np.concatenate([train_data, valid_data], axis=0)
    numcol = data.shape[1]
    data = data[:, :-1]
    kept_col_ids = np.arange(data.shape[1])

    # 去除那些方差非常小的特征,因为方差小意味着该特征在数据中的变化不大,可能对模型的贡献较小
    if var >= 0.00:
        variance = np.var(data, axis=0)
        # print(variance)
        kept_col_ids = np.where(variance > var)[0]
        # print(kept_col_ids)

    # remove the same columns
    _, index = np.unique(data[:, kept_col_ids], axis=1, return_index=True)
    kept_col_ids = kept_col_ids[index]

    # 基于相关性筛选
    if corr < 1.0 and kept_col_ids.shape[0] > 1:
        corr_mat = np.abs(np.corrcoef(data[:, kept_col_ids].T))
        rm_col_ids = np.unique(np.argwhere(np.triu(corr_mat, k=1) > corr)[:, 1])
        kept_col_ids = np.delete(kept_col_ids, rm_col_ids)

    kept_col_ids = np.append(kept_col_ids, numcol - 1)
    return kept_col_ids

训练模型

model = xgboost.XGBClassifier(subsample=0.9,
                            scale_pos_weight=2,
                            reg_lambda=10,
                            reg_alpha=0.1,
                            n_estimators=400,
                            min_child_weight=1,
                            max_depth=9,
                            learning_rate=0.3,
                            colsample_bytree=0.5,
                            early_stopping_rounds=10)
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=0)

评估AUC分值,对于二分类问题常用

y_pred_proba = model.predict_proba(X_test)[:, 1]  # 获取属于正类的概率
auc_score = roc_auc_score(y_test, y_pred_proba)

2.4. 推理

5折交叉验证,获取每一个子模型的预测值,计算平均值或投票值

mean = lambda out_pred: np.mean(np.asarray(out_pred), axis=0)
vote = lambda out_pred: np.sum(np.asarray(out_pred) >= 0.5, axis=0) / len(out_pred)

平均值

Kpuu-mean(>0.5)

投票机制

Kpuu-vote,例如4/5,表示5个模型中4个模型认为Kpuu值可能大于0.5

3. 代码目录介绍

训练脚本

train.py

预测脚本

predict.py

数据集

  • train_val.csv kpuu处理完成的所有数据
  • test.csv 5 个外部测试集

models文件夹

包含5个随机种子建立的分类模型

4. 补充学习

4.1. XGBoost介绍

  • 基础模型:梯度提升树(GBDT)

XGBoost 以 GBDT 为基础,GBDT 是一种集成学习方法,通过迭代地训练多个弱学习器(通常是决策树),并将它们的预测结果相加来得到最终的预测结果。

在每次迭代中,GBDT 学习一个新的决策树来拟合上一次迭代中模型的残差(真实值与预测值之间的差值),从而逐步减小模型的误差。

  • 目标函数优化

XGBoost 的目标函数由损失函数和正则项两部分组成。损失函数衡量模型预测值与真实值之间的差异,正则项用于控制模型的复杂度,防止过拟合。

XGBoost 使用泰勒展开式对目标函数进行近似,将损失函数在当前模型的预测值处展开到二阶,从而可以更精确地优化目标函数。

通过对目标函数进行优化,XGBoost 可以自动学习决策树的结构和参数,提高模型的性能和泛化能力。

  • 并行计算和分布式处理

XGBoost 支持并行计算,可以在多个 CPU 核心或多个机器上进行训练,提高训练速度。

在训练过程中,XGBoost 可以对数据进行并行处理,将数据分成多个块,每个块可以在不同的 CPU 核心或机器上进行计算。同时,XGBoost 还可以对决策树的构建过程进行并行化,提高决策树的构建速度。

  • 正则化技术

为了防止过拟合,XGBoost 采用了多种正则化技术,如 L1 正则化、L2 正则化、树的深度限制、叶子节点数量限制等。

这些正则化技术可以控制模型的复杂度,避免模型过度拟合训练数据,提高模型的泛化能力。

4.2. XGBoost怎么预测连续值

XGBoost(eXtreme Gradient Boosting)回归器的主要原理是通过集成多个弱回归器来构建一个强大的预测模型,从而能够预测连续值。

通过集成多个弱回归器,XGBoost 能够捕捉数据中的复杂模式和趋势。每个弱回归器通常是一个简单的决策树,其预测能力有限,但通过不断地添加新的弱回归器并调整它们的参数,可以逐步提高模型的整体性能。

4.3. 决策树如何预测连续值,即决策树如何完成一个回归任务

决策树

  • 决策树由节点和分支组成。每个节点代表一个对特征的判断,根据判断结果将数据分配到不同的分支。内部节点进行特征判断,叶节点则对应最终的预测值。
  • 为了构建决策树,需要选择合适的特征和分裂点进行节点分裂,使得分裂后的子节点中的数据尽可能 “纯净”,即目标值的差异尽可能小。

优点

  • 能够自动进行特征选择,即选择对预测目标值最有帮助的特征进行分裂
  • 对非线性关系具有较好的拟合能力,能够捕捉数据中的复杂模式

构建决策树

  • 选择最优分裂,计算每个特征的所有可能分裂点的分裂质量(MSE)(熵减增益最大)。
  • 递归构建。对分裂后的子节点重复上述过程,直到满足停止条件。停止条件可以是节点中的样本数量小于一定阈值、树的深度达到限制、分裂后的质量提升小于一定阈值等。

预测连续值

遍历决策树
  • 对于一个新的输入样本,从决策树的根节点开始,根据样本的特征值进行判断,选择相应的分支向下遍历,直到到达叶节点。
叶子节点预测
  • 叶节点存储了该节点对应的样本的目标值的统计信息,通常是均值或中位数。将叶节点的统计信息作为对新样本的预测值。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容