人人都在用的机器学习算法-决策树

决策树(DecisionTree)

这里说几个决策树有关的概念:

  • 贪心算法:是指在对问题求解时,总是做出在当前看来是最好的选择。不考虑总体的最优解,以每一步的局部最优解来模拟全局最优解。决策树是典型的贪心算法,现在众多的决策树算法包括,ID3、C4.5和CART,都是在使用这一算法。

那么对于决策树来说,怎么才能实现局部最优呢?需要有一些指标来帮助决策树模型,判断哪个条件是最重要的,对下面的例子来说:高,富,帅到底哪个是最重要的呢?决策树为了找出最佳节点和最佳的分枝⽅法,创建了几个指标来帮助实现局部最优,简单说一下,对公式感兴趣的也可以自己搜搜看:

  • 信息熵:混乱度,不稳定度,不确定性越大,越混乱,则信息熵越大,反之,信息熵越小。我们当然是希望信息熵越小越稳定,越好,这样我们预测的数据就更准确。
  • gini:常用,和信息熵相似,越小越好,只是值域不同,变化更平缓。
  • 分类误差:决策树中通常不使用,其对样本数量的变动不敏感。

下图是:各指标随着单个节点中某一个变量占比的变化图
人人都在用的机器学习算法-决策树_第1张图片

决策树算法思想

决策树算法的原理,绝对是每个人都懂的,也每天都在使用的,简单举个例子大家就知道了:
每个人都不经意之间使用到决策树,比如我想买房子:
1.先考虑要100平以上的,就会排除100平一下,在100平以上的房子中选择,
2.在考虑有没有学区,排除没有学区的房子,在100平以上有学区的房子中选择,
等等,这就是决策树的算法思想

决策树算法的构造, 实际上就是对原有数据集, 选取⼀定的属性测试条件, 不断进⾏切分的过程。
下面举一个‘高富帅’的例子,来说下决策树的一些基本概念:

节点 意义
根节点 没有进边,有出边,一般指最初的,针对特征的提问。例如正方形的“高吗?”
中间节点 既有进边也有出边,进边只有⼀条,出边可以有很多条。例如椭圆形的的“帅吗?”,“富吗?”
叶⼦节点 有进边,没有出边,例如菱形的的“注定单身”,“多人运动”
⼦节点和⽗节点 在两个相连的节点中,更接近根节点的是⽗节点,另⼀个是⼦节点。例如:帅吗?是富吗?的父节点
人人都在用的机器学习算法-决策树_第2张图片

决策树的特点

  1. 过拟合:基本所有的决策树在不加限制的情况下都会实现过拟合,达到测试集百分比的预测结果,过拟合一直是决策树模型的比较困难的点。
  2. “王侯将相宁有种” :相较于knn的众生平等,决策树天生就认为每个特征有高低之分。
  3. “自成一家”:他是一个无参算法,不需要空间的假设。不太会受到离散值,缺失值的影响。
  4. 可理解性好,相较于其他算法,决策树和人的思考方式比较相像,更容易解释。

决策树代码实现

PS:

  • 决策树模型基本不会单独使用,因为随机森林,adaboost等集合算法太厉害了。
  • 值得一提的是,决策树除了分类树,还有回归树。

代码实现分类树模型:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#全部行都能输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
#显示中文,解决图中无法显示中文的问题
plt.rcParams['font.sans-serif']=['Simhei'] 
plt.rcParams['axes.unicode_minus']=False   
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris # 用的数据集, 鸢尾花集

# 导入数据,切分测试集数据集
iris = load_iris()
X = pd.DataFrame(data = iris.data,  columns=iris.feature_names)
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
   
#学习曲线初步调参
train_score_list = [] 
test_score_list = []
cross_score_list = [] 
for i in range(1,10):
    dtc =  DecisionTreeClassifier(max_depth=i)# 调最大深度
    dtc.fit(X_train, y_train)
    train_score = dtc.score(X_train, y_train)
    test_score = dtc.score(X_test, y_test) 
    cross_score = cross_val_score(dtc, X_train, y_train, cv=5).mean()    
    train_score_list.append(train_score)
    test_score_list.append(test_score)
    cross_score_list.append(cross_score)
#画图   
plt.plot(range(1,10 ), train_score_list , label='train_score' ) 
plt.plot(range(1,10 ), test_score_list , label='test_score' ) 
plt.plot(range(1,10 ), cross_score_list , label='cross_score' ) 
plt.legend() 

#网格搜索多参数调参
dtc = DecisionTreeClassifier(random_state=666)
grid_range = {
    "max_depth":[2,3,4], 
    "min_samples_leaf":range(2, 40,5),
    "max_leaf_nodes":range(3, 8),
    "min_samples_split":range(10, 31, 2)} 
grid = GridSearchCV(dtc , param_grid=grid_range, n_jobs=-1, verbose=2, cv=5 ).fit(X_train, y_train)

grid.best_score_# 最优分数
grid.best_params_# 最优分数参数组合
grid.score(X_test, y_test)#测试集分数
grid.score(X_train, y_train)#训练集分数

人人都在用的机器学习算法-决策树_第3张图片
人人都在用的机器学习算法-决策树_第4张图片
这几天太忙了,会慢慢把机器学习的算法都补出来的,前方应该有梦的。

你可能感兴趣的:(python,机器学习,算法,决策树)