【数据分析】(task5)数据建模及模型评估

news2024/9/24 21:20:42

note

文章目录

  • note
  • 一、建立模型
  • 二、模型评估
    • 2.1 交叉验证
    • 2.2 混淆矩阵/recall/accuracy/F1
    • 2.3 ROC曲线
  • 三、Pyspark进行基础模型预测
  • 时间安排
  • Reference

一、建立模型

下载sklearn的命令pip install scikit-learn

from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import Image

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.rcParams['figure.figsize'] = (10, 6)  # 设置输出图片大小
# 一般先取出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)

在这里插入图片描述
有了之前的数据分析,我们也根据数据集判断是监督学习还是无监督学习,并且根据我们的任务、数据样本量、特征稀疏性等进行判断使用什么模型。逻辑回归是分类模型,随机森林是决策树为了防止过拟合。通常会先用一个baseline作为基本模型,然后再选择其他泛化能力更强的模型(参考上图的算法选择路径,深度学习NN类模型的选择就更多了)。

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier

# 1. 默认参数逻辑回归模型
lr = LogisticRegression()
lr.fit(X_train, y_train)
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Testing set score: {:.2f}".format(lr.score(X_test, y_test)))

# 2. 调整参数后的逻辑回归模型
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)))

# 3. 默认参数的随机森林分类模型
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)))

# 4. 调整参数后的随机森林分类模型
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)))

# 5. 模型预测
pred = lr.predict(X_train)  # 预测标签
pred[:10]  # 显示前10个样本的预测结果
pred_proba = lr.predict_proba(X_train) # 预测标签概率

在这里插入图片描述

二、模型评估

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

在这里插入图片描述

2.1 交叉验证

十折交叉验证:
在这里插入图片描述

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  # (10, )
# 平均交叉验证分数
print("Average cross-validation score: {:.2f}".format(scores.mean()))  # 0.79

2.2 混淆矩阵/recall/accuracy/F1

  • 混淆矩阵的方法在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)

在这里插入图片描述

# 精确率、召回率以及f1-score
print(classification_report(y_train, pred))

在这里插入图片描述
上面的左侧列0和1就是两个预测的标签,对应的不同预测指标。查准率和查全率是一对矛盾的指标,查全率recall衡量的是某标签的预测结果是否涵盖“周全”。

2.3 ROC曲线

from sklearn.metrics import roc_curve
fig = plt.figure(figsize=(4, 4))
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)

在这里插入图片描述

三、Pyspark进行基础模型预测

# test libsvm dataset
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
import findspark
findspark.init()
import pyspark
from pyspark import SparkConf
from pyspark.ml import Pipeline
from pyspark.context import SparkContext
from pyspark.sql.session import SparkSession
from pyspark.ml.classification import DecisionTreeClassifier
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
from pyspark.ml.feature import StringIndexer, VectorIndexer,IndexToString

"""
conf=SparkConf().setAppName('MLDemo')
sc = SparkContext('local')
spark = SparkSession(sc)
"""

def gradientBoostedTreeClassifier(data="data/sample_libsvm_data.txt"):
    '''
    GBDT分类器
    '''
    #加载LIBSVM格式的数据集
    data = spark.read.format("libsvm").load(data)  
    print("data数据集前5行:\n", data.show(n = 3))
    
    labelIndexer = StringIndexer(inputCol="label", outputCol="indexedLabel").fit(data)
    
    #自动识别类别特征并构建索引,指定maxCategories,因此具有> 4个不同值的特征被视为连续的
    featureIndexer=VectorIndexer(inputCol="features", outputCol="indexedFeatures", maxCategories=4).fit(data)
    
    #训练集、测试集划分
    (trainingData, testData) = data.randomSplit([0.7, 0.3])
    
    # 构建10个基分类器 maxIter = 10
    gbt = GBTClassifier(labelCol="indexedLabel", featuresCol="indexedFeatures", maxIter=10)
    
    pipeline = Pipeline(stages=[labelIndexer, featureIndexer, gbt])
    model = pipeline.fit(trainingData)
    # transformer是一个pipelineStage,将一个df转为另一个df,对testData进行
    predictions = model.transform(testData)
    
    #展示前5行数据,或者show进行打印
    predictions.select("prediction", "indexedLabel", "features").show(5)
    
    #展示预测标签与真实标签,计算测试误差
    evaluator = MulticlassClassificationEvaluator(
        labelCol="indexedLabel", predictionCol="prediction", metricName="accuracy")
    
    # 评估model
    accuracy = evaluator.evaluate(predictions)
    print("Test Error = %g" % (1.0 - accuracy))
    gbtModel = model.stages[2]
    print('gbtModelSummary: ',gbtModel)  #模型摘要
 
 
if __name__=='__main__':
    filepath = "file:///home/hadoop/development/RecSys/"
    gradientBoostedTreeClassifier(filepath + "data/sample_libsvm_data.txt")

pyspark适合数据量更大时候的模型预测,如GBDT结果如下:

+-----+--------------------+
|label|            features|
+-----+--------------------+
|  0.0|(692,[127,128,129...|
|  1.0|(692,[158,159,160...|
|  1.0|(692,[124,125,126...|
+-----+--------------------+
only showing top 3 rows

data数据集前5行:
 None
+----------+------------+--------------------+
|prediction|indexedLabel|            features|
+----------+------------+--------------------+
|       1.0|         1.0|(692,[95,96,97,12...|
|       1.0|         1.0|(692,[122,123,124...|
|       1.0|         1.0|(692,[124,125,126...|
|       1.0|         1.0|(692,[124,125,126...|
|       1.0|         1.0|(692,[125,126,127...|
+----------+------------+--------------------+
only showing top 5 rows

Test Error = 0.03125
gbtModelSummary:  GBTClassificationModel: uid = GBTClassifier_d0de0e9263e7, numTrees=10, numClasses=2, numFeatures=692

时间安排

任务任务内容时间完成情况
-1月16日周一开始
Task01:数据加载及探索性数据分析(第一章第1,2,3节)(2天)16-17日周二完成
Task02:数据清洗及特征处理(第二章第1节)(2天)18-19日周四完成
Task03:数据重构(第二章第2,3节)(2天)20-21日周六完成
Task04:数据可视化(第二章第4节)(2天)22-23日周一完成
Task05:数据建模及模型评估(第三章第1,2节)(3天)24-26日周四完成

Reference

[1] https://github.com/datawhalechina/hands-on-data-analysis

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

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

相关文章

ARP渗透与攻防(二)之断网攻击

ARP断网攻击 系列文章 ARP渗透与攻防(一)之ARP原理 1.环境准备 kali 作为ARP攻击机,IP地址:192.168.110.26 MAC地址:00:0c:29:fc:66:46 win10 作为被攻击方,IP地址:192.168.110.12 MAC地址:1c:69:7a:a…

Tkinter的Entry与Text

Tkinter界面设计之输入控件Entry以及文本框控件Text。 目录 一、放置控件 1. pack()函数 2. place()函数 3. grid()函数 二、简单控件 1. Entry输入控件 1.1 tk.StringVar()函数:接收一个字符串 1.2 tk.Entry()函数:设置一个输入控件E 2. Text文…

CMake多文件编译

之前学习ceres-solver中的3d相关的源码的时候,发现对于CMake多文件工程编译中对于CMakeLists.txt的编写和处理的理解运用还是比较模糊,这里整理梳理一下对于不同文件夹数量如何使用。 参考文章: CMake使用详解二(多文件编译&…

maya常用操作

1:重置工作区。2:切换视图。按空格切换视图。3:未选中状态,按shift,再点右键,可以打开交互式创建。这样可以在栅格上创建想要的大小。不选中交互式创建的话,创建的是默认未知。默认未知为正中间…

linux系统中利用QT实现车牌识别的方法

大家好,今天主要和大家分享一下,如何利用QT实现车牌识别的方法。 目录 第一:车牌识别基本简介 第二:车牌识别产品申请 第三:百度车牌识别API接口 第四:车牌识别综合测试 第一:车牌识别基本简…

Scala快速入门

Scala简介 Scala是一门现代的多范式编程语言,平滑地集成了面向对象和函数式语言的特性。Scala运行于Java平台(JVM,Java 虚拟机)上,并兼容现有的Java程序,Scala代码可以调用Java方法,访问Java字…

ArcGIS Pro脚本工具(17)——生成多分式标注

​朋友们,你们知道ArcGIS里面分式标注的四种写法么? 放错图了,是这个 分式标注的四种形式我们可以把这类叫分式标注,网上也有博主分享过如何在ArcGIS中制作这类标注,但我觉得仍有一些不足。 一是基本都使用VB编写&…

中文问题相似度挑战赛

赛题概要 请本赛题排行榜前10位的队伍,通过作品说明提交源代码,模型以及说明文档,若文件过大,可发送至官网邮箱AICompetitioniflytek.com, 若截止时间内为提交,官方会通过电话联系相关选手,若未接到通知或…

WPF作图神器Interactive DataDisplay的初步使用

文章目录安装初步使用安装 Interactive DataDisplay是一款比较优秀的C#绘图控件,尽管与一些商业控件还有不小的差距,关键是开源免费轻量。 在VS中安装控件十分简单,本测试基于Net Core5.0,在VS的菜单栏->工具->NuGet包管理…

HomeLab 常用工具一:filebrowser

前言在实际使用过程中,我们通常都有基于WEB 的文件操作需求(例如从一台陌生设备上想打开看一下,图片等),和nextcloud 相比 filebrowser 更为轻巧也更为方便。一、filebrowser 安装这里基于docker 安装和使用&#xff0…

Prometheus 动态拉取监控服务

Prometheus 版本 2.41.0 平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符PromQL之函数Prometheus 配置身份认证Prometheus 动态拉取监控服务 我们在以前的实例中配置Prometheus 的target 都是手动配置,这在监控目标少的情况下还可以接受…

【基础】BMP格式

BMP格式位图 (BMP)简介格式1.1图和调色板的概念1.2 bmp文件格式1.2.1 位图文件头 14字节1.2.2 位图信息头 40字节1.2.3 调色板1.2.4 注意位图 (BMP)简介 BMP取自位图Bitmap的缩写,也称为DIB(与设备无关的位图),是一种独立于显示器…

【苹果家庭群发推】软件keychain中刚打开的证书下载的证书文件要决不会报错 UNTimeIntervalNotificationTrigge

推荐内容IMESSGAE相关 作者✈️IMEAX推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容3.日历推 *** …

linux入门---linux基本指令

目录标题云服务器选择云服务器购买xshell下载如何登陆云服务器Linux的新建与删除新建删除云服务器选择 学习linux的时候云服务器是一个非常重要的工具,那么我们在购买云服务器的时候有很多选择比如说:华为云,腾讯云,阿里云等等&a…

活动星投票网络文明公益广告网络评选微信的投票方式线上免费投票

“网络文明公益广告”网络评选投票_不记名投票小程序_投票帮手免费畅享_扫码投票微信小程序手机互联网给所有人都带来不同程度的便利,而微信已经成为国民的系统级别的应用。现在很多人都会在微信群或朋友圈里转发投票,对于运营及推广来说找一个合适的投票…

ROS2机器人编程简述humble-第三章-PERCEPTION AND ACTUATION MODELS .1

书中,第三章主题:First Behavior: Avoiding Obstacles with Finite States Machines本节旨在应用到现在为止所展示的一切来创建看似“聪明”的行为。这个练习将介绍的许多东西结合起来,并展示使用ROS2编程机器人的效率。此外,将解…

第五届字节跳动青训营 前端进阶学习笔记(八)React框架入门

文章目录前言React 的设计思路1.传统JavaScript更新UI的痛点2.我们对UI代码的需求3.组件(1)组件定义(2)组件设计(3)组件结构4.React的生命周期React的基本语法1.JSXReact的实现1.虚拟DOM2.响应数据的实现前…

Java面试题,Spring Bean的注册与依赖注入

Spring Bean的注册与依赖注入一、XML文件中,将Bean创建到Spring容器1. 基本类型注册2. 类装配3. 有参构造方法装配4. 扩展注入5. Bean的作用域6. Bean的其他配置二、配置类中,将Bean创建到Spring容器1. 在mapper、service、controller中创建,…

计网必会:HTPP详解(非常全面)、cookie、缓存

文章目录应用层协议Web和HTTPHTTP 概述采用非持续连接的HTTPRTT 往返时间的定义**三次握手过程**采用持续连接的HTTPHTTP到底采用哪个?HTTP 的报文格式请求报文功效格式响应报文状态码格式Cookie什么是cookieWeb缓存在学习的过程很多人都遇到了HTTP和Cookie&#xf…

卓有成效的五种用例设计方法

持续坚持原创输出,点击蓝字关注我吧用例设计作为测试工程师的立身之本,是衡量测试工程师综合素质的重要参考,时间是测试工作中重要的测试资源,通过设计高质量的测试用例可以有效地提升测试效率。本文旨在介绍测试工作中常用的五种…