决策树与随机森林学习

决策树(DecisionTree)

决策树是一种在分类与回归中都有非常广泛应用的算法,它的原理是通过对一系列问题进行if/else的推导,最终实现决策。
下面用一个酒的分类的例子来进行简单的说明。

import numpy as np
from sklearn.datasets import load_wine
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as  plt
from sklearn.model_selection import train_test_split
from matplotlib.colors import ListedColormap
import graphviz
from sklearn.tree import export_graphviz
wine = load_wine()
#只取前两个特征
X = wine.data[:,:2]
y = wine.target
X_train,X_test,y_train,y_test = train_test_split(X,y)
#训练模型
dtc = DecisionTreeClassifier(max_depth=3)
dtc.fit(X_train,y_train)
#定义分区的颜色和散点的颜色
cmap_light = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000','#00FF00','#0000FF'])
#分别用样本的两个特征值创建图像、横轴、纵轴
x_min,x_max = X_train[:,0].min() - 1,X_train[:,0].max() + 1
y_min,y_max = X_train[:,1].min() - 1,X_train[:,1].max() + 1
xx,yy = np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
Z = dtc.predict(np.c_[xx.ravel(),yy.ravel()])
# print(Z.shape,xx.shape)
#给每个分类中的样本分配不同的颜色
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx,yy,Z,cmap=cmap_light)
#用散点把样本表示出来
plt.scatter(X[:,0],X[:,1],c=y,cmap=cmap_bold,edgecolor='k',s=20)
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:(max_depth = 3)")
plt.show()

运行结果如下:
在这里插入图片描述
max_depth参数指的是决策树的深度。在这里选择了max_depth=3里进行试验,可以看到当决策树最大深度设为3的时候,分类器能进行3个分类的识别,而且对于这个数据集是很有用的,因为这个数据集就是3个分类的。
下面利用graphviz库来展示决策树的工作过程。

export_graphviz(dtc,out_file="wine.dot",class_names=wine.target_names,
               feature_names=wine.feature_names[:2],impurity=False,filled=True)
with open("wine.dot") as f:
    dot_graph = f.read()
#显示图形
graphviz.Source(dot_graph)

运行结果如下:
在这里插入图片描述
这个图十分清楚的展现了决策树是如何进行预测的。

随机森林(Random_Forest)

随机森林有的时候也被称之为随机决策森林,是一种集中学习方法。也就是将多个机器学习算法综合在一起,制造出一个更大的模型。
下面通过一个实例来说明,加入有一个girl纠结是否要和相亲对象发展,而她的要求是对方月薪至少要过50k才能继续发展。下面通过一个adult数据集来训练,预测相亲对象Mr_Z是否值得进一步的发展下去。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
#导入数据
data = pd.read_csv('G:\data\\adult.csv',header=None,index_col=False,
                   names=['年龄','单位性质','权重','学历','受教育时长',
                         ' 婚姻状况','职业','家庭状况','种族','性别',
                         '资产所得','资产损失','周工作时长','原籍','收入'])
#选取一部分数据展示
data_lite = data[['年龄','单位性质','学历','性别','周工作时长','职业','收入']]
# display(data_lite.head())
#将文本数据转化为数值
data_dummies = pd.get_dummies(data_lite)
# print("样本原始特征: \n",list(data_lite.columns))
# print("虚拟变量特征: \n",list(data_dummies.columns))
# data_dummies.head()
features =  data_dummies.loc[:,'年龄':'职业_ Transport-moving']
#将特征数值赋值给X
X = features.values
#将收入大于50k作为预测目标
y = data_dummies['收入_ >50K'].values
# print("============================")
# print("特征形态:{} 标签形态:{}".format(X.shape,y.shape))
# print("============================")
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=0)
#用max_depth=5的随机森林来拟合数据
rtc = RandomForestClassifier(n_estimators=6,max_depth=5,random_state=3)
rtc.fit(X_train,y_train)
print("==============================")
print("模型得分:{:.2f}".format(rtc.score(X_test,y_test)))
print("==============================")
#Mr_Z age:37......
Mr_Z = [[37,40,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,
        0,0,0,0,0,0,0,0,0,0,0,0,0]]
pre = rtc.predict(Mr_Z)
print("===============================")
if pre == 1:
    print("去追求真爱吧,Mr_Z月薪过5万了!")
else:
    print("不用去了,不满足你的要求")
print("===============================")

预测结果如下:
在这里插入图片描述
这个模型有8成的正确率,还是很有参考价值的,结果是Z先生不值得发展下去。

总结

相比其他的算法,决策树有一个大的优势,就是它可以可视化,让许多非专业人士也看的很明白,而且几乎不用对决策树进行预处理。但是它存在过拟合的问题,泛化能力差。随机森林就可以弥补这一个不足,并且支持并行处理。然而也有不足,对于超高维数据集和稀疏数据集等来说,它的表现就不是很好了,并且更消耗内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值