人工智能学习3(特征变换:特征数值化)

编译工具:PyCharm

有些编译工具不用写print可以直接将数据打印出来,pycharm需要写print才会打印出来。

文章目录

      • 编译工具:PyCharm
  • 概念
    • 1.特征类型
      • 分类型
      • 二值型
      • 顺序型
      • 数值型
    • 2.特征数值化练习1
    • 3.特征数值化练习2
    • 4.特征二值化
      • 使用sklearn库自带的Binarizer实现二值化需要注意的点
      • 练习:创建100个正态分布的随机数,并且实现二值化
      • 练习:对图片数据进行二值化
    • OneHot编码
      • 练习
      • sklearn中的OneHotEncoder也提供了实现OneHot编码的方法

概念

1.特征类型

特征的类型:“离散型”“连续型”
机器学习算法对特征的类型是有要求的,不是任意类型的特征都可以随意放入任何算法中。
通过特征变换后,数据的可解释性得到提高。
连续型特征就是具体的数值,如温度、长度
离散型分为分类型、二值型、顺序型特征

分类型

用于表示类别,每个值表示一种单独的类别,并且不同值之间没有顺序和大小之分,如"在职"、“离职”,可以用"0","1"来表示。
数据挖掘领域中,分类型特征被称为“标称属性”。

二值型

特征值只有两种状态,如0,1;显然是分类型的,二值型特征也称为“二元型特征”或“布尔型特征”

顺序型

可以是数字也可以是对连续型特征离散化而得到如将学生的成绩划分等级A(90-100)、B(75-90)、C(60-75)

数值型

整数/浮点数

2.特征数值化练习1

将一些算法不理解的特征值转化为数值型,实现数值化
在这里插入图片描述

# 将一些算法不理解的特征值转化为数值型,实现数值化
import pandas as pd
print("-------特征数值化-------")
df = pd.DataFrame({
    "total_bill":[34.3,27.05,48.17,41.16,29.85,20.69,30.46,28.15,24.59,25.29],
    "tip":[6.7,5,5,5,5.14,5,2,3,3.61,4.71],
    "gender":["Male","Female","Male","Male","Female","Male","Male","Male","Female","Male"],
    "smoker":["No","No","No","No","No","No","Yes","Yes","No","No"]
})
print("-------原始数据-------")
print(df)
print("-------通过replace进行特征数值化---------")
print(df.replace({"Male": 1, "Female": 0, "Yes": 1, "No": 0}))
# 没有sklearn库的先安装,scikit-learn
print("-------通过sklearn库内置方法进行特征数值化---------")
from sklearn.preprocessing import LabelEncoder
day = ["Thur","Thur","Fri","Thur","Sun","Thur","Sun","Sat","Sun","Sun","Thur","Thur","Fri","Sun"]
print("原始数据1: ")
print(day)
le = LabelEncoder()
print("调用sklearn中的LabelEncoder中的方法实现特征化: ")
print(le.fit_transform(day))
print("用LabelEncoder来获取到原始的字符串,即实现'反向取值'的方法: ")
day_new = le.inverse_transform([0,1,2,3]) # 这里的le已经被训练好了,所以可以取到特征化之前的数值
print(day_new)
print("原始数据2: ")
nums = [2001,10001,3000,10001]
print(nums)
print("调用fit_transform后: ")
print(le.fit_transform(nums))
print("实现'反向取值':")
print(le.inverse_transform([1]))  # 写的时候不能直接写1,要写[1]

运行结果:
在这里插入图片描述
使用sklearn库中的内置方法
在这里插入图片描述

3.特征数值化练习2

某办公室电子设备数据如下
data=[‘笔记本’,‘台式本’,‘手机’,‘台式机’,‘平板电脑’]
需要用这些数据创建特征数值化模型,然后用该模型对下面的数据集进行特征变换。
data_test=[‘平板电脑’,‘手机’,‘台式机’,‘台式机’]

print()
print("------------------练习2----------------")
from sklearn.preprocessing import LabelEncoder
data=['笔记本','台式本','手机','台式机','平板电脑']
data_test=['平板电脑','手机','台式机','台式机']
# 对data特征化,创建特征数值化模型
le = LabelEncoder()
le.fit(data)
# 查看类别信息
print(le.classes_)
# 用训练好的模型对新的数据进行特征化
print(le.transform(data_test))

运行结果:
在这里插入图片描述

4.特征二值化

sklearn库提供Binarizer可以实现二值化
from sklearn.preprocessing import Binarizer

print("-----------特征二值化------------")
import numpy as np
tips = [19.65,10.33,21.50,14.52,11.02,15.77,40.55,30.06,14.07,18.35]
print(tips)
# np.mean(tips)求tips数组的平均值
# np.where中三个参数,判断第一个参数为true则取第二个参数,为false取第三个参数
tips = np.where(tips>np.mean(tips),1,0)
print("二值化后: ")
print(tips)
# sklearn库中二值化模块实现二值化
from sklearn.preprocessing import Binarizer
data2 = {
    'tips':[19.65,10.33,21.50,14.52,11.02,15.77,40.55,30.06,14.07,18.35],
    'sex':['Male','Male','Male','Female','Male','Male','Male','Male','Male','Male']
}
df2 = pd.DataFrame(data2,columns=['tips','sex'])
print("使用sklearn库: ")
# average = np.mean(data2['tips'])
average = df2['tips'].mean()
# 设置阈值
bn = Binarizer(threshold=average)
# 需要注意的是,不可直接这样子写
# result = bn.fit_transform(df2['tips'])
# df2[['tips']]返回的是一个DataFrame对象,是二位数据
# df2['tips']是一维数据
data_temp = df2[['tips']]
result = bn.fit_transform(data_temp)
print(result)
# 使用binarize方法
print("使用binarize方法")
from sklearn.preprocessing import binarize
fbin = binarize(df2[['tips']],threshold=df2['tips'].mean())
print(fbin)

在这里插入图片描述

使用sklearn库自带的Binarizer实现二值化需要注意的点

sklearn需要传入一个二维数据,但是df2[‘tips’]得到的其实是一个一维的数据,可以通过以下方法将一个一维的数据转化为二维的数据使用(一行变为一列 1xm 变为 mx1)。

# 一维数据转变为二维的数据
# df2[['tips']]返回的是一个DataFrame对象,是二位数据
# df2['tips']是一维数据
tra1 = df2['tips']
tra2 = df2[['tips']]
tra3 = df2['tips'].values.reshape((-1,1)).shape
print(tra1)
print(type(tra1))
print(tra2)
print(type(tra2))
print(tra3)
print(type(tra3))

在这里插入图片描述

练习:创建100个正态分布的随机数,并且实现二值化

print("-------练习2:创建100个正态分布的随机数,并且实现二值化------")
import numpy as np
from sklearn.preprocessing import Binarizer
# normal 是正态的意思,loc=0表示以y轴为对称轴的状态分布,scale越大,正态分布曲线矮胖,越小高瘦
nor = np.random.normal(loc=0,scale=1.0,size=100)
# 可以看到nor是一个一维的数据
print(nor)
data_temp = nor.reshape(-1,1)
# 打印转化后的数据的前十行以及所有的列
print(data_temp[:10,:])
# 如果没有设置阈值threshold,则默认为0
nor_bin=Binarizer().fit_transform(data_temp)
print(nor_bin[:10, :])

在这里插入图片描述
在这里插入图片描述

练习:对图片数据进行二值化

对彩色图片需要对红绿蓝这三个通道进行调整,因为openCV在读取图片的时候,认为图片存储通道顺序是bgr,但是正常显示图片的顺序是rgb。
如果不修改就显示图片的话,图片的颜色是错乱的。
图片二值化目标:区分出前景和背景。
需要先把图片灰度化,然后再对每个像素点进行二值化
每一个像素点实际上存储的是一个数字,从0~255,0表示纯黑,255表示纯白

print("----------练习3:对图像数据二值化------------")
import matplotlib.pyplot as plt
import cv2
def show_img(img):
    if len(img.shape)==3:       # 用于判断图像是否为灰度图或彩色图(判断图像通道数)
        b,g,r = cv2.split(img)  # 拆分通道
        img=cv2.merge([r,g,b])
        plt.imshow(img)
    else:
        plt.imshow(img,cmap="gray")
    plt.axis("off") # 关闭坐标轴
    plt.show()
image = cv2.imread("./img/spider-man.png")
show_img(image)
# 对图片灰度化
gray_image= cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
show_img(gray_image)
# 对灰度化的像素点进行二值化
# 127是手动设置的阈值(0-255中间值为127,可以设置其他值),255是大于阈值时显示的值
ret,thr = cv2.threshold(gray_image,127,255,cv2.THRESH_BINARY)
show_img(thr)

将图片正常显示
在这里插入图片描述

灰度化后图片显示
在这里插入图片描述

二值化后图片显示
在这里插入图片描述

OneHot编码

one-hot编码也叫独热编码。
基本思想:将离散化特征的每一种取值都看成一种状态,如果一个特征中由N中取值,就可以将该特征抽象成N种不同的状态,one-hot编码保证每一个取值只会使得一种状态处于“激活态”,就是说这N种状态只有一个状态位值为1,其他状态位为0.
例如:三种类型:猫、狗、乌龟
猫编码:[1,0,0]
狗编码:[0,1,0]
乌龟:[0,0,1]
pandas中的get_dummies方法可以将分类型特征转化为“虚拟变量”(哑变量),就是将数据转换为one-hot编码

print("----------------OneHot独热编码---------------------")
import pandas as pd
color = pd.DataFrame({"color":["red","green","green","red","green"]})
print(color)
# 特征提取
print(pd.get_dummies(color))

01表示了red,10标识green
在这里插入图片描述
可以添加前导字符,通过设定prefix='xxx’即可

练习

print("-------练习1:生成独热编码-------")
data = {
    "grade":['A','B','B','A','A'],
    "size":['L','XXL','XXL','L','L']
}
df = pd.DataFrame(data)
print(df)
print(pd.get_dummies(df))

可以理解为,输入grade_A则为True,不属于则为False。10标识了A,01标识了B;10标识了L,01表示了XXL
在这里插入图片描述
可以看到都是通过10,01或者是100,010,001来标识的,没有000,所以我们可以通过去掉一列然后引入000来标识一个类型,例如:

print("--------去除第一列,通过000来标识为A--------")
shirt=pd.DataFrame({"grade":["A","A","D","C","B","B"]})
print("未去列之前:")
print(pd.get_dummies(shirt))
print("去列后:")
print(pd.get_dummies(shirt,drop_first=True))

在这里插入图片描述

sklearn中的OneHotEncoder也提供了实现OneHot编码的方法

print("-----------通过sklearn中提供的方法实现one-hot编码------------")
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
features = ohe.fit_transform(shirt)
print(features.toarray())
# OneHotEncoder中没有提供类似于drop_first的方法
# 可以通过numpy切片解决舍弃第一列
print(features.toarray()[:,1:])

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信号是怎么搞到电磁波上面去的呢?

在之前的文章中,我们曾多次讲到电磁波的美妙,但是有了电磁波就可以通信了吗? No,我们要把信息加载到电磁波上,这个电磁波就可以作为信息的载体来工作了。可是信号是怎么加载到电磁波上的呢? 今天我们一起…

Javafx实现浏览器

浏览器是一种计算机程序,主要用于显示互联网上的网页。通过浏览器,用户可以访问各种网站、搜索引擎、在线应用程序、社交媒体等。常见的浏览器包括Google Chrome、Mozilla Firefox、Safari、Microsoft Edge、Opera等。浏览器的功能不仅限于浏览网页&…

无线网卡填坑记

没想到我安装无线网卡这么波澜起伏~ 起因 近来刚在电脑上玩完了 Dishonored 2,紧接着继续着我的刺客信条之旅。总是觉得键盘鼠标玩起来不爽,还是手柄玩这种游戏才舒服。突然,灵光一现,我想到正好有闲置的 Switch 掌机没怎么玩&am…

【代码随想录】算法训练计划39

dp 1、62. 不同路径 题目: 求路径方案多少个 思路: 这道题就有点dp了哈 func uniquePaths(m int, n int) int {//dp,写过,代表的是多少种// 初始化dp : make([][]int, m)for i : range dp {dp[i] make([]int, n)dp[i][0] 1 // 代表到…

【数据结构】图<简单认识图>

对于下面的内容,大家着重观察和理解图即可,可以直接绕过一些文字性的概念,对图有一个大概的认识。 图 简单认识图图的定义有向图和无向图完全图无向完全图有向完全图 图的基本存储结构邻接矩阵存储邻接矩阵的优点 网络的邻接矩阵邻接表无向图…

看懂lscpu的输出

文章目录 1. lscpu1.1 Architecture1.2 逻辑核心数1.3 缓存1.4 CPU型号1.5 NUMA架构1.5.1 CPU多核架构1.5.2 多CPU Socket架构 2. cat /proc/cpuinfo2.1 关键字段 1. lscpu 通过lscpu查看当前系统的CPU信息。 [hadoopserver3 ~]$ lscpuArchitecture: x86_64 …

混音编曲软件tudio One 6.5.1 保姆级安装教程

根据软件大数据显示De-Esser驯服人声嘶嘶声和其他高频声音,和其他 Studio One 中新的去实体插件一样高效且直观易用,使用“收听”按钮查找有问题的频率,然后使用相关的旋钮和 S-Mon 功能拨入 S-Reduce 量即可。实际上我们可以这样讲工作流和协…

Linux(15):SELinux 初探

什么是 SELinux SELinux 是【Security Enhanced Linux】的缩写,字面上的意义就是安全强化的 Linux。 SELinux 是由美国国家安全局(NSA)开发的,开发原因:因为很多企业界发现,通常系统出现问题的原因大部分都在于【内部员工的资源…

Redis的三种消息队列实现方式

目录 前言 List实现消息队列 PubSub消息队列 Stream消息队列 三种实现方式对比 前言 为什么要使用Redis的消息队列? 成本低,对于RabbitMQ或是Kafka来说,已经是重量级的消息队列。 Redis的三种实现方式: List结构&#xff1…

VSC改造MD编辑器及图床方案分享

VSC改造MD编辑器及图床方案分享 用了那么多md编辑器,到头来还是觉得VSC最好用。这次就来分享一下我的blog文件编辑流吧。 这篇文章包括:VSC下md功能扩展插件推荐、图床方案、blog文章管理方案 VSC插件 Markdown All in One Markdown Image - 粘粘图片…

在python的Scikit-learn库中,可以使用train_test_split函数来划分训练集和测试集。

文章目录 一、在Scikit-learn库中,可以使用train_test_split函数来划分训练集和测试集总结 一、在Scikit-learn库中,可以使用train_test_split函数来划分训练集和测试集 在Scikit-learn库中,可以使用train_test_split函数来划分训练集和测试…

【网络安全】红蓝对抗之企业互联网安全防护

01 什么是“红蓝对抗”? “红蓝对抗”最早起源于古罗马军队,在沙盘中用红色和蓝色来代表敌人和自己,他们认为蓝色代表勇敢和忠诚,红色代表血腥和暴力,所以选择用蓝色代表自己。 在中国,由于传统习俗与文化…

一、技术体系结构

本章概要 总体技术体系框架概念和理解 1.1 总体技术体系 单一架构一个项目,一个工程,导出为一个war包,在一个Tomcat上运行。也叫all in one。 单一架构,项目主要应用技术框架为:Spring , SpringMVC , Mybatis 分布…

Python如何传递任意数量的实参及什么是返回值

Python如何传递任意数量的实参 传递任意数量的实参 形参前加一个 * ,Python会创建一个已形参为名的空元组,将所有收到的值都放到这个元组中: def make_pizza(*toppings):print("\nMaking a pizza with the following toppings: "…

【ArcGIS Pro】探索性插值无法覆盖所需shp范围

做个小记录自用,实际不准。 1 看看就行 pro插值 看看过程就行。有详细过程,类似tutorial https://learn.arcgis.com/zh-cn/projects/interpolate-temperatures-using-the-geostatistical-wizard/ 2 注意用投影坐标系 wgs84转投影坐标系 https://blog…

SR锁存器—>带EN的SR锁存器—>D锁存器—>边沿触发式D触发器—>寄存器

其实选择与非门当做构成SR锁存器的基本逻辑电路是有漏洞的,所以才导致了后续的都为低电平的时候,Q和非Q都是亮起的。但是我们设计的初衷是:Q和非Q是互斥的,是不能同时亮起的,且为了达到这一点,要使得其中两…

用友NC JiuQiClientReqDispatch反序列化RCE漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC JiuQiClientReqDispatch 接口存在…

EasyRecovery14破解版 v14.0.0.4 官方免费版(含激活码)

软件介绍 EasyRecovery14高级版是一款功能强大的数据恢复软件,软件对比家庭版本它的使用更加广泛,在恢复数据方面软件可以做到最完整的损失恢复,无论是文档、音乐、软件都可以一键恢复,同时软件还可以对文件的名字、后缀进行修改…

龙芯loongarch64服务器编译安装tokenizers

1、简介 Hugging Face 的 Tokenizers 库提供了一种快速和高效的方式来处理(即分词)自然语言文本,用于后续的机器学习模型训练和推理。这个库提供了各种各样的预训练分词器,如 BPE、Byte-Pair Encoding (Byte-Level BPE)、WordPiece 等,这些都是现代 NLP 模型(如 BERT、GP…

浅谈ArrayBuffer、Blob和File、FileReader

ArrayBuffer、Blob和File都是JavaScript中处理二进制数据的对象。 ArrayBuffer 用于表示一个通用的、固定长度的原始二进制数据缓冲区。它不能直接操作缓冲区中的数据,而需要通过一个类型化数组TypedArray(如Int8Array、Uint8Array等)或者一…