模型参数优化
使用网格搜索法对模型进行调优(调参时采用五折交叉验证的方式),并进行模型评估
网格搜索
网格搜索,其实可以叫穷举搜索,就是在所有候选的参数中,将不同参数组合起来,找出表现最好的一组参数。
eg:以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫网格搜索
五折交叉验证
五折交叉验证,不是打五折的意思。而是将训练模型的数据分为五份,并取第五份作为验证集,剩下的作为训练集。最后,用五分数据跑模型,得到的分数求平均值。用交叉验证的目的是为了得到可靠稳定的模型。
各类模型优化结果
逻辑回归模型
clf = LogisticRegression(C=0.1, penalty='l1')
model = clf.fit(X_train, y_train)
# 参数说明。C表示逻辑回归模型中从参数C,分别取如下数组中的值,penalty同理,分别可以取l1和l2
params = {'C': [0.01, 0.1, 0.5, 1], 'penalty': ['l1', 'l2']}
# 使用网格搜索法,对模型进行调优,准确度评估采用roc_auc值
grid_search = GridSearchCV(model, param_grid=params, scoring='roc_auc', cv=5)
grid_search.fit(X_train, y_train)
print("最优化参数组合:", grid_search.best_params_)
结果:
优化后模型的分数评估
最优化参数组合: {‘penalty’: ‘l1’, ‘C’: 0.1}
accuracy:
训练集: 0.7959
测试集: 0.8059
precision:
训练集: 0.7158
测试集: 0.7436
recall:
训练集: 0.3179
测试集: 0.3286
F1-score:
训练集: 0.4402
测试集: 0.4558
AUC:
训练集: 0.8011
测试集: 0.8013
SVM模型
代码实现:
# 使用svm模型
clf = SVC(C=0.01, kernel='linear', probability=True)
model = clf.fit(X_train, y_train)
params = {'C': [0.01, 0.1, 0.5, 1, 10], 'kernel': ['linear', 'poly', 'rbf', 'sigmoid']}
# 使用网格搜索法,对模型进行调优,准确度评估采用roc_auc值
grid_search = GridSearchCV(model, param_grid=params, scoring='roc_auc', cv=5)
grid_search.fit(X_train, y_train)
注:在对SVM模型进行参数优化,当params中的kernel包含’precomputed’时,程序运行异常:X should be a square kernel matrix。原因是kernel='precomputed’时,传入的矩阵不是普通的数据矩阵,而是表示样本成对相似性的数据矩阵。参考链接:原址
运行结果:
优化后模型的分数评估
最优化参数组合: {‘C’: 0.01, ‘kernel’: ‘linear’}
accuracy:
训练集: 0.7860
测试集: 0.7912
precision:
训练集: 0.7783
测试集: 0.8022
recall:
训练集: 0.2131
测试集: 0.2068
F1-score:
训练集: 0.3346
测试集: 0.3288
AUC:
训练集: 0.8032
测试集: 0.8127
决策树模型
# 决策树
clf = DecisionTreeClassifier(max_depth=5)
model = clf.fit(X_train, y_train.values)
# 由于参数过多,导致网格搜索优化运行很久,因此,决策树模型暂时只加了一个参数
params = {'max_depth': [5, 10, 50]}
# 使用网格搜索法,对模型进行调优,准确度评估采用roc_auc值
grid_search = GridSearchCV(model, param_grid=params, scoring='roc_auc', cv=5)
grid_search.fit(X_train, y_train)
print('\n优化后模型的分数评估')
结果:
优化后模型的分数评估
最优化参数组合: {‘max_depth’: 5}
accuracy:
训练集: 0.8058
测试集: 0.7624
precision:
训练集: 0.7310
测试集: 0.5455
recall:
训练集: 0.3655
测试集: 0.2380
F1-score:
训练集: 0.4873
测试集: 0.3314
AUC:
训练集: 0.8005
测试集: 0.7328
随机森林
代码
clf = RandomForestClassifier(oob_score=True, n_estimators=10)
model = clf.fit(X_train, y_train.values)
params = {'oob_score': [True, False], 'n_estimators': [10, 50, 200, 500]}
grid_search = GridSearchCV(model, param_grid=params, scoring='roc_auc', cv=5)
grid_search.fit(X_train, y_train)
print('\n优化后模型的分数评估')
结果:
优化后模型的分数评估
最优化参数组合: {‘n_estimators’: 500, ‘oob_score’: False}
accuracy:
训练集: 1.0000
测试集: 0.8003
precision:
训练集: 1.0000
测试集: 0.7698
recall:
训练集: 1.0000
测试集: 0.2748
F1-score:
训练集: 1.0000
测试集: 0.4050
AUC:
训练集: 1.0000
测试集: 0.7792
总结
准备对比下优化前的模型参数,看看效果
注:XGBClassifier模型没跑起来,报错了,填坑中…