决策树

决策树


树形模型是一个一个特征进行处理,之前线性模型是所有特征给予权重相加得到一个新的值。

采用自顶向下的递归的方法,基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处熵值为0(叶节点中的实例都属于一类)

根节点(最重要的特征);父节点与子节点是一对,先有父节点,才会有子节点;叶节点(最终标签)。


原理:
就是从样本中得到一个用于进行判断的树(判断特征的顺序),方法就是从样要中计算每个特征对结果的贡献大小来决定顺序.


随机森林(RandomForestClassifier)
同一批数据,用同样的算法只能产生一棵树,这时Bagging策略可以帮助我们产生不同的数据集。Bagging策略来源于bootstrap aggregation:从样本集(假设样本集N个数据点)中重采样选出Nb个样本(有放回的采样,样本数据点个数仍然不变为N),在所有样本上,对这n个样本建立分类器(ID3\C4.5\CART\SVM\LOGISTIC),重复以上两步m次,获得m个分类器,最后根据这m个分类器的投票结果,决定数据属于哪一类。

随机森林在bagging的基础上更进一步:

1. 样本的随机:从样本集中用Bootstrap随机选取n个样本

2. 特征的随机:从所有属性中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树(泛化的理解,这里面也可以是其他类型的分类器,比如SVM、Logistics)

3. 重复以上两步m次,即建立了m棵CART决策树

4. 这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)


关于调参:1.如何选取K,可以考虑有N个属性,取K=根号N
2.最大深度(不超过8层)
3.棵数
4.最小分裂样本树
5.类别比例



# coding=utf-8

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import tree
import numpy as np
from sklearn.externals.six import StringIO
import pydot


def main():
iris = datasets.load_iris() # 典型分类数据模型
# 这里我们数据统一用pandas处理
data = pd.DataFrame(iris.data, columns=iris.feature_names)
data['class'] = iris.target

# 这里只取两类
data = data[data['class'] != 2]
# 为了可视化方便,这里取两个属性为例
X = data[['sepal length (cm)', 'sepal width (cm)']]
Y = data[['class']]
# 划分数据集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y)
# 创建决策树模型对象,默认为CART
dt = tree.DecisionTreeClassifier()
dt.fit(X_train, Y_train)

# 返回树中的决策路径
dp = dt.decision_path(X_test)
print('X_test')
print(X_test)
print('决策路径')
print(dp)

print("特征重要性(数组)") # 特征重要性(数组)
print(dt.feature_importances_)#特征重要性(数组)

print("类别标签(数组或列表)") #类别标签(数组或列表)
print(dt.classes_) # 类别标签(数组或列表)

print("max_features的inferred(推测?)值(int)") # max_features的inferred(推测?)值(int)
print(dt.max_features_) # max_features的inferred(推测?)值(int)

print("类别数目(int)") # 类别数目(int)
print(dt.n_classes_) # 类别数目(int)

print("特征数目(int)") #特征数目(int)
print(dt.n_features_) # 特征数目(int)

print("输出数目(int)") # 输出数目(int)
print(dt.n_outputs_) # 输出数目(int)

print("树对象") # 树对象
print(dt.tree_) # 树对象


# 显示训练结果
print(dt.score(X_test, Y_test))
# score是指分类的正确率

# 作图
h = 0.02
x_min, x_max = X.iloc[:, 0].min() - 1, X.iloc[:, 0].max() + 1
y_min, y_max = X.iloc[:, 1].min() - 1, X.iloc[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = dt.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)

# 做出原来的散点图
class1_x = X.loc[Y['class'] == 0, 'sepal length (cm)']
class1_y = X.loc[Y['class'] == 0, 'sepal width (cm)']
l1 = plt.scatter(class1_x, class1_y, color='b', label=iris.target_names[0])
class1_x = X.loc[Y['class'] == 1, 'sepal length (cm)']
class1_y = X.loc[Y['class'] == 1, 'sepal width (cm)']
l2 = plt.scatter(class1_x, class1_y, color='r', label=iris.target_names[1])
plt.legend(handles=[l1, l2], loc='best')

plt.grid(True)
plt.show()
# 导出决策树的图片,需要配置graphviz,并且添加到环境变量
dot_data = StringIO()
tree.export_graphviz(dt, out_file=dot_data, feature_names=X.columns,
class_names=['healthy', 'infected'],
filled=True, rounded=True,
special_characters=True)
graph = pydot.graph_from_dot_data(dot_data.getvalue())[0]
# graph.write_png("Iris.png")


if __name__ == '__main__':
main()




# coding=utf-8

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn import tree
import numpy as np
from sklearn.externals.six import StringIO
import pydot
from sklearn.externals.six import StringIO
import pydot
import pydotplus
import os


def main():
# ['有房', '有工作', '有车','年龄']
X_train = np.array([[1, 1, 1, 25],
[1, 1, 0, 35],
[1, 0, 1, 32],
[0, 1, 1, 31],
[0, 0, 1, 20],
[0, 1, 0, 20],
[1, 0, 0, 21],
[1, 1, 0, 28],
[1, 0, 1, 30],
[1, 1, 0, 32]])

Y_train = np.array([1, 0, 0, 0, 1,
1, 0, 1, 1, 1])

X_test = np.array([[1, 1, 0, 33]])
Y_test = np.array([1])

# 创建决策树模型对象,默认为CART
dt = tree.DecisionTreeClassifier()
dt.fit(X_train, Y_train)

print("特征重要性(数组)") # 特征重要性(数组)
print(dt.feature_importances_) # 特征重要性(数组)
# [0. 0.33333333 0. 0.66666667]

print("类别标签(数组或列表)") # 类别标签(数组或列表)
print(dt.classes_) # 类别标签(数组或列表)

print("max_features的inferred(推测?)值(int)") # max_features的inferred(推测?)值(int)
print(dt.max_features_) # max_features的inferred(推测?)值(int)
# 4

print("类别数目(int)") # 类别数目(int)
print(dt.n_classes_) # 类别数目(int)

print("特征数目(int)") # 特征数目(int)
print(dt.n_features_) # 特征数目(int)

print("输出数目(int)") # 输出数目(int)
print(dt.n_outputs_) # 输出数目(int)

print("树对象") # 树对象
print(dt.tree_) # 树对象

predict_y = dt.predict(X_test)

print("predict_y = ", predict_y)
# predict_y = [1]

# score是指分类的正确率
print("score = ", dt.score(X_test, Y_test))
# score = 1.0

# 返回每个样本被预测的叶子结点索引
print("apply = ", dt.apply(X_test))
# apply = [6]

# 返回决策路径
print("decision_path = ", dt.decision_path(X_test))
# decision_path = (0, 0) 1
# (0, 2) 1
# (0, 6) 1

# 获取参数
print("get_params = ", dt.get_params())

# 预测输入样本的类别对数概率
print("predict_log_proba = ", dt.predict_log_proba(X_test))
# 预测输入样本的类别概率
print("predict_proba = ", dt.predict_proba(X_test))


#
dot_data = StringIO()
tree.export_graphviz(dt, out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
# graph[0].write_dot('test002.dot')
graph[0].write_png('test002.png')

# graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
# graph.write_pdf("test002.pdf")
# graph.

# graph = pydot.graph_from_dot_data(dot_data.getvalue())
# graph[0].write_pdf("test002.pdf")

if __name__ == '__main__':
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'
main()




[img]http://dl2.iteye.com/upload/attachment/0130/8226/501cd7e6-0ba5-37d6-96dc-bbcaa0426fb0.png[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jie310600

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值