机器学习基础之《特征工程(3)—特征预处理》

一、什么是特征预处理

通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程

处理前,特征值是数值,处理后,进行了特征缩放

1、包含内容
数值型数据的无量纲化:
归一化
标准化

2、特征预处理API
sklearn.preprocessing

3、为什么我们要进行归一化/标准化
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
因为很多数据量纲不一致

可以看到里程数数值比较大,消耗时间比数值比较小
用KNN算法计算欧氏距离公式时,最终结果被里程数左右,学习不到其他特征了
(72993 - 35948) ^ 2 + (10.14 - 6.83) ^ 2 + (1.03 - 1.21) ^ 2

我们需要用到一些方法进行无量纲化,使不同规格的数据转换到同一规格

4、什么是欧氏距离公式

5、无量纲化
之所以要做无量纲化的处理,就是因为量纲不统一,导致了里程数数值非常的大。为了让特征同等重要,要做归一化/标准化

二、归一化

1、定义
通过对原始数据进行变换把数据映射到(默认为[0,1])之间

2、公式

3、API函数
sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1)...)

4、MinMaxScaler.fit_transform(X)
X:numpy array格式的数据[n_samples, n_features]
n_samples:有几行数据,样本数
n_features:有几个特征,有几列
返回值:转换后的形状相同的array

5、归一化处理dating.txt中的数据

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler
import jieba
import pandas as pddef datasets_demo():"""sklearn数据集使用"""#获取数据集iris = load_iris()print("鸢尾花数据集:\n", iris)print("查看数据集描述:\n", iris["DESCR"])print("查看特征值的名字:\n", iris.feature_names)print("查看特征值几行几列:\n", iris.data.shape)#数据集的划分x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)print("训练集的特征值:\n", x_train, x_train.shape)return Nonedef dict_demo():"""字典特征抽取"""data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]# 1、实例化一个转换器类transfer = DictVectorizer(sparse=False)# 2、调用fit_transform()data_new = transfer.fit_transform(data)print("data_new:\n", data_new)print("特征名字:\n", transfer.get_feature_names())return Nonedef count_demo():"""文本特征抽取"""data = ["life is short,i like like python", "life is too long,i dislike python"]# 1、实例化一个转换器类transfer = CountVectorizer()# 2、调用fit_transform()data_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names()) return Nonedef count_chinese_demo():"""中文文本特征抽取"""data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]# 1、实例化一个转换器类transfer = CountVectorizer()# 2、调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray());print("特征名字:\n", transfer.get_feature_names())return Nonedef cut_word(text):"""进行中文分词"""return " ".join(list(jieba.cut(text)))  #返回一个分词生成器对象,强转成list,再join转成字符串def count_chinese_demo2():"""中文文本特征抽取,自动分词"""# 1、将中文文本进行分词data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年前之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new = []for sent in data:data_new.append(cut_word(sent))print(data_new)# 2、实例化一个转换器类transfer = CountVectorizer()# 3、调用fit_transform()data_final = transfer.fit_transform(data_new)print("data_final:\n", data_final.toarray())print("特征名字:\n", transfer.get_feature_names())return Nonedef tfidf_demo():"""用tf-idf的方法进行文本特征抽取"""# 1、将中文文本进行分词data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年前之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new = []for sent in data:data_new.append(cut_word(sent))print(data_new)# 2、实例化一个转换器类transfer = TfidfVectorizer()# 3、调用fit_transform()data_final = transfer.fit_transform(data_new)print("data_final:\n", data_final.toarray())print("特征名字:\n", transfer.get_feature_names())return Nonedef minmax_demo():"""归一化"""# 1、获取数据data = pd.read_csv("dating.txt")#print("data:\n", data)data = data.iloc[:, 0:3] #行都要,列取前3列print("data:\n", data)# 2、实例化一个转换器transfer = MinMaxScaler()# 3、调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return Noneif __name__ == "__main__":# 代码1:sklearn数据集使用#datasets_demo()# 代码2:字典特征抽取#dict_demo()# 代码3:文本特征抽取#count_demo()# 代码4:中文文本特征抽取#count_chinese_demo()# 代码5:中文文本特征抽取,自动分词#count_chinese_demo2()# 代码6: 测试jieba库中文分词#print(cut_word("我爱北京天安门"))# 代码7:用tf-idf的方法进行文本特征抽取#tfidf_demo()# 代码8:归一化minmax_demo()

运行结果:

data:milage     liters  consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
984   11145   3.410627    0.631838
985   68846   9.974715    0.669787
986   26575  10.650102    0.866627
987   48111   9.134528    0.728045
988   43757   7.882601    1.332446[989 rows x 3 columns]
data_new:[[0.44832535 0.39805139 0.56233353][0.15873259 0.34195467 0.98724416][0.28542943 0.06892523 0.47449629]...[0.29115949 0.50910294 0.51079493][0.52711097 0.43665451 0.4290048 ][0.47940793 0.3768091  0.78571804]]

三、标准化

1、归一化有什么缺点
归一化结果是根据最小值和最大值求出来的,如果数据中异常点较多,最大值和最小值非常容易受异常点影响
所以这种方法鲁棒性(健壮性)较差,只适合传统精确小数据场景

2、定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

3、公式

用数据减去这一列的平均值,除以标准差

4、什么是标准差

5、API函数
sklearn.preprocessing.StandardScaler()
处理后,对每列来说,所有数据都聚集在均值为0附近,标准差为1

6、StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples, n_features]
返回值:转换后的形状相同的array

7、标准化处理dating.txt中的数据

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import jieba
import pandas as pddef datasets_demo():"""sklearn数据集使用"""#获取数据集iris = load_iris()print("鸢尾花数据集:\n", iris)print("查看数据集描述:\n", iris["DESCR"])print("查看特征值的名字:\n", iris.feature_names)print("查看特征值几行几列:\n", iris.data.shape)#数据集的划分x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)print("训练集的特征值:\n", x_train, x_train.shape)return Nonedef dict_demo():"""字典特征抽取"""data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]# 1、实例化一个转换器类transfer = DictVectorizer(sparse=False)# 2、调用fit_transform()data_new = transfer.fit_transform(data)print("data_new:\n", data_new)print("特征名字:\n", transfer.get_feature_names())return Nonedef count_demo():"""文本特征抽取"""data = ["life is short,i like like python", "life is too long,i dislike python"]# 1、实例化一个转换器类transfer = CountVectorizer()# 2、调用fit_transform()data_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names()) return Nonedef count_chinese_demo():"""中文文本特征抽取"""data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]# 1、实例化一个转换器类transfer = CountVectorizer()# 2、调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray());print("特征名字:\n", transfer.get_feature_names())return Nonedef cut_word(text):"""进行中文分词"""return " ".join(list(jieba.cut(text)))  #返回一个分词生成器对象,强转成list,再join转成字符串def count_chinese_demo2():"""中文文本特征抽取,自动分词"""# 1、将中文文本进行分词data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年前之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new = []for sent in data:data_new.append(cut_word(sent))print(data_new)# 2、实例化一个转换器类transfer = CountVectorizer()# 3、调用fit_transform()data_final = transfer.fit_transform(data_new)print("data_final:\n", data_final.toarray())print("特征名字:\n", transfer.get_feature_names())return Nonedef tfidf_demo():"""用tf-idf的方法进行文本特征抽取"""# 1、将中文文本进行分词data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年前之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new = []for sent in data:data_new.append(cut_word(sent))print(data_new)# 2、实例化一个转换器类transfer = TfidfVectorizer()# 3、调用fit_transform()data_final = transfer.fit_transform(data_new)print("data_final:\n", data_final.toarray())print("特征名字:\n", transfer.get_feature_names())return Nonedef minmax_demo():"""归一化"""# 1、获取数据data = pd.read_csv("dating.txt")#print("data:\n", data)data = data.iloc[:, 0:3] #行都要,列取前3列print("data:\n", data)# 2、实例化一个转换器transfer = MinMaxScaler()# 3、调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return Nonedef stand_demo():"""标准化"""# 1、获取数据data = pd.read_csv("dating.txt")#print("data:\n", data)data = data.iloc[:, 0:3] #行都要,列取前3列print("data:\n", data)# 2、实例化一个转换器transfer = StandardScaler()# 3、调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return Noneif __name__ == "__main__":# 代码1:sklearn数据集使用#datasets_demo()# 代码2:字典特征抽取#dict_demo()# 代码3:文本特征抽取#count_demo()# 代码4:中文文本特征抽取#count_chinese_demo()# 代码5:中文文本特征抽取,自动分词#count_chinese_demo2()# 代码6: 测试jieba库中文分词#print(cut_word("我爱北京天安门"))# 代码7:用tf-idf的方法进行文本特征抽取#tfidf_demo()# 代码8:归一化#minmax_demo()# 代码9:标准化stand_demo()

运行结果:

data:milage     liters  consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
984   11145   3.410627    0.631838
985   68846   9.974715    0.669787
986   26575  10.650102    0.866627
987   48111   9.134528    0.728045
988   43757   7.882601    1.332446[989 rows x 3 columns]
data_new:[[ 0.33984938  0.42024644  0.2460588 ][-0.86581884  0.14356328  1.69344575][-0.338339   -1.2030865  -0.05314407]...[-0.31448289  0.96798056  0.07050117][ 0.66785937  0.61064669 -0.2081032 ][ 0.46925618  0.31547409  1.00698075]]

8、标准化小结
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
 

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

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

相关文章

什么是训练数据?

算法从数据中学习。算法从得到的训练数据中找到关系,形成理解,做出决策,并评估信心。训练数据越好,模型的表现就越好。 实际上,与算法本身一样,训练数据的质量和数量与数据项目的成功有很大关系。 现在&…

Java项目作业~ 通过html+Servlet+MyBatis,完成站点信息的添加功能

需求: 通过htmlServletMyBatis,完成站点信息的添加功能。 以下是站点表的建表语句: CREATE TABLE websites (id int(11) NOT NULL AUTO_INCREMENT,name char(20) NOT NULL DEFAULT COMMENT 站点名称,url varchar(255) NOT NULL DEFAULT ,…

html2canvas截图生成图片并保存到本地的解决方案

html2canvas截图生成图片并保存到本地的解决方案 一、构建HTML容器二、html2canvas截图封装函数避坑指南1.尺寸过大而无法成功生成图片 html2canvas是一款JavaScript插件,能够将网页上的HTML元素转化为Canvas对象,从而可以将网页截图输出为图片或者PDF文…

Go学习第八天

签名 func (a *Account) Sign(message []byte) ([]byte, error) {hash : crypto.Keccak256Hash(message)signature, err : crypto.Sign(hash.Bytes(), a.privateKeyECDSA)if err ! nil {log.Fatal(err)}signMsg : []byte(hexutil.Encode(signature))return signMsg, err }验签…

CentOS7 安装远程桌面

换源 设置镜像源为清华源: sudo sed -e s|^mirrorlist|#mirrorlist|g \-e s|^#baseurlhttp://mirror.centos.org/centos|baseurlhttps://mirrors.tuna.tsinghua.edu.cn/centos|g \-i.bak \/etc/yum.repos.d/CentOS-*.repo详见 https://mirrors.tuna.tsinghua.edu.…

函数与方法有区别?

有区别,当然是有区别。 不管是java、rust还是go,他们都是不一样的。 先看定义: 函数(Function) 是一段独立的代码块,用于执行特定的任务。函数可以被多次调用,并且可以接受参数和返回结果。在G…

尼科彻斯定理

目录 1.题目概述 2.题解 思路分析 具体实现 1.题目概述 验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。 例如: 1^31 2^335 3^37911 4^313151719 输入一个正整数m(m≤100),将…

pytorch 训练过程内存泄露/显存泄露debug记录:dataloader和dataset导致的泄露

背景 微调 mask-rcnn 代码,用的是 torchvision.models.detection.maskrcnn_resnet50_fpn 代码,根据该代码的注释,输入应该是: images, targetsNone (List[Tensor], Optional[List[Dict[str, Tensor]]]) -> Tuple[Dict[str, Te…

【大数据】-- 部署 Flink kubernetes operator

目录 1.说明 1.1 版本 1.2 kubernetes 环境 1.3 参考 2.安装步骤 2.1 安装本地 kubernetes 环境

Oracle 使用 CONNECT_BY_ROOT 解锁层次结构洞察:在 SQL 中导航数据关系

CONNECT_BY_ROOT 是一个在 Oracle 数据库中使用的特殊函数,它通常用于在层次查询中获取根节点的值。在使用 CONNECT BY 子句进行层次查询时,通过 CONNECT_BY_ROOT 函数,你可以在每一行中获取根节点的值,而不仅仅是当前行的值。 假…

Vue3 实现产品图片放大器

Vue3 实现类似淘宝、京东产品详情图片放大器功能 环境&#xff1a;vue3tsvite 1.创建picShow.vue组件 <script lang"ts" setup> import {ref, computed} from vue import {useMouseInElement} from vueuse/core/*获取父组件的传值*/ defineProps<{images:…

从支付或退款之回调处理的设计,看一看抽象类的使用场景

一、背景 抽象类&#xff0c;包含抽象方法和实例方法&#xff0c;抽象方法待继承类去实例化&#xff0c;正是利用该特性&#xff0c;以满足不同支付渠道的差异化需求。 我们在做多渠道支付的时候&#xff0c;接收支付或退款的回调报文&#xff0c;然后去处理。这就意味着&…

【python 深度学习】解决遇到的问题

目录 一、RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb 二、AttributeError: module ‘tensorflow’ has no attribute ‘flags’ 三、conda 更新 Please update conda by running 四、to search for alternate channels that…

Tomcat部署SpringBoot项目

1.修改打包方式 pom.xml 里 加上 <packaging>war</packaging>2.移除内嵌的Tomcat <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope…

Java-jar和war包的区别

jar包和war包的区别&#xff1a; 1、war是一个web模块&#xff0c;其中需要包括WEB-INF&#xff0c;是可以直接运行的WEB模块&#xff1b;jar一般只是包括一些class文件&#xff0c;在声明了Main_class之后是可以用java命令运行的。 2、war包是做好一个web应用后&#xff0c;通…

Kubernetes 调度 约束

调度约束 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和 Container。 APIServer…

腾讯云轻量应用服务器和云服务器有什么区别?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

饿了么输入框限制只能输入数字,并且保留小数

可以使用饿了么ui中的input-number组件实现输入框只能输入数字&#xff0c;这样就不能输入数字以外的&#xff0c;controls隐藏输入框左右俩边的加减按钮&#xff0c;precision小数点保留多少位&#xff0c;2则是俩位&#xff0c;但是会导致默认值为0.00的情况&#xff0c;俩种…

开源数据库Mysql_DBA运维实战 (DDL语句)

DDL DDL语句 数据库定义语言&#xff1a;数据库、表、视图、索引、存储过程. 例如:CREATE DROP ALTER DDL库 定义库{ 创建业务数据库&#xff1a;CREAATE DATABASE ___数据库名___ ; 数据库名要求{ a.区分大小写 b.唯一性 c.不能使用关键字如 create select d.不能单独使用…

图像识别模型与训练策略

图像预处理 1.需要将图像Resize到相同大小输入到卷积网络中 2.翻转、裁剪、色彩偏移等操作 3.转化为Tensor数据格式 4.对RGB三种颜色通道进行标准化 data_transforms {train: transforms.Compose([transforms.Resize([96, 96]),transforms.RandomRotation(45),#随机旋转&…