关于机器学习:机器学习五通俗易懂决策树与随机森林及代码实践

38次阅读

共计 4354 个字符,预计需要花费 11 分钟才能阅读完成。

与 SVM 一样,决策树是通用的机器学习算法。随机森林,顾名思义,将决策树分类器集成到一起就造成了更弱小的机器学习算法。它们都是很根底但很弱小的机器学习工具,尽管咱们当初有更先进的算法工具来训练模型,但决策树与随机森林因其简略灵便仍然广受青睐,倡议大家学习。

一、决策树

1.1 什么是决策树

咱们能够把决策树设想成 IF/ELSE 判别式深度嵌套的二叉树形构造。以咱们在《机器学习(三):了解逻辑回归及二分类、多分类代码实际》所举的鸢尾花数据集为例。

咱们曾用 seaborn 绘制花瓣长度和宽度特色对应鸢尾花品种的散点图,如下:

当花瓣长度小于 2.45 则为山鸢尾 (setosa),剩下的咱们判断花瓣宽度小于 1.75 则为变色鸢尾(versicolor) 剩下的为维吉尼亚鸢尾(virginica)。那么我用导图画一下这种判别式的树形构造如下:

因而,当咱们面对任意鸢尾花的样本,咱们只须要 从根节点到叶子节点遍历决策树,就能够失去鸢尾花的分类论断。

这就是决策树。

1.2 决策树代码实际

咱们导入数据集(大家不必在意这个域名),并训练模型:

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier

#引入数据集
df = pd.read_csv('https://blog.caiyongji.com/assets/iris.csv')

#决策树模型
X = df[['petal_length','petal_width']].to_numpy() 
y = df['species']
tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_clf.fit(X, y)

咱们来可视化决策树:

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(12,8))
plot_tree(tree_clf,filled=True);

如上图,咱们能够看到根节点总实例数为 150 时,由 value = [50, 50, 50] 可知,理论样本分类为 50 个山鸢尾花实例、50 个变色鸢尾花实例、50 个维吉尼亚鸢尾花实例。咱们再看最开端右侧的叶子节点(紫色),由 value = [0, 1, 45] 可知,理论样本分类为 0 个山鸢尾花实例、1 个变色鸢尾花实例、45 个维吉尼亚鸢尾花实例。

那么 gini = 0.043 是什么意思呢?

1.3 基尼不纯度

显然咱们进行分类时,每一个类别理论混入其余类的数量越少分类就越 纯正,这种纯度咱们通过如下公式示意:

$$ G_i = 1 – \sum_{k=1}^{n}{p^2_{i,k}} $$

咱们计算维吉尼亚鸢尾花节点(紫色)的 gini 系数1-((0/46)**2 + (1/46)**2 + (45/46)**2) = 0.04253308128544431 ≈0.043

咱们应用基尼 (gini) 不纯度来掂量决策树的好坏。那么咱们通过最小化基尼不纯度 min(gini)来求解 X[0],X[1](即,花瓣长度宽度特色)边界的过程就决策树模型的训练过程。

二、随机森林

2.1 大数定理与随机森林

其实随机森林很简略,咱们把决策树随机组合在一起就是随机森林,它比单个的决策树更无效。

凭什么?

假如咱们有一枚不平均的硬币,投掷它有 51% 的概率为侧面,49% 的概率为反面,那么当投掷 1000 次时,“大多数为侧面 ” 这件事的概率为 75%。投掷 10000 次时,“大多数为侧面 ” 这件事的概率为 97%。这就是大数定理,它体现的是群体智慧。品质不够,数量来凑。由此可知,以后寻找最佳模型的办法不止是技巧的比拼,也同样是算力的比拼。

2.2 随机森林代码实际

2.2.1. 引入新的数据集

增加援用:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

导入数据集(大家不必在意这个域名):

df = pd.read_csv("https://blog.caiyongji.com/assets/penguins_size.csv")
df = df.dropna()
df.head()
species island culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g sex
Adelie Torgersen 39.1 18.7 181 3750 MALE
Adelie Torgersen 39.5 17.4 186 3800 FEMALE
Adelie Torgersen 40.3 18 195 3250 FEMALE
Adelie Torgersen 36.7 19.3 193 3450 FEMALE
Adelie Torgersen 39.3 20.6 190 3650 MALE

企鹅数据集蕴含特色和标签如下:

  • 特色:所在岛屿 island、鸟喙长度 culmen_length_mm、鸟喙深度 culmen_depth_mm、脚蹼长度 flipper_length_mm、体重(g)、性别
  • 标签:物种 species:Chinstrap, Adélie, or Gentoo

2.2.2 察看数据


sns.pairplot(df,hue='species')

咱们通过 pairplot 办法绘制特色两两之间的对应关系。

2.2.3 预处理

X = pd.get_dummies(df.drop('species',axis=1),drop_first=True)
y = df['species']
X.head()

留神,get_dummies办法将字符串属性的列转换成了数字属性的多个列。如,岛屿 island 和性别 sex 别离转换成了 island_Dream、island_Torgersen 和 sex_FEMALE、sex_MALE。这是一种独热编码的关系,比方 sex_FEMALE 与 sex_MALE 属性独立,在空间内没有向量关系。

culmen_length_mm culmen_depth_mm flipper_length_mm body_mass_g island_Dream island_Torgersen sex_FEMALE sex_MALE
39.1 18.7 181 3750 0 1 0 1
39.5 17.4 186 3800 0 1 1 0
40.3 18 195 3250 0 1 1 0
36.7 19.3 193 3450 0 1 1 0
39.3 20.6 190 3650 0 1 0 1

2.2.4 训练数据

# 训练
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)
model = RandomForestClassifier(n_estimators=10,max_features='auto',random_state=101)
model.fit(X_train,y_train)

#预测
from sklearn.metrics import accuracy_score
preds = model.predict(X_test)
accuracy_score(y_test,preds)

应用随机森林分类器 RandomForestClassifier 训练,失去模型精度为 97%。

2.2.5 网格搜寻与 AdaBoost 晋升法(拓展)

咱们应用 AdaBoostClassifier 分类器集成数个决策树分类器 DecisionTreeClassifier 进行分类。并应用网格搜寻办法 GridSearchCV 来寻找最优参数。

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import AdaBoostClassifier

ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), random_state=101)
ada_clf.fit(X_train, y_train)
param_grid = {'n_estimators':[10,15,20,25,30,35,40], 'learning_rate':[0.01,0.1,0.5,1], 'algorithm':['SAMME', 'SAMME.R']}
grid = GridSearchCV(ada_clf,param_grid)
grid.fit(X_train,y_train)
print("grid.best_params_ =",grid.best_params_,", grid.best_score_ =" ,grid.best_score_)

这是一种集成学习技术,输入如下:

grid.best_params_ =  {'algorithm': 'SAMME', 'learning_rate': 1, 'n_estimators': 20} , grid.best_score_ = 0.9914893617021276

总结

二叉树是决策树的外围逻辑,随机森林是大数定理的利用实现。这种根本思维即便不必数学公式也能够很容易的解释分明,这也是我做这个系列课程(文章)的次要格调特点。我认为,数学是对事实世界的解释,但事实世界并不能被数学 齐全解释。像谷歌 AI 主管 Laurence Moroney 所说:

很多人胆怯数学,胆怯大量的深度的微积分常识。其实咱们能够实现编码而不思考数学,咱们能够应用 TensorFlow 中高 (层) 级的 API,来解决问题,如自然语言解决,图像分类,计算机视觉序列模型等而无需了解粗浅的数学。就像你应用 JAVA 却不肯定非要把握它是如何编译的。将来,AI 只是每个开发者技术栈 (toolbox) 中的一部分,就像 HTML, CSS, JAVA。

心愿那一天能够早点到来吧……

往期文章:

  • 机器学习(四):艰深了解反对向量机 SVM 及代码实际
  • 机器学习(三):了解逻辑回归及二分类、多分类代码实际
  • 机器学习(二):了解线性回归与梯度降落并做简略预测
  • 机器学习(一):5 分钟了解机器学习并上手实际
  • 前置机器学习(五):30 分钟把握罕用 Matplotlib 用法
  • 前置机器学习(四):一文把握 Pandas 用法
  • 前置机器学习(三):30 分钟把握罕用 NumPy 用法
  • 前置机器学习(二):30 分钟把握罕用 Jupyter Notebook 用法
  • 前置机器学习(一):数学符号及希腊字母

正文完
 0