Skip to content

Commit 273f646

Browse files
committed
修改第9章的文档和代码
1 parent ba6ab3f commit 273f646

File tree

2 files changed

+36
-35
lines changed

2 files changed

+36
-35
lines changed

docs/9.树回归.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727

2828
### 1.2、树构建算法 比较
2929

30-
我们在 第3章 中使用的树构建算法是 ID3 。ID3 的做法是每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来切分。也就是说,如果一个特征有 4 种取值,那么数据将被切分成 4 份。一旦按照某特征切分后,该特征在之后的算法执行过程中将不会再起作用,所以有观点认为这种切分方式过于迅速。另外一种方法是二分切分法,即每次把数据集切分成两份。如果数据的某特征值等于切分所要求的值,那么这些数据就进入树的左子树,反之则进入树的右子树。
30+
我们在 第3章 中使用的树构建算法是 ID3 。ID3 的做法是每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来切分。也就是说,如果一个特征有 4 种取值,那么数据将被切分成 4 份。一旦按照某特征切分后,该特征在之后的算法执行过程中将不会再起作用,所以有观点认为这种切分方式过于迅速。另外一种方法是二元切分法,即每次把数据集切分成两份。如果数据的某特征值等于切分所要求的值,那么这些数据就进入树的左子树,反之则进入树的右子树。
3131

32-
除了切分过于迅速外, ID3 算法还存在另一个问题,它不能直接处理连续型特征。只有事先将连续型特征转换成离散型,才能在 ID3 算法中使用。但这种转换过程会破坏连续型变量的内在性质。而使用二元切分法则易于对树构造过程进行调整以处理连续型特征。具体的处理方法是: 如果特征值大于给定值就走左子树,否则就走右子树。另外,二分切分法也节省了树的构建时间,但这点意义也不是特别大,因为这些树构建一般是离线完成,时间并非需要重点关注的因素。
32+
除了切分过于迅速外, ID3 算法还存在另一个问题,它不能直接处理连续型特征。只有事先将连续型特征转换成离散型,才能在 ID3 算法中使用。但这种转换过程会破坏连续型变量的内在性质。而使用二元切分法则易于对树构造过程进行调整以处理连续型特征。具体的处理方法是: 如果特征值大于给定值就走左子树,否则就走右子树。另外,二元切分法也节省了树的构建时间,但这点意义也不是特别大,因为这些树构建一般是离线完成,时间并非需要重点关注的因素。
3333

3434
CART 是十分著名且广泛记载的树构建算法,它使用二元切分来处理连续型变量。对 CART 稍作修改就可以处理回归问题。第 3 章中使用香农熵来度量集合的无组织程度。如果选用其他方法来代替香农熵,就可以使用树构建算法来完成回归。
3535

@@ -41,7 +41,7 @@ CART 是十分著名且广泛记载的树构建算法,它使用二元切分来
4141
三种方法区别是划分树的分支的方式:
4242
1. ID3 是信息增益分支
4343
2. C4.5 是信息增益率分支
44-
3. CART GINI 系数分支
44+
3. CART 做分类工作时,采用 GINI 值作为节点分裂的依据;回归时,采用样本的最小方差作为节点的分裂依据。
4545

4646
工程上总的来说:
4747

src/python/9.RegTrees/regTrees.py

+33-32
Original file line numberDiff line numberDiff line change
@@ -395,12 +395,12 @@ def createForeCast(tree, testData, modelEval=regTreeEval):
395395

396396

397397
if __name__ == "__main__":
398-
# # 测试数据集
399-
# testMat = mat(eye(4))
400-
# print testMat
401-
# print type(testMat)
402-
# mat0, mat1 = binSplitDataSet(testMat, 1, 0.5)
403-
# print mat0, '\n-----------\n', mat1
398+
# 测试数据集
399+
testMat = mat(eye(4))
400+
print testMat
401+
print type(testMat)
402+
mat0, mat1 = binSplitDataSet(testMat, 1, 0.5)
403+
print mat0, '\n-----------\n', mat1
404404

405405
# # 回归树
406406
# myDat = loadDataSet('input/9.RegTrees/data1.txt')
@@ -431,29 +431,30 @@ def createForeCast(tree, testData, modelEval=regTreeEval):
431431
# myTree = createTree(myMat, modelLeaf, modelErr)
432432
# print myTree
433433

434-
# # 回归树 VS 模型树 VS 线性回归
435-
trainMat = mat(loadDataSet('input/9.RegTrees/bikeSpeedVsIq_train.txt'))
436-
testMat = mat(loadDataSet('input/9.RegTrees/bikeSpeedVsIq_test.txt'))
437-
# # 回归树
438-
myTree1 = createTree(trainMat, ops=(1, 20))
439-
print myTree1
440-
yHat1 = createForeCast(myTree1, testMat[:, 0])
441-
print "--------------\n"
442-
# print yHat1
443-
# print "ssss==>", testMat[:, 1]
444-
print "回归树:", corrcoef(yHat1, testMat[:, 1],rowvar=0)[0, 1]
445-
446-
# 模型树
447-
myTree2 = createTree(trainMat, modelLeaf, modelErr, ops=(1, 20))
448-
yHat2 = createForeCast(myTree2, testMat[:, 0], modelTreeEval)
449-
print myTree2
450-
print "模型树:", corrcoef(yHat2, testMat[:, 1],rowvar=0)[0, 1]
451-
452-
# 线性回归
453-
ws, X, Y = linearSolve(trainMat)
454-
print ws
455-
m = len(testMat[:, 0])
456-
yHat3 = mat(zeros((m, 1)))
457-
for i in range(shape(testMat)[0]):
458-
yHat3[i] = testMat[i, 0]*ws[1, 0] + ws[0, 0]
459-
print "线性回归:", corrcoef(yHat3, testMat[:, 1],rowvar=0)[0, 1]
434+
# # # 回归树 VS 模型树 VS 线性回归
435+
# trainMat = mat(loadDataSet('input/9.RegTrees/bikeSpeedVsIq_train.txt'))
436+
# testMat = mat(loadDataSet('input/9.RegTrees/bikeSpeedVsIq_test.txt'))
437+
# # # 回归树
438+
# myTree1 = createTree(trainMat, ops=(1, 20))
439+
# print myTree1
440+
# yHat1 = createForeCast(myTree1, testMat[:, 0])
441+
# print "--------------\n"
442+
# # print yHat1
443+
# # print "ssss==>", testMat[:, 1]
444+
# # corrcoef 返回皮尔森乘积矩相关系数
445+
# print "regTree:", corrcoef(yHat1, testMat[:, 1],rowvar=0)[0, 1]
446+
447+
# # 模型树
448+
# myTree2 = createTree(trainMat, modelLeaf, modelErr, ops=(1, 20))
449+
# yHat2 = createForeCast(myTree2, testMat[:, 0], modelTreeEval)
450+
# print myTree2
451+
# print "modelTree:", corrcoef(yHat2, testMat[:, 1],rowvar=0)[0, 1]
452+
453+
# # 线性回归
454+
# ws, X, Y = linearSolve(trainMat)
455+
# print ws
456+
# m = len(testMat[:, 0])
457+
# yHat3 = mat(zeros((m, 1)))
458+
# for i in range(shape(testMat)[0]):
459+
# yHat3[i] = testMat[i, 0]*ws[1, 0] + ws[0, 0]
460+
# print "lr:", corrcoef(yHat3, testMat[:, 1],rowvar=0)[0, 1]

0 commit comments

Comments
 (0)