斯皮尔曼相关系数(斯皮尔曼等级相关系数)计算思路是:
- 首先将值做排序
- 判断排序的序号之间的相关系数
更多详情请参考:https://zh.wikipedia.org/wiki/%E6%96%AF%E7%9A%AE%E5%B0%94%E6%9B%BC%E7%AD%89%E7%BA%A7%E7%9B%B8%E5%85%B3%E7%B3%BB%E6%95%B0
工具类:
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])