一、竞赛平台

  1. Kaggle
  2. 阿里天池
  3. DF(DataFountain)
  4. DC(DataCastle)
  5. Kesci
  6. JDATA
  7. FlyAI
  8. AI Challenger

二、竞赛流程

2.1、问题建模

	理解题目,需要对赛题理解自行利用主办方提供的数据构造训练集和测试集。

2.2、数据探索

	EDA(Exploratory Data Analysis,数据探索性分析),理解数据的内容。

2.3、特征工程

	特征决定了机器学习的上线,而算法只是不断的去逼近这个上线。

2.4、模型训练

	常使用GBDT类的树模型,例如XGBoost、LightGBM。

2.5、模型融合

	模型融合的方法有Stacking、加权投票等。

三、问题建模

	问题建模主要可以分成赛题理解、样本选择、线下评估策略三个部分

3.1、赛题理解

	直观上梳理问题,分析问题可解的方法、赛题背景、赛题的主要问题。
3.1.1、深入业务背景
	赛题本身基于特定的场景而产生,场景即业务,分析业务中各特征性质。
	明确赛题目标,在业务背景的基础之上理解赛题。
3.1.2、对数据进行理解
	数据理解分为数据基础层和数据描述层。
	数据基础层:各竞赛主办方提供的数据质量参差不齐,数据的类型等也多种多样,为进一步分析建模,需要对原数据进行清洗、加工和计算等处理。
	数据描述层:在数据基础层处理好的数据上进行统计描述性分析,统计简单的均值、方差等,具体统计哪些统计量,依题而异。
	对于时间序列问题,统计其增幅、趋势和周期等;对于常规数值特征,统计其均值、最值、方差等;对于存在多类别的样本集合,可以使用分布、分位点等进行描述。
3.1.3、评价指标

分类指标:

  • 错误率与精度:
    错误率是分类结果错误的样本数占样本总数的比列,精度则是分类结果正确的样本数占样本总数的比列,即:错误率+精度=1
  • 准确率与召回率(查准率与查全率):
    准确率P:被判定为正类的样本中真正的正类样本所占的比列
    P=TP/(TP+FP)P=TP/(TP+FP)P=TP/(TP+FP)
    召回率R:被正确判定的正类样本占总的正类样本的比列
    R=TP/(TP+FN)R=TP/(TP+FN)R=TP/(TP+FN)
    准确率与召回率此消彼长
  • F1-score:
    准确率和召回率的调和平均:
    F1=2(P∗R)/(P+R)F1=2(P*R)/(P+R)F1=2(PR)/(P+R)
  • ROC曲线:
    FP为横轴、TP为纵轴
  • AUC值:ROC曲线下面积
  • 对数损失:交叉熵损失

回归指标:

  • 平均绝对误差(MAE):
  • 均方误差(MSE):
  • 均方根误差(RMSE):
  • 平均绝对百分比误差(MAPE):

3.2、样本选择

	四个样本选择因数:数据集过大影响模型性能;噪声和异常数据导致准确率不高;样本冗余或不相关数据多;正负样本分布不平衡。
3.2.1、数据集过大
	采用随机简单抽样,分为有放回和无放回两种
	分层采样
3.2.2、正负样本不均衡
	评分加权处理
	欠采样:随机欠采样、Tomek Links
	过采样:随机过采样、SMOTE

3.3、线下评估策略

3.3.1、强时序问题
	采用时间上最接近测试集的数据做验证集
3.3.2、弱时序问题
	采用K折交叉验证
四、案例
	Kaggle平台房屋价格预测数据
	Kaggle:House Prices - 
import numpy as np
import pandas as pd
from sklearn.model_selection import KFold     # 交叉验证
from sklearn.metrics import mean_squared_error   # 均方误差
from sklearn.preprocessing import OneHotEncoder   # 独热编码
import lightgbm as lgb
train = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/train.csv')
test = pd.read_csv('/kaggle/input/house-prices-advanced-regression-techniques/test.csv')
all_data = pd.concat((train,test))
all_data = pd.get_dummies(all_data)  # 独热编码
all_data = all_data.fillna(all_data.mean())   # 均值填充
X_train = all_data[:train.shape[0]]  # 训练数据集
X_test = all_data[train.shape[0]:]   # 测试数据集
y = train.SalePrice
```python

```python
folds = KFold(n_splits=5,shuffle=True,random_state=1)  # 5折交叉验证
# 模型参数
params = {'num_leaves':63,'min_child_samples':50,'objective':'regression',
          'learning_rate':0.01,'boosting_type':'gbdt','metric':'rmse'}
for trn_idx,val_idx in folds.split(X_train,y):
    trn_df,trn_label = X_train.iloc[trn_idx,:],y[trn_idx]
    val_df,val_label = X_train.iloc[val_idx,:],y[val_idx]
    dtrn = lgb.Dataset(trn_df,label=trn_label)
    dval = lgb.Dataset(val_df,label=val_label)
    bst = lgb.train(params,dtrn,num_boost_round=1000,valid_sets=[dtrn,dval],
                   early_stopping_rounds=100,verbose_eval=100)

在LightGBM算法中,这些参数的含义如下:

  • num_leaves: 树上的最大叶子节点数。增加这个值会使模型更加复杂。这是一个需要根据数据集大小进行调整的关键参数。

  • min_child_samples: 叶子节点上的最小样本数。它有助于控制过拟合。较高的值可以防止模型学习对于特定数据样本过于特殊的关系。

  • objective: 要优化的目标函数。在这里,设置为 'regression',表示模型用于回归任务(预测连续值)。

  • learning_rate: 在每个 boosting 步骤之后收缩特征权重的因子。它用于防止过拟合。较小的值需要更多的 boosting 迭代,但可能导致更准确的模型。

  • boosting_type: 使用的 boosting 算法的类型。在这里,设置为 'gbdt',表示梯度提升决策树。

  • metric: 用于评估模型的指标。设置为 'rmse',表示使用均方根误差作为评估回归模型的标准。均方根误差是预测值与实际值之间差异的平方的平均值的平方根。

这些参数影响着模型的复杂性、学习速度以及拟合数据的能力,对于LightGBM等梯度提升算法来说,调整这些参数是优化模型性能的重要步骤。

lgb.train(params, dtrn, num_boost_round=1000, valid_sets=[dtrn, dval], early_stopping_rounds=100, verbose_eval=100)
  • params: 一个字典,包含了 LightGBM 模型的参数,例如学习率、树的最大深度等。

  • dtrn: 训练数据集的 Dataset 对象,它是一个轻量级的数据结构,用于提高训练速度。

  • num_boost_round: Boosting 迭代的次数,也就是树的数量。在这里,设置为 1000。

  • valid_sets: 一个包含验证数据集的列表。在这里,[dtrn, dval] 表示使用 dtrn 作为训练集,dval 作为验证集。

  • early_stopping_rounds: 如果在指定的轮数内没有进展,训练将会提前停止。在这里,设置为 100,意味着如果在连续的 100 次迭代中都没有改善验证集上的性能,训练将会提前停止。

  • verbose_eval: 控制输出的详细程度。在这里,设置为 100,表示每隔 100 轮输出一次信息。

这段代码的作用是训练一个 LightGBM 模型,使用梯度提升算法,通过迭代训练树来拟合数据。num_boost_round 控制迭代的次数,early_stopping_rounds 可以在验证集性能不再提升时提前停止训练,以防止过拟合。 verbose_eval 控制训练过程中的输出信息。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐