前面有篇文章介绍了逻辑回归模型,用了一个违约率预测的案例,该模型的AUC值为0.816,本文用集成算法对数据进一步研究,进一步挖掘数据之间的关系,看能否提升模型的评估效果。
集成算法(Emseble Learning)是构建多个学习器,然后通过一定策略结合把它们来完成学习任务的,常常可以获得比单一学习显著优越的学习器。
集成算法主要包括三大类
基于自举采样法(bootstrap sampling)随机得到一些样本集训练,用来分别训练不同的基学习器,然后对不同的基学习器得到的结果投票得出最终的分类结果。自助采样法得到的样本大概会有63%的数据样本被使用,剩下的可以用来做验证集。
提升算法,它通过反复学习得到一系列弱分类器,然后组合这些弱分类器得到一个强分类器,把弱学习器提升为强学习器。主要包括:Adaboost、Xgboost、GBDT等。
这里重点说一下Xgboost,该算法由我国的陈天奇博士在2014年发明的算法,该算法横扫各大竞赛网站的奖项。陈天奇也因该算法多次在kaggle获奖,后赴美国读博,2020年陈天奇留在美国大学任教。(可惜可惜,机器学习牛人很多都留不住。)
多模型堆叠,按平均值或权重进行投票搭建新的模型。Stacking是比较暴力、实用性强的算法,它把多种模型融合在一起,按其预测的概率进行融合,组合成一个新的模型,大部分情况下,新模型的预测效果高于其所有的其他模型。因为新的集成算法模型减少了各个模型各自的缺点的,减少了噪音的影响。
本文以前文(逻辑回归模型案例)的数据集为样本。
#集成算法代码汇总
from sklearn import preprocessing
from sklearn.metrics import roc_curve, roc_auc_score
from sklearn.svm import SVC, LinearSVC
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import MLPClassifier
from sklearn.kernel_approximation import Nystroem, RBFSampler
from mlens.visualization import corrmat
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
import numpy as np
import pandas as pd
#Max-Min标准化 (离差标准化)
#建立MinMaxScaler对象
minmax = preprocessing.MinMaxScaler()
# 标准化处理
XJ= minmax.fit_transform(X)
#切分训练集和测试集
def get_train_test(test_size = 0.2):
return train_test_split(XJ,y,test_size = test_size, random_state =3)
xtrain, xtest, ytrain, ytest = get_train_test()
def get_models():
nb = GaussianNB()
svc = SVC(C = 100, probability = True)
knn = KNeighborsClassifier(n_neighbors = 16)
lr = LogisticRegression(C = 100, random_state =3)
nn = MLPClassifier((80,10),early_stopping = False, random_state = 3)
gb = GradientBoostingClassifier(n_estimators = 10, max_features =2, random_state = 3)
rf = RandomForestClassifier(n_estimators =10, max_features =2, random_state =3)
models = {'svm支持向量机':svc,
'knn近邻算法':knn,
'naive bayes贝叶斯预测':nb,
'mlp-nn神经网络':nn,
'random forest随机森林': rf,
'gbm梯度提升树算法':gb,
'logistic逻辑回归': lr,
}
return models
def train_predict(model_list):#"使用上述模型算法多测试集和训练集数据进行拟合并获得其预测的概率值"
P = np.zeros((ytest.shape[0], len(model_list)))
#构建一个和0矩阵,行和样本数一样,列的数目是用到的sklearn算法的总数
P = pd.DataFrame(P)
cols = list()
#通过一个for循环对之前构建的算法的字典进行调用,先拟合模型,然后将预测的概率结果赋值到P矩阵中对应的位置4
#并依次保存算法的name到cols列表中,最后作为P的属性(就是DataFrame的第一列)
for i, (name, m) in enumerate(models.items()):
m.fit(xtrain, ytrain)
P.iloc[:, i] = m.predict_proba(xtest)[:, 1]
cols.append(name)
P.columns = cols
return P
def score_models(P, y):
#"对模型预测结果与测试集数据进行比较利用ROC-AUC评价指标进行打分"
for m in P.columns:
score = roc_auc_score(y, P.loc[:, m])
print("%-10s: %.3f" % (m, score))
models = get_models()
#调用get_models获得所有的模型集合组成的一个字典models
P = train_predict(models)
#依次利用每个算法模型进行拟合预测获得P矩阵中包含的每种模型算法的预测结果
score_models(P,ytest)
#使用ROC-AUC评价指标对P矩阵中模型预测结果与实际测试集进行比较
corrmat(P.corr(), inflate = False)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文
plt.show()
def plot_roc_curve(test_y, P_base_learners, P_ensemble, labels, ens_label):
#test_y = 测试集的真实值 ;P_base_learners = 各个模型预测生成的新的属性值;
#P_ensemble = 各个模型预测值的合并预测值,此处是用平均
#labels= 各个模型名称list ; ens_label 的名称,这里命名为'ensemble'
plt.figure(figsize=(15, 9))
plt.plot([0, 1], [0, 1], 'k--') # 画出基础对角线
cm = [plt.cm.rainbow(i) for i in np.linspace(0, 1.0, P_base_learners.shape[1] + 1)]
for i in range(P_base_learners.shape[1]):
p = P_base_learners[:, i]
fpr, tpr, _ = roc_curve(test_y, p)
plt.plot(fpr, tpr, label=labels[i], c=cm[i + 1])
fpr,tpr, _ = roc_curve(test_y, P_ensemble)
plt.plot(fpr, tpr, label=ens_label,c=cm[0])
plt.tick_params(axis='both', which='major', labelsize=15)
plt.xlabel('False positive rate',fontsize=15)
plt.ylabel('True positive rate',fontsize=15)
plt.title('ROC-pjb',fontsize=14)
plt.legend(frameon=False)
plt.legend(prop={'size':13})#控制图例的大小
plt.show()
bb=['AUC值为:'+str(round(roc_auc_score(ytest, P.loc[:, m]),3)) for m in P.columns ]
kkm=[i for i in zip(list(P.columns),bb)]
socoremelt=round(roc_auc_score(ytest, P.mean(axis = 1)),3)
plot_roc_curve(ytest,P.values,P.mean(axis=1),pp,'Stacking集成算法'+'AUC值:'+str(socoremelt))
输出结果展示:
模型相关系数矩阵:
AUC值:
本例集成算法AUC值为0.853,优于其他七种算法,可见集成算法综合了其他算法的优点,对模型预测的效果得到了一定的提升。大家能观察到集成算法运行已经接近3秒,之前我做的模型很少有超过1秒的运行时间。而本例集成算法用到的数据样本并不大,集成算法其运行过程相较于之前的基础算法更为复杂,如果后续要优化还要进行调参,特别是用k折交叉算法对树模型的深度等其他参数找最优值都是需要进行大量的运算。
原文作者:Python学习杂记;如有侵权,请联系管理员删除。