机器学习算法竞赛系列一
一、竞赛平台
- Kaggle
- 阿里天池
- DF(DataFountain)
- DC(DataCastle)
- Kesci
- JDATA
- FlyAI
- 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(P∗R)/(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 控制训练过程中的输出信息。
更多推荐
所有评论(0)