赞
踩
本文代码及数据集来自《Python大数据分析与机器学习商业案例实战》
在机器学习中,因为训练集和测试集的数据划分是随机的,所以有时会重复地使用数据,以便更好地评估模型的有效性,并选出最好的模型,该做法称为交叉验证。具体而言就是对原始样本数据进行切分,然后组合成为多组不同的训练集和测试集,用训练集训练模型,用测试集评估模型。某次的训练集可能是下次的测试集,故而称为交叉验证。
交叉验证的方法有简单交叉验证、K折交叉验证和留一交叉验证3种。其中K折交叉验证应用较为广泛,它是指将数据集随机等分为K份,每次选取K-1份作为训练集,用剩下的1份作为测试集,得到K个模型后将这K个模型的平均测试效果作为最终的模型效果。
# **K折交叉验证**
from sklearn.model_selection import cross_val_score
acc = cross_val_score(model, X, y, cv=5)
print(acc) #通过打印acc来查看5次交叉验证得到的打分
print(acc.mean()) #获得这5个得分的平均分
用cross_val_score()函数进行交叉验证,传入的参数依次为模型名称(model)、特征变量数据(X)、目标变量数据(y)、交叉验证的次数(cv)。这里设置cv为5,表示交叉验证5次,每次随机取4/5的数据用于训练,1/5的数据用于测试。如果不设置该参数,则默认交叉验证3次。此外,这里没有设置scoring参数,表示以默认值’accuracy’(准确度)作为评估标准。
运行结果:
如果想以ROC曲线的AUC值作为评估标准,则可以设置scoring参数为’roc_auc’,代码如下。
from sklearn.model_selection import cross_val_score
acc = cross_val_score(model, X, y, scoring='roc_auc', cv=5)
print(acc)
print(acc.mean())
运行结果:
GridSearch网格搜索是一种穷举搜索的参数调优手段:遍历所有的候选参数,循环建立模型并评估模型的有效性和准确性,选取表现最好的参数作为最终结果。如果要同时调节多个模型参数,例如,模型有2个参数,第1个参数有4种可能,第2个参数有5种可能,所有的可能性可以表示成4×5的网格,那么遍历的过程就像是在网格(Grid)里搜索(Search),这就是该方法名称的由来。
# **多参数调优**
from sklearn.model_selection import GridSearchCV
parameters = {'max_depth': [5, 7, 9, 11, 13],
'criterion':['gini', 'entropy'],
'min_samples_split':[5, 7, 9, 11, 13, 15]}
model = DecisionTreeClassifier()
grid_search = GridSearchCV(model, parameters, scoring='roc_auc', cv=5) #设置cv参数为5,表示进行5折交叉验证,对于每个候选值,模型都会运行5遍
grid_search.fit(X_train, y_train)
print(grid_search.best_params_)
运行结果:
{‘criterion’: ‘entropy’, ‘max_depth’: 11, ‘min_samples_split’: 13}
从输出结果可知,将criterion设置为’entropy’(信息熵)、max_depth设置为11、min_samples_split设置为13时,模型最优。将这些参数的最优值引入模型,代码如下。
model = DecisionTreeClassifier(criterion='entropy', max_depth=11, min_samples_split=13)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)
y_pred_proba = model.predict_proba(X_test)
print(y_pred_proba[:,1])
from sklearn.metrics import roc_auc_score
score = roc_auc_score(y_test, y_pred_proba[:,1])
print(score)
此时模型的预测准确度为0.9823,ROC曲线的AUC值为0.988,这两个值与之前的单参数调优结果相比都有提升。
# **补充知识点:批量生成调参所需数据**
import numpy as np
parameters = {'max_depth': np.arange(1, 10, 2)}
#可代替parameters = {'max_depth': [1, 3, 5, 7, 9]}
第一,多参数调优和单参数分别调优是有区别的。不能为了省事,对多个参数分别进行单参数调优,然后将结果汇总,这种做法是不严谨的。因为在进行单参数调优时,其他参数会取默认值,那么就忽略了该参数和其他参数都不取默认值的情况,即忽略了多个参数对模型的组合影响。以上述代码示例来说,进行多参数调优时,有5×2×6=60种可能的组合,而进行3次单参数调优时,则只有5+2+6=13种可能的组合。因此,如果只需要调节一个参数,那么可以进行单参数调优,如果需要调节多个参数,则推荐进行多参数调优。
第二,如果使用GridSearchCV()函数得到的参数最优值是给定范围的边界值,那么有可能存在范围以外的值使得模型效果更好,此时需要额外增大范围,继续进行参数调优。举例来说,倘若上述代码获得的max_depth最优值为设定的最大值13,那么真正的max_depth最优值可能更大,此时便需要重新调整搜索网格,如将max_depth的搜索范围变成[9,11,13,15,17],再重新进行参数调优。
·criterion:特征选择标准,取值为’entropy’(信息熵)和’gini’(基尼系数),默认值为’gini’。
·splitter:取值为’best’和’random’。‘best’指在特征的所有划分点中找出最优的划分点,适合样本量不大的情况;‘random’指随机地在部分划分点中寻找局部最优的划分点,适合样本量非常大的情况;默认值为’best’。
·max_depth:决策树最大深度,取值为int型数据或None,默认值为None。一般数据或特征较少时可以不设置,如果数据或特征较多,可以设置最大深度进行限制。
·min_samples_split:子节点往下分裂所需的最小样本数,默认值为2。如果子节点中的样本数小于该值则停止分裂。
·min_samples_leaf:叶子节点的最小样本数,默认值为1。如果叶子节点中的样本数小于该值,该叶子节点会和兄弟节点一起被剪枝,即剔除该叶子节点和其兄弟节点,并停止分裂。
·min_weight_fraction_leaf:叶子节点最小的样本权重和,默认值为0,即不考虑权重问题。如果小于该值,该叶子节点会和兄弟节点一起被剪枝。如果较多样本有缺失值或者样本的分布类别偏差很大,则需考虑样本权重问题。
·max_features:在划分节点时所考虑的特征值数量的最大值,默认值为None,可以传入int型或float型数据,如果传入的是float型数据,则表示百分数。
·max_leaf_nodes:最大叶子节点数,默认值为None,可以传入int型数据。
·class_weight:指定类别权重,默认值为None,可以取’balanced’,代表样本量少的类别所对应的样本权重更高,也可以传入字典来指定权重。该参数主要是为防止训练集中某些类别的样本过多,导致训练的决策树过于偏向这些类别。除了指定该参数,还可以使用过采样和欠采样的方法处理样本类别不平衡的问题。
·random_state:当数据量较大或特征变量较多,可能在某个节点划分时,会遇到两个特征变量的信息增益或基尼系数下降值相同的情况,此时决策树模型默认会从中随机选择一个特征变量进行划分,这样可能会导致每次运行程序后生成的决策树不一致。设置random_state参数(如设置为123)可以保证每次运行程序后各节点的分裂结果都是一致的,这在特征变量较多、树的深度较深时较为重要。
以决策树为代表的树模型在金融大数据风控领域也有很大的应用空间。以银行的信贷违约预测模型为例,通常会用到逻辑回归模型和决策树模型。
逻辑回归模型不需要太多变量,不容易过拟合,泛化能力较强,可能一年才需要换一次模型,但是有时不够精确,不能有效剔除潜在违约人员。树模型(决策树、随机森林、XGBoost等模型)不太稳定(一个变量可以反复用),容易造成过拟合,泛化能力较弱,一段时间后换一批人可能就不行了,但拟合度强,区分度高,可以快速去掉违约人员。
因此,商业实战中常以基于逻辑回归的评分卡模型为基础(稳定性强,半年到一年更新一次,但不够精确,KS值不够大),再结合决策树等树模型(不太稳定,可能要一个月更新一次,但拟合度强,区分度高,可以在第一拨快速去掉违约人员)。
作为机器学习的经典算法模型,决策树模型具有独特的优势,如对异常值不敏感、可解释性强等,不过它也有一些缺点,如结果不稳定、容易造成过拟合等。更重要的是,决策树模型是很多重要集成模型的基础,如随机森林模型、AdaBoost模型、GBDT模型、XGBoost与LightGBM模型都是建立在决策树模型的基础上的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。