本文概述
- 随机森林算法
- 该算法如何工作?
- 优点
- 缺点
- 寻找重要特征
- 随机森林与决策树
- 使用Scikit学习构建分类器
- 在Scikit学习中发现重要功能
- 在选定特征上生成模型
- 总结
随机森林具有各种应用程序, 例如推荐引擎, 图像分类和特征选择。它可用于对忠实的贷款申请人进行分类, 识别欺诈活动并预测疾病。它位于Boruta算法的基础上, 该算法选择数据集中的重要特征。
在本教程中, 你将学习以下所有内容:
- 随机森林算法
- 分类器如何工作?
- 其优缺点
- 寻找重要特征
- 随机森林和决策树之间的比较
- 使用scikit-learn构建分类器
- 使用scikit-learn查找重要功能 :target:before { content:""; display:block; height:150px; margin:-150px 0 0; } h3 {font-weight:normal; margin-top:.5em} h4 { font-weight:lighter }
随机森林算法 让我们以外行的术语来理解算法。假设你想旅行, 并且想去一个可以享受的地方。
那么, 你如何找到自己想要的地方?你可以在线搜索, 在旅行博客和门户网站上阅读评论, 也可以问朋友。
假设你决定问问你的朋友, 并与他们讨论他们过去在各个地方的旅行经历。你会从每个朋友那里得到一些建议。现在, 你必须列出这些推荐地点。然后, 你要求他们从你推荐的地点列表中投票(或为旅行选择一个最佳地点)。票数最高的地方将是你这次旅行的最终选择。
【了解Python中的随机森林分类器】在上述决策过程中, 分为两个部分。首先, 向你的朋友询问他们的个人旅行经历, 并从他们访问过的多个地方中获得一项推荐。这部分就像使用决策树算法。在这里, 每个朋友都选择了他或她到目前为止访问过的地方。
在收集所有建议之后, 第二部分是投票程序, 用于在建议列表中选择最佳位置。从朋友那里获得推荐并对其进行投票以找到最佳地点的整个过程称为随机森林算法。
从技术上讲, 它是在随机拆分的数据集上生成的决策树的整体方法(基于分治法)。决策树分类器的这种集合也称为森林。使用属性选择指示符(例如, 每个属性的信息增益, 增益比和Gini索引)生成各个决策树。每棵树取决于一个独立的随机样本。在分类问题中, 每棵树投票, 并选择最受欢迎的类别作为最终结果。在回归的情况下, 所有树输出的平均值被视为最终结果。与其他非线性分类算法相比, 它更简单, 功能更强大。
该算法如何工作? 它分四个步骤工作:
- 从给定的数据集中选择随机样本。
- 为每个样本构造一个决策树, 并从每个决策树中获得预测结果。
- 对每个预测结果进行投票。
- 选择投票最多的预测结果作为最终预测。
文章图片
优点
- 由于参与该过程的决策树数量众多, 因此随机森林被认为是一种高度准确且健壮的方法。
- 它不会遭受过度拟合的问题。主要原因是它采用了所有预测的平均值, 从而消除了偏差。
- 该算法可用于分类和回归问题。
- 随机森林也可以处理缺失值。处理这些问题的方法有两种:使用中位数替换连续变量, 以及计算缺失值的近似加权平均值。
- 你可以获得相对特征的重要性, 这有助于为分类器选择最有帮助的特征。
- 随机森林具有多个决策树, 因此生成预测的速度较慢。每当做出预测时, 森林中的所有树木都必须针对相同的给定输入做出预测, 然后对其进行投票。这整个过程很耗时。
- 与决策树相比, 该模型难以解释, 在决策树中, 你可以通过遵循树中的路径轻松地做出决策。
该分数将帮助你选择最重要的功能, 而放弃最不重要的功能以进行模型构建。
随机森林使用基尼重要性或杂质平均减少量(MDI)来计算每个特征的重要性。基尼重要性也被称为节点杂质的总减少。这是删除变量时模型拟合或准确性降低的程度。减小幅度越大, 变量越显着。在此, 平均下降是变量选择的重要参数。基尼系数可以描述变量的整体解释能力。
随机森林与决策树
- 随机森林是一组多个决策树。
- 深度决策树可能会过度拟合, 但是随机森林通过在随机子集上创建树来防止过度拟合。
- 决策树的计算速度更快。
- 随机森林很难解释, 而决策树则易于解释并且可以转换为规则。
首先从scikit-learn导入数据集库, 然后使用load_iris()加载iris数据集。
#Import scikit-learn dataset libraryfrom sklearn import datasets#Load datasetiris = datasets.load_iris()
你可以打印目标名称和特征名称, 以确保你拥有正确的数据集, 例如:
# print the label species(setosa, versicolor, virginica)print(iris.target_names)# print the names of the four featuresprint(iris.feature_names)
['setosa' 'versicolor' 'virginica']['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
经常浏览一下数据是个好主意, 这样你就知道自己在使用什么。在这里, 你可以看到打印了数据集的前五行, 以及整个数据集的目标变量。
# print the iris data (top 5 records)print(iris.data[0:5])# print the iris labels (0:setosa, 1:versicolor, 2:virginica)print(iris.target)
[[ 5.13.51.40.2] [ 4.93.1.40.2] [ 4.73.21.30.2] [ 4.63.11.50.2] [ 5.3.61.40.2]][0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]
在这里, 你可以通过以下方式创建虹膜数据集的DataFrame。
# Creating a DataFrame of given iris dataset.import pandas as pddata=http://www.srcmini.com/pd.DataFrame({'sepal length':iris.data[:, 0], 'sepal width':iris.data[:, 1], 'petal length':iris.data[:, 2], 'petal width':iris.data[:, 3], 'species':iris.target})data.head()
花瓣长度 | 花瓣宽度 | 萼片长度 | 萼片宽度 | 种类 | |
---|---|---|---|---|---|
0 | 1.4 | 0.2 | 5.1 | 3.5 | 0 |
1 | 1.4 | 0.2 | 4.9 | 3.0 | 0 |
2 | 1.3 | 0.2 | 4.7 | 3.2 | 0 |
3 | 1.5 | 0.2 | 4.6 | 3.1 | 0 |
4 | 1.4 | 0.2 | 5.0 | 3.6 | 0 |
# Import train_test_split functionfrom sklearn.model_selection import train_test_splitX=data[['sepal length', 'sepal width', 'petal length', 'petal width']]# Featuresy=data['species']# Labels# Split dataset into training set and test setX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% training and 30% test
拆分后, 你将在训练集上训练模型并在测试集上执行预测。
#Import Random Forest Modelfrom sklearn.ensemble import RandomForestClassifier#Create a Gaussian Classifierclf=RandomForestClassifier(n_estimators=100)#Train the model using the training sets y_pred=clf.predict(X_test)clf.fit(X_train, y_train)y_pred=clf.predict(X_test)
训练后, 使用实际值和预测值检查准确性。
#Import scikit-learn metrics module for accuracy calculationfrom sklearn import metrics# Model Accuracy, how often is the classifier correct?print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
('Accuracy:', 0.93333333333333335)
你还可以对单个项目进行预测, 例如:
- 萼片长度= 3
- 萼片宽度= 5
- 花瓣长度= 4
- 花瓣宽度= 2
clf.predict([[3, 5, 4, 2]])
array([2])
在此, 2表示花型维珍尼亚。
在Scikit学习中发现重要功能 在这里, 你可以在IRIS数据集中找到重要特征或选择特征。在scikit-learn中, 你可以按照以下步骤执行此任务:
- 首先, 你需要创建一个随机森林模型。
- 其次, 使用特征重要性变量查看特征重要性分数。
- 第三, 使用seaborn库可视化这些分数。
from sklearn.ensemble import RandomForestClassifier#Create a Gaussian Classifierclf=RandomForestClassifier(n_estimators=100)#Train the model using the training sets y_pred=clf.predict(X_test)clf.fit(X_train, y_train)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1, oob_score=False, random_state=None, verbose=0, warm_start=False)
import pandas as pdfeature_imp = pd.Series(clf.feature_importances_, index=iris.feature_names).sort_values(ascending=False)feature_imp
petal width (cm)0.458607petal length (cm)0.413859sepal length (cm)0.103600sepal width (cm)0.023933dtype: float64
你还可以可视化功能的重要性。可视化易于理解和解释。
为了可视化, 可以结合使用matplotlib和seaborn。由于seaborn是基于matplotlib构建的, 因此它提供了许多自定义主题, 并提供了其他绘图类型。 Matplotlib是seaborn的超集, 并且对于良好的可视化而言, 两者同等重要。
import matplotlib.pyplot as pltimport seaborn as sns%matplotlib inline# Creating a bar plotsns.barplot(x=feature_imp, y=feature_imp.index)# Add labels to your graphplt.xlabel('Feature Importance Score')plt.ylabel('Features')plt.title("Visualizing Important Features")plt.legend()plt.show()
文章图片
在选定特征上生成模型 在这里, 你可以删除” 分隔宽度” 功能, 因为它的重要性很低, 然后选择其余3个功能。
# Import train_test_split functionfrom sklearn.cross_validation import train_test_split# Split dataset into features and labelsX=data[['petal length', 'petal width', 'sepal length']]# Removed feature "sepal length"y=data['species']# Split dataset into training set and test setX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.70, random_state=5) # 70% training and 30% test
拆分后, 你将在选定的训练集特征上生成模型, 对选定的测试集特征执行预测, 并比较实际值和预测值。
from sklearn.ensemble import RandomForestClassifier#Create a Gaussian Classifierclf=RandomForestClassifier(n_estimators=100)#Train the model using the training sets y_pred=clf.predict(X_test)clf.fit(X_train, y_train)# prediction on test sety_pred=clf.predict(X_test)#Import scikit-learn metrics module for accuracy calculationfrom sklearn import metrics# Model Accuracy, how often is the classifier correct?print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
('Accuracy:', 0.95238095238095233)
你可以看到, 删除了最不重要的特征(间隔长度)后, 准确性提高了。这是因为你删除了误导性数据和噪声, 从而提高了准确性。较少的功能也可以减少训练时间。
总结 恭喜, 你已完成本教程的结尾!
在本教程中, 你学习了什么是随机森林, 如何工作, 查找重要功能, 随机森林与决策树之间的比较, 优缺点。你还学习了scikit-learn中的模型构建, 评估和发现重要功能。乙
如果你想了解有关机器学习的更多信息, 建议你看一看我们的《 R:分类中的监督学习》课程。
推荐阅读
- pandas教程(使用read_csv()导入数据)
- 使用Jinja2的Jupyter Notebook的自定义模板
- TensorBoard精品开发教程
- R中的线性回归权威指南
- 使用Tableau进行数据可视化
- 将字符串转换为日期作为datetime对象
- 使用Python增强数据科学中的电子表格
- Android-shape圆形&转圈圈
- appuim的简单使用及实例