多分类问题概述
分类是一种典型的有监督学习问题,其应用场景如:信用风险评估、医学诊断和电子邮件分类等。
一个典型的分类模型构建流程如图所示:
二分类任务
“拆分法”:可以解决多分类问题,即将多分类任务拆为若干个二分类任务:
- 一对一(OvO)
- 一对其余(OvR)
- 多对多(MvM)
图片来源:周志华.机器学习.清华大学出版社,2016
回归问题概述
在一个回归模型中,我们需要关注或预测的变量叫做因变量,我们选取的用来解释因变量变化的变量叫做自变量。
决策树
- 监督学习,分类(二分类或者多分类)或者回归;
- 基于树结构进行决策
一个例子---相亲问题:
根据一系列特征作出决策;每一次选择一个变量,作为树,最终结果作为叶子结点
假设我们希望判断一个人未来5年的收入水平是否会超过100w,这可以视为一个分类问题;我们可以收集如下特征:性别,年龄,工作城市,行业,工作年限,工作城市平均收入,工作行业平均收入,职位类别,职位类别平均收入等等,如上我们同样可以构建一个决策树,但是这里每一层的分裂特征怎么选?
决策树核心---决策规则
- ID3:根据信息增益( Information Gain )来选取feature作为决策树分裂的节点
- C4.5 :用信息增益比率( gain info) 来选择feature
- CART(Classification and Regression Tree):使用基尼指数选择Feature
决策树构建
ID3的思想
- 自顶向下,贪心搜索遍历所有可能的决策空间,优先选择最优的决策空间( ID3和C4.5算法的基础)
- 从选择根节点开始
- 用统计的方法确定每个属性单独分类样例的能力,优先选择分类最好的属性作为当前节点(根节点)
- 为节点属性的每个可能值产生一个分值,并根据取值分割样例
- 重复这个过程,直到达到终止条件
C4.5
C4.5是ID3的改进算法
- 用信息增益率来选择属性
- 在树构造过程中进行剪枝( 一定程度避免overfitting )
避免过拟合
- 增加对连续值特征的处理
- 增加对缺失值的处理
CART
- CART:分类回归树
CART使用GINI指数选择feature
-
二叉树,每个决策都是“是”与“否”
-
分类树:输出的离散的样本类标
-
回归树:输出的是连续的实树预估值( 房价、点击率等)
常见的决策树模型
| 模型 | 可处理的特征类型 | 不纯度度量方式 | 分割后子节点数量 | 目标特征类型 |
|---|---|---|---|---|
| ID3 | 离散型 | 信息增益 | 大于等于2 | 离散型 |
| C4.5 | 离散型、连续型 | 信息增益率 | 大于等于2 | 离散型 |
| CART | 离散型、连续型 | Gini系数 | 等于2 | 离散型、连续型 |
模型优劣及超参数
优势: 模型简单,可解释性强,可以省去一定程度的特征处理,对缺失值有比较好的处理机制,在相对短的时间内能够对大型数据源做出可行且效果良好的结果。
劣势: 单棵树泛化能力不强,容易发生过拟合;容易忽略数据集中属性的相互关联;
超参数: 树的最大深度,叶节点的最小元素个数
GBDT
梯度提升树,Gradient Boosting Decision Tree
以回归树为基学习器的boosting方法
用损失函数的负梯度来拟合每轮损失的近似值,
GradianBoostingClassifier类
| 参数 | 功能 |
|---|---|
| loss | 指定损失函数,默认为“deviance”,(对数损失),可为“exponential”(指数损失) |
| learning_rate | 学习率,默认为0.1 |
| n_estimators | 弱分类器个数,默认为100 |
| subsample | 拟合基学习器的训练集样本数占总样本数的比例,0到1之间的浮点数,默认为1.0 |
| 属性 | 说明 |
|---|---|
| feature_ importances_ | 特征重要性 |
| oob_improvement_ | 每增加一个基分类器,袋外样本的损失函数减少值 |
| train_score_ | 每增加一个基分类器,训练集上损失函数的值 |
GradientBoostindRegressor类
| 参数 | 说明 |
|---|---|
| loss | - 指定损失函数,默认为“ls”(平方损失) ,还可为: |
- “lad”(绝对值损失)
- “huber”( huber损失)
- “quantile”(分位数回归) | | alpha | 当loss=“huber”或”quantile” 时有效,两个损失中的参数,默认为0.9 | | learning_rate | 学习率,默认为0.1 | | n_estimators | 弱分类器个数,默认为100 | | subsample | 拟合基学习器的训练集样本数占总样本数的比例,0到1之间的浮点数,默认为1.0 |
构建GBDT模型
from sklearn.ensemble import GradientBoostingClassifier
import matplotlib.pyplot as plt
# 建立并训练GBDT模型
model_gdbt = GradientBoostingClassifier(random_state=10,subsample=.7)
model_gdbt.fit(X_train, Y_train)
# 弱分类器袋外样本损失减小值和训练集损失
plt.figure(figsize=(8,6))
plt.plot(model_gdbt.oob_improvement_, 'y-+', label='oob')
plt.plot(model_gdbt.train_score_, 'b--*', label='train')
plt.xlabel('estimator_order')
plt.legend()
随着弱分类器的增加,训练集的损失在不断降低,袋外样本的损失减小值慢慢趋于平稳。