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

皮尔逊相关系数矩阵是一个用于量化多个变量之间线性关系的统计工具。它的每个元素表示两个变量之间的皮尔逊相关系数,取值范围从 -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,
    )

前端渲染页面

相关推荐
Patience to do9 分钟前
Android Studio项目(算法计算器)
android·算法·android studio
这题怎么做?!?25 分钟前
模板方法模式
开发语言·c++·算法
边疆.2 小时前
C++类和对象 (中)
c语言·开发语言·c++·算法
binqian2 小时前
【K8S】kubernetes-dashboard.yaml
算法·贪心算法
Wils0nEdwards3 小时前
Leetcode 合并 K 个升序链表
算法·leetcode·链表
Tisfy3 小时前
LeetCode 3211.生成不含相邻零的二进制字符串:二进制枚举+位运算优化
算法·leetcode·二进制·题解·枚举·位运算
好看资源平台3 小时前
深入理解所有权与借用——借用与生命周期管理
开发语言·算法·rust
qiaoxinyu19893 小时前
线性代数(1)——线性方程组的几何意义
线性代数·算法·机器学习
爱吃饭团的饭桶4 小时前
【附源码】Python :哈密顿回路
开发语言·python·算法