《python机器学习预测分析核心算法》第六章
刚刚看书看一半的时候突然有个想法,看了这么久机器学习,机器学习模型到现在要解决的最大的问题就是过拟合和欠拟合的问题,然后联想到以前经常听各种“专家”说童年是最有创造力的时期,中国孩子教书太死,小孩的创造力没了。那机器学习模型如果和人类大脑近似的话那么所谓的过拟合是不是就是学习过多之后丧失了创造力呢,欠拟合是否就是童年时期不会做题的状态呢,有点意思。
生成-0.5~0.5之间的数字100份,x列表储存这些数字,y=x+random,y就成了大体趋势上等于x,但是有随机噪声干扰的数字集合,使用python模拟可以清晰的看出。
# -*- coding:utf-8 -*-
import numpy
import matplotlib.pyplot as plot
from sklearn import tree
from sklearn.tree import DecisionTreeRegressor
from sklearn.externals.six import StringIO
#构造简单的数据y=x+random
npoints=100
#使x在-0.5和0.5之间共100份
xplot=[(float(i)/float(npoints)-0.5) for i in range(npoints+1)]
#多行变多列
x=[[s] for s in xplot]
#生成随机数并生成y=x+random
numpy.random.seed(1)
y=[s+numpy.random.normal(scale=0.1) for s in xplot]
#绘制第一个
plot.plot(xplot,y)
plot.axis('tight')
plot.xlabel('x')
plot.ylabel('y')
plot.show()
#使用二元决策树学习用x预测y
simpletree=DecisionTreeRegressor(max_depth=1)
simpletree.fit(x,y)
#写入文件
with open("simpletree.dot",'w') as f:
f=tree.export_graphviz(simpletree,out_file=f)
#用训练完成的二元决策树去预测
yhat=simpletree.predict(x)
#同时绘制第二个图像
plot.figure()
plot.plot(xplot,y,label='true y')
plot.plot(xplot,yhat,label='prediction',linestyle='--')
plot.legend(bbox_to_anchor=(1,0.2))
plot.axis('tight')
plot.xlabel('x')
plot.ylabel('y')
plot.show()
然后使用sklearn包生成深度为1的二元决策树,再与观测值比对发现这不就是找个分割点一分为二然后各自取平均数吗。。。。。。
验证想法,更改深度为2得到:
更改深度为10得到:
很明显我刚刚想的是大体正确的。更改为10之后的图形明显是过拟合状态啊。
深度是10的话最大叶子节点也就是2^10=1024个,远超过样本点数量100个,所以每个点都有个叶子一一对应当然完全一样啦,所以二元决策树的过拟合问题也是有的,而且这个过拟合决策参数就只有一个depth,只要深度大到是的叶子节点个数很接近甚至大于实际样本点数目就会过拟合.