1 类别特征编码
类别特征编码和标签编码区别:
特征编码:1,顺序编码:OrdinalEncoder()
2,独热编码:OneHotEncoder()
标签编码:1, 二值编码:LabelBinarizer()
2,标签编码:LabelEncoder()
不要混淆。
1.1 特征编码:
示例1:伪代码
from sklearn.preprocessing import OrdinalEncoder
import pandas as pd
#1,导入数据
file_path=r" "
fd=pd.read_csv(file_path)
#2,申明使用的方法
oe=OrdinalEncoder()
#3,转换
fd_transrormed=oe.fit_transform(fd) #转换前几列将fd改成fd.iloc[:,1:4]
# 4,将转换后的数据再次发回原始数据中
fd.iloc[:,1:4]=fd_transrormed
print(fd)
示例2:伪代码
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
import numpy as np
#1 导入数据
file_path=r" "
fd=pd.read_csv(file_path)
#2 用什么方法
ohe = OneHotEncoder()
#3 转换数据
fd_transrormed=ohe.fit_transform(fd.iloc[:,1:4]).toarray#转化为np数组
fd_transrormed2=ohe.categories_ #显示编码每列对应的名字
fd_transrormed3 =ohe.get_feature_names()
#将np格式的二维数组转化为pandas格式数据
fd_transrormed4=pd.DataFrame(fd_transrormed,columns=['不开朗','开朗',
'不爱运动','爱运动',
'皮肤不白','皮肤白'])
#4 替换原来数据
fd2=fd.drop(['是否开朗','是否爱运动','是否皮肤白'],axis=1)
fd3=pd.concat((fd2,fd_transrormed4),axis=1)#行
order=['姓名','不开朗','开朗','不爱运动','爱运动','皮肤不白','皮肤白','身高(cm)','体重(kg)','是否被认为帅哥']
fd4=fd3[order]
print(fd4)
1.2 标签编码
标签二值化:LabelBinarizer–是一个用来从多类别列表创建标签矩阵的工具类。
from sklearn.preprocessing import LabelBinarizer
lb=LabelBinarizer()
lb.fit([1,2,6,4,2])
lb_class=lb.classes_ #查看标签名称
print(lb_class)
lb_transformed=lb.transform([1,6])
print(lb_transformed)
···································
输出:
[1 2 4 6]
[[1 0 0 0]
[0 0 0 1]]
当预测的标签有两种以上的情况,就要用到标签编码
import pandas as pd
from sklearn.preprocessing import LabelEncoder
#1 导入数据
file_path=r" "
df=pd.read_csv(file_path)
#2 用哪个方法
le=LabelEncoder()
#3 转换数据
df_transformed=le.fit_transform(df.iloc[:,-1])
df.iloc([:,-1])=df_transformed
print(df)
print(df.class_)
1.3标签离散化
离散化其实是对连续特征进行离散化(量化或装箱),离散化可以把连续属性的数据集变换成只有名义属性(名称属性,名义属性,符号属性,离散属性等)的数据集。
One-hot编码的离散化特征,可以使得一个模型更加的有表现力,同时还能保留其可解释性。比如:用离散化器进行处理可以给线性模型引入非线性。
1.3.1 离散化方法一:K-bins离散化
KBinsDiscretizer类使用k个等宽的bins把特征离散化
import pandas as pd
from sklearn.preprocessing import KBinsDiscretizer
#1 导入数据
file_path=r" "
df=pd.read_csv(file_path)
#2 用哪个方法
kb=KBinsDiscretizer() #kb=KBinsDiscretizer(strategy='uniform')每组的宽度一样,默认是'quantile'每一组的个数是一样的
#3 转换数据
df_tansform=kb.fit_transform(df.iloc[:,7:9]).toarray())
print(kb.bin_edges_) #查看每一组的边界
#4 替换到原来数组
df.iloc[:,7:9])=df_tansform
#5 保存
file_path=r""
df=pd.to_csv(file_path,index=0)
1.3.2 离散化方法二:特征二值化
分为两类。
import numpy as np
import pandas as pd
from sklearn.preprocessing import Binarizer()
file_path=r" "
df=pd.read_csv(file_path)
b=Binarizer(threshold=[160.0,70.0])#括号里,threshold=[]表示门槛,当二值化多个列时,threshold可以以列表的形式。
df_transformed=b.fit_transform(df.iloc[:,7:9])
df.iloc[:,7:9]=df_transformed
print(df)