机器学习算法比赛实战-比赛问题建模
更新《机器学习算法比赛实战》一书的阅览笔记,更多具体的内容请阅览原书。本文的主要内容包括:
- 比赛问题的3个主要部分
- -怎么了解比赛问题
- 机器学习的样本挑选
- 怎么线下点评模型
- 实战事例
比赛问题建模
针对具体问题的建模分为3个部分:
- 赛题了解
- 样本挑选
- 线下点评战略
赛题了解
- 事务背景:深化事务、明确方针
- 数据了解:数据基础层、数据描述层;前者关注:字段来历、取数逻辑、核算逻辑、生产过程等,后者关注:数据字段的统计量,便于进行统计分析和归纳描述。
- 点评目标:
- 分类模型:错误率、精度、精确率(查准率precision)、召回率(recall,查全率)、F1_score、ROC曲线、AUC和对数丢失(logloss)
- 回归模型:平均绝对差错MAE、均方差错MSE、均方根差错RMSE、平均百分比差错MAPE
样本挑选
主要原因
影响数据质量的4个原因:
- 数据集过大(偏重数据量)
- 存在噪声和异常值
- 样本数据冗余(偏重数据特征的冗余),一般进行特征筛选(降维)
- 正负样本不均衡:运用欠采样或许过采样来解决
精确方法
解决数据集过大或许正负样本不均衡的方法:
- 简单随机抽样:有放回和无放回
- 分层采样:评分加权处理(对不同的类别进行加权)、欠采样(随机欠采样、Tomek Links)、过采样(随机过采样、SMOTE算法)
应用常景
什么场景下需求处理样本不均衡问题?
- 对召回率有特别要求:即对正样本的猜测比负样本重要,假如不处理的话,很难获得较好的建模结果。
- 假如点评目标是AUC:处理或不处理不同不大
- 假如正负样本同等重要,无需多做处理
线下点评战略
- 强时序性问题:将数据按照时刻的先后顺序进行排序,挑选最近时刻的数据作为测验集
- 弱时序性问题:K折穿插验证
- K=2,2折穿插验证:将数据分为练习集和测验集,受数据区分方法影响大
- K=N,N折穿插验证(留一验证 leave-one-out Validation),N-1个练习集,1个测验集;练习过程核算量大
- K=5或许10,折中办法:比如K=5表明取其中4份作为练习集,1份作为验证集,循环5次,取5次练习的点评结果的均值或许投票表决
# 10折穿插验证
from sklearn.model_selection import KFold
NFOLDS = 10 # 操控折数
folds = KFold(n_splits=NFOLDS, shuffle=True, random_state=2023)
for trn_index, val_index in folds.split(X_train, y_train):
train_df, train_label = X_train.iloc[trn_index,:], y_train[trn_index] # 根据对应的索引号来取数
valid_df, valid_label = X_train.iloc[val_index,:], y_train[val_index]
实战事例
导入库
In [1]:
import pandas as pd
import numpy as np
from sklearn.model_selection import KFold # K折穿插验证
from sklearn.metrics import mean_squared_error #点评目标mse
from sklearn.preprocessing import OneHotEncoder # 独热码
import lightgbm as lgb # lgb模型
import warnings
warnings.filterwarnings("ignore")
加载数据
In [2]:
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
In [3]:
train.head()
查看数据的基本信息情况:
In [4]:
train.isnull().sum() # 缺失值情况
Out[4]:
Id 0
MSSubClass 0
MSZoning 0
LotFrontage 259
LotArea 0
...
MoSold 0
YrSold 0
SaleType 0
SaleCondition 0
SalePrice 0
Length: 81, dtype: int64
In [5]:
train.dtypes # 字段类型
Out[5]:
Id int64
MSSubClass int64
MSZoning object
LotFrontage float64
LotArea int64
...
MoSold int64
YrSold int64
SaleType object
SaleCondition object
SalePrice int64
Length: 81, dtype: object
In [6]:
train.describe() # 描述统计信息
数据预处理
In [7]:
all_data = pd.concat([train,test]) # 数据兼并
all_data = pd.get_dummies(all_data) # 哑变量处理
In [8]:
# 缺失值均值填充
all_data = all_data.fillna(all_data.mean())
In [9]:
all_data.head()
数据集区分
In [10]:
X_train = all_data[:train.shape[0]]
X_test = all_data[train.shape[0]:]
y = train.SalePrice
模型练习与点评
In [11]:
from sklearn.model_selection import KFold
NFOLDS = 5 # 操控折数
folds = KFold(n_splits=NFOLDS, shuffle=True, random_state=2023)
params = {"num_leaves":63,
"min_child_samples":50,
"objective":"regression",
"learning_rate":0.01,
"boosting_type":"gbdt",
"metric":"rmse"
}
for trn_index, val_index in folds.split(X_train, y):
train_df, train_label = X_train.iloc[trn_index,:], y[trn_index] # 根据对应的索引号来取数
valid_df, valid_label = X_train.iloc[val_index,:], y[val_index]
dtrn = lgb.Dataset(train_df, label=train_label)
dval = lgb.Dataset(valid_df, label=valid_label)
dst = lgb.train(params,
dtrn,
num_boost_round=1000,
valid_sets=[dtrn, dval], # 验证集数据
early_stopping_rounds=100,
verbose_eval=100
)