您的位置:首页 > 其它

机器学习实战之使用 scikit-learn 库实现决策树

2018-04-03 10:27 686 查看
数据如图所示:



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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: