前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kaggle ICR 赛题 LightGBM基础思路

Kaggle ICR 赛题 LightGBM基础思路

作者头像
Python数据科学
发布2023-08-29 18:43:32
2170
发布2023-08-29 18:43:32
举报
文章被收录于专栏:Python数据科学Python数据科学

作者:Coggle

Kaggle ICR比赛现在在进行中,这个比赛是一个典型的数据挖掘比赛,很适合入门学习。本文将介绍现在ICR基础的解决方案。

  • 赛题名称:ICR - Identifying Age-Related Conditions
  • 赛题任务:数据挖掘
  • https://www.kaggle.com/competitions/icr-identify-age-related-conditions

赛题任务

比赛数据包含与三种与年龄相关的状况相关联的五十多个匿名健康特征。您的目标是预测受试者是否被诊断出患有这些病症之一——二元分类问题。

步骤1:读取数据集

  • train.csv训练集
  • test.csv - 测试集。
  • greeks.csv:训练集元数据
代码语言:javascript
复制
COMP_PATH = "/kaggle/input/icr-identify-age-related-conditions"
train = pd.read_csv(f"{COMP_PATH}/train.csv")
test = pd.read_csv(f"{COMP_PATH}/test.csv")
sample_submission = pd.read_csv(f"{COMP_PATH}/sample_submission.csv")
greeks = pd.read_csv(f"{COMP_PATH}/greeks.csv")

步骤2:自定义评价指标

赛题使用的balance log loss,为了与赛题保持一致,可以自定义指标。当然也可以自定义目标函数。

代码语言:javascript
复制
def competition_log_loss(y_true, y_pred):
    N_0 = np.sum(1 - y_true)
    N_1 = np.sum(y_true)
    p_1 = np.clip(y_pred, 1e-15, 1 - 1e-15)
    p_0 = 1 - p_1
    log_loss_0 = -np.sum((1 - y_true) * np.log(p_0)) / N_0
    log_loss_1 = -np.sum(y_true * np.log(p_1)) / N_1
    return (log_loss_0 + log_loss_1)/2

def balanced_log_loss(y_true, y_pred):
    N_0 = np.sum(1 - y_true)
    N_1 = np.sum(y_true)
    p_1 = np.clip(y_pred, 1e-15, 1 - 1e-15)
    p_0 = 1 - p_1
    log_loss_0 = -np.sum((1 - y_true) * np.log(p_0))
    log_loss_1 = -np.sum(y_true * np.log(p_1))
    w_0 = 1 / N_0
    w_1 = 1 / N_1
    balanced_log_loss = 2*(w_0 * log_loss_0 + w_1 * log_loss_1) / (w_0 + w_1)
    return balanced_log_loss/(N_0+N_1)

步骤3:定义数据划分

由于数据集存在类别分布不均衡的情况,因此建议按照原信息或比赛标签进行划分验证集。

代码语言:javascript
复制
kf = StratifiedKFold(n_splits=5, random_state=42, shuffle=True)
df['fold'] = -1

for fold, (train_idx, test_idx) in enumerate(kf.split(df, greeks['Alpha'])):
    df.loc[test_idx, 'fold'] = fold

df.groupby('fold')["Class"].value_counts()

步骤4:模型训练与验证

由于比赛是典型的数据挖掘赛题,因此建议使用lightgbm。然后在训练中,可以进行调参,加入early stop。

并记录下每折的精度,按照每折的权重作为最终的加权。这也是一种集成方法。

代码语言:javascript
复制
weights = []
for fold in range(5):
    train_df = df[df['fold'] != fold]
    valid_df = df[df['fold'] == fold]
    valid_ids = valid_df.Id.values.tolist()
    X_train, y_train = train_df.drop(['Id', 'Class', 'fold'], axis=1), train_df['Class']
    X_valid, y_valid = valid_df.drop(['Id', 'Class', 'fold'], axis=1), valid_df['Class']
    
    # 使用lightgbm进行训练和验证
    lgb = LGBMClassifier(boosting_type='goss', learning_rate=0.06733232950390658, n_estimators = 50000, 
                         early_stopping_round = 300, random_state=42,
                        subsample=0.6970532011679706,
                        colsample_bytree=0.6055755840633003,
                         class_weight='balanced',
                         metric='none', is_unbalance=True, max_depth=8)
    
    # 存储每折的权重
    weights.append(1/balanced_logloss)

步骤5:模型预测

代码语言:javascript
复制
final_valid_predictions = pd.DataFrame.from_dict(final_valid_predictions, orient="index").reset_index()
final_valid_predictions.columns = ['Id', 'class_0', 'class_1']
final_valid_predictions.to_csv(r"oof.csv", index=False)

test_dict = {}
test_dict.update(dict(zip(test.Id.values.tolist(), test_preds)))
submission = pd.DataFrame.from_dict(test_dict, orient="index").reset_index()
submission.columns = ['Id', 'class_0', 'class_1']     

submission.to_csv(r"submission.csv", index=False)
submission

代码地址:https://www.kaggle.com/code/chaitanyagiri/icr-2023-single-lgbm-0-12-cv-0-16-lb

推荐阅读:pandas进阶宝典

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 赛题任务
  • 步骤1:读取数据集
  • 步骤2:自定义评价指标
  • 步骤3:定义数据划分
  • 步骤4:模型训练与验证
  • 步骤5:模型预测
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档