DW动手学数据分析Task5:数据建模及模型评估

news2024/12/23 14:54:40

目录

  • 1 建模
    • 1.1 数据分析流程
    • 1.2 模型搭建准备工作
      • 1.2.1 导入库
      • 1.2.2 载入数据
    • 1.3 模型搭建
      • 1.3.1 选择模型
      • 1.3.2 切割训练集和测试集
      • 1.3.3 模型创建
      • 1.3.4 输出模型预测结果
  • 2 评估
    • 2.1 评估的准备工作
    • 2.2 模型评估
      • 2.2.1 交叉验证
      • 2.2.2 混淆矩阵
      • 2.2.3 ROC曲线

1 建模

1.1 数据分析流程

  • 数据分析:运用数据结合业务,以此得到我们需要知道的结论
  • 整个项目完成的流程:
    • 首先对数据的本身进行处理,比如数据本身的增删查补,
    • 然后可以做必要的清洗工作,处理好数据
    • 其次使用数据建模,搭建一个预测模型或者其他模型
    • 最后从模型得到结果以后,要分析模型是不是足够的可靠,就需要评估这个模型

1.2 模型搭建准备工作

1.2.1 导入库

- `numpy`:支持大量的维度**数组与矩阵**运算,此外也针对数组运算提供大量的数学函数库。
- `pandas`:用于数据操纵和分析,建立在Numpy之上的,Pandas为Python带来了两种新的数据结构:`Pandas Series`和`Pandas DataFrame`,借助这两种数据结构,我们能够轻松直观地处理**带标签**数据和**关系**数据。
- `matplotlib.pyplot`:是一个用来绘图的python库,它的`matplotlib.pyplot`模块提供了一个与MATLAB非常类似的绘图系统
- `seaborn`:是python中的一个非常强大的数据可视化库,`seaborn`就是在`matplotlib`基础上进行更高级的API封装,使绘图更加容易。是针对统计绘图的,能满足数据分析90%的绘图需求
- `IPython.display `:·ipython·是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能和函数。
	```py
	import pandas as pd
	import numpy as np
	import matplotlib.pyplot as plt
	import seaborn as sns
	from IPython.display import Image
	```
- `%matplotlib inline`:`%matplotlib`命令可以将`matplotlib`的图表直接嵌入到Notebook之中,或者使用指定的界面库显示图表,它有一个参数指定`matplotlib`图表的显示方式。`inline`表示将图表嵌入到Notebook中。
	```py
	%matplotlib inline 
	```
	```py
	plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
	plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
	plt.rcParams['figure.figsize'] = (10, 6)  # 设置输出图片大小
	```

1.2.2 载入数据

  • 载入原始数据

    # 读取原数据数集
    train = pd.read_csv('train.csv')
    train.shape
    # (891, 12)
    
    train.head()
    

    在这里插入图片描述

  • 载入清洗后的数据

    #读取清洗过的数据集
    data = pd.read_csv('clear_data.csv')
    
    data.head()
    

    在这里插入图片描述

    思考:原始数据和清洗后数据的不同:清洗后的数据全部变为数字形式来表示

1.3 模型搭建

1.3.1 选择模型

  • 处理完数据后要选择模型:

    • 首先在进行模型选择之前,需要知道数据集最终是进行监督学习还是无监督学习
    • 模型的选择一方面是通过我们的任务来决定的
    • 另一方面是根据数据样本量以及特征的稀疏性来决定
    • 刚开始我们总是先尝试使用一个基本的模型来作为其baseline,进而再训练其他模型做对比,最终选择泛化能力或性能比较好的模型
  • 监督和非监督学习:

    • 监督学习:
      • 定义:根据已有的数据集,知道输入和输出结果之间的关系。根据这种已知的关系,训练得到一个最优的模型。
      • 通俗理解:可以把机器学习理解为我们机器如何做事情。
      • 分类:回归(Regression)、分类(Classification)
        • 回归:针对于连续型变量的。
          即对已经存在的点(训练数据)进行分析,拟合出适当的函数模型y=f(x),这里y就是数据的标签,而对于一个新的自变量x,通过这个函数模型得到标签y。
        • 分类:针对离散型的,输出的结果是有限的。
          要通过分析输入的特征向量,对于一个新的向量得到其标签
    • 非监督学习:
      • 定义:我们不知道数据集中数据、特征之间的关系,而是要根据聚类或一定的模型得到数据之间的关系。
      • 通俗理解:无监督学习更像是自学,让机器学会自己做事情,是没有标签(label)的。
        参考文章
  • sklearn的算法选择路径:

    • 上面的建模,并不是从零开始一个人完成完成所有代码的编译,而是使用一个机器学习最常用的一个库sklearn来完成模型的搭建
      在这里插入图片描述

1.3.2 切割训练集和测试集

  • 数据集的划分:
    • 通常将已有的数据集划分为训练集测试集两部分,训练集用来训练模型,而测试集则是用来评估模型对于新样本的判别能力
    • 数据集划分的基本条件:
      • 条件一:训练集和测试集的分布要与样本真实分布一致,即训练集和测试集都要保证是从样本真实分布中独立同分布采样而得;
      • 条件二:训练集和测试集要互斥
  • 划分数据集的方法:
    • 留出法
      • 定义:是直接将数据集 D 划分为两个互斥的集合,其中一个集合作为训练集 S,另一个作为测试集 T
      • 采样方法:为了保证数据分布的一致性,通常采用 分层采样 的方式来对数据进行采样
      • 通常选择:会将 D 中大约 2/3~4/5 的样本作为训练集,其余的作为测试集
    • 交叉验证法
      • 定义:k 折交叉验证:通常将数据集 D 分为 k 份,其中的 k-1 份作为训练集,剩余的那一份作为测试集,这样就可以获得 k 组训练/测试集,可以进行 k 次训练与测试,最终返回的是 k 个测试结果的均值。
      • 采样方法: 分层采样
      • 通常选择:对于交叉验证法,其 k 值的选取往往决定了评估结果的稳定性和保真性,通常 k 值选取 10k=1的时候,我们称之为留一法
    • 自助法
      • 定义:每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为 m 次,这样我们就可以得到大小为m的训练集,在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本作为测试集。
      • 采样方法:有放回重复采样

      总结:
      对于数据量充足的时候,通常采用 留出法 或者 k折交叉验证法 来进行训练/测试集的划分;
      对于数据集小且难以有效划分训练/测试集时使用 自助法;
      对于数据集小且可有效划分的时候最好使用 留一法 来进行划分,因为这种方法最为准确 『最常用』
      参考文章

  • 这里使用留出法划分数据集:
    • 将数据集分为自变量和因变量
    • 按比例切割训练集和测试集(一般测试集的比例有30%、25%、20%、15%和10%)
    • 使用分层抽样
    • 设置随机种子以便结果能复现
    # 调用tain_test_split模块用来分割数据
    from sklearn.model_selection import train_test_split
    
    # 一般先取出X和y后再切割,有些情况会使用到未切割的
    # 这时候X和y就可以用,x是清洗好的数据,y是我们要预测的存活数据'Survived'
    X = data
    y = train['Survived']
    
    # 对数据集进行切割
    X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
    
    # 查看数据形状
    X_train.shape, X_test.shape
    # ((668, 11), (223, 11))
    
  • train_test_split参数意义:
    • 格式:X_train,X_test, y_train, y_test =train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)
    • train_data:所要划分的样本特征集
    • train_target:所要划分的样本结果
    • test_size:样本占比,如果是整数的话就是样本的数量
    • random_state:随机数的种子,每次都填1,其他参数一样的情况下你得到的随机数组是一样的,填0或不填,每次都会不一样。
      • 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。
    • stratify:=X就是按照X中的比例分配 ,=y就是按照y中的比例分配

1.3.3 模型创建

  • 基本思路:

    • 创建基于线性模型的分类模型(逻辑回归)
    • 创建基于树的分类模型(决策树、随机森林)
    • 分别使用这些模型进行训练,分别的到训练集和测试集的得分
    • 查看模型的参数,并更改参数值,观察模型变化
  • 提醒:

    • 逻辑回归不是回归模型而是分类模型,不要与LinearRegression混淆
    • 随机森林其实是决策树集成为了降低决策树过拟合的情况
    • 线性模型所在的模块为sklearn.linear_model
    • 树模型所在的模块为sklearn.ensemble
  • 逻辑回归模型

    from sklearn.linear_model import LogisticRegression
    from sklearn.ensemble import RandomForestClassifier
    
    # 默认参数逻辑回归模型
    lr = LogisticRegression()
    lr.fit(X_train, y_train)
    
    # 查看训练集和测试集score值
    print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
    print("Testing set score: {:.2f}".format(lr.score(X_test, y_test)))
    

    在这里插入图片描述

    # 调整参数后的逻辑回归模型
    lr2 = LogisticRegression(C=100)
    lr2.fit(X_train, y_train)
    
    print("Training set score: {:.2f}".format(lr2.score(X_train, y_train)))
    print("Testing set score: {:.2f}".format(lr2.score(X_test, y_test)))
    

    在这里插入图片描述

  • 随机森林模型

    # 默认参数的随机森林分类模型
    rfc = RandomForestClassifier()
    rfc.fit(X_train, y_train)
    
    print("Training set score: {:.2f}".format(rfc.score(X_train, y_train)))
    print("Testing set score: {:.2f}".format(rfc.score(X_test, y_test)))
    

    在这里插入图片描述

    # 调整参数后的随机森林分类模型
    rfc2 = RandomForestClassifier(n_estimators=100, max_depth=5)
    rfc2.fit(X_train, y_train)
    
    print("Training set score: {:.2f}".format(rfc2.score(X_train, y_train)))
    print("Testing set score: {:.2f}".format(rfc2.score(X_test, y_test)))
    

    在这里插入图片描述

思考1:为什么线性模型可以进行分类任务,背后是怎么的数学关系

思考2:对于多分类问题,线性模型是怎么进行分类的

1.3.4 输出模型预测结果

  • 思路:
    • 输出模型预测分类标签
    • 输出不同分类标签的预测概率
  • 提示:
    • 一般监督模型在sklearn里面有个predict能输出预测标签,predict_proba则可以输出标签概率
    # 预测标签
    pred = lr.predict(X_train)
    
    # 此时我们可以看到0和1的数组
    pred[:10]
    
    在这里插入图片描述
    # 预测标签概率
    pred_proba = lr.predict_proba(X_train)
    
    pred_proba[:10]
    
    在这里插入图片描述

思考:预测标签的概率对我们有什么帮助


2 评估

2.1 评估的准备工作

  • 为什么评估:对于一个模型我们不知道好不好用,以至于不能放心使用模型得出的结果,因此要使用评估
  • 加载下面的库:
    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)  # 设置输出图片大小
    
  • 加载数据并分割测试集和训练集
    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)
    

2.2 模型评估

  • 思路:
    • 模型评估是为了知道模型的泛化能力。
    • 交叉验证(cross-validation)是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。
    • 在交叉验证中,数据被多次划分,并且需要训练多个模型。
    • 最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。
    • 准确率(precision)度量的是被预测为正例的样本中有多少是真正的正例
    • 召回率(recall)度量的是正类样本中有多少被预测为正类
    • f-分数是准确率与召回率的调和平均

2.2.1 交叉验证

  • 方法:
    • 用10折交叉验证来评估之前的逻辑回归模型
    • 计算交叉验证精度的平均值
      #提示:交叉验证
      Image('Snipaste_2020-01-05_16-37-56.png')
      
      在这里插入图片描述
    • 提示:交叉验证在sklearn中的模块为sklearn.model_selection
    from sklearn.model_selection import cross_val_score
    
    lr = LogisticRegression(C=100)
    scores = cross_val_score(lr, X_train, y_train, cv=10)
    
    # k折交叉验证分数
    scores
    
    在这里插入图片描述
    # 平均交叉验证分数
    print("Average cross-validation score: {:.2f}".format(scores.mean()))
    
    在这里插入图片描述

    思考:k折越多的情况下会带来什么样的影响?

2.2.2 混淆矩阵

  • 混淆矩阵:混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。
  • 思路:
    • 用10折交叉验证来评估之前的逻辑回归模型
    • 计算交叉验证精度的平均值
      #提示:混淆矩阵
      Image('Snipaste_2020-01-05_16-38-26.png')
      
      在这里插入图片描述
      #提示:准确率 (Accuracy),精确度(Precision),Recall,f-分数计算方法
      Image('Snipaste_2020-01-05_16-39-27.png')
      
      在这里插入图片描述
  • 提示:
    • 混淆矩阵的方法在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)
    
    在这里插入图片描述
    from sklearn.metrics import classification_report
    
    # 精确率、召回率以及f1-score
    print(classification_report(y_train, pred))
    
    在这里插入图片描述

思考:如果自己实现混淆矩阵的时候该注意什么问题

2.2.3 ROC曲线

  • ROC曲线:接受者操作特性曲线,(receiver operating characteristic curve,简称ROC曲线)

    • 作用:是反映敏感度和特异度连续变量的综合指标,用作图法展示两度之间的关系。
  • 思路:

    • 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)
    

    在这里插入图片描述

    注:对于多分类问题如何绘制ROC曲线

    文章参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac创建python2虚拟环境

前提:已经安装配置好python2.7版本,使用python和pip命令可以得到如下返回信息 1.安装virtualenv和virtualenvwrapper pip install virtualenv -i https://pypi.tuna.tsinghua.edu.cn/simple sudo pip install virtualenvwrapper -i https://pypi.tuna.t…

1595_AURIX_TC275_PMU_应用提示2

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 如果通过标注来标注了异常字行,那么在算法设计的时候,检查到之后应该跳过这一行的数据。 可以纠正的ECC在PFlash中是可以忽略的,相应的信息只是可以用来…

【SpringCloud】Ribbon负载均衡的基本原理与使用

【SpringCloud】Ribbon负载均衡的基本原理与使用 一、负载均衡原理 二、源码解析 LoadBalanced IDEA源码跟踪 负载均衡源码小结 三、负载均衡策略 负载均衡策略 策略规则解析 自定义负载均衡策略 (1)代码方式 (2)配置文…

Unity的Bounds(包围盒)简记

Unity的Bounds(包围盒)简记一、Bounds(包围盒)概述1.什么是包围盒?2.包围盒的类型2.1 AABB包围盒(Axis-aligned bounding box)2.2 包围球(Sphere)2.3 OBB方向包围盒(Oriented bounding box)2.4 FDH固定方向凸包(Fixed directions hulls或k-DOP)2.5 包围…

云服务器部署前后端分离项目(若依)详细教程

第一次在Linux云服务器上部署前后端分离项目,查了很多资料和视频,踩了许多坑。成功实现部署若依的前后端分离项目后,想记录一下前后端部署的过程,供学习的小伙伴参考。 目录1. 环境准备2. 开放端口3. 下载前后端项目4. 前端部署5.…

Linux部署Kafka及常见问题记录

Linux部署Kafka及常见问题记录kafka 使用场景Kafka 基本概念BrokerTopic(主题)Partition(分区)ProducerConsumerConsumer Group(消费者群组)offset 偏移量Linux 安装&启动 kafka修改核心配置文件创建数据存放目录启动验证 kafk 是否启动成功Topic (主…

AX7A200教程(1):DDR3仿真平台搭建(一)

本章节主要调用官方的MIG控制器,并使用官方的MIG控制器进行仿真,开发环境vivado2020.1鉴于很多童鞋无法仿真自己新建的DDR工程,即使使用modelsim仿真也仿真失败,本例程着重在vivado中对自己新建的带DDR3的工程进行仿真。新建DDR3工…

Python SciPy 插值及其他各种插值法

SciPy 插值什么是插值?在数学的数值分析领域中,插值(英语:interpolation)是一种通过已知的、离散的数据点,在范围内推求新数据点的过程或方法。简单来说插值是一种在给定的点之间生成点的方法。例如&#x…

【MySQL】MyCAT入门综述◆掌握MyCAT的基础概念、功能及适用场景

📫作者简介:小明java问道之路,专注于研究 Java/Liunx内核/C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1f4…

二叉树知识概括锦囊(一)

作者:爱塔居 专栏:数据结构 作者简介:大三学生,希望跟大家一起进步! 文章目录 目录 文章目录 一、树形结构 二、树的基础知识 三、二叉树 3.1 概念 3.2 特殊的二叉树 3.3 二叉树的性质 四、习题挑战 一、树形结构 树是…

【论文速递】IJCV2022 - CRCNet:基于交叉参考和区域-全局条件网络的小样本分割

【论文速递】IJCV2022 - CRCNet:基于交叉参考和区域-全局条件网络的小样本分割 【论文原文】:CRCNet: Few-shot Segmentation with Cross-Reference and Region-Global Conditional Networks 获取地址:https://link.springer.com/article/10.1007/s112…

BACnet协议详解——应用层说明一

文章目录写在前面1. 应用层模型1.1 需确认的应用层服务1.2 无需确认的应用层服务2 BACnet报文的分段2.1 报文分段规则2.1.1 APDU数据流的分段规则2.1.2 APDU最大长度的确定2.1.3 可接受的最大分段数2.2 分段协议控制信息(PCI)写在前面 年关将至&#xf…

分享77个PHP源码,总有一款适合您

PHP源码 分享77个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 77个PHP源码下载链接:https://pan.baidu.com/s/12hh-lhIVPL1bZw-d2sfVlQ?pwdvhqj 提取码&#xff…

selenium 操作已经打开的浏览器

有时通过selenium打开网站时,发现有些网站需要扫码登录,就很头疼,导致爬虫进展不下去。 如果继续想使用selenium进行数据抓取,下一步应该怎么办呢? 步骤一:创建文件夹 在电脑的D盘或者F盘或者合适的盘创建…

《Python数据分析基础教程:NumPy学习指南:第二版》读书笔记

内容 主要介绍了NumPy库中的函数。 组成方式 用非常零散的知识点串联成章节。 内容摘要 极简地展示了章节中所运用的函数。 第一章 arrange函数创建NumPy数组。 第二章 NumPy特性 在NumPy中,复数的虚部是用j表示的。如果数组中包含复数元素,则…

VMware vSphere 中 Clone 与 Template 的区别

VMware vSphere 中 Clone 与 Template 的区别 Clone(克隆)Template(模板)克隆在克隆过程中为正在运行的虚拟机创建一个精确的副本模板作为具有根据组织标准预先定义的配置的虚拟机的基线映像。克隆虚拟机使用相同的配置和安装的软…

【C语言初阶】指针

文章目录1.指针是什么2.指针和指针类型2.1指针的解引用2.1指针类型的意义3.野指针3.1野指针成因3.2如何规避野指针4.指针运算4.1指针-整数4.2指针-指针4.3指针的关系运算5.指针和数组6.二级指针7.指针数组1.指针是什么 指针理解的2个要点: 指针是内存中一个最小单元…

【GD32F427开发板试用】+使用USBFS轻松实现HID键盘应用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:不锈钢铁侠 前言 最近有项目需要用到键盘自动输入功能,提升工作效率。故使用该开发板实现自定义输入内容并通过按键控制自动通过u…

STM32——外部中断

目录 外部中断简述 什么是外部中断 传统单片机与新型单片机外部中断区别 STM32外部中断请求 STM32中断线与IO口的对应 STM32 中断服务函数 外部中断与中断服务函数的对应 中断服务函数列表 STM32外部中断程序编写 常用的库函数 外部中断的一般配置步骤 外部中断简…

【ArcGIS微课1000例】0058:波段合成(CompositeBands)工具的使用

波段合成工具常见于遥感软件,例如Envi和Erdas等,用于将多个单波段数据合成为一个多波段数据集,在ArcGIS中也提供了波段合成的工具,使用灵活方便。 文章目录 一、波段合成工具介绍二、波段合成工具案例1. 输出Esri Grid格式2. 输出tif格式3. 输出jgp格式4. 输出其它格式一、…