斯皮尔曼相关系数(斯皮尔曼等级相关系数),可以用来计算单调性,计算思路是:
- 首先将值做排序
- 判断排序的序号之间的相关系数
工具类:
def spearmanr_selection(x_data, y_data):
"""斯皮尔曼相关系数"""
from scipy.stats import spearmanr
param_dict = []
for col_name, c_data in x_data.iteritems():
sp = spearmanr(c_data, y_data)[0]
param_dict.append([col_name, abs(sp)])
feature_df = pd.DataFrame(param_dict)
feature_df.sort_values(by=1, ascending=False, inplace=True)
return feature_df
得到的feature_df
中的value
值越大,说明相关性越强,这个特征越重要
示例
import pandas as pd
from sklearn.datasets import make_regression, make_classification
def spearmanr_selection(x_data, y_data):
"""斯皮尔曼相关系数"""
from scipy.stats import spearmanr
param_dict = []
for col_name, c_data in x_data.iteritems():
sp = spearmanr(c_data, y_data)[0]
param_dict.append([col_name, abs(sp)])
feature_df = pd.DataFrame(param_dict)
feature_df.sort_values(by=1, ascending=False, inplace=True)
return feature_df
if __name__ == '__main__':
value_x, value_y = make_classification(n_samples=1000, n_classes=4, n_features=10, n_informative=8)
df_x = pd.DataFrame(value_x, columns=['f_1', 'f_2', 'f_3', 'f_4', 'f_5', 'f_6', "f_7", "f_8", "f_9", "f_10"])
df_y = pd.Series(value_y)
# 下面是筛选单变量特征
feature_df = spearmanr_selection(df_x, df_y)
for col_index, value in feature_df.iterrows():
print(value[0], ":", value[1])