数据如图所示:
1、数值转换:
构造决策树之前,需要将数据转化成数值形式,对了类别 label,yes 和 no 分别为 1, 0;对了样本数据,比如第一行属性 age,它有 youth middle_aged 和 senior 三类,那么我们可以把 youth 写成 [1,0,0],middle_aged 写成 [0,1,0]的向量形式。python 提供了专门转换属性值为数值向量的方法:vec.fit_transform(featureList) .toarray(),也提供了转换 label 为数值的方法:lb.fit_transform(labelList)
2、构造决策树
直接调用现有的包,tree.DecisionTreeClassifier(criterion=’entropy’),criterion=’entropy’ 说明是使用信息增益进行特征选择,也就是使用 ID3 算法,当然可以根据自己需要选择不同的算法。
3、测试
使用训练好的决策树进行预测,直接使用现有的方法即可: clf.predict(newRowX.reshape(1,-1)) ,其中 newRowX 就是新的特征数据。
具体代码如下:
#!/bin/python
#coding=utf-8
#使用 sklearn 实现决策树
#要先将数据转化成决策树所能处理的
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'/personal/code/python/ML_maizi/decision_tree/AllElectronics.csv', 'rb')
reader = csv.reader(allElectronicsData)
headers = reader.next()
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
# python 可以将 feature 转换成数据
vec = DictVectorizer() #实例化
dummyX = vec.fit_transform(featureList) .toarray()
# vectorize class labels
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY: " + str(dummyY))
# Using decision tree for classification
# clf = tree.DecisionTreeClassifier()
# 使用 id3 算法
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dummyX, dummyY)
oneRowX = dummyX[0, :]
print("oneRowX: " + str(oneRowX))
# 新数据用于预测-测试集
newRowX = oneRowX
newRowX[0] = 1
newRowX[2] = 0
print("newRowX: " + str(newRowX))
#测试
predictedY = clf.predict(newRowX.reshape(1,-1))
#输出预测结果
print("predictedY: " + str(predictedY))