0x00 数据准备
我们还是使用之前得那个气球模型,用来笔算
黄色,小,成人,用手打,不爆炸
黄色,小,成人,用脚踩,爆炸
黄色,小,小孩,用手打,不爆炸
黄色,小,小孩,用脚踩,不爆炸
黄色,大,成人,用手打,爆炸
黄色,大,成人,用脚踩,爆炸
黄色,大,小孩,用手打,不爆炸
黄色,大,小孩,用脚踩,爆炸
紫色,小,成人,用手打,不爆炸
紫色,小,小孩,用手打,不爆炸
紫色,大,成人,用脚踩,爆炸
紫色,大,小孩,用脚踩,爆炸
或者使用make_blobs自动生成一些聚类数据:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns;sns.set()
from sklearn.datasets import make_blobs
"""
n_samples:样本点的个数
n_features:每个样本的特征数
centers:聚类的类数
cluster_std:聚类得标准差
center_box:据类点生成的范围
shuffle:洗牌
random_state:随机数种子
"""
X,y = make_blobs(n_samples=300,centers=4,random_state=0,cluster_std=1.0)
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='rainbow')
0x01 笔算机器学习
1.先将输入的字符串进行数据化
数据化后
0,0,0,0,0
0,0,0,1,1
0,0,1,0,0
0,0,1,1,0
0,1,0,0,1
0,1,0,1,1
0,1,1,0,0
0,1,1,1,1
1,0,0,0,0
1,0,1,0,0
1,1,0,1,1
1,1,1,1,1
- 决策树得算法
决策数是一棵树,所以就相当与对数据进行分类,为了方便理解,手算得时候不使用数据化后得内容.
对于原始数据
6个爆炸
6个不爆炸
第一次分类:(按颜色分类)
黄色中:
4不爆炸
4爆炸
第二次分类:(大小)
小中:
3不爆炸
1爆炸
第三次分类:(年龄)
成人中:
1不
1爆炸
第四次分类:(操作)
用手打中:
1不爆炸
(结束)
用脚中:
1爆炸
(结束)
小孩中:
2不爆炸
(结束)
大中:
3爆炸
1不爆炸
第三次分类:(年龄)
成人中:
2爆炸
(结束)
小孩中:
1不爆炸
1爆炸
第四次分类:(操作)
用手打中:
1不爆炸
(结束)
用脚中:
1爆炸
(结束)
紫色中:
4不爆炸
4爆炸
第二次分类:(大小)
小中:
2不爆炸
(结束)
大中:
2爆炸
(结束)
很明显只是一次次得分类,但是知道分类结果只剩下单一得爆炸或者不爆炸为止.
画出原理图:
决策树.png
笔算就这样结束了,但是这个只是一个普通得决策树.
比如说:
为什么颜色是第一次区分?
明显得颜色对这次并没有任何得帮助,我却用来作为第一次区分,明显增加了分类得层数.
所以为了决定区分得顺序,决策树有很多种算法,最有名得是
C4.5,CART和ID3.
其中最大得区别就是决定顺序得方式.
CART是利用gini函数
ID3是利用gain函数
信息熵.png
C4.5 是利用 gain ratio(信息增益率)
信息熵的差值:
含有某种元素下的信息熵与不考虑该条件得信息熵
0x03 使用决策树
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns;sns.set()
from sklearn.datasets import make_blobs
"""
n_samples:样本数量
centers:聚类中类的个数
random_state:随机数得种子
cluster_std:每个类得标准差
"""
X,y = make_blobs(n_samples=300,centers=4,random_state=0,cluster_std=1.0,center_box=(-10,10))
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='rainbow')
# 是用决策树进行训练
from sklearn.tree import DecisionTreeClassifier
"""
criterion: 使用的算法
"gini"表示是用Gini函数,即CART算法
"entropy"表示信息熵,即ID3算法
splitter:分类器,
best表示是用最好得分类器
random表示是用随机得分类器
max_depth:树的最大深度。
如果没有,那么节点增加,
直到所有的叶子是纯
或直到所有叶中含有比min_samples_split样本较少
min_samples_split:分裂内部节点所需的样本的最小数目
min_samples_leaf:是在叶节点所需的样本的最小数目
用来防止过拟合
"""
tree = DecisionTreeClassifier().fit(X,y)
# 可视化函数
def visualize_classifier(model,X,y,ax=None,cmap='rainbow'):
#gca将figure转为axis
ax = ax or plt.gca()
ax.scatter(X[:,0],X[:,1],c=y,s=30,cmap=cmap,clim=(y.min(),y.max()),zorder=3)
ax.axis('tight')
ax.axis('off')
#获取(xmin,xmax)
xlim=ax.get_xlim()
ylim=ax.get_ylim()
model.fit(X,y)
#*xlim表示这个中还有多个参数,即:
#linspace中得 start=xlim的xmin
# stop=xlim的xmax
xx,yy = np.meshgrid(np.linspace(*xlim,num=200),np.linspace(*ylim,num=200))
#ravel将矩阵转为向量
#c_将2个向量和并为一个2D的坐标矩阵
Z=model.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)
n_classes = len(np.unique(y))
"""
画出等高线
x,y:z的坐标
z:结果
alpha:透明度
levels:等高线得值
int:绘制 n+1得轮廓线
阵列:绘制制定得轮廓线的颜色
要在vmin和vmax之间
cmap:调色板
vmin:颜色的最大值
vmax:颜色得最小值
"""
contours=ax.contourf(xx,yy,Z,alpha=0.3,levels=np.arange(n_classes+1)-0.5,cmap=cmap,clim=(y.min(),y.max()),zorder=1)
ax.set(xlim=xlim,ylim=ylim)
#调用可视化函数
visualize_classifier(DecisionTreeClassifier(),X,y)
决策树的图形化.png
网友评论