背景
训练集表格:training_data_label.csv(例如下表,省略数据)
A | B | C | D | E | |
---|---|---|---|---|---|
0 | |||||
1 | |||||
2 | |||||
3 | |||||
4 | |||||
5 |
特征重要性表格:feature_importance.csv(例如下表,重要性为0的特征就不填入该表)
feature | importance | |
---|---|---|
3 | C | 208 |
1 | A | 179 |
5 | E | 3 |
2 | B | 1 |
用训练数据去跑XGBoost模型,用XGBoost模型自带的特征重要性函数得出特征重要性并输出到表格feature_importance.csv中。
我要去掉一些不重要的特征,以及相关性特别高的两个特征中去掉重要性相对低的特征。
代码
#encoding=utf-8
import pandas
'''读取特征重要性表格,并将数据转化为dataframe格式'''
data_feature_importance = pandas.read_csv('/lujing/feature_importance.csv')
frame_feature_importance = pandas.DataFrame(data_feature_importance)
# print(frame_feature_importance)
注意:读取表格的路径要换成自己的路径
可以print(frame_feature_importance)
康康是否正确读取表格中的东西
importance_feature = [] # 存放特征重要性表格中的特征名
dict_importance_feature = {} # 存放{特征:重要性}的键值对,例如{name:100}
for row in frame_feature_importance.index:
if frame_feature_importance.loc[row]['importance'] > 2:
importance_feature.append(frame_feature_importance.loc[row]['feature'])
dict_importance_feature[frame_feature_importance.loc[row]['feature']] = frame_feature_importance.loc[row]['importance']
这里for
循环按行遍历dataframe,if
语句筛选出重要性大于2的特征名
笔记:
pandas中的.loc和.iloc以及.at和.iat的区别:
显示索引:.loc,第一个参数为 index切片,第二个为 columns列名
隐式索引:.iloc(integer_location), 只能传入整数
at定位到某个元素,df.at[index,columns]
.iat类似于iloc使用隐式索引访问某个元素
'''读取训练数据表格,并将其转换为dataframe格式'''
data_training = pandas.read_csv('/lujing/training_data_label.csv')
frame_training = pandas.DataFrame(data_training)
# print(frame1.shape[1])
注意:读取表格的路径要换成自己的路径
df = frame_training[importance_feature] # 只保留重要性高的特征
# df_drop = df.drop(useless_feature, axis=1) # 删除某些指定的列,useless_feature是无用的特征的列表
# print(df_drop)
df = pandas.DataFrame(df.corr()) # 求各个特征之间的相关性,得到的表格关于轴对称
# df_drop.to_csv('/lujing/filename1.csv')
.drop()是删除某些列,这里不需要用到
.corr()是求dataframe中列之间的相关性,得到的数据输出到filename1.csv表格中(例如下表,不是真实的数据,只作为示意)
A | C | E | |
---|---|---|---|
A | 1 | 0.2 | 0.55 |
C | 0.2 | 1 | 0.04 |
E | 0.55 | 0.04 | 1 |
row = df._stat_axis.values.tolist() # 获取dataframe的行索引
col = df.columns.values.tolist() # 获取dataframe的列索引
for i in range(df.shape[0]):
for j in range(i+1):
if abs(df.iloc[i,j]) >= 0.5 and df.iloc[i,j] != 1:
df.iloc[i, j] = bytes(df.iloc[i,j])
print(row[i] + ' 的重要性: ' + str(dict_importance_feature[row[i]]) + ' ' + col [j] + ' 的重要性: '
+ str(dict_importance_feature[col[j]]) + ' 两者的相关性: ' + df.iloc[i,j])
输出相关性大于0.5的特征对,并分别输出其重要性。