from sklearn.model_selection import GridSearchCV
逻辑回归模型
LR = LogisticRegression()
param = {‘C’:[0.01,0.1,1,10,100],‘penalty’:[‘l1’, ‘l2’]}
#C 正则化强度的倒数,较小的值表示更强的正则化
#penalty 惩罚项 官方文档可选11 12
gscv = GridSearchCV(LR, param_grid = param,scoring=‘roc_auc’,cv=5)
#cv=5 五折交叉
#scorin = ‘roc_auc’ 用auc值评估
gscv.fit(X_train,Y_train)
print(‘最佳参数:’,gscv.best_params_)
print(‘训练集的最佳分数:’,gscv.best_score_)
print(‘测试集的最佳分数:’,gscv.score(X_test,Y_test))
最佳参数: {‘C’: 10, ‘penalty’: ‘l1’}
训练集的最佳分数: 0.789362301390054
测试集的最佳分数: 0.8028815061438597
SVM模型
#线性SVM
svm_linear = svm.SVC(kernel = ‘linear’, probability=True)
param = {‘C’:[0.01,0.1,1]} #惩罚参数 错误项 默认1
gscv = GridSearchCV(svm_linear,param_grid = param,scoring=‘roc_auc’,cv =5)
gscv.fit(X_train,Y_train)
print(‘最佳参数:’,gscv.best_params_)
print(‘训练集的最佳分数:’,gscv.best_score_)
print(‘测试集的最佳分数:’,gscv.score(X_test,Y_test))
最佳参数: {‘C’: 1}
训练集的最佳分数: 0.7971450422551442
测试集的最佳分数: 0.8086361349972455
#多项式核函数
svm_poly = svm.SVC(kernel = ‘poly’, probability=True)
param = {‘C’:[0.01,0.1,1]} #惩罚参数 错误项 默认1
gscv = GridSearchCV(svm_poly,param_grid = param,scoring=‘roc_auc’,cv =5)
gscv.fit(X_train,Y_train)
print(‘最佳参数:’,gscv.best_params_)
print(‘训练集的最佳分数:’,gscv.best_score_)
print(‘测试集的最佳分数:’,gscv.score(X_test,Y_test))
最佳参数: {‘C’: 1}
训练集的最佳分数: 0.7803289215708327
测试集的最佳分数: 0.7966777647368799
#高斯核函数
svm_rbf = svm.SVC(kernel = ‘rbf’, probability=True)
param = {‘C’:[0.01,0.1,1]} #惩罚参数 错误项 默认1
gscv = GridSearchCV(svm_rbf,param_grid = param,scoring=‘roc_auc’,cv =5)
gscv.fit(X_train,Y_train)
print(‘最佳参数:’,gscv.best_params_)
print(‘训练集的最佳分数:’,gscv.best_score_)
print(‘测试集的最佳分数:’,gscv.score(X_test,Y_test))
最佳参数: {‘C’: 1}
训练集的最佳分数: 0.7909685604942758
测试集的最佳分数: 0.8003724640111141
sigmoid 函数
svm_sigmoid = svm.SVC(kernel = ‘sigmoid’, probability=True)
param = {‘C’:[0.01,0.1,1]} #惩罚参数 错误项 默认1
gscv = GridSearchCV(svm_sigmoid,param_grid = param,scoring=‘roc_auc’,cv =5)
gscv.fit(X_train,Y_train)
print(‘最佳参数:’,gscv.best_params_)
print(‘训练集的最佳分数:’,gscv.best_score_)
print(‘测试集的最佳分数:’,gscv.score(X_test,Y_test))
最佳参数: {‘C’: 0.1}
训练集的最佳分数: 0.7904667908330548
测试集的最佳分数: 0.7971867589642865
决策树模型
主要调整哪些参数?
max_depth: 树的最大深度
min_samples_split:拆分内部节点所需的样本数
min_samples_leaf:叶子节点最少的样本数
max_features:最大特征数
1.先对max_depth和min_samples_split进行网格搜索
In [53]:
DT = DecisionTreeClassifier()
param = {‘max_depth’:range(10,50,2),‘min_samples_split’:range(10,101,10)}
gscv = GridSearchCV(DT,param_grid = param,scoring =‘roc_auc’, cv=5)
gscv.fit(X_train, Y_train)
print(‘最佳参数:’,gscv.best_params_)
print(‘当前最佳分数:’,gscv.best_score_)
最佳参数: {‘max_depth’: 10, ‘min_samples_split’: 100}
当前最佳分数: 0.7079870369371769
2.对min_samples_split和min_samples_leaf进行网格搜索
In [54]:
DT = DecisionTreeClassifier(max_depth=10)
param = {‘min_samples_split’:range(100,1000,50),‘min_samples_leaf’:range(10,100,10)}
gscv = GridSearchCV(DT,param_grid = param,scoring =‘roc_auc’, cv=5)
gscv.fit(X_train, Y_train)
print(‘最佳参数:’,gscv.best_params_)
print(‘当前最佳分数:’,gscv.best_score_)
最佳参数: {‘min_samples_leaf’: 70, ‘min_samples_split’: 100}
当前最佳分数: 0.7282362669208555
3.再对max_feature进行网格搜索
In [55]:
DT = DecisionTreeClassifier(max_depth=10,min_samples_leaf=90,min_samples_split=400)
param = {‘max_features’:range(2,20)}
gscv = GridSearchCV(DT,param_grid = param,scoring =‘roc_auc’, cv=5)
gscv.fit(X_train, Y_train)
print(‘最佳参数:’,gscv.best_params_)
print(‘当前最佳分数:’,gscv.best_score_)
最佳参数: {‘max_features’: 14}
当前最佳分数: 0.73600472275314
XGBoost模型
通用参数:宏观函数控制。
Booster参数:控制每一步的booster(tree/regression)。booster参数一般可以调控模型的效果和计算代价。我们所说的调参,很这是大程度上都是在调整booster参数。
学习目标参数:控制训练目标的表现。我们对于问题的划分主要体现在学习目标参数上。比如我们要做分类还是回归,做二分类还是多分类,这都是目标参数所提供的。
【n_estimatores】
含义:总共迭代的次数,即决策树的个数
调参:
early_stopping_rounds
含义:在验证集上,当连续n次迭代,分数没有提高后,提前终止训练。
调参:防止overfitting。
【max_depth】
含义:树的深度,默认值为6,典型值3-10。
调参:值越大,越容易过拟合;值越小,越容易欠拟合。
【min_child_weight】
含义:默认值为1,。
调参:值越大,越容易欠拟合;值越小,越容易过拟合(值较大时,避免模型学习到局部的特殊样本)。
【subsample】 含义:训练每棵树时,使用的数据占全部训练集的比例。默认值为1,典型值为0.5-1。
调参:防止overfitting。
【colsample_bytree】
含义:训练每棵树时,使用的特征占全部特征的比例。默认值为1,典型值为0.5-1。
调参:防止overfitting。
【learning_rate】
含义:学习率,控制每次迭代更新权重时的步长,默认0.3。
调参:值越小,训练越慢。
典型值为0.01-0.2。
objective 目标函数
回归任务
reg:linear (默认)
reg:logistic
二分类
binary:logistic 概率
binary:logitraw 类别
多分类
multi:softmax num_class=n 返回类别
multi:softprob num_class=n 返回概率
rank:pairwise
eval_metric
回归任务(默认rmse)
rmse–均方根误差
mae–平均绝对误差
分类任务(默认error)
auc–roc曲线下面积
error–错误率(二分类)
merror–错误率(多分类)
logloss–负对数似然函数(二分类)
mlogloss–负对数似然函数(多分类)
【gamma】
惩罚项系数,指定节点分裂所需的最小损失函数下降值。
调参:
alpha
L1正则化系数,默认为1
lambda
L2正则化系数,默认为1
1.先对迭代次数(n_estimatores)和树的深度(max_depth)进行网格搜索
xgb = XGBClassifier() #是否应该先定义一些参数
param_1 = {‘n_estimatores’:range(1,100,5),‘max_depth’:range(0,10)}
gscv = GridSearchCV(xgb,param_grid = param_1, scoring=‘roc_auc’,n_jobs=4,iid=False, cv=5)
gscv.fit(X_train, Y_train)
#gsearch.grid_scores_,
print(‘最佳参数:’,gscv.best_params_)
print(‘当前最佳分数:’,gscv.best_score_)
最佳参数: {‘max_depth’: 2, ‘n_estimatores’: 1}
当前最佳分数: 0.7895918680895077
2.对min_child_weight和subsample网格搜索
xgb = XGBClassifier(max_depth=2, n_estimatores=1)
param_2 = {‘min_child_weight’:range(2,20,2),‘subsample’:[i/10 for i in range(2,11,2)]}
gscv = GridSearchCV(xgb,param_grid = param_2, scoring=‘roc_auc’,n_jobs=4,iid=False, cv=5)
gscv.fit(X_train, Y_train)
#gsearch.grid_scores_,
print(‘最佳参数:’,gscv.best_params_)
print(‘当前最佳分数:’,gscv.best_score_)
最佳参数: {‘min_child_weight’: 16, ‘subsample’: 1.0}
当前最佳分数: 0.792051988668116
xgb = XGBClassifier(max_depth=2, n_estimatores=1)
param_2 = {‘min_child_weight’:range(15,18),‘subsample’:[i/10 for i in range(9,11)]}
gscv = GridSearchCV(xgb,param_grid = param_2, scoring=‘roc_auc’,n_jobs=4,iid=False, cv=5)
gscv.fit(X_train, Y_train)
#gsearch.grid_scores_,
print(‘最佳参数:’,gscv.best_params_)
print(‘当前最佳分数:’,gscv.best_score_)
最佳参数: {‘min_child_weight’: 16, ‘subsample’: 1.0}
当前最佳分数: 0.792051988668116
3.对learning_rate和gamma网格搜索
In [59]:
xgb = XGBClassifier(max_depth=3, n_estimatores=10,min_child_weight=16,subsample=1.0)
param_3 = {‘learning_rate’:[i/10 for i in range(1,10)],‘gamma’:[i/10 for i in range(1,10)]}
gscv = GridSearchCV(xgb,param_grid = param_3, scoring=‘roc_auc’,n_jobs=4,iid=False, cv=5)
gscv.fit(X_train, Y_train)
#gsearch.grid_scores_,
print(‘最佳参数:’,gscv.best_params_)
print(‘当前最佳分数:’,gscv.best_score_)
最佳参数: {‘gamma’: 0.1, ‘learning_rate’: 0.1}
当前最佳分数: 0.7855197361568692
分数下降,因此在这2个参数中选用默认值gamma=0,learning_rate=0.3
4.尝试对reg_alpha网格搜索
In [76]:
xgb = XGBClassifier(max_depth=3, n_estimatores=10,min_child_weight=16,subsample=1.0,gamma=0,learning_rate=0.3)
param_4 = {‘reg_alpha’:[1e-5, 1e-2, 0.1, 1, 100]}
gscv = GridSearchCV(xgb,param_grid = param_4, scoring=‘roc_auc’,n_jobs=4,iid=False, cv=5)
gscv.fit(X_train, Y_train)
#gsearch.grid_scores_,
print(‘最佳参数:’,gscv.best_params_)
print(‘当前最佳分数:’,gscv.best_score_)
最佳参数: {‘reg_alpha’: 0.1}
当前最佳分数: 0.7734080152974204
TASK6
LR = LogisticRegression(C=10.0,penalty=‘l1’)
svm_linear = svm.SVC(C=1,kernel = ‘linear’, probability=True)
svm_poly = svm.SVC(C=1,kernel = ‘poly’, probability=True)
svm_rbf = svm.SVC(C=1,kernel = ‘rbf’, probability=True)
svm_sigmoid = svm.SVC(C=0.1,kernel = ‘sigmoid’, probability=True)
DT = DecisionTreeClassifier(max_depth=10,min_samples_leaf=90,min_samples_split=400)
xgb = XGBClassifier(learning_rate = 0.01,
n_estimator = 5000,
max_depth = 2,
min_child_weight =2,
gamma = 0.3,
subsample = 0.9,
colsample_bytree = 0.8,
objetive = ‘binary:logistic’,
nthread = 4,
scale_pos_weight = 1,
reg_alpha=1
)
stacking融合,LR做基准模型(meta_classfier)
from mlxtend.classifier import StackingClassifier
sclf=StackingClassifier(classifiers=[LR, svm_linear, svm_poly, svm_rbf, svm_sigmoid, DT, xgb],meta_classifier=LR,use_probas=True,average_probas=True)
sclf.fit(X_train, Y_train)
model_metrics(sclf, X_train, X_test, Y_train, Y_test)
drawROC(sclf,X_test, Y_test,‘Stacking_LR’)
【准确率】 训练集 0.7964 测试集 0.7810
【精准率】 训练集 0.6906 测试集 0.5990
【召回率】 训练集 0.3536 测试集 0.3554
【F1-Score】 训练集 0.4677 测试集 0.4461
【auc值】 训练集 0.8127 测试集 0.8078
【ROC曲线】
尝试其他模型作为基准模型
#基准模型:svm_linear
sclf2=StackingClassifier(classifiers=[LR, svm_linear, svm_poly, svm_rbf, svm_sigmoid, DT, xgb],meta_classifier=svm_linear,use_probas=True,average_probas=True)
sclf2.fit(X_train, Y_train)
model_metrics(sclf2, X_train, X_test, Y_train, Y_test)
drawROC(sclf2,X_test, Y_test,‘Stacking_svm_linear’)
【准确率】 训练集 0.7958 测试集 0.7870
【精准率】 训练集 0.7346 测试集 0.6478
【召回率】 训练集 0.3016 测试集 0.3102
【F1-Score】 训练集 0.4277 测试集 0.4196
【auc值】 训练集 0.8127 测试集 0.8078
【ROC曲线】
#基准模型:svm_poly
sclf3=StackingClassifier(classifiers=[LR, svm_linear, svm_poly, svm_rbf, svm_sigmoid, DT, xgb],meta_classifier=svm_poly,use_probas=True,average_probas=True)
sclf3.fit(X_train, Y_train)
model_metrics(sclf3, X_train, X_test, Y_train, Y_test)
drawROC(sclf3,X_test, Y_test,‘Stacking_svm_poly’)
【准确率】 训练集 0.7861 测试集 0.7870
【精准率】 训练集 0.7773 测试集 0.7374
【召回率】 训练集 0.2167 测试集 0.2199
【F1-Score】 训练集 0.3389 测试集 0.3387
【auc值】 训练集 0.7867 测试集 0.7826
【ROC曲线】
#基准模型:svm_rbf
sclf4=StackingClassifier(classifiers=[LR, svm_linear, svm_poly, svm_rbf, svm_sigmoid, DT, xgb],meta_classifier=svm_rbf,use_probas=True,average_probas=True)
sclf4.fit(X_train, Y_train)
model_metrics(sclf4, X_train, X_test, Y_train, Y_test)
drawROC(sclf4,X_test, Y_test,‘Stacking_svm_rbf’)
【准确率】 训练集 0.7919 测试集 0.7900
【精准率】 训练集 0.7555 测试集 0.6917
【召回率】 训练集 0.2624 测试集 0.2771
【F1-Score】 训练集 0.3895 测试集 0.3957
【auc值】 训练集 0.7762 测试集 0.7675
【ROC曲线】
#基准模型:svm_sigmoid
sclf5=StackingClassifier(classifiers=[LR, svm_linear, svm_poly, svm_rbf, svm_sigmoid, DT, xgb],meta_classifier=svm_sigmoid,use_probas=True,average_probas=True)
sclf5.fit(X_train, Y_train)
model_metrics(sclf5, X_train, X_test, Y_train, Y_test)
drawROC(sclf5,X_test, Y_test,‘Stacking_svm_sigmoid’)
【准确率】 训练集 0.7935 测试集 0.7900
【精准率】 训练集 0.7474 测试集 0.6783
【召回率】 训练集 0.2776 测试集 0.2922
【F1-Score】 训练集 0.4048 测试集 0.4084
【auc值】 训练集 0.8127 测试集 0.8078
【ROC曲线】
#基准模型:DT
sclf6=StackingClassifier(classifiers=[LR, svm_linear, svm_poly, svm_rbf, svm_sigmoid, DT, xgb],meta_classifier=DT,use_probas=True,average_probas=True)
sclf6.fit(X_train, Y_train)
model_metrics(sclf6, X_train, X_test, Y_train, Y_test)
drawROC(sclf6,X_test, Y_test,‘Stacking_DT’)
【准确率】 训练集 0.8051 测试集 0.7810
【精准率】 训练集 0.6443 测试集 0.5699
【召回率】 训练集 0.5120 测试集 0.4789
【F1-Score】 训练集 0.5706 测试集 0.5205
【auc值】 训练集 0.8191 测试集 0.8046
【ROC曲线】
#基准模型:xgb
sclf7=StackingClassifier(classifiers=[LR, svm_linear, svm_poly, svm_rbf, svm_sigmoid, DT, xgb],meta_classifier=xgb,use_probas=True,average_probas=True)
sclf7.fit(X_train, Y_train)
model_metrics(sclf7, X_train, X_test, Y_train, Y_test)
drawROC(sclf7,X_test, Y_test,‘Stacking_xgb’)
【准确率】 训练集 0.8051 测试集 0.7810
【精准率】 训练集 0.6443 测试集 0.5699
【召回率】 训练集 0.5120 测试集 0.4789
【F1-Score】 训练集 0.5706 测试集 0.5205
【auc值】 训练集 0.8149 测试集 0.8052
【ROC曲线】
基准模型 结果(auc值)
LogistRegression 训练集 0.8127 测试集 0.8078
SVM_linear 训练集 0.8127 测试集 0.8078
SVM_poly 训练集 0.7867 测试集 0.7826
SVM_rbf 训练集 0.7762 测试集 0.7675
SVM_sigmoid 训练集 0.8127 测试集 0.8078
DecisonTree 训练集 0.8191 测试集 0.8046
XGBoost 训练集 0.8149 测试集 0.8052