使用随机森林计算特征重要度

本文介绍了两种计算随机森林中特征重要性的方法:基于不纯度降低的特征选择和准确率降低的均值。通过实例展示了如何使用sklearn库在波士顿房价数据集上进行特征重要性评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随机森林包含很多决策树,决策树中的每一个节点是某一个特征的条件。这些条件用来将数据集分成两部分,使得每一部分的响应值归为同一个集合。最优条件的选择依据是不纯度。不纯度在分类中通常为Gini不纯度或信息增益/信息熵,对于回归问题来说是方差。
下面是两种计算特征重要度的方法:
1 基于sklearn的实现

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
import numpy as np
#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
rf = RandomForestRegressor()
rf.fit(X, Y)
print "Features sorted by their score:"
print sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names), 
             reverse=True)

输出结果为

Features sorted by their score:
[(0.5298, 'LSTAT'), (0.4116, 'RM'), (0.0252, 'DIS'), (0.0172, 'CRIM'), (0.0065, 'NOX'), (0.0035, 'PTRATIO'), (0.0021, 'TAX'), (0.0017, 'AGE'), (0.0012, 'B'), (0.0008, 'INDUS'), (0.0004, 'RAD'), (0.0001, 'CHAS'), (0.0, 'ZN')]

基于不纯度对模型进行排序有几点需要注意:
(1)基于不纯度降低的特征选择将会偏向于选择那些具有较多类别的变量(bias)。
(2)当存在相关特征时,一个特征被选择后,与其相关的其他特征的重要度则会变得很低,因为他们可以减少的不纯度已经被前面的特征移除了。
2 准确率降低的均值
这种方法是直接测量每种特征对模型预测准确率的影响,基本思想是重新排列某一列特征值的顺序,观测降低了多少模型的准确率。对于不重要的特征,这种方法对模型准确率的影响很小,但是对于重要特征却会极大降低模型的准确率。
下面是这种方法的示例:

from sklearn.cross_validation import ShuffleSplit
from sklearn.metrics import r2_score
from collections import defaultdict

X = boston["data"]
Y = boston["target"]

rf = RandomForestRegressor()
scores = defaultdict(list)

#crossvalidate the scores on a number of different random splits of the data
for train_idx, test_idx in ShuffleSplit(len(X), 100, .3):
    X_train, X_test = X[train_idx], X[test_idx]
    Y_train, Y_test = Y[train_idx], Y[test_idx]
    r = rf.fit(X_train, Y_train)
    acc = r2_score(Y_test, rf.predict(X_test))
    for i in range(X.shape[1]):
        X_t = X_test.copy()
        np.random.shuffle(X_t[:, i])
        shuff_acc = r2_score(Y_test, rf.predict(X_t))
        scores[names[i]].append((acc-shuff_acc)/acc)
print "Features sorted by their score:"
print sorted([(round(np.mean(score), 4), feat) for
              feat, score in scores.items()], reverse=True)

输出结果为:

Features sorted by their score:
[(0.7276, 'LSTAT'), (0.5675, 'RM'), (0.0867, 'DIS'), (0.0407, 'NOX'), (0.0351, 'CRIM'), (0.0233, 'PTRATIO'), (0.0168, 'TAX'), (0.0122, 'AGE'), (0.005, 'B'), (0.0048, 'INDUS'), (0.0043, 'RAD'), (0.0004, 'ZN'), (0.0001, 'CHAS')]

在这个例子中, LSTAT 和RM是两个对模型影响较大的特征,打乱他们的顺序将会降低模型约73%与57%的准确率。

参见http://blog.datadive.net/selecting-good-features-part-iii-random-forests/

随机森林(Random Forest)是一种集成学习算法,广泛应用于分类和回归任务。在遥感和生态学领域,它被用来估算植被覆盖度(Vegetation Coverage),通常基于卫星影像或地面测量数据进行训练和预测。 植被覆盖度的计算通常涉及以下步骤: 1. **数据准备**:收集包含植被信息的遥感影像(如NDVI、EVI等植被指数)以及对应的地面实测植被覆盖度数据作为训练集。 2. **特征工程**:从遥感数据中提取相关特征,例如波段反射率、纹理特征、时间序列特征等。 3. **模型训练**:使用随机森林模型对训练数据进行拟合,学习植被覆盖度与遥感特征之间的非线性关系。 4. **模型预测**:在新的遥感数据上应用训练好的模型,预测植被覆盖度。 5. **精度评估**:通过交叉验证或独立测试集评估模型性能,使用R²、RMSE等指标衡量预测精度。 随机森林的优势在于其对高维数据的处理能力、抗过拟合特性以及对异常值和噪声的鲁棒性。此外,它还能提供特征重要性评估,有助于理解哪些变量对植被覆盖度的预测贡献最大[^1]。 以下是一个使用Python中Scikit-learn库实现植被覆盖度预测的简单示例: ```python from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score, mean_squared_error import numpy as np # 假设 X 是特征矩阵,每一行代表一个样本,列是遥感特征 # y 是对应的植被覆盖度标签 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 构建随机森林回归模型 rf_model = RandomForestRegressor(n_estimators=100, random_state=42) rf_model.fit(X_train, y_train) # 进行预测 y_pred = rf_model.predict(X_test) # 评估模型 r2 = r2_score(y_test, y_pred) rmse = np.sqrt(mean_squared_error(y_test, y_pred)) print(f"R² Score: {r2:.4f}") print(f"RMSE: {rmse:.4f}") ``` 在实际应用中,可能需要进行特征选择、参数调优(如树的数量、最大深度等)以提升模型性能。此外,确保训练数据的空间代表性对模型泛化能力至关重要。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值