欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习——Tree Methods and Random Forest随机森林

程序员文章站 2022-07-14 14:11:07
...

Random Forest随机森林

学习提要:
1·介绍Tree Methods;
2·引入Random Forest;
3·Coding.

Introduction to Tree Methods:

为了方便理解,我们先举一个例子。想象一下,每个周末,你都想约上你的朋友一起去打球。但是,
你的朋友有时候来有时候不来。对于他来说,和不和你一起去打球可能取决于如下因素:天气状况、风速、湿度、温度等。那么你就可能会想:我能不能用这些因素来预测我的朋友出不出来和我打球?这个时候你对之前的周末都做了一个统计形成了一个数表:
机器学习——Tree Methods and Random Forest随机森林
接下来,你就可以用这些数据进行预测了。这时候就会遇到一个问题,我的第一个判断标准是什么?Outlook?Temperature?Humidity?这时候我们就需要去计算每个因素的信息熵去帮助我们判断哪个因素提供了最多的信息(信息熵在上次的建立因果连系那篇博客中有写到,如果没看的话可以点击信息熵进行学习)。我们这边就不进行具体的计算了,我们假设Outlook占据主导,则可以有如下的判断方式:
机器学习——Tree Methods and Random Forest随机森林
这样你就建立完一个模型了,下次周末只要把相应的因素带进去判断一下,再决定邀不邀请他。
于是乎,我们就把上述这种预测方式称为Tree Methods(决策树)。我们把Outlook这个因素所在的位置称为根节点,把Humidity和Windy这些因素所在的位置称为叶子节点。决策数模型通常适用于类别变量比较多的数据表。但是我们在观察上图所示的决策方法时发现:根节点的因素对这个模型的预测有很大的影响。也就是说如果在相同的稳态条件下,这颗树可能会有很高的精准度,但是稳态万一发生了变化,而根问题不发生变化的话,这个模型很可能会被练“坏”,导致极低的准确率。因此我们需要一个方法去降低这个根节点在模型中的“影响力”——Random Forest

Introduction to Random Forest:

随机森林,是由很多“发育程度各不相同的决策树”组成的。预测问题时,由这些决策树进行众数投票,投出最后的结果。什么时发育程度各不相同呢?我们在给每棵树分配特征的时候做些改变,我们随机给出80%的特征,和这些特征下80%的数据用来培育决策树,这样就可以得到不同成长度的决策树了。

Coding

使用Jupyter Notebook,先介绍一下数据集。这边我们使用的数据集来自于Lending Club,这是一个类似于国内借贷平台的网站,他依据人们的信用、还贷能力等特征来决定是否借贷、借多少?下图是数据集中的特征解释:
机器学习——Tree Methods and Random Forest随机森林
我们这边EDA环节就直接跳过了,有兴趣可以找个数据集来练手。数据集可以在Kaggle上找。

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

我们先来看一下这个数据集:
机器学习——Tree Methods and Random Forest随机森林
我们可以通过EDA发现purpose这个特征对于Lending Club的判断很重要,但因为它是以字符串表示的,所以我们得把他转化为0、1这种模型能看懂的类别变量。
数据预处理:

cat_feats = list(loans['purpose'])
data = pd.get_dummies(loans['purpose'], drop_first=True)
loans.drop('purpose', axis=1, inplace=True)
final_data = pd.concat([loans,data], axis=1)

机器学习——Tree Methods and Random Forest随机森林
处理完成之后就是上图所示的样子了,变成了模型能读懂的数据表了。接下来建立模型:

from sklearn.model_selection import train_test_split
X = final_data.drop('not.fully.paid', axis=1)
y = final_data['not.fully.paid']
X_train, X_test, y_train, y_test = train_test_split(X, y , test_size=0.2)

Decision Tree的训练:

from sklearn.tree import DecisionTreeClassifier
dtree = DecisionTreeClassifier()
dtree.fit(X_train, y_train)
#预测
pred = dtree.predict(X_test)
from sklearn.metrics import classification_report, confusion_matrix
print(classification_report(y_test, pred))

机器学习——Tree Methods and Random Forest随机森林
我们可以看到这个结果并不怎么好,但是在我们的预料之内对吧
Random Forest训练:

from sklearn.ensemble import RandomForestClassifier
rfc_dtree = RandomForestClassifier()
rfc_dtree.fit(X_train, y_train)
#预测
prediction = r_dtree.predict(X_test)
print(classification_report(y_test, prediction))

机器学习——Tree Methods and Random Forest随机森林
这个准确度一下子就上来了对吧。
OK~我们的这次机器模型之旅就到这里告一段落啦…