机器学习-数据集划分和特征工程

news2025/5/10 17:09:27

一.数据集划分

API函数:

sklearn.model_selection.train_test_split(*arrays,**options)

参数:

- arrays:多个数组,可以是列表,numpy数组,也可以是dataframe数据框等

- options:(包含以下参数)

    - shuffle = True 默认随机抽取

    - random_state=x,随机数种子,x是哪个都行,就是固定随机抽取的规则,保证每次都一样

    - train_size=x,就是训练集的比例,默认是0.75,和test_size两者选一个就行

    - stratify,如果数据集是多分类,则需要指定,比如是二分类,则指定为y(分层划分,这个留到后面再讲)

可以传入多个数据集,返回train与test数据集

# 进行API导入
from sklearn.model_selection  import train_test_split

# 随手创建两个数据集
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [10,20,30,40,50,60,70,80,90,100]

# 调用train_test_split函数,将数据集分为训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42, shuffle=True)

# 打印训练集和测试集
print(x_train, x_test, y_train, y_test)

[6, 1, 8, 3, 10, 5, 4, 7] [9, 2] [60, 10, 80, 30, 100, 50, 40, 70] [90, 20]

可以看到,两个数据集以完全相同的方式进行划分,在函数中都是用相同的下标进行抽取,使用的是相同的划分规则

而在日常工作中,我们一般都会像上面一样传入两个数据集,一个就是特征数据集,一个就是标签数据集。我们以鸢尾花为例:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

iris = load_iris()
# 获取特征
data = iris.data
# 获取标签
target = iris.target

# 进行划分
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.3, random_state=42)

print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

(105, 4) (45, 4) (105,) (45,)

这里取出来的每一整条特征数据都完美对应自己的标签,这也为后续的模型训练奠定了基础。

二.特征工程

2.1 概念

就是对特征进行相关的处理

一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程

特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。

2.2 API

实例化转换器对象(transfer),转换器类有很多:

DictVectorize字典特征提取
CountVectorizer    文本特征提取
TfidfVectorizer    TF-IDF文本特征词的重要程度特征提取
MinMaxScaler        归一化
StandardScaler      标准化
VarianceThreshold  底方差过滤降维
PCA主成分分析降维

转换器对象调用 fit_transform() 进行特定转换, fit用于计算数据,transform进行最终转换。fit_transform()可以使用fit()和transform()代替:

data_new = transfer.fit_transform(data)

可写成

transfer.fit(data)

data_new = transfer.transform(data)

2.3 DictVectorizer  字典列表特征提取

讲之前先了解一个概念,稀疏矩阵:

稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。由于稀疏矩阵中零元素非常多,存储和处理稀疏矩阵时,通常会采用特殊的存储格式三元组表,以节省内存空间并提高计算效率。

比如:

(0,0) 10

(0,1) 20

(2,0) 90

(2,20) 8

(8,0) 70

表示除了列出的索引位置有值, 其余全是0

同样也有非稀疏矩阵(稠密矩阵),与稀疏矩阵相反。

API:

sklearn.feature_extraction.DictVectorizer(sparse=True)

参数:

sparse:默认以稀疏矩阵表示,为True时返回稀疏矩阵,为False时返回稠密矩阵。

这个API会返回一个字典列表特征提取器对象,再通过前面的fit_transform方法,就可以将字典列表转换为稀疏矩阵或稠密矩阵。

# 导入相关库
from sklearn.feature_extraction import DictVectorizer

# 创建一个简单的字典列表数据
data = [
    {'city': '北京', 'temperature': 10},
    {'city': '上海', 'temperature': 20},
    {'city': '广州', 'temperature': 30},
    {'city': '广州', 'temperature': 29}]

# 创建一个DictVectorizer对象
vec = DictVectorizer(sparse=False)

# 转换字典列表数据为特征矩阵
data_new = vec.fit_transform(data)

# 看看转换后的特征名称
print(vec.get_feature_names_out())

# 打印特征矩阵
print(data_new)

['city=上海' 'city=北京' 'city=广州' 'temperature']
[[ 0.  1.  0. 10.]
 [ 1.  0.  0. 20.]
 [ 0.  0.  1. 30.]
 [ 0.  0.  1. 29.]]

可以看到原先的数据集中含有中文特殊字符,在进行转化时转换器就把每个包含中文的键值对当作一个特征名保存。而打印出的特征矩阵中,其中每一行每个数字对应的位置就是特征名列表中的位置,为1则代表是该特征,为0则代表不是该特征。

再来看看三元组的表示:

# 创建一个DictVectorizer对象
vec = DictVectorizer(sparse=True)

# 转换字典列表数据为特征矩阵
data_new = vec.fit_transform(data)

# 看看转换后的特征名称
print(vec.get_feature_names_out())

# 打印特征矩阵
print(data_new)

['city=上海' 'city=北京' 'city=广州' 'temperature']
<Compressed Sparse Row sparse matrix of dtype 'float64'
    with 8 stored elements and shape (4, 4)>
  Coords    Values
  (0, 1)    1.0
  (0, 3)    10.0
  (1, 0)    1.0
  (1, 3)    20.0
  (2, 2)    1.0
  (2, 3)    30.0
  (3, 2)    1.0
  (3, 3)    29.0

三元组(稀疏矩阵)显示的就是除了0以外的所有数值的索引,也就可以根据索引可以还原之前的特征矩阵。

2.4 CountVectorizer 文本特征提取

API:

sklearn.feature_extraction.text.CountVectorizer()

参数:

- stop_words : 又叫黑名单,其中存储的是停用词即不会被提取的词,值类型为list

# 导入相关库
from sklearn.feature_extraction.text import CountVectorizer

# 创建一个简单的英文句子
data = ["I love machine learning.", "I love coding.", "I love both"]

# 创建一个CountVectorizer对象
cv = CountVectorizer(stop_words=["machine", "learning", "coding"])
# 转换句子为词频矩阵
data_new1 = cv.fit_transform(data)
# 查看特征名
print(cv.get_feature_names_out())
# 查看词频矩阵(三元组)
print(data_new1)
# 转化为特征矩阵
print(data_new1.toarray())

['both' 'love']
<Compressed Sparse Row sparse matrix of dtype 'int64'
    with 4 stored elements and shape (3, 2)>
  Coords    Values
  (0, 1)    1
  (1, 1)    1
  (2, 1)    1
  (2, 0)    1
[[0 1]
 [0 1]
 [1 1]]

可以看到,其将每个英文单词提取出来作为特征,矩阵中的数字就是出现的次数(频率)。我们也可以不提取某些词,而且这个函数内部也隐式地去掉了一些特殊字符。

但,我们一般用的都是中文,而这又是特殊字符,能正常使用吗?

# 导入相关库
from sklearn.feature_extraction.text import CountVectorizer

# 创建一个简单的中文句子
data = ["第一个句子","第二个句子"]

# 创建一个CountVectorizer对象
cv = CountVectorizer()
# 转换句子为词频矩阵
data_new1 = cv.fit_transform(data)
# 查看特征名
print(cv.get_feature_names_out())
# 查看词频矩阵(三元组)
print(data_new1)
# 转化为特征矩阵
print(data_new1.toarray())

['第一个句子' '第二个句子']
<Compressed Sparse Row sparse matrix of dtype 'int64'
    with 2 stored elements and shape (2, 2)>
  Coords    Values
  (0, 0)    1
  (1, 1)    1
[[1 0]
 [0 1]]

很明显,这个地方有大问题,由于英文单词天生就用空格分隔,所以可以直接提取。但中文有自己的分词规则,我们需要用其他分词工具进行分词,比如jieba

使用下面的命令进行下载:

pip install jieba

# 导入
from sklearn.feature_extraction.text import CountVectorizer
import jieba

data = "第一个句子"

# 用jieba分词,返回一个可迭代对象
data = jieba.cut(data)
data = list(data)
print(data)

# 再将分词结果转换为字符串
data = " ".join(data)
print(data)

# 用CountVectorizer进行特征提取
vec = CountVectorizer()
data_new = vec.fit_transform([data])

print(vec.get_feature_names_out())
print(data_new.toarray())

['第一个', '句子']
第一个 句子
['句子' '第一个']
[[1 1]]

# 进行多个句子的提取
from sklearn.feature_extraction.text import CountVectorizer
import jieba

data = ["第一个句子","第二个句子"]

# 写一个函数完成分词和转化字符串
def cut_words(str):
    return " ".join(list(jieba.cut(str)))

# 给data里的句子分词
data = [cut_words(i) for i in data]

# 用CountVectorizer进行特征提取
vec = CountVectorizer()
data_new = vec.fit_transform(data)

# 打印特征提取后的结果
print(vec.get_feature_names_out())
print(data_new.toarray())

['句子' '第一个' '第二个']
[[1 1 0]
 [1 0 1]]

2.5 TfidfVectorizer TF-IDF文本特征词的重要程度特征提取

词频(Term Frequency, TF),  表示一个词在当前篇文章中的重要性

逆文档频率(Inverse Document Frequency, IDF), 反映了词在整个文档集合中的稀有程度


 

API:

sklearn.feature_extraction.text.TfidfVectorizer()

参数:

- stop_words:表示词特征黑名单

使用示例:

# 导入相关库
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

# 自定义数据集
data = ["第一个句子","第二个句子"]
def cut_words(str):
    return " ".join(list(jieba.cut(str)))

# 给data里的句子分词
data = [cut_words(i) for i in data]

# 创建TF-IDF向量化器
tool = TfidfVectorizer()

# 拟合并转换数据集
data_new = tool.fit_transform(data)

# 输出结果
print(tool.get_feature_names_out())
print(data_new.toarray())

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\Clocky7\AppData\Local\Temp\jieba.cache
Loading model cost 0.529 seconds.
Prefix dict has been built successfully.


['句子' '第一个' '第二个']
[[0.57973867 0.81480247 0.        ]
 [0.57973867 0.         0.81480247]]

可以看到,有几个句子(文档)就有几个列表,其中的数据表明对应词语在当前文档中的重要程度

扩展:

在sklearn库中 TF-IDF算法做了一些细节的优化:

- TfidfVectorizer 中,TF 默认是:直接使用一个词在文档中出现的次数也就是CountVectorizer的结果

- TfidfVectorizer 中,IDF 的默认计算公式是:

- 而且机器学习中还会进行归一化(L2归一化)处理

下面是手动实现TF-IDF算法的代码:

# 手动实现tfidf向量(跟上面的api实现出一样的效果)
import numpy as  np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.preprocessing import normalize
import jieba

data = ["第一个句子","第二个句子"]
def cut_words(str):
    return " ".join(list(jieba.cut(str)))

data = [cut_words(i) for i in data]

def tfidf(x):
    cv = CountVectorizer()
    # 获取词频
    tf = cv.fit_transform(x).toarray()
    # 计算idf
    idf = np.log((len(tf)+1)/(np.sum(tf!=0,axis=0)+1))+1
    tfidf = tf*idf
    # 归一化
    tfidf = normalize(tfidf, norm='l2', axis=1)
    return tfidf

data_new = tfidf(data)
print(data_new)

[[0.57973867 0.81480247 0.        ]
 [0.57973867 0.         0.81480247]]

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

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

相关文章

MySQL C API高效编程:C语言实现数据库操作的深入解析

知识点【MySQL C API】 1、头文件及MYSQL * 句柄 //头文件 #include <mysql/mysql.h>1、MYSQL MYSQL是一个结构体&#xff0c;封装了与数据库连接相关的所有状态&#xff0c;配置和数据。 2、MYSQL *的本质 类似于 FILE*&#xff0c;代表一个与数据库连接的通道&…

MySQL初阶:数据库约束和表的设计

数据库约束 数据库约束是针对数据库中的表中的数据进行施加规则和条件&#xff0c;用于确保数据的准确性和可靠性。 数据库约束类型 1&#xff09;not null 非空类型 &#xff1a;指定非空类型的列不能存储null&#xff0c;如果插入的数据是null便会报错。 2&#xff09;de…

LeetCode 解题思路 47(最长回文子串、最长公共子序列)

解题思路&#xff1a; dp 数组的含义&#xff1a; dp[i][j] 是否为回文子串。递推公式&#xff1a; dp[i][j] s.charAt(i) s.charAt(j) && dp[i 1][j - 1]。dp 数组初始化&#xff1a; 单字符 dp[i][i] true&#xff0c;双字符 dp[i][i 1] s.charAt(i) s.charA…

嵌入式培训之C语言学习完(十七)结构体、共用体、枚举、typedef关键字与位运算

目录 一、结构体&#xff08;struct关键字&#xff09; &#xff08;一&#xff09;声明一个结构体数据类型 &#xff08;二&#xff09;结构体的成员初始化与赋值 a、结构体变量赋值 b、结构体成员初始化 c、结构体的定义形式 &#xff08;三&#xff09;考点&#xff…

《软件项目经济性论证报告模板:全面解析与策略建议》

《软件项目经济性论证报告模板:全面解析与策略建议》 一、引言 1.1 项目背景阐述 在数字化浪潮席卷全球的当下,各行业对软件的依赖程度日益加深。[行业名称] 行业也不例外,随着业务规模的不断扩张、业务复杂度的持续提升以及市场竞争的愈发激烈,对高效、智能、定制化软件…

关税冲击下,FBA国际物流企业如何靠智能拓客跑出增长“加速度”?

国际物流行业正迎来前所未有的增长机遇。据中研普华最新报告&#xff0c;2025年全球物流市场规模已突破6.27万亿美元&#xff0c;其中中国跨境物流市场预计达2.71万亿元。在全球化与数字化双轮驱动下&#xff0c;国际物流从“规模扩张”迈向“价值重构”。可以说&#xff0c;国…

vue源代码采用的设计模式分解

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…

使用 JavaScript 实现数据导出为 Excel 和 CSV 文件

在 Web 开发中&#xff0c;经常会遇到需要将数据导出为文件的需求&#xff0c;例如将数据导出为 Excel 或 CSV 文件。今天&#xff0c;我们就来探讨如何使用 JavaScript 实现这一功能。 一、实现思路 我们通过 HTML 创建一个按钮&#xff0c;点击按钮时&#xff0c;触发 Java…

eNSP中路由器RIP协议配置完整实验实验和命令解释

一、实验拓扑 二、配置命令 R1配置并先测试一下连通性 R1、R2和R3接口配置完后再测试连通性&#xff0c;直连路由可通 启动RIP进程&#xff0c;宣告直连网络 查看路由表&#xff0c;测试连通性 环回接口配置 三、命令解释及注意事项 配置命令逐行解释 system-view: 从用户视…

密码学--AES

一、实验目的 1、完成AES算法中1轮加密和解密操作 2、掌握AES的4个基本处理步骤 3、理解对称加密算法的“对称”思想 二、实验内容 1、题目内容描述 &#xff08;1&#xff09;利用C语言实现字节代换和逆向字节代换&#xff0c;字节查S盒代换 &#xff08;2&#xff09;利…

Vue项目中实现自定义连线图

需求描述 在vue项目中实现由自定义块元素组成的连线图。效果图 实现思路 Leader-Line 是一个用于 Web 的轻量级 JavaScript 库&#xff0c;专为创建从一个元素指向另一个元素的引导线而设计。它提供了高度自定义的能力&#xff0c;使得开发者能够轻松地在网页上实现各种指引用…

C++编程语言:标准库:标准库概观(Bjarne Stroustrup)

第30章 标准库概观(Standard-Library Overview) 目录 30.1 引言 30.1.1 标准库设施 30.1.2 设计约束 30.1.3 描述风格 30.2 头文件 30.3 语言支持 30.3.1 对initializer_list的支持 30.3.2 对范围for的支持 30.4 异常处理 30.4.1 异常 30.4.1…

Shiro(八):JWT介绍

1、什么是JWT&#xff1f; JWT&#xff08;JSON Web Token&#xff0c;JSON Web令牌&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应 用环境间安全地传递声明&#xff08;claims&#xff09;作为JSON对象&#xff1b;JWT会按指定的加密算…

【HDLBits刷题】Verilog Language——1.Basics

目录 一、题目与题解 1.Simple wire&#xff08;简单导线&#xff09; 2.Four wires&#xff08;4线&#xff09; 3.Inverter&#xff08;逆变器&#xff08;非门&#xff09;&#xff09; 4.AND gate &#xff08;与门&#xff09; 5. NOR gate &#xff08;或非门&am…

Python 常用内置函数详解(十):help()函数——查看对象的帮助信息

目录 一、语法参考二、示例 一、语法参考 help() 函数的语法格式如下&#xff1a; 参数说明&#xff1a; request&#xff1a;可选参数&#xff0c;要查看其帮助信息的对象&#xff0c;如类、函数、模块、数据类型等&#xff1b;返回值&#xff1a;返回对象的帮助信息。 二…

【Python系列】Python 中的 HTTP 请求处理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

辉芒微离线烧录器“文件格式错误”问题解决

最近在使用辉芒微离线烧录器烧录程序时&#xff0c;提示“文件格式错误”&#xff0c;记录一下解决方法。 一、问题现象 经过多次尝试和排查&#xff0c;发现以下几种情况&#xff1a; 情况一&#xff1a;使用离线烧录器导入固件1&#xff08;boot程序&#xff09;&#xff0c…

【软件设计师:体系结构】15.计算机体系结构概论

计算机体系结构是指计算机系统的功能和属性,是程序员所看到的计算机的属性。它主要研究计算机体系的概念性结构和功能特性,包括指令集、数据类型、存储器寻址技术、I/O机制等。例如,计算机是否具备乘法指令的功能,这是一个体系结构的问题。 一、机内代码及运算 一、数的进…

vscode 配置doxygen注释和snippet

vscode 配置doxygen注释和snippet Doxygen的C/C注释原则 基于Doxygen的C/C注释原则 标注总述 1.文件头标注 2. 命名空间标注 3. 类、结构、枚举标注 4. 函数注释原则 5. 变量注释 6. 模块标注 7. 分组标注指令表格 命令字段名语法file文件名file [< name >]brief简介b…

HarmonyOS NEXT 免费无广告看电影app:从想法到实现的经验总结

学习一项新技能&#xff0c;最好也是最快的方法就是动手实战。学习鸿蒙也一样&#xff0c;给自己定一个小目标&#xff0c;直接找项目练,这样进步是最快的。最近&#xff0c;我在网上看到360周董的一句话&#xff1a;“想干什么就去干&#xff0c;干得烂总比不干强&#xff01;…