本关任务:编写一个例子讲解决策树如何预测患者需要佩戴的隐形眼镜类型。使用小数据集,我们就可以利用决策树学到很多知识:眼科医生是如何判断患者需要佩戴的镜片类型,一旦理解了决策树的工作原理,我们甚至也可以帮助人们判断需要佩戴的镜片类型。
为了完成本关任务,你需要掌握:1.如何处理隐形眼镜数据集,2.如何使用决策树来进行预测
如何处理隐形眼镜数据集
隐形眼镜数据集包含很多患者眼部状况的观察条件以及医生推荐的隐形眼镜类型。隐形眼镜类型包括硬材质、软材质以及不适合佩戴隐形眼镜。数据来源于UCI数据库,为了更容易显示数据,我么对数据做了简单的更改。
import pandas as pd
if __name__ == '__main__':
with open('lenses.txt', 'r') as fr: #加载文件
lenses = [inst.strip().split('\t') for inst in fr.readlines()]#处理文件
lenses_target = [] #提取每组数据的类别,保存在列表里
for each in lenses:
lenses_target.append(each[-1])
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate'] #特征标签
lenses_list = [] #保存lenses数据的临时列表
lenses_dict = {} #保存lenses数据的字典,用于生成pandas
for each_label in lensesLabels: #提取信息,生成字典
for each in lenses:
lenses_list.append(each[lensesLabels.index(each_label)])
lenses_dict[each_label] = lenses_list
lenses_list = []
print(lenses_dict) #打印字典信息
lenses_pd = pd.DataFrame(lenses_dict) #生成pandas.DataFrame
print(lenses_pd)
我们讲原始的数据信息进行处理,将原始数据处理成有序的数据。
根据提示,在右侧编辑器补充代码,添加使用决策树预测的代码
平台会对你编写的代码进行测试:
开始你的任务吧,祝你成功!
首先来讲如何创建LabelEncoder()对象,用于序列化:
labelcoder作用是为了将n个类别编码为0~n-1之间的整数(包含0和n-1)。
下面举个简单的例子参考来源(2条消息) python:sklearn 标签编码(LabelEncoder)_weixin_39450145的博客-CSDN博客_python标签编码https://blog.csdn.net/weixin_39450145/article/details/114156682
data=['小猫','小猫','小狗','小狗','兔子','兔子'] #准备好数据
#方法1:
enc=preprocessing.LabelEncoder() #获取一个LabelEncoder
enc=enc.fit(['小猫','小狗','兔子']) #训练LabelEncoder
data=enc.transform(data) #使用训练好的LabelEncoder对原数据进行编码
#方法2:
#enc=preprocessing.LabelEncoder() #获取一个LabelEncoder
#data=enc.fit_transform(data)
这里的输出结果 [2 2 1 1 0 0]
根据结果可以看到, LabelEncoder将:小猫编码成2,小狗编码成2,兔子编码成0
扩展:这是是把文本标签转化为int数值类型,如果想要转化回来,用方法inverse_transform
2.创建DecisionTreeClassifier()类
下面列举了几个DecisionTreeClassifier()类中参数的具体含义,可参考(2条消息) 决策树调参说明(DecisionTreeClassifier)_碧空之戈的博客-CSDN博客_decisiontreeclassifier调参https://blog.csdn.net/qq_38923076/article/details/82931340
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.externals.six import StringIO
from sklearn import tree
if __name__ == '__main__':
with open('./src/step3/lenses.txt', 'r') as fr: #加载文件
lenses = [inst.strip().split('\t') for inst in fr.readlines()]#处理文件
lenses_target = [] #提取每组数据的类别,保存在列表里
for each in lenses:
lenses_target.append(each[-1])
print(lenses_target)
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate'] #特征标签
lenses_list = [] #保存lenses数据的临时列表
lenses_dict = {} #保存lenses数据的字典,用于生成pandas
for each_label in lensesLabels: #提取信息,生成字典
for each in lenses:
lenses_list.append(each[lensesLabels.index(each_label)])
lenses_dict[each_label] = lenses_list
lenses_list = []
#print(lenses_dict) #打印字典信息
# print(lenses_dict) #打印字典信息
###########
lenses_pd=pd.DataFrame(lenses_dict,columns= lensesLabels)#生成pandas.DataFrame
print(lenses_pd) #打印pandas.DataFrame
le=LabelEncoder()#创建LabelEncoder()对象,用于序列化(labelcoder的结果是随机的吗?)
for i in lenses_pd.columns: #为每一列序列化
lenses_pd[i] = le.fit_transform(lenses_pd[i])#序列化(对每一列进行序列化)
print(lenses_pd) #打印编码信息
DTC = tree.DecisionTreeClassifier(max_depth = 4)#(限制了深度,防止过拟合)创建DecisionTreeClassifier()类
DTC= DTC.fit(lenses_pd.values.tolist(), lenses_target)#(转化为列表值)使用数据,构建决策树
#############
#############