weixin_51587165 2024-03-08 14:49 采纳率: 0%
浏览 57
已结题

符号回归symbolictransformer得到的模型值与特征公式不匹配

关于符号回归输出特征值与特征公式不匹配问题,敬请各位优秀的人解答,不吝感激! ~这是我的代码:

import numpy as np
import pandas as pd
from sklearn.preprocessing import MaxAbsScaler, StandardScaler
from joblib import dump
from sklearn.ensemble import RandomForestRegressor
from sklearn.pipeline import Pipeline
from sklearn.model_selection import RandomizedSearchCV
from gplearn.genetic import SymbolicTransformer
from scipy.stats import randint, uniform
from scipy.stats import spearmanr
from sklearn.decomposition import PCA
#省略了一步读取文件的操作

X = data.iloc[:, :-1].values
y = data.iloc[:, -1].values

# 数据预处理
X_scaler = MaxAbsScaler()
y_scaler = MaxAbsScaler()

uni_X = X_scaler.fit_transform(X)
uni_y = y_scaler.fit_transform(y.reshape(-1, 1)).ravel()

#search.best_params_是我通过随机搜索得到的最佳参数

symbolic_transformer = SymbolicTransformer(
    population_size=search.best_params_['symbolic__population_size'],
    generations=search.best_params_['symbolic__generations'],
    tournament_size=search.best_params_['symbolic__tournament_size'],
    function_set=search.best_params_['symbolic__function_set'],
    parsimony_coefficient=search.best_params_['symbolic__parsimony_coefficient'],
    max_samples=search.best_params_['symbolic__max_samples'],
    p_crossover=search.best_params_['symbolic__p_crossover'],
    p_subtree_mutation=search.best_params_['symbolic__p_subtree_mutation'],
    p_hoist_mutation=search.best_params_['symbolic__p_hoist_mutation'],
    p_point_mutation=search.best_params_['symbolic__p_point_mutation'],
    n_components=30,
    random_state=42
)

new_features = symbolic_transformer.fit_transform(uni_X, uni_y)
formulas = [str(sym) for sym in symbolic_transformer.programs[-1]]

我发现我得到的new_features每一列的值完全一样,而最后一代的formulas公式也与其对应不上,如图:

img

img

  • 写回答

21条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-08 14:53
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    在符号回归(Symbolic Regression)中,如果得到的特征变换结果new_features每一列数据完全相同,并且生成的公式与变换后的特征值对应不上,可能存在以下几个原因:

    1. 参数设置问题:您提供的SymbolicTransformer参数中,n_components=30表示保留30个最佳公式生成的新特征。请检查是否因为优化过程中没有找到足够的有效公式,导致填充了重复或无效的公式。

    2. 训练样本不足或过于简单:确保您的训练集大小合适且具有足够的复杂性以激发算法产生多样化的公式。

    3. 过拟合或欠拟合:调整遗传编程的参数,如种群大小、代数等,以避免模型过早收敛于局部最优解或者无法学到有意义的规律。

    4. 预处理步骤:在对原始特征进行缩放时,MaxAbsScaler可能对于某些分布的数据并不适用,尝试使用其他标准化方法,比如StandardScaler,看是否能得到不同特征。

    5. 随机种子一致性:确保在整个实验流程中,尤其是随机搜索CV和SymbolicTransformer初始化时,都使用了相同的随机种子,以便结果可复现。

    6. 验证公式计算:手动根据输出的公式计算几组特征值,对比SymbolicTransformer直接输出的结果,确认公式是否确实执行错误。

    为了进一步排查,请尝试以下代码,它将帮助你查看 SymbolicTransformer 找到的每个公式的实际计算结果,并与转换后的新特征进行比较:

    # 从最后一代程序中取出一个公式并手动计算
    example_formula = symbolic_transformer.programs[-1][0]
    manual_new_feature = np.zeros_like(uni_X)
    
    for i in range(uni_X.shape[0]):
        manual_new_feature[i] = eval(example_formula, {}, uni_X[i].tolist())
    
    # 比较SymbolicTransformer生成的特征值与手动计算的特征值
    compare_results = pd.DataFrame({'Generated Feature': new_features[:, 0], 'Manual Calculation': manual_new_feature})
    print(compare_results.head())
    

    若发现手动计算结果与生成特征一致,则可能是后续特征处理环节出现问题;若不一致,则需要深入研究SymbolicTransformer内部实现细节,甚至考虑其是否存在bug。同时,确保使用的gplearn库版本无误且功能正常。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月16日
  • 修改了问题 3月8日
  • 创建了问题 3月8日