- 代码
#构建分类随机森林分类器
clf=RandomForestClassifier(n_estimators=10,random_state=42,max_depth=4)
clf.fit(x_val, y_val) #对自变量和因变量进行拟合
for feature in zip(x_feature,clf.feature_importances_):print(feature)
('V1', 0.0038989752714058486)
('V2', 0.0027038871454469217)
('V3', 0.026952559757713098)
('V4', 0.02159376763527073)
('V5', 0.01798767663560397)
('V6', 0.0005289202626423892)
('V7', 0.03184662339558151)
('V9', 0.012345829031178873)
('V10', 0.0917851429181416)
('V11', 0.0068039329696330765)
('V12', 0.20512839327084872)
('V14', 0.13941079529437903)
('V16', 0.12561363630520125)
('V17', 0.26507827141261814)
('V18', 0.03456786771378745)
('V19', 0.0005833168045762355)
('Amount', 0.006863681529958022)
('Hour', 0.006306722646013179)
plt.style.use('fivethirtyeight')
plt.rcParams['figure.figsize'] = (12,6)## feature importances 可视化
importances = clf.feature_importances_
feat_names = data_df_new[x_feature].columns# 对特征重要性进行降序排序,并获取排序后的索引
indices = np.argsort(importances)[::-1]fig = plt.figure(figsize=(20,6))
plt.title("阶梯图-importances by RandomTreeClassifier")x = list(range(len(indices)))plt.bar(x, importances[indices], color='lightblue', align="center")
plt.step(x, np.cumsum(importances[indices]), where='mid', label='Cumulative')
plt.xticks(x, feat_names[indices],fontsize=14)
plt.xlim([-1, len(indices)]) # 设置了 x 轴的范围,从 -1 到 len(indices),确保所有特征都能在图表中显示。
plt.show()
- 结果
进一步:在柱状图上显示当前的特征重要性取值
plt.style.use('fivethirtyeight')
plt.rcParams['figure.figsize'] = (12,6)## feature importances 可视化
importances = clf.feature_importances_
feat_names = data_df_new[x_feature].columns
# 对特征重要性进行降序排序,并获取排序后的索引
indices = np.argsort(importances)[::-1]fig = plt.figure(figsize=(20,6))
plt.title("阶梯图-importances by RandomTreeClassifier")x = list(range(len(indices)))bars = plt.bar(x, importances[indices], color='lightblue', align="center")
# 在每个条形上方添加特征名称
for bar, label in zip(bars, importances[indices]):plt.text(bar.get_x() + bar.get_width() / 2, bar.get_height(), f"{label:.5f}",ha='center', va='bottom', fontsize=10, color='black')plt.step(x, np.cumsum(importances[indices]), where='mid', label='Cumulative')
plt.xticks(x, feat_names[indices],fontsize=14)
plt.xlim([-1, len(indices)])
plt.show()
plt.step()
- 阶梯图
plt.step(x, np.cumsum(importances[indices]), where='mid', label='Cumulative')
以下是参数的详细解释:x:这是阶梯图的 x 坐标,通常是一个数字列表,表示每个阶梯的位置。np.cumsum(importances[indices]):这是 numpy 库中的 cumsum 函数,它计算数组中元素的累积和。
在这里,它被用来计算特征重要性的累积和,indices 是特征重要性排序后的索引。where='mid':这个参数指定了阶梯图的台阶应该位于每个区间的哪个位置。
'mid' 表示台阶位于每个区间的中间位置,这意味着每个阶梯的高度将从当前点跳到下一个点,然后在下一个点保持水平。label='Cumulative':这是为阶梯图设置的图例标签,表示这个阶梯图代表的是累积和。
argsort
在 Python 的 NumPy 库中,argsort
函数用于对数组中的元素进行排序,并返回排序后元素的索引。这个函数对于找到数组值从小到大(或从大到小)的顺序对应的索引非常有用。
函数定义
numpy.argsort(a, axis=-1, kind=None, order=None)
参数解释
a
:要排序的数组。axis
:指定沿着哪个轴进行排序。默认为-1
,表示沿着最后一个轴。kind
:指定排序算法的类型。常用的值有quicksort
(快速排序,默认值)、mergesort
(归并排序)、heapsort
(堆排序)等。order
:用于多维数组排序时指定次序的参数。
返回值
argsort
返回的是排序后的元素索引数组,该数组的形状与输入数组相同,但元素值是原数组中元素从小到大排序后的索引。
示例代码
import numpy as np# 创建一个随机数组
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])# 使用 argsort 对数组进行排序,并获取索引
sorted_indices = np.argsort(arr)# 打印排序后的索引
print("排序后的索引:", sorted_indices)# 使用排序后的索引获取排序后的数组
sorted_array = arr[sorted_indices]# 打印排序后的数组
print("排序后的数组:", sorted_array)
输出结果
排序后的索引: [1 7 3 0 2 4 9 5 6 8 10]
排序后的数组: [1 1 2 3 3 4 5 5 5 6 9]
在这个例子中,argsort
返回了数组中元素从小到大排序后的索引,然后我们使用这些索引来获取排序后的数组。
注意事项
- 如果输入数组中有重复值,
argsort
返回的索引将对应于这些重复值在原数组中首次出现的顺序。 argsort
可以用于多维数组,但需要指定axis
参数来确定沿着哪个轴进行排序。[::-1]
:这是 Python 中的切片语法,用于反转数组。当应用于 np.argsort(arr) 的结果时,它将索引数组反转,从而实现降序排序。
argsort
是一个非常有用的函数,特别是在数据分析和机器学习中,当你需要根据数值对数据进行排序,并且关心排序后元素的原始位置时。