集体智慧编程学习之决策树
常用的沟通工具,比如手机,QQ是和已经认识的朋友交流的工具。现在出现了一大批自诩的约炮神器,非诚勿扰挺好看的,宅男腐女的问题操碎了爸妈的心,世纪佳缘都上市了,看来大家对想认识不认识的人有巨大的热情。我也听说非诚勿扰牵手成功后最后走到一起的并不多,这些方式到底靠不靠谱?如果我去参加非诚勿扰,我会不会牵手成功?这里面是不是有一些规律可循,趁着今天被毁容不能出门,我就来学习一下决策树。
高中老师隔三差五让我们填一些表,各种性格和IQ测验。这些测验里很多是十几道题目,每道题目选择“是”或者“否”,这就是决策树的基本原型了。十几道题目相当于十几种要考察的因素,每道题目的选择就是决策树的一个决策,如果题目一选择了“是”,那就跳到题目2,如果选择“否”,那就跳到题目3,决策树也就是这个样子,这个因素的判断调试是否成立,成立了就走成立的分支,不成立就走不成立的分支,这样下来,决策树就像是以树状形式排列的一系列if-else语句。
[python]
if (因素A成立):
if (因素B1成立):
...
if (因素N11成立):
你可以参加非诚勿扰
else:
你不可以参加非诚勿扰
else:
...
if (因素N12成立):
你可以参加非诚勿扰
else:
你不可以参加非诚勿扰
else:
if (因素B2成立):
...
if (因素N21成立):
你可以参加非诚勿扰
else:
你不可以参加非诚勿扰
else:
...
if (因素N22成立):
你可以参加非诚勿扰
else:
你不可以参加非诚勿扰
if (因素A成立):
if (因素B1成立):
...
if (因素N11成立):
你可以参加非诚勿扰
else:
你不可以参加非诚勿扰
else:
...
if (因素N12成立):
你可以参加非诚勿扰
else:
你不可以参加非诚勿扰
else:
if (因素B2成立):
...
if (因素N21成立):
你可以参加非诚勿扰
else:
你不可以参加非诚勿扰
else:
...
if (因素N22成立):
你可以参加非诚勿扰
else:
你不可以参加非诚勿扰
我们的目的就是根据已知的数据,构建出这棵树。
概念理清楚了,我来一点一点实现这个算法。
[python]
my_data=[['beijing','yes','yes',28,'yes'],
['hebei','no','no',23,'no'],
['henan','yes','no',24,'yes'],
['hubei','no','yes',28,'no'],
['hunan','yes','yes',39,'no']]
my_data=[['beijing','yes','yes',28,'yes'],
['hebei','no','no',23,'no'],
['henan','yes','no',24,'yes'],
['hubei','no','yes',28,'no'],
['hunan','yes','yes',39,'no']]
上面是我捏造的的数据,下面根据这五条数据来构建决策树。用户A,北京人,有房有车,28岁,牵手成功;用户B,河北人,没房没车,23岁,牵手失败;用户C,河南人,有房没车,24岁,牵手成功;用户D,湖北人,没房有车,23岁,牵手失败;用户E,湖南人,有车有房,39岁,牵手失败。
第一步:定义节点结构;第二步:对输入数据分组;第三步:选择拆分数据的评价模型;第四步:构造决策树;第五步:用决策树进行判断;第六步:剪枝;第七步:数据缺失处理。
第一步:定义节点结构:
每个节点必须表明自己代表的那个考察因素,一个成立或者不成立的判断条件,一个指向条件成立后的要执行下一个节点,一个指向条件不成立后要判断的下一个节点。如果是末级叶子节点,还需要一个结果节点,来指明要不要参加非诚勿扰。
[python]
class decisionnode:
def __init__(self,col=-1,value=None,results=None,tb=None,fb=None):
self.col=col
self.value=value
self.results=results
self.tb=tb
self.fb=fb
class decisionnode:
def __init__(self,col=-1,value=None,results=None,tb=None,fb=None):
self.col=col
self.value=value
self.results=results
self.tb=tb
self.fb=fb其中,col代表的要考察的因素是输入数据的那一列;valus就是判断条件;results是叶子节点保存最后判断结果的变量;tb,fb分别是条件value成立指向的分支和条件value不成立指向的分支。
第二步:分组输入数据:
我们考虑因素有四个,祖籍,房,车和年龄。祖籍是字符型,年龄是整数型,是否有车有房是布尔型;假设
补充:Web开发 , Python ,