(1)读入aviation数据集,设置MEMBER_NO为索引列;(4分)
(2)剔除重复值、缺失值。(4分)
(3)随机抽取500样本,切片特征X和标签Y;(4分) 因为调参很慢,所以这里的操作是想在小数据集上调参
(4)使用交叉验证方法(10折)
比较逻辑回归、决策树算法性能差异,评估指标用F1分数(5分)
(5)使用网格搜索对上题中F1分数较高的算法进行超参数调优。(4分)
(6)使用4、5中确定的最优算法和最优参数建立模型。(4分)
(7)按照6:4划分整个数据集(样本总体)。(4分)
(8)使用训练集数据进行模型训练,对测试集数据进行预测,打印混淆矩阵。(4分)
(9)打印精确率、召回率、F1分数和AUC值、画出ROC曲线。(5分)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体和负号正确显示
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
# 数据切分器
from sklearn.model_selection import train_test_split
# 决策树分类器
from sklearn.tree import DecisionTreeClassifier
# 逻辑回归分类器
from sklearn.linear_model import LogisticRegression
# 交叉验证评估器
from sklearn.model_selection import cross_val_score
# 表格查找最优模型器
from sklearn.model_selection import GridSearchCV
# 模型评估指标
from sklearn.metrics import f1_score,classification_report,confusion_matrix
# 模型评估指标
from sklearn.metrics import precision_score,recall_score,roc_auc_score,roc_curve
# 忽略多余的警告
import warnings
warnings.filterwarnings('ignore')
# (1)读入aviation数据集,设置MEMBER_NO为索引列;(4分)
data=pd.read_excel("../datas/aviation.xls",index_col="MEMBER_NO")
# (2)剔除重复值、缺失值。(4分)
data.drop_duplicates(inplace=True)
data.dropna(inplace=True)
# (3)随机抽取500样本,切片特征X和标签Y;(4分) 因为调参很慢,所以这里的操作是想在小数据集上调参
data=data.sample(500)
X=data.iloc[:,:-1]
Y=data.iloc[:,-1]
# (4)使用交叉验证方法(10折)
# 比较逻辑回归、决策树算法性能差异,评估指标用F1分数(5分)
Log=LogisticRegression()
DT=DecisionTreeClassifier()
model1=cross_val_score(Log,X,Y,scoring="f1",cv=10)
model2=cross_val_score(DT,X,Y,scoring="f1",cv=10)
print('model1:\n',np.mean(model1))
print('model2:\n',np.mean(model2))
# (5)使用网格搜索对上题中F1分数较高的算法进行超参数调优。(4分)
param1={
"C":[0.1,1,10,100,200],
"max_iter":[1,10,50,100,200]
}
# 表格选择器对逻辑回归模型选择最优参数
searchmodel1=GridSearchCV(Log,param_grid=param1,cv=2).fit(X,Y)
print(searchmodel1.best_params_)
print(searchmodel1.best_score_*100,"%")
param2={
"max_depth":[0.1,1,10,50,100],
"min_samples_leaf":[1,10,50,100,200]
}
# 表格选择器对决策树模型选择最优参数
searchmodel2=GridSearchCV(DT,param_grid=param2).fit(X,Y)
print(searchmodel2.best_params_)
print(searchmodel2.best_score_*100,"%")
# (6)使用4、5中确定的最优算法和最优参数建立模型。(4分)
model=LogisticRegression(C=searchmodel1.best_params_.get("C"),max_iter=100)
# (7)按照6:4划分整个数据集(样本总体)。(4分)
X_train,X_test,Y_train,Y_test=train_test_split(X,Y,test_size=0.4,random_state=3)
# (8)使用训练集数据进行模型训练,对测试集数据进行预测,打印混淆矩阵。(4分)
model.fit(X_train,Y_train)
pred=model.predict(X_test)
preds=model.predict_proba(X_test)
print("混淆矩阵:\n",confusion_matrix(Y_test,pred))
# (9)打印精确率、召回率、F1分数和AUC值、画出ROC曲线。(5分)
print("精确率:%.2f"%(precision_score(Y_test,pred)*100),"%")
print("召回率:%.2f"%(recall_score(Y_test,pred)*100),"%")
print("F1-Score:%.2f"%(f1_score(Y_test,pred)*100),"%")
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()