赞
踩
1、机器学习算法中分类和预测算法的评估
- 准确率
- 速度
- 强壮性
- 可规模性
- 可解释性
2、什么是决策树(Decision Tree)?
决策树是一种类似流程图的树形结构,每个结点表示一个属性测试,每条边表示一个属性输出,每个树叶结点表示类或者类分布。决策树的决策过程需要从决策树的根节点开始,待测数据与决策树中的特征节点进行比较,并按照比较结果选择选择下一比较分支,直到叶子节点作为最终的决策结果。
3、决策树的学习过程
- 特征选择:从训练数据的特征中选择一个特征作为当前节点的分裂标准(如上图中,“颜色”为上述决策树的一个特征),特征选择的标准不同产生了不同的特征决策算法
- 决策树生成:根据所选特征峰评估标准,从上至下递归生成子节点,知道数据集不可分则停止决策树生成
- 剪 枝:决策树容易过拟合,需要剪枝来缩小树的结构和规模(包括预剪枝和后剪枝)。
实现决策树的算法包括ID3、C4.5算法等
4、ID3算法
ID3算法是由Ross Quinlan提出的决策树的一种算法实现,以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。
ID3算法是建立在奥卡姆剃刀的基础上:越是小型的决策树越优于大的决策树(be simple简单理论)。
- 信息熵:用来衡量一个随机变量出现的期望值,如果信息的不确定性越大,熵的值也就越大,出现的各种情况也就越多。信息熵的计算公式为:
E n t r o p y ( S ) = ∑ i = 1 n − P i l o g 2 P i Entropy(S)=\sum_{i=1}^n-P_ilog_2P_i Entropy(S)=i=1∑n−Pilog2Pi
其中 S S S为所有事件的集合, P i P_i Pi为事件 i i i发生的概率, n n n为特征总数- 信息增益:是指信息划分前后信息熵的变化,也就是说由于使用了某个特征划分,使得信息熵发生变化,而两者之间的差值就是信息增益,其计算公式如下:
G a i n ( S , A ) = E n t r o p y ( S ) − ∑ v ∈ V a l u e ( A ) ∣ S v ∣ s E n t r o p y ( S y ) Gain(S,A) = Entropy(S) - \sum_{v∈Value(A)}\frac{|S_v|}{s}Entropy(S_y) Gain(S,A)=Entropy(S)−v∈Value(A)∑s∣Sv∣Entropy(Sy)
其中——
号后面的部分表示为属性A对S划分的期望值(划分后的信息熵)
算法实现:
- 初始化属性集合和数据集合
- 计算数据集合信息熵S和所有属性的信息熵,选择信息增益最大的属性作为当前决策节点
- 更新数据集合和属性集合(删除掉上一步中使用的属性,并按照属性值来划分不同分支的数据集合)
- 依次对每种取值情况下的子集重复第二步
- 若子集只包含单一属性,则为分支为叶子节点,根据其属性值标记。
- 完成所有属性集合的划分
数据文件下载:AllElectronics.csv ----->Download
from sklearn.feature_extraction import DictVectorizer import csv from sklearn import tree from sklearn import preprocessing from sklearn.externals.six import StringIO # Read in the csv file and put features into list of dict and list of class label allElectronicsData = open(r'AllElectronics.csv的文件路径', 'rt') reader = csv.reader(allElectronicsData) #headers = reader.next() python3.0已经不支持 headers = next(reader) print(headers) featureList = [] labelList = [] for row in reader: labelList.append(row[len(row)-1]) rowDict = {} for i in range(1, len(row)-1): rowDict[headers[i]] = row[i] featureList.append(rowDict) print(featureList) # Vetorize features vec = DictVectorizer() dummyX = vec.fit_transform(featureList) .toarray() print("dummyX: " + str(dummyX)) print(vec.get_feature_names()) print("labelList: " + str(labelList)) # vectorize class labels lb = preprocessing.LabelBinarizer() dummyY = lb.fit_transform(labelList) print("dummyY: " + str(dummyY)) # Using decision tree for classification # clf = tree.DecisionTreeClassifier() clf = tree.DecisionTreeClassifier(criterion='entropy') clf = clf.fit(dummyX, dummyY) print("clf: " + str(clf)) # Visualize model with open("allElectronicInformationGainOri.dot", 'w') as f: f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f) oneRowX = dummyX[0, :] print("oneRowX: " + str(oneRowX)) newRowX = oneRowX newRowX[0] = 1 newRowX[2] = 0 print("newRowX: " + str(newRowX)) predictedY = clf.predict([newRowX]) print("predictedY: " + str(predictedY))
说明
运行程序之后会生成一个.dot的文件(在本案例中生成的文件为allElectronicInformationGainOri.dot)
通过安装Graphviz可以将.dot文件转换为可视化的决策树,具体操作方法为
- 下载Graphviz可视化工具选择graphviz-2.38.zip文件下载解压到安装目录
- Window系统PC右键我的电脑,点击属性–>高级系统设置–>环境变量–>选择系统变量中的Path点击编辑–>右侧新建–>填入Graphviz安装目录下bin文件夹的目录(eg:C:\Users\Peter\Desktop\graphviz-2.38\release\bin)
- 设置好环境变量后打开cmd窗口输入dot -Tpng dot文件路径 -o 输出文件.png
本案例输出的决策树为
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。