本期学习链接为https://github.com/datawhalechina/hands-on-data-analysis
第三章 模型搭建和评估--建模
经过前面的两章的知识点的学习,我可以对数数据的本身进行处理,比如数据本身的增删查补,还可以做必要的清洗工作。那么下面我们就要开始使用我们前面处理好的数据了。这一章我们要做的就是使用数据,我们做数据分析的目的也就是,运用我们的数据以及结合我的业务来得到某些我们需要知道的结果。那么分析的第一步就是建模,搭建一个预测模型或者其他模型;我们从这个模型的到结果之后,我们要分析我的模型是不是足够的可靠,那我就需要评估这个模型。今天我们学习建模,下一节我们学习评估。
1首先导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image
前几节基本上了解了pandas和numpy包
现在查询一下matplotlib.pyplot
相关百度链接为;https://blog.csdn.net/feng98ren/article/details/79392747
载入库
载入我们提供清洗之后的数据(clear_data.csv),大家也将原始数据载入(train.csv),说说他们有什么不同**
清洗后的数据看起来更简洁明了。大多是数字
模型搭建
* 处理完前面的数据我们就得到建模数据,下一步是选择合适模型
* 在进行模型选择之前我们需要先知道数据集最终是进行**监督学习**还是**无监督学习**
* 模型的选择一方面是通过我们的任务来决定的。
* 除了根据我们任务来选择模型外,还可以根据数据样本量以及特征的稀疏性来决定
* 刚开始我们总是先尝试使用一个基本的模型来作为其baseline,进而再训练其他模型做对比,最终选择泛化能力或性能比较好的模型
这里我的建模,并不是从零开始,自己一个人完成完成所有代码的编译。我们这里使用一个机器学习最常用的一个库(sklearn)来完成我们的模型的搭建
关于库(sklearn)的介绍;
https://zhuanlan.zhihu.com/p/33420189
任务一:切割训练集和测试集
这里使用留出法划分数据集
* 将数据集分为自变量和因变量
* 按比例切割训练集和测试集(一般测试集的比例有30%、25%、20%、15%和10%)
* 使用分层抽样
* 设置随机种子以便结果能复现
先取出来X和Y
然后在进行切割‘
#### 任务二:模型创建
* 创建基于线性模型的分类模型(逻辑回归)
* 创建基于树的分类模型(决策树、随机森林)
* 分别使用这些模型进行训练,分别的到训练集和测试集的得分
* 查看模型的参数,并更改参数值,观察模型变化
#### 提示2
* 逻辑回归不是回归模型而是分类模型,不要与`LinearRegression`混淆
* 随机森林其实是决策树集成为了降低决策树过拟合的情况
* 线性模型所在的模块为`sklearn.linear_model`
* 树模型所在的模块为`sklearn.ensemble`
【思考】
* 为什么线性模型可以进行分类任务,背后是怎么的数学关系
* 对于多分类问题,线性模型是怎么进行分类的
分别给不同函数结果进行分类。通常预测的规则都是通用的
多分类的问题常常是使用差分策略,通过二分类学习来解决多分类问题,即将多分类问题拆解为多个二分类训练二分类学习器最后通过继承得到结果,最经典拆分策略有三种:“一对一”(OvO)、“一对其余”(OvR)和“多对多”(MvM)。
#### 任务三:输出模型预测结果
* 输出模型预测分类标签
* 输出不同分类标签的预测概率
#### 提示3
* 一般监督模型在sklearn里面有个`predict`能输出预测标签,`predict_proba`则可以输出标签概率
【思考】
* 预测标签的概率对我们有什么帮助
可以让我们大致知道输出的结果,而且也可以根据这个来进行调整
#### 任务一:交叉验证
* 用10折交叉验证来评估之前的逻辑回归模型
* 计算交叉验证精度的平均值
交叉验证
#### 提示4
* 交叉验证在sklearn中的模块为`sklearn.model_selection`
k折交叉验证分数
平均交叉验证分数
#### 思考4
* k折越多的情况下会带来什么样的影响?
数量有限
#### 任务二:混淆矩阵
* 计算二分类问题的混淆矩阵
* 计算精确率、召回率以及f-分数
混淆矩阵
准确率 (Accuracy),精确度(Precision),Recall,f-分数计算方法
#### 提示5
* 混淆矩阵的方法在sklearn中的`sklearn.metrics`模块
* 混淆矩阵需要输入真实标签和预测标签
* 精确率、召回率以及f-分数可使用`classification_report`模块
【思考】
* 如果自己实现混淆矩阵的时候该注意什么问题
要确定自己的矩阵有意义
#### 任务三:ROC曲线
* 绘制ROC曲线
【思考】什么是OCR曲线,OCR曲线的存在是为了解决什么问题?
ROC的全名叫做Receiver Operating Characteristic,中文名字叫“受试者工作特征曲线”,其主要分析工具是一个画在二维平面上的曲线——ROC 曲线。
平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)。对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。这样,此分类器就可以映射成ROC平面上的一个点。顾名思义,AUC的值就是处于ROC 曲线下方的那部分面积的大小。通常,AUC的值介于0.5到1.0之间,较大的AUC代表了较好的性能。AUC(Area Under roc Curve)是一种用来度量分类模型好坏的一个标准。
#### 提示6
* ROC曲线在sklearn中的模块为`sklearn.metrics`
* ROC曲线下面所包围的面积越大越好
#### 思考6
* 对于多分类问题如何绘制ROC曲线
假设测试样本个数为m,类别个数为n。在训练完成后,计算出每个测试样本的在各类别下的概率或置信度,得到一个[m, n]形状的矩阵P,每一行表示一个测试样本在各类别下概率值(按类别标签排序)。相应地,将每个测试样本的标签转换为类似二进制的形式,每个位置用来标记是否属于对应的类别(也按标签排序,这样才和前面对应),由此也可以获得一个[m, n]的标签矩阵L。
①方法一:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每一列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从而绘制出一条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n条ROC曲线取平均,即可得到最终的ROC曲线。
②方法二:
首先,对于一个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应二分类问题中的‘’正’’),0就表示其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是大于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分别按行展开,转置后形成两列,这就得到了一个二分类的结果。所以,此方法经过计算后可以直接得到最终的ROC曲线。
【思考】你能从这条OCR曲线的到什么信息?这些信息可以做什么?
比较优秀