Skip to content

决策树与集成学习

——二元分类问题

(一)信用风险评估项目

1. 数据清理

统一列名-小写化 表示出分类变量的实际含义 除去极端个例、数据确实

2. 准备数据集

将数据集划分为训练集、验证集、测试集 处理缺失值 使用one-HOT编码 创建特征矩阵X和目标变量y

(二)决策树

对一系列if-then-else规则进行编码的数据结构。

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(X_train, y_train)

# 可视化
from sklearn.tree import export_text
tree_text = export_text(dt, feature_names=dv.feature_names_) #one-hot时产生的
print(tree_text)

1 AUC评估

描述一个随机选择的正例(default)比一个随机选择的负例(OK)得分更高的概率

2 决策树算法

杂质度

纯与不纯。标准:误分类率、熵、基尼杂质度

划分特征选取

对于每个特征尝试所有阈值->对于每个阈值测量杂质度->选择具有最低杂质度的特征和阈值

停止标准

组的纯度足够高;树达到深度限制-max_depth;分组太小无法继续划分-min_samples-leaf

3 决策树的参数调优

暴力枚举啦

(三)随机森林

多个模型的输出合并成一个,得到错误答案的机会会更小——集成学习 模型的组合——继承

得到不同模型的简单方法:不同的特征子集上训练

随机森林训练:训练N个单独的决策树模型->对于每个模型,选择一个随机的特征子集并只使用它们进行训练->进行预测时,将N个模型的输出合并成为一个

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=10,random_state=3)
rf.fit(X_train, y_train)
y_pred = rf.predict_proba(X_val)[:,1]
roc_auc_score(y_val, y_pred)

参数调优

aucs = []
for i in range(10, 201, 10):
    rf = RandomForestClassifier(n_estimators=i,random_state=3)
    rf.fit(X_train, y_train)

    y_pred = rf.predict_proba(X_val)[:,1]
    AUC = roc_auc_score(y_val, y_pred)
    print('%s -> %.3f' % (i, AUC))

    aucs.append(AUC)
plt.plot(range(10,201,10), aucs)
# depth
all_aucs = {}  # 这里创建一个字典

for depth in [5, 10, 20]:  # 遍历不同的深度
    print('depth: %s' % depth)
    # 对当前的深度进行探索
    aucs = []
    for i in range(10, 201, 10):  # 尝试不同的树的数量的集成树
        rf = RandomForestClassifier(n_estimators = i, max_depth = depth, random_state = 1)  # 对应的参数
        rf.fit(X_train, y_train)  # 开始进行训练
        y_pred = rf.predict_proba(X_val)[:, 1]
        auc = roc_auc_score(y_val, y_pred)
        print('%s -> %.3f' % (i, auc))
        aucs.append(auc)
    all_aucs[depth] = aucs
    print()
num_trees = list(range(10, 201, 10))
plt.plot(num_trees, all_aucs[5], label = 'depth = 5')
plt.plot(num_trees, all_aucs[10], label = 'depth = 10')
plt.plot(num_trees, all_aucs[20], label = 'depth = 20')
plt.legend()

# min_samples_leaf
all_aucs = {}

for m in [3, 5, 10]:
    print('min_samples_leaf: %s' % m)
    aucs = []

    for i in range(10, 201, 20):
        rf = RandomForestClassifier(n_estimators=i, max_depth=10, min_samples_leaf=m, random_state=1)
        rf.fit(X_train, y_train)
        y_pred = rf.predict_proba(X_val)[:, 1]
        auc = roc_auc_score(y_val, y_pred)
        print('%s -> %.3f' % (i, auc))
        aucs.append(auc)

    all_aucs[m] = aucs
    print()
num_trees = list(range(10, 201, 20))
plt.plot(num_trees, all_aucs[3], label='min_samples_leaf=3')
plt.plot(num_trees, all_aucs[5], label='min_samples_leaf=5')
plt.plot(num_trees, all_aucs[10], label='min_samples_leaf=10')
plt.legend()

(四)梯度提升

训练当前模型->查看它导致的错误->训练令一个模型来纠正这些错误->再次查看错误并按顺序重复此过程

1 XGBoost:极限梯度提升

——Extreme Gradient Boosting

import xgboost as xgb

dtrain = xgb.DMatrix(X_train, label=y_train, feature_names=dv.feature_names_) #把数据封装到DMatrix-高效查找划分点的特殊数据结构
dval = xgb.DMatrix(X_val, label=y_val, feature_names=dv.feature_names_)
xgb_params = {
    'eta': 0.3,
    'max_depth': 6,
    'min_child_weight': 1,

    'objectove': 'binary:logistic',
    'nthread': 8,
    'seed': 1,
    'silent': 1
}
model = xgb.train(xgb_params, dtrain, num_boost_round=10)
y_pred = model.predict(dval)
roc_auc_score(y_val, y_pred)

2 模型性能监控

watchlist = [(dtrain, 'train'), (dval, 'val')]

xgb_params = {
    'eta': 0.3, # 学习率
    'max_depth': 6,
    'min_child_weight': 1,

    'objectove': 'binary:logistic',
    'eval_metric': 'auc', # 解决的任务类型
    'nthread': 8, # 训练模型的线程数
    'seed': 1, # 随机数发生器种子
    'silent': 1 # 是否开启静默模式,1:只输出警告
}
model = xgb.train(xgb_params, dtrain, num_boost_round=100, evals=watchlist, verbose_eval=10)

3 参数调优

——枚枚举,找到最终的最优解就行 学习率: 梯度提升过程中,每棵树都尝试修成前一棵树的错误,ETA决定了修正的权重

(五)后续

极限随机化树-额外树 所有基于树的模型都可以解决回归问题