机器学习笔记2:建立模型一般所需步骤

2023-11-11

目录

1.特征工程

2.抽样方式

2.1 随机抽样:

2.2 分层抽样:

3.交叉验证

4.微调模型

4.1 网格搜索:

4.2 随机搜索:


1.特征工程

特征工程是指对样本属性值的处理。对数值型属性值一般用标准化,以此来消除量纲的影响。对字符串或者文本型属性值一般用one-hot编码,以此来消除不同类别之间的差异

本文所用数据集展示:

import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.model_selection import train_test_split

# 划分数据集
data=pd.read_excel('123.xlsx')
x=data.copy().drop('median_house_value',axis=1) # 除去目标值列
y=data['median_house_value']
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)

# 特征工程
# 1.数据准备
train_num=x_train.iloc[:,:-1] # 提取出数值型属性值
num_name = list(train_num) # 数值型属性值的列名
str_name = ["ocean_proximity"] # 字符串型属性值的列名
# 2.数值属性处理方案
num_pipeline = Pipeline([
        ('imputer', SimpleImputer(strategy="median")), # 缺失值用平均数填补
        ('std_scaler', StandardScaler()), # 标准化
    ])
# 3.字符串属性处理方案
full_pipeline = ColumnTransformer([
        ("num", num_pipeline, num_name), # 数值列用上面定义的顺序流程
        ("cat", OneHotEncoder(), str_name), # 文本类用one-hot编码转换
    ])
# 4.训练并转换
x_train = full_pipeline.fit_transform(x_train)
x_test = full_pipeline.transform(x_test)

2.抽样方式

常用的有随机抽样和分层抽样,随机抽样意思很明确就不解释了。

分层抽样:你要从人群中选取1000个人来调查下人均财产,假如当下社会有10%的上层阶级、50%的中层阶级、40%的下层阶级,如果选出100个上层阶级、500个中层阶级、400个下层阶级的人比随机抽样更能代表全体人口。当要选取的样本数足够大时(99.99%)随机抽样和分层抽样的差别就不大了,反之可以采用分层抽样,但基于何种指标进行分层就智者见智了。确定层数时要保证每层有足够的样本,不要将层数分的太多

2.1 随机抽样:

from sklearn.model_selection import train_test_split

# random_state:随机数种子
# test_size:训练集所占比例
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22,test_size=0.8)

2.2 分层抽样:

先查看该属性值的分布图确定分层区间

housing["median_income"].hist()

from sklearn.model_selection import StratifiedShuffleSplit

# 分类区间:0~1.5、1.5~3、...、6~inf
housing["income_cat"] = pd.cut(housing["median_income"],
                               bins=[0., 1.5, 3.0, 4.5, 6., np.inf],
                               labels=[1, 2, 3, 4, 5])

# StratifiedShuffleSplit()是处理分层抽样时的打乱数据集步骤
# 参数意义是,分出一组train/test集,后者占比20%
split = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index, test_index in split.split(housing, housing["income_cat"]):
    strat_train_set = housing.loc[train_index]
    strat_test_set = housing.loc[test_index]


3.交叉验证

交叉验证的目的是为了多次对模型进行评估,取平均值作为最后的结果。

交叉验证有两种方式,第一种是将训练集再分出一部分验证集(不参与训练),利用train_test_split函数可以轻松实现。

第二种使用sklearn库自带的K-折交叉验证功能,内部执行如下

1、首先,将全部样本划分成k个大小相等的样本子集;

2、依次遍历这k个子集,每次把当前子集作为验证集,其余所有样本作为训练集,进行模型的训练和评估;

3、最后把k次评估指标的平均值作为最终的评估指标。在实际实验中,k通常取3,5,10.

# 交叉验证准确率
from sklearn.model_selection import cross_val_score

# 利用先前训练的模型sgd_clf进行3折交叉验证
# scoring:评估的指标,例如准确率、f1值等,这里用的是默认的准确率
cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring="accuracy")

4.微调模型

微调模型的目的一般是为了提高某项评价值,方法也有很多,例如网格搜索和随机搜索用于调整超参数。网格搜索就是利用你给出的组合一个个试,随即搜索一般是你给出超参数的范围,然后进行随机抽取组合。推荐先用随机搜索确定大致范围,再用网格搜索进行细搜

4.1 网格搜索:

这里共有(3*4)+(1*2*3)=18种组合,每种组合都进行三折交叉验证

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(random_state=42)
param_grid = [
    # 尝试 12 (3×4) 的超参数组合
    {'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]},
    # 在bootstrap设置为False的情况下,尝试6 (2×3) 的超参数组合
    {'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]},
  ]

# scoring参数是为了下一步显示出每组的指标
# refit参数默认True,一旦通过交叉验证找到了最佳估算器,它将在整个训练集上重新训练
grid_search = GridSearchCV(model, param_grid, cv=3,scoring='neg_mean_squared_error')
grid_search.fit(x_train, y_train)

# 最佳模型
grid_search.best_estimator_

可查每组指标对应的评分(例如RMSE:
cvres = grid_search.cv_results_
for mean_score, params in zip(cvres["mean_test_score"], cvres["params"]):
    print(np.sqrt(-mean_score), params)

4.2 随机搜索:

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint

param_distribs = {
        'n_estimators': randint(low=1, high=200),
        'max_features': randint(low=1, high=8),
        'bootstrap':[True,False]
    }

# n_iter:随机搜索的次数
forest_reg = RandomForestRegressor(random_state=42)
rnd_search = RandomizedSearchCV(forest_reg, param_distributions=param_distribs,
                                n_iter=10, cv=3, scoring='neg_mean_squared_error', random_state=42)
# 数据集是来自房价预测
rnd_search.fit(x_train, y_train)

每组的指标结果显示:

cvres = rnd_search.cv_results_
for mean_score, params in zip(cvres["mean_test_score"], cvres["params"]):
    print(np.sqrt(-mean_score), params)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习笔记2:建立模型一般所需步骤 的相关文章

  • 翠儿。让流永远运行

    我对 tweepy python 库比较陌生 我想确保我的流 python 脚本始终在远程服务器上运行 因此 如果有人能够分享如何实现这一目标的最佳实践 那就太好了 现在我正在这样做 if name main while True try
  • 将tensorflow 2.0 BatchDataset转换为numpy数组

    我有这个代码 train images test images tf keras datasets mnist load data train dataset tf data Dataset from tensor slices train
  • 没有任何元数据的 zip 文件

    我想找到一种简单的方法来压缩一堆文件 而无需任何文件元数据 例如时间戳 这zip命令似乎总是保留元数据 我没有找到禁用元数据的方法 我希望解决方案是一个命令或最多一个 python 脚本 谢谢 正如一些帖子已经指出的那样 zip 标头中的大
  • 在 Python 中使用 Selenium 处理“接受 Cookie”弹出窗口

    我一直在尝试用硒抓取这个房地产网站的一些信息 但是 当我访问该网站时 我需要接受 cookie 才能继续 这仅在机器人访问网站时发生 而不是在我手动执行时发生 当我尝试通过 xpath 或 id 查找相应的元素时 正如我在手动检查页面时找到
  • 在Python3.6中调用C#代码

    由于完全不了解 C 编码 我希望在我的 python 代码中调用 C 函数 我知道有很多关于同一问题的问答 但由于一些奇怪的原因 我无法从示例 python 模块导入简单的 c 类库 以下是我所做的事情 C 类库设置 我使用的是 VS 20
  • 在 Numpy 中切片后确定结果数组的形状

    我很难理解在 numpy 中切片后如何确定结果数组的形状 例如 我使用以下简单代码 import numpy as np array np arange 27 reshape 3 3 3 slice1 array 1 2 1 slice2
  • 如何在Python中循环并存储自变量中的值

    我对 python 很陌生 所以这听起来可能很愚蠢 我进行了搜索 但没有找到解决方案 我在 python 中有一个名为 ExcRng 的函数 我可以对该函数执行什么样的 for 循环 以便将值存储在独立变量中 我不想将它们存储在列表中 而是
  • 一次将Python dict的内容分配给多个变量?

    我想做这样的事情 def f return a 1 b 2 c 3 a b f or a b f IE 这样 a 被分配为 1 b 被分配为 2 并且 c 是未定义的 这与此类似 def f return 1 2 a b f 依赖于变量名称
  • Tensorflow 可变图像输入大小(自动编码器、放大......)

    Edit WARNING不建议使用不同图像大小的图像 因为张量需要具有相同的大小才能实现并行化 我一直在寻找解决方案 了解如何使用不同大小的图像作为神经网络的输入 Numpy 第一个想法是使用numpy 然而 由于每个图像的大小不同 我无法
  • 如何从 Dockerfile 安装 Python 3.7 和 Pip

    我正在尝试构建基于 Ubuntu 18 04 的自定义 Docker 映像 Ubuntu 预装了 Python 3 6 但我想 1 安装 Python 3 7 2 将其设置为默认 Python 版本 这样就可以使用python代替pytho
  • 如何使用 python urllib 在 HTTP/1.1 中保持活力

    现在我正在这样做 Python3 urllib url someurl headers HOST somehost Connection keep alive Accept Encoding gzip deflate opener urll
  • 更改 pandas 中多个日期时间列的时区信息

    有没有一种简单的方法可以将数据帧中的所有时间戳列转换为本地 任何时区 不是逐列进行吗 您可以有选择地将转换应用于所有日期时间列 首先 选择它们select dtypes https pandas pydata org pandas docs
  • 为什么我用 beautifulSoup 刮的时候有桌子,但没有 pandas

    尝试抓取条目页面转换为制表符分隔格式 主要拉出序列和 UniProt 登录号 当我跑步时 url www signalpeptide de index php sess m listspdb bacteria s details id 10
  • 将输入发送到 python 子进程而不等待结果

    我正在尝试为一段代码编写一些基本测试 该代码通常通过 stdin 无休止地接受输入 直到给出特定的退出命令 我想检查程序是否在给出一些输入字符串时崩溃 经过一段时间来考虑处理 但似乎无法弄清楚如何发送数据而不是陷入等待我不知道的输出关心 我
  • 查找给定节点的最高权重边

    我在 NetworkX 中有一个有向图 边缘的权重从 0 到 1 表示它们发生的概率 网络连通性非常高 所以我想修剪每个节点的边缘 只保留最高概率的节点 我不确定如何迭代每个节点并仅保留最高权重in edges在图中 有没有一个networ
  • Flask WTForms 使用变量自动填充 StringField

    我有一个表格 我想用上一页收到的信息自动填充一些字段 但如果他们想调整它 它需要是可更改的 我正在为我的 SelectField 使用动态创建的列表 但添加 StringField 并不成功 请参阅下面的我的代码 forms py clas
  • Scipy 稀疏 Cumsum

    假设我有一个scipy sparse csr matrix代表下面的值 0 0 1 2 0 3 0 4 1 0 0 2 0 3 4 0 我想就地计算非零值的累积和 这会将数组更改为 0 0 1 3 0 6 0 10 1 0 0 3 0 6
  • 为什么我们应该在 def __init__(self, n) -> None: 中使用 -> ?

    我们为什么要使用 gt in def init self n gt None 我读了以下摘录来自 PEP 484 https www python org dev peps pep 0484 the meaning of annotatio
  • Python 3.2 中 **kwargs 和 dict 有什么区别?

    看起来Python的很多方面都只是功能的重复 除了我在 Python 中的 kwargs 和 dict 中看到的冗余之外 还有什么区别吗 参数解包存在差异 许多人使用kwargs 并通过dict作为论据之一 使用参数解包 Prepare f
  • 全局变量是 None 而不是实例 - Python

    我正在处理Python 中的全局变量 代码应该可以正常工作 但是有一个问题 我必须使用全局变量作为类的实例Back 当我运行应用程序时 它说 back is None 这应该不是真的 因为第二行setup 功能 back Back Back

随机推荐

  • 刷脸支付各行业有发挥一技之长的地方

    刷脸支付的技术在各方的监督下不断发展 安全性也被大大提高 引用范围愈发广泛 零售 教育 金融 安防 医疗等 都是刷脸支付可以发挥一技之长的地方 只有你想不到 没有刷脸支付触达不到 应广大家长和学生的要求 刷脸支付如今正肆无忌惮的入驻校园 帮
  • OTA-Docker架构设计&源码

    架构设计 Docker容器的主要任务 运行所需的应用程序 Docker容器映射文件目录 完成与本地文件共享数据 OTA Client控制共享文件目录下的更新和容器的重启 最终实现基于Docker的SOTA应用升级 整体架构的设计思路如下 终
  • C# - this 的用法

    引言 最近有接触到 C 静态方法中 this 做为参数紧跟类名 实现对类的扩展 觉得很好奇 便想了解一下 C 中 this 关键字的用法 主要有 5 类用法 内容提要 限定类似名称隐藏的成员 将对象作为参数传递给方法 声明索引器 串联构造函
  • 2018年泰迪杯心得总结--最全的数学建模、数据挖掘的比赛入门

    2018年泰迪杯总结 最全的数学建模 数据挖掘比赛入门 期待已久的泰迪杯数据挖掘比赛从3月1日开启到今天4月15日已经结束了 不同于美赛等数学建模比赛 它耗时更长 赛题难度更大 需要处理的数据更加庞大 奖金也超级丰厚hhh 笔者通过一个半月
  • SQL注入基础 sql注入详细解释 小白学习笔记

    sql注入作为安全攻防中最重要的一个部分 可以说是所有渗透测试注入中最为重要的一个注入 不管是预防还是测试 都需要扎实的基础才能明白sql注入 温馨提示 此文章仅限于学习记录与讨论 不得随意测试或者注入 互联网不是法外之地 任何除学习之外的
  • cdr怎么抠图轮廓线条_CDR怎么抠图?CorelDRAW快速抠图方法

    抠图这个词相信大家都有所耳闻 CDR中的抠图功能也比较实用 可以用于将图片的一部分单独取出来 或是用来给人物换背景 做照片的合成等 那么用CDR怎么抠图呢 CorelDRAW 2019 for Win中的抠图方法有很多 今天小编教大家两种
  • 深度学习之图像隐写去除(DDSP模型 Steganography Removal)

    文章目录 一 前言 二 论文内容 2 1 Abstract 2 2 Introduction 2 3 Background 2 3 1 Prior Work 2 3 2 Super Resolution GAN 超分辨率GAN 2 4 Da
  • python json5

    install pip install json5 test a json a b aa b1 b2 import json5a json5 load open a json r print a a b aa b1 b2 转载于 https
  • C语言小编程之九九乘法表

    在初学C语言中 我们会遇到很多九九乘法表的问题 在这我们进行一系列的分析 九九乘法表的格式是x x x的格式 接下来 我们要做的是利用循环结构 使得数量发生变化 在最后 要对乘法表的形状进行限定 首先我们先进行 对 两个乘数进行循环 然后求
  • mysql check执行流程,MySQL==> SQL执行流程剖析

    一 MySQL基本架构 从该图可以看出 MySQL 主要分为 Server 层和存储引擎层 Server 层中包罗毗邻器 查询缓存 剖析器 优化器 执行器 涵盖 MySQL 的大多数焦点服务功效 以及所有的内置函数 如日期 时间 数学和加密
  • 安装MMCV血泪史

    如果直接进行pip 是会出错的 需要先在服务器上或者Python控制台查找torch和cuda版本号 python c import torch print torch version 查找到版本号之后 在下面的链接查找对应版本的mmcv安
  • Unity3D Shader 新手教程(2/6) —— 积雪Shader

    如果你是一个shader编程的新手 并且你想学到下面这些酷炫的技术 我觉得你可以看看这篇教程 实现一个积雪效果的shader 创建一个具有凹凸纹理的shader 为每个像素修改其对应纹理值 在表面着色器中修改模型的顶点数据 引论 这是我们系
  • 方舟编译器分析十四——代码分析(十二)

    2021SC SDUSC ssa是MeFuncPhase类的phase之一 是除了ssaTab之外 和ssa相关的第二个phase 它在phases def中 排在ssaTab和aliasclass之后 前文已经分析过了ssaTab 本文将
  • Postgresql的并发(一)

    转载请注明URL http write blog csdn net postedit 50747829 翻译 卧龙居 pijing 13 1 简介 PostgreSQL提供了非常丰富的工具给开发者 以供开发者控制对于数据的并发访问 在内部
  • 深度学习笔记丨李沐深度学习课程kaggle竞赛——加利福尼亚房价预测(我的第一个深度学习项目)

    记录作为小白的第一个深度学习项目 1 kaggle竞赛题目 The task is to predict house sale prices based on the house information such as of bedroom
  • python3: xpath的使用

    转 本文转自 https blog csdn net qq 36148847 article details 79167267 python 具有一些比较流行的解析库 例如 lxml 使用的是 XPath 语法 是大众普遍认为的网页文本信息
  • Oracle 11gR2 RAC Listener - 多端口多监听

    Oracle单实例库 可以配置多个监听服务 同时监听同一个service 具体的步骤可以参考之前的文章 Oracle RAC想使用多端口 多监听服务 来同时监听同一个service 也可以 官方文档 http docs oracle com
  • 异常链的解释与使用

    目录 1 什么是异常链 2 异常链的使用场景 3 使用异常链的注意事项 1 什么是异常链 百度百科的解释 异常链是一种面向对象编程技术 指将捕获的异常包装进一个新的异常中并重新抛出的异常处理方式 深入理解Java核心技术 中的解释 异常链是
  • 使用Docker创建镜像的容器

    1 查看当前环境下的镜像 docker ps 2 创建docker镜像容器 例如 我要创建czy py3 6 pytorch1 0镜像对应的容器 raid raid home shanhui mrc是我本地文件的路径 workplace c
  • 机器学习笔记2:建立模型一般所需步骤

    目录 1 特征工程 2 抽样方式 2 1 随机抽样 2 2 分层抽样 3 交叉验证 4 微调模型 4 1 网格搜索 4 2 随机搜索 1 特征工程 特征工程是指对样本属性值的处理 对数值型属性值一般用标准化 以此来消除量纲的影响 对字符串或