本文参考自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.
以上是结合大神的代码做了一些调整后得到本文想要的结果,毕业论文上的小笔记,纯粹是为了自己记忆。大神轻喷。