昨天,我们已建立完决策树,那今天,我打算带入资料去看他分类结果:
建立决策树的使用模型:
#用树来预测样本
def tree_Classify(decisionTree, featureLabel, testDataSet):
firstFeature = list(decisionTree.keys())[0]
secondFeatDict = decisionTree[firstFeature]
splitValue = float(list(secondFeatDict.keys())[0][1:])
#因为test资料少目标值,所以在计算索引时要少1
featureIndex = featureLabel[firstFeature-1]
if float(testDataSet[featureIndex] )<= splitValue:
valueOfFeat = secondFeatDict['<' + str(splitValue)]
else:
valueOfFeat = secondFeatDict['>' + str(splitValue)]
#如果还有字典,就继续往下
if isinstance(valueOfFeat, dict):
pred_label = tree_Classify(valueOfFeat, featureLabel, testDataSet)
else:
pred_label = valueOfFeat
return pred_label
test_Data = [1.09,3.852,2,3.5]
pre_label = tree_Classify(myTree1, data.columns[1:], test_Data)
print(pre_label)
这样子就会得到结果:输出2
当然如果只有一棵树就当成预测结果,会显得太独断一点,所以利用之前说明的袋装法,来生成多个的train集就可以建立多个树,有了多个树就会有多个预测类别最後因为是类别型资料,所以取个数最多的就是最终预测
首先改写一下bagging_k
import random as rd
import pandas as pd
import copy
#一个5维资料,共5笔,data(第0维为y)
data=pd.DataFrame([[1,1.01,0.852,5,1.5],[2,2.01,0.31,8,8.1],[1,3.01,0.589,9,5.6],[1,3.01,0.01,8,2.3],[2,4.01,0.258,10,1.1]])
#预设m=4:表示重复抽资料4次;k=5:表示5组资料;d=3:随机选三个特徵
def bagging_k(data,m=4,k=5,d=3):
n=len(data)
#建立放全部资料的data_k
data_k=[]
for j in range(k):
data_use1=[]
#选取除目标以外d个特徵
features = rd.sample(range(1,n), d)
#把目标加回去
features.insert(0,0)
features.sort()
print("第",j+1,"组特徵:",features)
data_use1=copy.deepcopy(data[features])
print(data_use1)
rows=[]
#重复抽样过程
for i in range(m):
rows.append(rd.randint(0, len(data_use1)-1))
data_m=data_use1.iloc[rows]
print("第",j+1,"组数据:",data_m)
#重排索引
data_m=data_m.reset_index(drop=True)
data_k.append(data_m)
return data_k
print("全部数据:",bagging_k(data))
结果如下:
全部数据: [
0 1 3 4
0 2 4.01 10 1.1
1 2 2.01 8 8.1
2 1 1.01 5 1.5
3 2 4.01 10 1.1,
0 1 2 4
0 1 3.01 0.010 2.3
1 1 1.01 0.852 1.5
2 1 1.01 0.852 1.5
3 1 1.01 0.852 1.5,
0 1 2 3
0 1 3.01 0.010 8
1 1 3.01 0.010 8
2 1 3.01 0.589 9
3 1 3.01 0.589 9,
0 1 2 4
0 2 2.01 0.310 8.1
1 2 2.01 0.310 8.1
2 1 3.01 0.010 2.3
3 1 3.01 0.589 5.6,
0 2 3 4
0 1 0.010 8 2.3
1 2 0.310 8 8.1
2 1 0.589 9 5.6
3 2 0.310 8 8.1]
这样就有多组数据,再来做关於决策树建立,
trees=[]
for i in bagging_k(data):
trees.append(create_Tree(i))
for j in trees:
print(j)
建立完後就会有很多棵树,如下:
{4: {'<3.55': {1: {'<2.51': 1.0, '>2.51': 2.0}}, '>3.55': 1.0}}
{1: {'<2.51': 2.0, '>2.51': 1.0}}
{3: {'<9.0': {1: {'<2.51': 2.0, '>2.51': 1.0}}, '>9.0': 2.0}}
{2: {'<0.4495': 2.0, '>0.4495': 1.0}}
{1: {'<1.51': 1.0, '>1.51': {2: {'<0.134': 1.0, '>0.134': 2.0}}}}
再来就是针对test集依照这几棵树来预测类别
trees=[]
data_k=bagging_k(data)
for i in data_k:
trees.append(create_Tree(i))
for j in range(len(trees)):
test_Data = pd.DataFrame([[1.09,3.852,2,3.5]],columns=[1,2,3,4])
if isinstance(trees[j], dict):
pre_label = tree_Classify(trees[j], data_k[j].columns[1:], test_Data)
else:
pre_label = trees[j]
print("预测类别:",pre_label)
所以预测完後,选最多类别
预测类别: 2.0
预测类别: 1.0
预测类别: 1.0
预测类别: 2.0
预测类别: 1.0
-->所以就是第1类比例最多-->所以预测就是1
好,今天实作部分完成了,明天就说明下回归方法下随机森林差异
在男孩敲了门之後,屋内的歌声突然消失了,在一阵寂静之後,门缓缓打开,但却没有任何人出现,男孩疑惑地往屋内看,里面黑漆漆一片,甚麽也看不到,男孩顺着墙壁找到了电灯开关,他按了下去,瞬间,屋内充满光亮,但男孩发现里面甚麽都没有,只有刚刚的窗帘和正中央有一张桌子,桌子上只有一个木头做成的人偶,人偶上有一双大大的眼睛,正望着窗帘,男孩走近一看,发现这个人偶只有眼睛,但却没有嘴巴
--|为了你,我失去了一切 |-- MS.CM
<<: Day 07 : 操作基础篇 4 - 做好笔记备份 ,使用 iCloud 和 Google Drive 进行双重备份
Day 27: 暴力破解 WPA/WPA2 加密 wifi 密码 tags: Others 自我挑战...
前言 系列文也来到尾声了,终於要进入最後一个观念:Nginx 了,有了前面 K8s 的观念其实就可...
Service Container 是管理类别依赖和执行依赖注入的一个容器。 官方文件告诉我们可以利...
今天是30天程序语言研究的第三十天,由於最近写unix语言的东西用到很多,所以做了很多笔记,就想说也...
第四题,就满直观的,回答破口和後门,应该都可以。 但这时候,我看小七应该是忍无可忍了... 小七:「...