Python随机森林求各指标权重

本文参考自https://blog.csdn.net/zjuPeco/article/details/77371645
随机森林主要用于分类、回归。一般就是输入数据得出一个最终结果,本文主要用来求各指标的权重。
运用python中的sklearn库(该库已经封装好了随机森林算法,我们只需要调用即可)
首先
输入数据的格式:(代码小白摸爬滚打后的经验总结)
纯数字,纯数字,不需要表头
像这样的在这里插入图片描述上代码
先导入数据,csv或者excel都可(若格式为excel,则将pd.read_csv(…)改为pd.read_excel)

# -*- coding: utf-8 -*-
"""
Created on Tue Aug  3 08:09:56 2021

@author: Amor
"""
#利用sklearn库求各指标的权重
#数据文件应该时纯数据,没有表头,表头在下面的df.columns处按列顺序定义
import pandas as pd
import numpy as np
url = 'G://代码//python//转化.data'
df = pd.read_csv(url, header = None)

接下来定义数据列的名称

// An highlighted block
#定义各列数据的名称,按自己文件中列的顺序命名
df.columns = ['yiji', 'erji', 'sanji', 'siji', 'wuji', 'liuji', 'qiji',  'baji', 'jiuji']

然后查看数据中的数据格式

// An highlighted block
df.info()#查看文件中数据类型
#每列数据共392行,整数型数据
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 392 entries, 0 to 391
Data columns (total 9 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   yiji    392 non-null    int64
 1   erji    392 non-null    int64
 2   sanji   392 non-null    int64
 3   siji    392 non-null    int64
 4   wuji    392 non-null    int64
 5   liuji   392 non-null    int64
 6   qiji    392 non-null    int64
 7   baji    392 non-null    int64
 8   jiuji   392 non-null    int64
dtypes: int64(9)
memory usage: 27.7 KB
#注意:如果数据为字符型object时无法进行计算,需要转化为int或float

接下来就可以调用函数进行分析了

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
x, y = df.iloc[:, 0:].values, df.iloc[:, 0].values #0表示从第一列开始,即索引下标为0的列
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)
feat_labels = df.columns[0:]
forest = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)
forest.fit(x_train, y_train)
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1] #[::-1]表示将各指标按权重大小进行排序输出
for f in range(x_train.shape[1]):
    print("%2d) %-*s %f" % (f + 1, 30, feat_labels[indices[f]], importances[indices[f]]))

运行后的结果如下:

 1) yiji                           0.330188
 2) erji                           0.177266
 3) sanji                          0.111752
 4) siji                           0.082379
 5) wuji                           0.068437
 6) qiji                           0.060532
 7) baji                           0.058051
 8) liuji                          0.057615
 9) jiuji                          0.053782

这样就求出了各指标的权重,加起来正好等于1.
以上是结合大神的代码做了一些调整后得到本文想要的结果,毕业论文上的小笔记,纯粹是为了自己记忆。大神轻喷。

利用随机森林计算模型指标权重的过程主要包括以下几个步骤: ### 1. 数据准备 - **收集数据**:收集用于训练随机森林模型的数据,包括因变量(例如地下水中硝酸盐浓度)和自变量(例如地下水脆弱性指标、地下水硝酸盐污染荷载指标等)。 - **数据预处理**:对数据进行清洗、归一化或标准化处理,以消除量纲和尺度的影响,提高模型的训练效果。 ### 2. 模型构建 - **选择随机森林算法**:在编程环境中(如Python)选择随机森林算法。常用的库包括Scikit-learn。 - **划分数据集**:将数据集划分为训练集和测试集,通常比例为80%(训练集)和20%(测试集)。 ### 3. 训练模型 - **设置超参数**:选择合适的超参数,如决策树数量(`n_estimators`)、决策树分裂所需的最小样本数(`min_samples_split`)、决策树最大深度(`max_depth`)等。可以通过网格搜索或贝叶斯优化等方法进行超参数调优。 - **训练模型**:使用训练集数据训练随机森林模型。 ### 4. 特征重要性计算 - **获取特征重要性**:训练完成后,随机森林模型会自动计算每个特征(指标)的重要性。在Scikit-learn中,可以使用`feature_importances_`属性获取特征重要性。 - **归一化**:将特征重要性归一化,使其总和为1,以便将其作为权重使用。 ### 5. 权重应用 - **赋予权重**:将归一化后的特征重要性作为各指标权重,应用于后续的地下水硝酸盐污染风险评价中。 - **评价模型性能**:使用测试集数据验证模型的性能,可以通过均方根误差(RMSE)、平均绝对误差(MAE)等指标进行评估。 ### 示例代码 以下是使用Python和Scikit-learn进行随机森林模型训练和特征重要性计算的示例代码: ```python import pandas as pd from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, mean_absolute_error # 加载数据 data = pd.read_csv('your_data.csv') X = data.drop(columns=['nitrate_concentration']) y = data['nitrate_concentration'] # 数据预处理 # 假设已经进行了必要的数据清洗和归一化 # 划分数据集 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=130, min_samples_split=82, max_depth=2, random_state=42) # 训练模型 rf_model.fit(X_train, y_train) # 获取特征重要性 feature_importances = rf_model.feature_importances_ # 归一化特征重要性 normalized_weights = feature_importances / sum(feature_importances) # 打印特征重要性 for feature, weight in zip(X.columns, normalized_weights): print(f'{feature}: {weight}') # 评估模型性能 y_pred = rf_model.predict(X_test) rmse = mean_squared_error(y_test, y_pred, squared=False) mae = mean_absolute_error(y_test, y_pred) print(f'RMSE: {rmse}') print(f'MAE: {mae}') ``` ### 解释 1. **数据加载**:从CSV文件中读取数据。 2. **数据预处理**:假设数据已经进行了必要的清洗和归一化。 3. **数据划分**:将数据集划分为训练集和测试集。 4. **模型设置**:创建随机森林回归模型,并设置超参数。 5. **模型训练**:使用训练集数据训练模型。 6. **特征重要性**:获取每个特征的重要性,并进行归一化。 7. **模型评估**:使用测试集数据评估模型的性能。 通过上述步骤,可以利用随机森林模型计算出各指标权重,并将其应用于地下水硝酸盐污染风险评价中。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值