本章将分享用独热编码的方式来处理离散型变量,本文的数据和方法学习自Python3《机器学习实战》学习笔记(三):决策树实战篇之为自己配个隐形眼镜_机器学习gain计算例题贷款申请样本_Jack-Cui的博客-CSDN博客
下面介绍一下读热编码:
独热编码(One-Hot Encoding)是一种常用的特征编码方法,用于将离散型的特征变量转换为机器学习算法可以处理的数值表示。
独热编码的基本思想是创建一个新的二进制特征变量,对原始特征的每个可能取值创建一个对应的新特征,然后用0和1表示该特征是否具有相应的取值。对于原始特征的每个可能取值,如果样本具有该取值,则对应的新特征取值为1,否则为0。
例如,假设我们有一个原始特征"颜色",可能的取值为{“红色”, “绿色”, “蓝色”}。通过独热编码,我们可以将该特征变为三个新特征:“颜色_红色”、“颜色_绿色"和"颜色_蓝色”。如果一个样本的颜色是绿色,则对应的独热编码表示为(0, 1, 0)。
下面,以一个实际案例来讲解如何对离散数据进行转化,并构建决策树模型学习转化之后的数据。
在下面这个函数中,serialization意为“序列化”,该函数的作用是对数据进行序列化
def serialization(fileName):
with open(fileName,'r',encoding='utf_8') as fr:
dataPurge=[Each_data.strip().split('\t') for Each_data in fr.readlines()]
# print(dataPurge)
pass
data_target = []
#删除第一列,因为第一列是序号
for i in dataPurge:
del i[0]
# print(dataPurge)
#得到每一个样本的标签
for i in dataPurge:
data_target.append(i[-1])
pass
print(data_target)
target=['age','job','house','credit']
data_list=[]
data_dict={}
#下面构建list对象,并以此构建dict对象,生成DataFrame
for each in target:
for eachdata in dataPurge:
data_list.append(eachdata[target.index(each)])
data_dict[each]=data_list
data_list=[]
pass
print("整合后的数据:")
print(data_dict)
#构建DataFrame对象
df=pd.DataFrame(data_dict)
print("序列化前:")
print(df)
#将DataFrame对象序列化
ser=LabelEncoder()#构建LabelEncoder对象用于序列化
for col in df.columns:
df[col]=ser.fit_transform(df[col])
pass
# print("序列化后:")
# print(df)
return df
总代码:
import pandas as pd
from sklearn.neural_network import MLPClassifier
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#设置默认使用中文字体
from sklearn import tree
from sklearn import datasets
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
def serialization(fileName):
with open(fileName,'r',encoding='utf_8') as fr:
dataPurge=[Each_data.strip().split('\t') for Each_data in fr.readlines()]
# print(dataPurge)
pass
data_target = []
#删除第一列,因为第一列是序号
for i in dataPurge:
del i[0]
# print(dataPurge)
#得到每一个样本的标签
for i in dataPurge:
data_target.append(i[-1])
pass
print(data_target)
target=['age','job','house','credit']
data_list=[]
data_dict={}
#下面构建list对象,并以此构建dict对象,生成DataFrame
for each in target:
for eachdata in dataPurge:
data_list.append(eachdata[target.index(each)])
data_dict[each]=data_list
data_list=[]
pass
print("整合后的数据:")
print(data_dict)
#构建DataFrame对象
df=pd.DataFrame(data_dict)
print("序列化前:")
print(df)
#将DataFrame对象序列化
ser=LabelEncoder()#构建LabelEncoder对象用于序列化
for col in df.columns:
df[col]=ser.fit_transform(df[col])
pass
# print("序列化后:")
# print(df)
return df
if __name__=='__main__':
data=serialization('dataSet')
print("打印处理好的数据:")
print(data)
train_X=data.loc[0:9,"age":"house"]
print("处理好后的属性集:")
print(train_X)
train_y=data.loc[0:9,"credit"]
print("处理好后的标签:")
print(train_y)
test_X=data.loc[10:13,"age":"house"]
print("处理好后的验证集属性集:")
print(test_X)
print("处理好后的验证集标签:")
test_y=data.loc[10:13,"credit"]
print(test_y)
clf=tree.DecisionTreeClassifier()
clf.fit(train_X,train_y)
predict=clf.predict(test_X)
print("预测的结果是:")
print(predict)
score=clf.score(test_X,test_y)
print("预测准确率是:")
print(score)
tree.plot_tree(clf)
plt.show()