当前位置: 首页 > article >正文

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

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

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

皮尔逊相关系数的计算

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

其中:

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

应用场景

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

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

例子

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

ABC
A10.8-0.3
B0.810.2
C-0.30.21

这个矩阵表示:

  • 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,
    )

前端渲染页面


http://www.kler.cn/news/362769.html

相关文章:

  • vue3项目页面实现echarts图表渐变色的动态配置
  • 求助帖:ubuntu22.10 auto install user-data配置了为何还需要选择语言键盘(如何全自动)
  • 3.STM32之蜂鸣器
  • Java工具类--截至2024常用http工具类分享
  • Centos7 将man手册内容转换为txt,pdf访问,并汉化
  • Redis提供了专门的命令来实现自增操作
  • Windows系统启动MongoDB报错无法连接服务器
  • 码支付源码2024又一款全新码支付源码
  • 国产自主可控新征程:华为原生鸿蒙系统与鲲鹏认证
  • vue中选项式 API(Options API) 和 组合式 API(Composition API)区别
  • Python 实现的风控系统(使用了kafka、Faust、模拟drools、redis、分布式数据库)
  • 【Excel】函数各类公式总结
  • 深度图和RGB图对齐
  • 技术成神之路:设计模式(二十二)命令模式
  • 玩转PyCharm:常用操作和快捷键
  • 【Windows】Microsoft Office 的 .docx .xlsx .pptx 等文件图标消失,变成空白图标
  • elasticsearch中的向量检索,语义检索,RRF,kNN,ANN,HNSW
  • 各种包管理工具(npm,pip,yum,brew...)换镜像源
  • 【JavaScript】LeetCode:71-75
  • Zabbix 监控自动化
  • 论文翻译 | A Prompt Pattern Catalog to Enhance Prompt Engineering with ChatGPT (上)
  • Qt实现自定义目录添加到导航树(导航树存在目录追加,不存在创建)
  • Scala的内部对象
  • Python基于TensorFlow实现GRU-Transformer回归模型(GRU-Transformer回归算法)项目实战
  • Java安全编程:公钥加密和私钥签名的实践指南
  • 地方门户分类信息网站源码系统 用户可以自由发帖 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程