网格搜索5折交叉验证对模型进行调参。大部分时间都在等待,就调的比较简单。
1.数据37分
from sklearn.model_selection import GridSearchCV, KFold, train_test_split
import pandas as pd
import numpy as np
from sklearn.metrics import precision_score,roc_auc_score
from sklearn.metrics import accuracy_score,make_scorer
from sklearn.metrics import precision_score#这个就可以用评分函数了
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
from sklearn.metrics import roc_curve, auc
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
data_all=pd.read_csv(r'C:\Users\lxy\Desktop\input\data_all.csv')
from sklearn.model_selection import train_test_split
features=[x for x in data_all.columns if x not in ['status']]
x=data_all[features]
y=data_all['status']
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=2018)
scaler = StandardScaler()
scaler.fit(x_train)
x_train= scaler.transform(x_train)
x_test= scaler.transform(x_test)
2.交叉验证函数
评价函数用了精确度和AUC
def gridsearch_vail(model,parameters):
scoring_fnc=make_scorer(accuracy_score)
grid=GridSearchCV(model,parameters,scoring_fnc,cv=5)
grid=grid.fit(x_train,y_train)
if hasattr(model,'decision_function'):
pre_test=grid.decision_function(x_test)
else:
pre_test=grid.predict_proba(x_test)[:,1]
print('best score: %f'%grid.best_score_)
print(grid.best_params_)
print('test score: %f'%grid.score(x_test, y_test))
print("AUC",roc_auc_score(y_test,pre_test))
3.逻辑回归
C:一个浮点数,它指定了惩罚系数的倒数。如果它的值越小,则正则化越大。
penalty: 一个字符串,制定了正则化策略
from sklearn.linear_model import LogisticRegression
parameters = {'C':[0.1,1,5],'penalty':['l1','l2']}
lr = LogisticRegression(random_state=2018)
gridsearch_vail(lr,parameters)
best score: 0.792907
{'C': 0.1, 'penalty': 'l1'}
test score: 0.782761
AUC 0.779722596058548
对比:精确度上升了0.004,AUC上升了0.014左右
4.svm
C:一个浮点数,它指定了惩罚系数的倒数。如果它的值越小,则正则化越大。
tol:阀值,收敛到什么的时候停止
from sklearn.svm import LinearSVC
svm=LinearSVC(random_state=2018)
parameters={'tol':[1e-3,1e-4,1e-5,1e-6],'C':[0.1,1,5]}
gridsearch_vail(svm,parameters)
best score: 0.789300
{'tol': 0.001}
test score: 0.781359
AUC 0.7677954784931093
最先还调了C值然后发现模型score上升但是AUC下降了,感觉过拟合了。然后就只调了tol。最后AUC上升了
5.决策树
max_depth(树的深度)。 树越深,它就分裂的越多,更能捕获有关数据的信息,主要是为了降低过拟合,
max_features表示查找最佳拆分时要考虑的要最大特征数量。控制树的生成时间
criterion:gini就是基尼系数,entropy就是信息增益
因为数据量不大,我就没用min_samples_spilt
from sklearn.tree import DecisionTreeClassifier
tree=DecisionTreeClassifier(random_state=2018)
parameters={'max_depth':range(1,100),'criterion':['gini','entropy'],'max_features':['sqrt','log2','auto']}
gridsearch_vail(tree,parameters)
best score: 0.764653
{'criterion': 'gini', 'max_depth': 3, 'max_features': 'log2'}
test score: 0.749124
AUC 0.701477783689608
调参后决策树没有过拟合了,score降了很多。AUC直接上升了1.2左右
6.随机森林
max_depth。树的深度,用于控制过拟合
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=500,oob_score=True, random_state=2018)
parameters = {'max_depth': range(1, 6)}
gridsearch_vail(rf,parameters)
best score: 0.787797
{'max_depth': 5}
test score: 0.779958
AUC 0.7670208548506567
调的比较简单,AUC就只上升了0.006左右
7.GBDT
n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑
max_feature最大特征数
from sklearn.ensemble import GradientBoostingClassifier
gbdt=GradientBoostingClassifier(random_state=2018)
parameters={'n_estimators':range(30,80,10),'max_depth':range(3,10),'max_features':range(7,20,2)}
gridsearch_vail(gbdt,parameters)
best score: 0.795912
{'max_features': 15}
test score: 0.782761
AUC 0.7741059226106641
这里我是分开跑得,先跑出了max_depth为3,然后跑出了n_estimators为50,最后跑出了max_features=15.然后AUC涨了0.01
8.xgboost
我直接以树模型为基础做的
max_depth。树的深度,用于控制过拟合
eta类似于GBM的学习速率,通过缩小每一步的权重,使模型变得更好
min-child-weight用于控制过度学习,较高的值阻止了模型的学习关系,可能是特定于某棵树的特定样本的关系
subsample和GBM的子样本相同,表示每棵树随机样本的分数,较低的值可以使得算法更加保守,避免过拟合,但是太小的值会导致模型不合适
gamma在损失函数中,只有当分裂次数减少中,一个节点才会被分裂。gamma参数确定了进分拆分或分裂时,所需最小的损失减少
from xgboost.sklearn import XGBClassifier
xgbc = XGBClassifier(random_state=2018,lamba=2,silent=1,subsample=0.6,max_depth=3)
parameter={'eta':np.arange(0.1,0.4,0.1),'min_child_weight':range(1,6,2),'gamma':[0.1,0.2]}
gridsearch_vail(xgbc,parameter)
best score: 0.793207
{'gamma': 0.1}
test score: 0.779958
AUC 0.7780664141967388
max_depth因为前面几个模型都跑的3就直接设置了,其他参数都是分开跑的.eta跑的是0.1,然后min_child_weight跑的是0.1。最后gamma跑的是.AUC上升了0.007.可能是因为我参数选的不够多吧,后面我还会弥补下
9.lightgbm
max_depth。树的深度,用于控制过拟合
learning_rate学习率,这个大家都懂。关于收敛速度和准确度
n_estimators=10: 拟合的树的棵树,相当于训练轮数
criterion:gini就是基尼系数,entropy就是信息增益
import lightgbm as lgb
lgb_model = lgb.LGBMClassifier(boosting_type='GBDT',random_state=2018,silent=0)
parameters={'max_depth':range(3,10),'n_estimators=10':[25,30,35],'criterion':("gini", "entropy"),'learning_rate':np.arange(0.1,0.4,0.1)}
gridsearch_vail(lgb_model,parameters)
best score: 0.793508
{'criterion': 'gini', 'learning_rate': 0.1, 'max_depth': 3, 'n_estimators=10': 25}
test score: 0.787666
AUC 0.7689117711495728
AUC上升了0.01算是比较大的增长了
总结:
调参的时候其实可以参数一个一个调,这样会比放在这一起快很多,xgboost和GBDT原先我是放在一起跑实在跑不动就分开了,至于效果差异我就不知道了。但是分开跑也要注意跑的顺序。但是我人懒就直接放进去跑了,还有决策树这玩意儿不调参过拟合太严重。对于简单的二分类。lr的效果确实还不错。

本文详细介绍了使用网格搜索和5折交叉验证进行模型调参的过程,涵盖了逻辑回归、SVM、决策树、随机森林、GBDT、XGBoost和LightGBM等算法,对比了调参前后的精确度和AUC变化。
353

被折叠的 条评论
为什么被折叠?



