决策树与集成学习¶
——二元分类问题
(一)信用风险评估项目¶
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决定了修正的权重
(五)后续¶
极限随机化树-额外树 所有基于树的模型都可以解决回归问题