决策树——划分数据集
def splitDataSet(dataSet, axis, value):
retDataSet = [] #创建返回的数据集列表
for featVec in dataSet: #遍历数据集
if featVec[axis] == value:
reducedFeatVec = featVec[:axis] #去掉axis特征
reducedFeatVec.extend(featVec[axis+1:]) #将符合条件的添加到返回的数据集
retDataSet.append(reducedFeatVec)
return retDataSet #返回划分后的数据集
这个代码就是按axis划分,然后每次把它去掉。
1.
def splitDataSet(dataSet, axis, value):
- dataSet:这是输入的数据集,通常是一个二维列表,其中每个子列表代表一个样本,最后一项通常是标签(分类)。
-
axis:这个参数是整数,表示当前划分的特征的索引位置。假设我们的数据集有多个特征(列),
axis
就指定了你想要按哪一个特征来划分数据集。 -
value:这个参数是我们在数据集中按
axis
这个特征划分时,要求该特征的取值为value
。即:我们希望选择所有在此特征上值为value
的样本。
返回的 retDataSet
retDataSet
是一个空列表,用来保存符合条件的子集。函数会遍历 dataSet
,每次找到符合条件的样本(即特征 axis
的值为 value
),就将该样本的特征信息(去掉当前特征)加入到 retDataSet
。
2.
retDataSet = [] # 创建返回的数据集列表
- 创建一个空的列表
retDataSet
,用来保存符合条件的子集。
python
复制代码
for featVec in dataSet: # 遍历数据集中的每一个样本
- 使用
for
循环遍历dataSet
中的每一行数据(每个featVec
)。每个featVec
是一个样本,它包含多个特征值,通常最后一个元素是标签(类别)
if featVec[axis] == value:
- 对于每一个样本
featVec
,判断该样本的特征axis
对应的取值是否等于value
。如果该样本在axis
特征上的取值与value
相等,就满足条件,应该将该样本加入返回的子集retDataSet
中。
reducedFeatVec = featVec[:axis] # 去掉当前特征(axis)
- 通过
featVec[:axis]
获取当前样本的特征,去掉axis
位置的特征。比如,如果数据集中有5个特征(第0列到第4列),且axis = 2
,那么featVec[:axis]
就是将样本中第2列之前的特征提取出来(不包括第2列),即[featVec[0], featVec[1]]
。
reducedFeatVec.extend(featVec[axis+1:]) # 将符合条件的特征值部分加入返回的数据集
-
featVec[axis+1:]
表示去掉了axis
位置的特征后的部分,即从axis+1
到最后的特征。将这部分特征信息添加到reducedFeatVec
中。extend
方法会将一个列表的元素加入到另一个列表中,确保reducedFeatVec
包含了除了当前特征axis
外的所有特征。
return retDataSet # 返回划分后的数据集
- 最后,函数返回划分后的子集
retDataSet
,它包含了所有在特定特征axis
上取值为value
的样本(每个样本去掉了axis
特征)。
假设有如下数据集(dataSet
):
dataSet = [
['青年', '否', '否', '一般', '不放贷'],
['青年', '否', '是', '好', '放贷'],
['青年', '是', '否', '好', '放贷'],
['青年', '是', '是', '一般', '不放贷'],
['中年', '否', '否', '一般', '不放贷'],
['中年', '否', '是', '好', '放贷'],
['中年', '是', '否', '好', '放贷'],
['中年', '是', '是', '一般', '不放贷'],
['老年', '否', '否', '一般', '不放贷'],
['老年', '否', '是', '好', '放贷'],
['老年', '是', '否', '好', '放贷'],
['老年', '是', '是', '一般', '不放贷']
]
假设我们希望根据第二个特征“是否有工作”(axis=1
)进行划分,我们调用 splitDataSet
函数,并指定取值 否
:
result = splitDataSet(dataSet, 1, '否')
在这个例子中,axis=1
表示我们正在根据第二个特征(“是否有工作”)进行划分,value='否'
表示我们选择特征值为“否”的样本。调用 splitDataSet
函数后,返回的 result
是:
[
['青年', '否', '否', '一般', '不放贷'],
['青年', '否', '是', '好', '放贷'],
['中年', '否', '否', '一般', '不放贷'],
['中年', '否', '是', '好', '放贷'],
['老年', '否', '否', '一般', '不放贷'],
['老年', '否', '是', '好', '放贷']
]
这些样本的第二个特征都是“否”。可以看到,函数成功地将数据集按第二个特征值为“否”进行划分,且去除了“是否有工作”这一特征,返回了包含其余特征的子集。