决策树
决策树是一个类似于流程图的树结构:其中,每个内部节点表示在一个属性上的测试,每个分支代表一个属性输出,而每个树叶节点代表类或类分布。树的最顶层是根节点。
决策树优点
- 直观、便于理解,小规模数据集有效,对中间值的确实不敏感,可以处理不相关特征数据
决策树缺点 - 处理连续变量不好
- 类别较多时,错误增加的比较快
- 可规模性一般
预备知识
- 信息熵(不了解的同学,点击(http://www.jianshu.com/p/ba7199bdb36b)
- Python
准备
安装Python机器学习的库:scikit - learn
特征:
- 简单高效的数据挖掘和机器学习分析
- 对所用用户开放,根据不同需求高度可重用性
- 基于Numpy、SciPy和matplotlib
- 开源,商用级别:获的BSD许可
覆盖问题领域: - 分类、回归、聚典、降维、模型选择、预处理
温馨提示:windows下如果安装不起 Numpy、Scipy。请参考(http://blog.csdn.net/u011177305/article/details/52334023),记得一定要下载和自己使用的python版本和操作系统对应的whl文件(scipy‑0.19.1‑cp35‑cp35m‑win_amd64.whl,cp35表示Python3.5版本)
例子:
数据的准备(格式为.csv):
决策树Python代码:
需要将特征转化为0,1.例如特征age中youth为0,则除了youth,其它的都为1.好在sklearn为我们提供了preprocessing方法可以自动转化,省去了我们自己转的步骤。信息增益最大的为根节点,以此类推。
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import preprocessing
from sklearn import tree
from sklearn.externals.six import StringIO
#决策树实例
decisionTreeData = open('C:\\Users\\hxjd009\\Desktop\\decisionTree.csv',encoding='utf-8')
reader = csv.reader(decisionTreeData)
headers = next(reader)
print(headers)
# for row in reader:
# print(row)
featureList = []
lableList = []
for rows in reader:
lableList.append(rows[len(rows) - 1])#获取标签
print(lableList)
rowDict = {}
for i in range(1,len(rows) - 1):
rowDict[headers[i]] = rows[i]#获取特征
featureList.append(rowDict)
# print(featureList)
#特征的装换
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList).toarray()
# print("dummyX:",dummyX)
# print(vec.get_feature_names())
# print(str(lableList))
#结果的转换(转化为0,1)
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(lableList)
# print("dummyY:",dummyY)
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dummyX,dummyY)
# print("clf:"+str(clf))
#dot文件转化为pdf文件
with open('E:\Arduino.dot','w') as f:
f = tree.export_graphviz(clf,feature_names = vec.get_feature_names(),out_file = f)
#输入数据预测
oneRowX = dummyX[0]
print("newRowX:",oneRowX)
newRowX = oneRowX
newRowX[0] = 0
newRowX[1] = 0
# print("newRowX:"+str(newRowX))
# print("shape:"+str(newRowX.shape))
# print("reshape:"+str(newRowX.reshape(1, -1)))
predictedY = clf.predict(newRowX.reshape(1, -1))
print("predictedY:"+str(predictedY))
网友评论