机器学习——网格搜索

网格搜索特点

网格搜索类似于穷举法,来确定模型参数的一个最优的组合,但相应的会大量的增加计算时间,但精确率等指标会很高

代码如下

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score, GridSearchCV, train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score, roc_auc_score, roc_curve

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 读取数据并设置MEMBER_NO为索引列
data = pd.read_excel('../../datas/aviation.xls', index_col='MEMBER_NO')
# 处理数据(去重,删除空值)
data.drop_duplicates(inplace=True)
data.dropna(inplace=True)
# 抽取500个样本,并切出XY
data = data.sample(500)
X = data.iloc[:, :-1]
Y = data.iloc[:, -1]
# 使用交叉验证方法
# 比较逻辑回归、决策树的性能并用f1指标验证
# 逻辑回归
Log = LogisticRegression()
# 决策树
Dc = DecisionTreeClassifier()

Logmodel = cross_val_score(Log, X, Y, scoring='f1', cv=2)
print(Logmodel)
Dcmodel = cross_val_score(Dc, X, Y, scoring='f1', cv=2)
print(Dcmodel)
# # 使用网格搜索对上题中f1分数较高的算法进行超参数调优
param1 = {
    'C': [0.1, 1, 10, 100, 200],
    'max_iter': [1, 10, 50, 100, 200]
}

g_log = GridSearchCV(Log, param_grid=param1, cv=2).fit(X, Y)
print('最优组合:', g_log.best_params_)
print('最优精确率:', g_log.best_score_ * 100, '%')

param2 = {
    'max_depth': [0.1, 1, 10, 100, 200],
    'min_samples_leaf': [1, 10, 50, 100, 200]
}

g_dc = GridSearchCV(Dc, param_grid=param2, cv=2).fit(X, Y)
print('最优组合:', g_dc.best_params_)
print('最优精确率:', g_dc.best_score_ * 100, '%')

# 使用上面确定的最优算法和最优参数建立模型
model = LogisticRegression(C=g_log.best_params_.get('C'), max_iter=100)

# 按照6:4切割数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.4, random_state=2)
# 使用训练集训练模型,对测试集数据进行预测,打印混淆矩阵
model.fit(X_train, Y_train)
pred = model.predict(X_test)
preds = model.predict_proba(X_test)

print('混淆矩阵:\n', confusion_matrix(Y_test, pred))
print('精确率:', precision_score(Y_test, pred))
print('召回率:', recall_score(Y_test, pred))
print('f1_score:\n', f1_score(Y_test, pred))

# 打印AUC值,画出ROC曲线
print('AUC:%.2f' %(roc_auc_score(Y_test, preds[:, -1]) * 100), "%")
TPR, FPR, TH = roc_curve(Y_test, preds[:, -1])
plt.title('ROC曲线')
plt.plot(TPR, FPR)
plt.xlabel("FPR")
plt.ylabel("TPR")
plt.show()

效果展示

[ 0.95431472  0.94581281]
[ 0.91457286  0.94059406]
最优组合: {'C': 0.1, 'max_iter': 100}
最优精确率: 96.8 %
最优组合: {'max_depth': 200, 'min_samples_leaf': 10}
最优精确率: 93.4 %
混淆矩阵:
 [[112   4]
 [  2  82]]
精确率: 0.953488372093
召回率: 0.97619047619
f1_score:
 0.964705882353
AUC:99.77 %

机器学习——网格搜索_第1张图片

你可能感兴趣的:(机器学习,机器学习,网格搜素,交叉验证,逻辑回归,决策树)