第三章 模型搭建和评估-评估
根据之前的模型的建模,我们知道如何运用sklearn这个库来完成建模,以及我们知道了的数据集的划分等等操作。那么一个模型我们怎么知道它好不好用呢?以至于我们能不能放心的使用模型给我的结果呢?那么今天的学习的评估,就会很有帮助。
加载下面的库
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from IPython.display import Image
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6) # 设置输出图片大小
任务:加载数据并分割测试集和训练集
#写入代码
clear_data = pd.read_csv('clear_data.csv')
train = pd.read_csv('train.csv')
#写入代码
clear_data
### 模型评估
#写入代码
train
- 模型评估是为了知道模型的泛化能力。
- 交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。
- 在交叉验证中,数据被多次划分,并且需要训练多个模型。
- 最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。
- 准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例
- 召回率(recall)度量的是正类样本中有多少被预测为正类
- f-分数是准确率与召回率的调和平均
【思考】:将上面的概念进一步的理解,大家可以做一下总结
思考回答:
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import train_test_split
任务一:交叉验证
- 用10折交叉验证来评估之前的逻辑回归模型
- 计算交叉验证精度的平均值
提示:交叉验证
提示4
- 交叉验证在sklearn中的模块为
sklearn.model_selection
#写入代码
x = clear_data # 自变量
y = train['Survived'] # 因变量
x_train, x_test, y_train, y_test = train_test_split(x, y, stratify=y, random_state=0)
lr = LogisticRegression(C=100)
#写入代码
scores = cross_val_score(lr, x_train, y_train, cv=10)
scores
#写入代码
# 平均交叉验证分数
print('Average cross-validation score ' + str(scores.mean()))
思考4
- k折越多的情况下会带来什么样的影响?
思考回答
一般而言,k折越多,评价结果的稳定性和保真性越高,不过整个计算复杂度越高。一种特殊的情况是k=m,m为数据集样本格式,这种特里成为留一法,结果往往比较准确
任务二:混淆矩阵
- 计算二分类问题的混淆矩阵
- 计算精确率、召回率以及f-分数
【思考】什么是二分类问题的混淆矩阵,理解这个概念,知道它主要是运算到什么任务中的
思考回答
混淆矩阵是一个二维方阵,它主要用于评估二分类问题的好坏
提示:混淆矩阵
提示:准确率 (Accuracy),精确度(Precision),Recall,f-分数计算方法
提示5
- 混淆矩阵的方法在sklearn中的
sklearn.metrics
模块 - 混淆矩阵需要输入真实标签和预测标签
- 精确率、召回率以及f-分数可使用
classification_report
模块
#写入代码
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
#写入代码
lr = LogisticRegression(C=100)
lr.fit(x_train, y_train)
#写入代码
pred = lr.predict(x_train)
confusion_matrix(y_train, pred)
#写入代码
print(confusion_matrix(y_train, pred))
【思考】
- 如果自己实现混淆矩阵的时候该注意什么问题
思考回答
不要混淆
任务三:ROC曲线
- 绘制ROC曲线
【思考】什么是ROC曲线,ROC曲线的存在是为了解决什么问题?
思考
ROC曲线描述的是分类器性能随着分类器阈值的变化而变化的过程。对于ROC曲线,一个重要的特征是它的面积,面积为0.5为随机分类,识别能力为0,面积越接近于1识别能力越强
提示6
- ROC曲线在sklearn中的模块为
sklearn.metrics
- ROC曲线下面所包围的面积越大越好
#写入代码
from sklearn.metrics import roc_curve
#写入代码
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)
思考6
- 对于多分类问题如何绘制ROC曲线
思考回答
# 多分类的ROC曲线的画法其实就是画出各个类别的ROC曲线,然后进行平均