动手学数据分析 -- Task03-评估

第三章 模型搭建和评估-评估

根据之前的模型的建模,我们知道如何运用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曲线,然后进行平均

posted @ 2023-01-31 22:15  HoroSherry  阅读(23)  评论(0编辑  收藏  举报