共计 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 用法
- 前置机器学习(一):数学符号及希腊字母