forest及python实现的简单介绍

发布时间:2022-11-22

本文目录一览:

  1. 求python写的随机森林的roc代码
  2. Python 如何画类似辐射图
  3. 如何用python实现随机森林分类

求python写的随机森林的roc代码

随机森林在 R packages 和 Python scikit-learn 中的实现是当下非常流行的,下列是在 R 和 Python 中载入随机森林模型的具体代码:

Python

# Import Library
from sklearn.ensemble import RandomForestClassifier  # use RandomForestRegressor for regression problem
# Assumed you have, X (predictor) and Y (target) for training data set and x_test (predictor) of test_dataset
# Create Random Forest object
model = RandomForestClassifier(n_estimators=1000)
# Train the model using the training sets and check score
model.fit(X, y)
# Predict Output
predicted = model.predict(x_test)

R Code

library(randomForest)
x <- cbind(x_train, y_train)
# Fitting model
fit <- randomForest(Species ~ ., x, ntree=500)
summary(fit)
# Predict Output
predicted = predict(fit, x_test)

Python 如何画类似辐射图

Python 有一些自带的图形例子,在 Python 目录的 Lib\turtledemo 下面,通过下面的命令可以执行,foresttree 有点类似你想要的图形,可以参考一下。

pythonw -m turtledemo forest

如何用python实现随机森林分类

大家如何使用 scikit-learn 包中的类方法来进行随机森林算法的预测。其中讲的比较好的是各个参数的具体用途。 这里我给出我的理解和部分翻译:

参数说明:

最主要的两个参数是 n_estimatorsmax_features

  • n_estimators:表示森林里树的个数。理论上是越大越好。但是伴随着就是计算时间的增长。但是并不是取得越大就会越好,预测效果最好的将会出现在合理的树个数。
  • max_features:随机选择特征集合的子集合,并用来分割节点。子集合的个数越少,方差就会减少的越快,但同时偏差就会增加的越快。根据较好的实践经验。如果是回归问题则:
    • max_features = n_features,如果是分类问题则 max_features = sqrt(n_features)。 如果想获取较好的结果,必须将 max_depth = None,同时 min_sample_split = 1。 同时还要记得进行交叉验证(cross_validated),除此之外记得在 random forest 中,bootstrap = True。但在 extra-trees 中,bootstrap = False。 这里也给出一篇老外写的文章:调整你的随机森林模型参数。 这里我使用了 scikit-learn 自带的 iris 数据来进行随机森林的预测:
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
# print iris # iris的4个属性是:萼片宽度 萼片长度 花瓣宽度 花瓣长度 标签是花的种类:setosa versicolour virginica
print(iris['target'].shape)
rf = RandomForestRegressor()  # 这里使用了默认的参数设置
rf.fit(iris.data[:150], iris.target[:150])  # 进行模型的训练
# 随机挑选两个预测不相同的样本
instance = iris.data[[100, 109]]
print(instance)
print('instance 0 prediction;', rf.predict(instance[0]))
print('instance 1 prediction;', rf.predict(instance[1]))
print(iris.target[100], iris.target[109])

返回的结果如下:

(150,)
[[ 6.3  3.3  6.   2.5]
 [ 7.2  3.6  6.1  2.5]]
instance 0 prediction; [ 2.]
instance 1 prediction; [ 2.]
2 2

在这里我有点困惑,就是在 scikit-learn 算法包中随机森林实际上就是一颗颗决策树组成的。但是之前我写的决策树博客中是可以将决策树给显示出来。但是随机森林却做了黑盒处理。我们不知道内部的决策树结构,甚至连父节点的选择特征都不知道是谁。所以我给出下面的代码(这代码不是我的原创),可以显示的显示出所有的特征的贡献。所以对于贡献不大的,甚至是负贡献的我们可以考虑删除这一列的特征值,避免做无用的分类。

from sklearn.cross_validation import cross_val_score, ShuffleSplit
X = iris["data"]
Y = iris["target"]
names = iris["feature_names"]
rf = RandomForestRegressor()
scores = []
for i in range(X.shape[1]):
    score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
                            cv=ShuffleSplit(len(X), 3, .3))
    scores.append((round(np.mean(score), 3), names[i]))
print(sorted(scores, reverse=True))

显示的结果如下:

[(0.934, 'petal width (cm)'), (0.929, 'petal length (cm)'), (0.597, 'sepal length (cm)'), (0.276, 'sepal width (cm)')]

这里我们会发现 petal widthpetal length 这两个特征将起到绝对的贡献,之后是 sepal length,影响最小的是 sepal width。这段代码将会提示我们各个特征的贡献,可以让我们知道部分内部的结构。