一、前期准备
# %matplotlib inline这一句是IPython的魔法函数,可以在IPython编译器里直接使用,作用是内嵌画图,省略掉plt.show()这一步,直接显示图像。 #如果不加这一句的话,我们在画图结束之后需要加上plt.show()才可以显示图像。 %matplotlib inline import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from IPython.display import Image from sklearn.model_selection import train_test_split plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 plt.rcParams['figure.figsize'] = (10, 6) # 设置输出图片大小
1.1 加载数据并分割数据集
from sklearn.model_selection import train_test_split # 一般先取出X和y后再切割,有些情况会使用到未切割的,这时候X和y就可以用,x是清洗好的数据,y是我们要预测的存活数据'Survived' data = pd.read_csv('clear_data.csv') train = pd.read_csv('train.csv') X = data y = train['Survived'] # 对数据集进行切割 X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0) # 默认参数逻辑回归模型 lr = LogisticRegression() lr.fit(X_train, y_train)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, l1_ratio=None, max_iter=100, multi_class='auto', n_jobs=None, penalty='l2', random_state=None, solver='lbfgs', tol=0.0001, verbose=0, warm_start=False)
二、模型评估
模型评估是为了知道模型的泛化能力。
交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。
在交叉验证中,数据被多次划分,并且需要训练多个模型。
最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。
准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例
召回率(recall)度量的是正类样本中有多少被预测为正类
f-分数是准确率与召回率的调和平均
2.1 交叉验证
- 用10折交叉验证来评估之前的逻辑回归模型
- 计算交叉验证精度的平均值
#提示:交叉验证 Image('Snipaste_2020-01-05_16-37-56.png') # i=Image.open('Snipaste_2020-01-05_16-37-56.png') # plt.figure("dd") # plt.imshow(i) # plt.show()
提示:
- 交叉验证在sklearn中的模块为
sklearn.model_selection
from sklearn.model_selection import cross_val_score lr = LogisticRegression(C=100) # k折交叉验证分数 scores = cross_val_score(lr, X_train, y_train, cv=10) print(scores) """ array([0.85074627, 0.74626866, 0.74626866, 0.80597015, 0.88059701, 0.8358209 , 0.76119403, 0.8358209 , 0.74242424, 0.75757576]) """ # 平均交叉验证分数 print("Average cross-validation score: {:.2f}".format(scores.mean())) # Average cross-validation score: 0.80
思考:k折越多的情况下会带来什么样的影响?
答:K折越多,单次训练验证时,用作训练集的数据就会越多,而用作验证集的数据越少。这样平均的结果会更加可靠,但是所耗费的总时间也会增多。(用大量数据换取结果的可靠,时间增加。)
2.2 混淆矩阵
计算二分类问题的混淆矩阵
计算精确率、召回率以及f-分数
混淆矩阵:又称为可能性表格或是错误矩阵。它是一种特定的矩阵用来呈现算法性能的可视化效果,通常是监督学习(非监督学习,通常用匹配矩阵:matching matrix)。其每一列代表预测值,每一行代表的是实际的类别。这个名字来源于它可以非常容易的表明多个类别是否有混淆(也就是一个class被预测成另一个class)。
提示:
- 混淆矩阵的方法在sklearn中的
sklearn.metrics
模块 - 混淆矩阵需要输入真实标签和预测标签
- 精确率、召回率以及f-分数可使用
classification_report
模块
from sklearn.metrics import confusion_matrix # 训练模型 lr = LogisticRegression(C=100) lr.fit(X_train, y_train) # 模型预测结果 pred = lr.predict(X_train) # 混淆矩阵 confusion_matrix(y_train, pred) """ array([[354, 58], [ 83, 173]]) """ from sklearn.metrics import classification_report # 精确率、召回率以及f1-score print(classification_report(y_train, pred))
precision recall f1-score support 0 0.81 0.86 0.83 412 1 0.75 0.68 0.71 256 accuracy 0.79 668 macro avg 0.78 0.77 0.77 668 weighted avg 0.79 0.79 0.79 668
2.3 ROC曲线
提示:
- ROC曲线在sklearn中的模块为
sklearn.metrics
- ROC曲线下面所包围的面积越大越好
from sklearn.metrics import roc_curve # ROC曲线下面所包围的面积越大越好 fpr, tpr, thresholds = roc_curve(y_test, lr.decision_function(X_test)) plt.plot(fpr, tpr, label="ROC Curve") plt.xlabel("FPR") plt.ylabel("TPR (recall)") # 找到最接近于0的阈值 close_zero = np.argmin(np.abs(thresholds)) plt.plot(fpr[close_zero], tpr[close_zero], 'o', markersize=10, label="threshold zero", fillstyle="none", c='k', mew=2) plt.legend(loc=4) plt.show()