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)(熵减增益最大)。
- 递归构建。对分裂后的子节点重复上述过程,直到满足停止条件。停止条件可以是节点中的样本数量小于一定阈值、树的深度达到限制、分裂后的质量提升小于一定阈值等。
预测连续值
遍历决策树
- 对于一个新的输入样本,从决策树的根节点开始,根据样本的特征值进行判断,选择相应的分支向下遍历,直到到达叶节点。
叶子节点预测
- 叶节点存储了该节点对应的样本的目标值的统计信息,通常是均值或中位数。将叶节点的统计信息作为对新样本的预测值。