使用皮尔逊相关系数矩阵进行特征筛选

皮尔逊相关系数矩阵是一个用于量化多个变量之间线性关系的统计工具。它的每个元素表示两个变量之间的皮尔逊相关系数,取值范围从 -1 到 1:

  • 1 表示完全正相关:当一个变量增加时,另一个变量也会增加。
  • -1 表示完全负相关:当一个变量增加时,另一个变量会减少。
  • 0 表示没有线性相关关系。

皮尔逊相关系数的计算

皮尔逊相关系数 rrr 的计算公式为:

其中:

  • Xi 和 Yi 是变量的观测值。
  • Xˉ 和 Yˉ 是变量的均值。

应用场景

皮尔逊相关系数矩阵常用于:

  • 数据分析与统计研究。
  • 发现变量之间的关系,尤其是在机器学习和数据挖掘中。
  • 经济学、心理学、生物学等领域的研究。

例子

假设有三个变量 A,B,CA, B, CA,B,C,计算得到的皮尔逊相关系数矩阵可能如下:

A B C
A 1 0.8 -0.3
B 0.8 1 0.2
C -0.3 0.2 1

这个矩阵表示:

  • A 和 B 的相关性较强。
  • A 和 C 之间存在负相关。
  • B 和 C 的相关性较弱。

测试一个简单demo

import pandas as pd
import numpy as np

# 创建一个示例数据集
data = {
    'feature1': np.random.rand(100),
    'feature2': np.random.rand(100),
    'feature3': np.random.rand(100),
    'feature4': np.random.rand(100),
    'target': np.random.rand(100)
}

df = pd.DataFrame(data)

# 计算皮尔逊相关系数矩阵
correlation_matrix = df.corr(method='pearson')

# 显示相关系数矩阵
print("相关系数矩阵:\n", correlation_matrix)

# 设置相关性阈值
threshold = 0.5

# 筛选相关性大于阈值的特征
relevant_features = correlation_matrix['target'][abs(correlation_matrix['target']) > threshold].index.tolist()

# 移除目标变量
relevant_features.remove('target')

print("与目标变量相关性大于阈值的特征:", relevant_features)

返回结果

相关系数矩阵:

feature1 feature2 feature3 feature4 target

feature1 1.000000 -0.112876 -0.148784 0.011113 0.059841

feature2 -0.112876 1.000000 -0.093312 0.140427 0.177329

feature3 -0.148784 -0.093312 1.000000 0.086698 -0.032103

feature4 0.011113 0.140427 0.086698 1.000000 0.196255

target 0.059841 0.177329 -0.032103 0.196255 1.000000

生产上使用下面方法和调用去返回数据分析

def build_correlations_matrix(data_id, is_pps=False, encode_strings=False, image=False):
    data = run_query(
        handle_predefined(data_id),
        build_query(data_id, global_state.get_query(data_id)),
        global_state.get_context_variables(data_id),
    )
    valid_corr_cols, valid_str_corr_cols, valid_date_cols = correlations.get_col_groups(
        data_id, data
    )

    str_encodings_code = ""
    dummy_col_mappings = {}
    if encode_strings and valid_str_corr_cols:
        data = data[valid_corr_cols + valid_str_corr_cols]
        dummy_kwargs = {}
        if pandas_util.is_pandas2():
            dummy_kwargs["dtype"] = "int"
        for str_col in valid_str_corr_cols:
            dummies = pd.get_dummies(data[[str_col]], columns=[str_col], **dummy_kwargs)
            dummy_cols = list(dummies.columns)
            dummy_col_mappings[str_col] = dummy_cols
            data[dummy_cols] = dummies
            valid_corr_cols += dummy_cols
        str_encodings_code = (
            "str_corr_cols = [\n\t'{valid_str_corr_cols}'\n]\n"
            "dummies = pd.get_dummies(corr_data, str_corr_cols)\n"
            "corr_data.loc[:, dummies.columns] = dummies\n"
        ).format(valid_str_corr_cols="', '".join(valid_str_corr_cols))
    else:
        data = data[valid_corr_cols]

    corr_cols_str = "'\n\t'".join(
        ["', '".join(chunk) for chunk in divide_chunks(valid_corr_cols, 8)]
    )

    pps_data = None
    if is_pps:
        code = build_code_export(data_id, imports="import ppscore\n")
        code.append(
            (
                "corr_cols = [\n"
                "\t'{corr_cols}'\n"
                "]\n"
                "corr_data = df[corr_cols]\n"
                "{str_encodings}"
                "corr_data = ppscore.matrix(corr_data)\n"
            ).format(corr_cols=corr_cols_str, str_encodings=str_encodings_code)
        )

        data, pps_data = get_ppscore_matrix(data[valid_corr_cols])
    else:
        data, matrix_code = correlations.build_matrix(
            data_id,
            data,
            valid_corr_cols,
            {"corr_cols": corr_cols_str, "str_encodings": str_encodings_code},
        )
        code = [matrix_code]

    code.append(
        "corr_data.index.name = str('column')\ncorr_data = corr_data.reset_index()"
    )
    code = "\n".join(code)
    data.index.name = str("column")
    if image:
        return build_correlations_matrix_image(
            data,
            is_pps,
            valid_corr_cols,
            valid_str_corr_cols,
            valid_date_cols,
            dummy_col_mappings,
            pps_data,
            code,
        )
    return (
        valid_corr_cols,
        valid_str_corr_cols,
        valid_date_cols,
        dummy_col_mappings,
        pps_data,
        code,
        data,
    )

接口调用该方法

@dtale.route("/correlations/<data_id>")
@exception_decorator
def get_correlations(data_id):
    """
    :class:`flask:flask.Flask` route which gathers Pearson correlations against all combinations of columns with
    numeric data using :meth:`pandas:pandas.DataFrame.corr`

    On large datasets with no :attr:`numpy:numpy.nan` data this code will use :meth:`numpy:numpy.corrcoef`
    for speed purposes

    :param data_id: integer string identifier for a D-Tale process's data
    :type data_id: str
    :param query: string from flask.request.args['query'] which is applied to DATA using the query() function
    :returns: JSON {
        data: [{column: col1, col1: 1.0, col2: 0.99, colN: 0.45},...,{column: colN, col1: 0.34, col2: 0.88, colN: 1.0}],
    } or {error: 'Exception message', traceback: 'Exception stacktrace'}
    """
    is_pps = get_bool_arg(request, "pps")
    image = get_bool_arg(request, "image")
    matrix_data = build_correlations_matrix(
        data_id,
        is_pps=is_pps,
        encode_strings=get_bool_arg(request, "encodeStrings"),
        image=image,
    )
    (
        valid_corr_cols,
        valid_str_corr_cols,
        valid_date_cols,
        dummy_col_mappings,
        pps_data,
        code,
        df_or_image,
    ) = matrix_data
    if image:
        fname = "{}.png".format("predictive_power_score" if is_pps else "correlations")
        return send_file(df_or_image, fname, "image/png")

    data = df_or_image.reset_index()
    col_types = grid_columns(data)
    f = grid_formatter(col_types, nan_display=None)
    return jsonify(
        data=f.format_dicts(data.itertuples()),
        dates=valid_date_cols,
        strings=valid_str_corr_cols,
        dummyColMappings=dummy_col_mappings,
        code=code,
        pps=pps_data,
    )

前端渲染页面

相关推荐
thesky1234565 分钟前
活着就好20241126
学习·算法
一只鸡某42 分钟前
实习冲刺第三十一天
数据结构·c++·算法·leetcode·排序算法
材料苦逼不会梦到计算机白富美1 小时前
贪心算法-Huffman树 不等式 推公式
算法·贪心算法
Y.O.U..1 小时前
力扣刷题-excel表名称序列相转换
算法·leetcode·excel
立志成为master1 小时前
HBU算法设计与分析 贪心算法
c++·算法·贪心算法
野風_199602012 小时前
10大排序总结
数据结构·算法·排序算法
慕容复之巅2 小时前
基于Matlab的图像去噪算法仿真(二)
图像处理·算法·matlab
Lenyiin2 小时前
02.02、返回倒数第 k 个节点
c++·算法·leetcode
慕容复之巅2 小时前
基于Matlab的图像去噪算法仿真
图像处理·算法·matlab
SUN_Gyq3 小时前
什么是C++中的Lambda表达式?它的作用是什么?Lambda表达式可以捕获哪些类型的变量?有哪些捕获方式?
java·开发语言·c++·算法