随机森林实例:利用基于CART算法的随机森林(Random Forest)树分类方法对于红酒质量进行预测

1、引言

随机森林(Random Forest)是一种基于决策树的集成学习(Ensemble Learning)方法,其基本思想是通过集成学习的思想将多课决策树集成的一种算法,基本构成单元是决策树,本质上为集成学习方法。随机森林可以分为两个部分来看,一部分是“随机”,另一部分是“森林”。所谓“森林”,就是指由很多棵“树”构成的,每一棵树都是一棵决策树;而“随机”的含义则会在后续的理论介绍部分详细介绍。对于我们所要研究的分类问题而言,直观上来说,每棵决策树都是对于给定数据集的一个“分类器”,如果我们所建立的森林有N棵决策树,那么对于一个给定数据就能得到N个分类结果,随机森林再将所有的结果集合起来,投票选出次数最多的结果作为最终的输出。

作为新兴起的、高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来源,保留和流失,也可用来预测疾病的风险和病患者的易感性。

2、理论基础

2.1 什么是决策树

决策树算法(Decision Tree)算法是一种基本的分类与回归方法,是我们最经常使用的数据挖掘算法之一。决策树模型是一种树形结构,在常见的分类问题中,表现为基于特征对于数据实例进行分类的过程,其基本规则是if-then规则。如下图所示,对于一组具有二维特征变量的数据,利用两个叶节点的处理后,我们可以将数据的两种分类区分开来;从空间上来说,是将数据空间按其分类分为了两个部分。一般而言,决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪三个步骤。对于决策树分类的直观认识【来源*Introduction to Machine Learning*】

2.2 特征选择的算法

决策树最重要的步骤就是如何选择合适的标准对于数据进行分类。而对于数据进行分类的依据是信息增益。

这里首先要引入信息论的相关知识:

熵(entropy):熵指的是体系的混乱程度

信息论(information theory)中的熵(又称为香农熵):是一种信息度量方式,表示的第一个数据集中的信息的混乱的程度,一般而言,数据集中的信息越有序,信息熵越低, 信息越无序,信息熵就越高。对于数据分类而言,一组数据中的类别越多,其信息的混乱程度也就越高,类别越少其混乱程度越低。下图表示了包含了两类数据的数据组的数据构成比例与其信息混乱程度之间的关系,可以看到当数据越接近于由单一类别构成时,信息混乱程度越低,而数据构成越接近于1:1时(对于两类数据而言),其信息混乱程度越来越高。
可以看到随着数据集中二类数据比例的变化下混乱程度的变化

信息增益(information gain):指的是在选定特征划分数据集前后的信息熵的变化情况。 一般来说,决策树在决定信息混乱程度的常见算法有三种,即:

2.2.1 ID3:基于信息增益的特征划分

ID3算法的信息增益算法基础是香农熵,熵定义为信息的期望值。如果待分类的对象可能被划分在多个种类中,那么我们定义对象x_i的信息为:

l ( x i ) = − log ⁡ 2 ( p ( x i ) ) l(x_i)=-\log_2\left(p(x_i)\right) l(xi)=log2(p(xi))

其中 p ( x i ) p(x_i) p(xi)是选择该分类的概率。为了对于数据集的熵进行计算,我们需要对于所有类别所有可能值包含的信息期望值,即有:

H ( D ) = − ∑ k = 1 K ∣ C k ∣ D log ⁡ 2 ∣ C k ∣ D = − ∑ i = 1 n p ( x i ) log ⁡ 2 p ( x i ) H(D)=-\sum_{k=1}^K\frac{\vert C_k\vert}D\log_2\frac{\vert C_k\vert}D=-{\textstyle\sum_{i=1}^n}p(x_i)\log_2p(x_i) H(D)=k=1KDCklog2DCk=i=1np(xi)log2p(xi)

信息增益可以表示为:
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D\vert A) g(D,A)=H(D)H(DA) H ( D ∣ A ) = ∑ i = 1 n D i D H ( D i ) = − ∑ i = 1 n ∑ k = 1 K ∣ D i k ∣ D i log ⁡ ∣ D i k ∣ D i H(D\vert A)=\sum_{i=1}^n\frac{D_i}DH(D_i)=-\sum_{i=1}^n\sum_{k=1}^K\frac{\vert D_{ik}\vert}{D_i}\log\frac{\vert D_{ik}\vert}{D_i} H(DA)=i=1nDDiH(Di)=i=1nk=1KDiDiklogDiD

  • 19
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是一个使用KNN、决策树随机森林对葡萄酒质量数据进行建模的完整Python代码: 首先,需要导入必要的库: ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score ``` 接下来,读取数据并进行预处理: ```python # 读取数据集 data = pd.read_csv('winequality.csv') # 将数据集分为特征和目标 X = data.iloc[:, :-1].values y = data.iloc[:, -1].values # 将目标变量转换为二元变量 for i in range(len(y)): if y[i] < 6: y[i] = 0 else: y[i] = 1 # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 特征缩放 sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) ``` 然后,使用KNN进行建模和预测: ```python # KNN分类器 knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train) # 预测测试集结果 y_pred_knn = knn.predict(X_test) # 输出模型准确率 acc_knn = accuracy_score(y_test, y_pred_knn) print("KNN准确率:", acc_knn) ``` 接下来,使用决策树进行建模和预测: ```python # 决策树分类器 dt = DecisionTreeClassifier(criterion='entropy', random_state=0) dt.fit(X_train, y_train) # 预测测试集结果 y_pred_dt = dt.predict(X_test) # 输出模型准确率 acc_dt = accuracy_score(y_test, y_pred_dt) print("决策树准确率:", acc_dt) ``` 最后,使用随机森林进行建模和预测: ```python # 随机森林分类器 rf = RandomForestClassifier(n_estimators=10, criterion='entropy', random_state=0) rf.fit(X_train, y_train) # 预测测试集结果 y_pred_rf = rf.predict(X_test) # 输出模型准确率 acc_rf = accuracy_score(y_test, y_pred_rf) print("随机森林准确率:", acc_rf) ``` 完整代码如下: ```python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score # 读取数据集 data = pd.read_csv('winequality.csv') # 将数据集分为特征和目标 X = data.iloc[:, :-1].values y = data.iloc[:, -1].values # 将目标变量转换为二元变量 for i in range(len(y)): if y[i] < 6: y[i] = 0 else: y[i] = 1 # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 特征缩放 sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # KNN分类器 knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train) # 预测测试集结果 y_pred_knn = knn.predict(X_test) # 输出模型准确率 acc_knn = accuracy_score(y_test, y_pred_knn) print("KNN准确率:", acc_knn) # 决策树分类器 dt = DecisionTreeClassifier(criterion='entropy', random_state=0) dt.fit(X_train, y_train) # 预测测试集结果 y_pred_dt = dt.predict(X_test) # 输出模型准确率 acc_dt = accuracy_score(y_test, y_pred_dt) print("决策树准确率:", acc_dt) # 随机森林分类器 rf = RandomForestClassifier(n_estimators=10, criterion='entropy', random_state=0) rf.fit(X_train, y_train) # 预测测试集结果 y_pred_rf = rf.predict(X_test) # 输出模型准确率 acc_rf = accuracy_score(y_test, y_pred_rf) print("随机森林准确率:", acc_rf) ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值