如何用Python遗传编程从DataFrame的x、y数据推导未知函数公式?
用Python遗传编程推导DataFrame中x与y的函数关联
1. 选择合适的遗传编程库
Python中针对符号回归(从数据推导函数公式)的常用遗传编程(GP)库有两个方向:
gplearn:封装度高,API简洁,专门为符号回归场景设计,适合快速实现需求deap:灵活性极强,支持自定义遗传逻辑,适合需要深度定制的场景
这里以gplearn为例展开,它能直接输出可读的函数表达式,上手成本低。
2. 数据预处理
确保你的DataFrame满足以下基础要求:
- 自变量
x和因变量y均为数值型,无缺失值、异常值(可提前用df.dropna()、df.describe()做校验) - 将
x转换为二维特征矩阵(即使只有单个自变量,也需保持二维格式,匹配模型输入要求) - 将
y转换为一维目标数组
3. 配置并运行遗传编程模型
使用gplearn的SymbolicRegressor类,核心参数可按需调整:
generations:遗传迭代的代数,数值越大越可能找到更优公式,但耗时更长population_size:每一代的种群规模,规模越大搜索空间越广function_set:允许使用的数学操作符,例如['add', 'sub', 'mul', 'div', 'pow', 'sqrt']metric:适应度评估指标,默认用均方误差(MSE),也可指定r2等
4. 完整示例代码
import pandas as pd from gplearn.symbolic import SymbolicRegressor from sklearn.model_selection import train_test_split # 替换为你的实际DataFrame df = pd.DataFrame({ 'x': [0.5, 1.2, 2.0, 3.1, 4.5, 5.8], 'y': [1.25, 2.44, 5.0, 10.61, 21.25, 34.64] # 对应y = x² + 1 }) # 数据格式转换 X = df[['x']].values y = df['y'].values # 可选:划分训练/测试集验证泛化能力 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 初始化GP模型 gp_model = SymbolicRegressor( generations=25, population_size=800, function_set=['add', 'sub', 'mul', 'pow'], metric='mse', random_state=42 ) # 拟合数据 gp_model.fit(X_train, y_train) # 输出推导的函数公式 print("推导的函数表达式:", gp_model._program) # 可选:评估模型性能 print("训练集R²得分:", gp_model.score(X_train, y_train)) print("测试集R²得分:", gp_model.score(X_test, y_test))
5. 结果优化建议
- 如果推导公式不够准确,可尝试增大
generations或population_size,扩展function_set加入更多数学操作(如log、sin) - 若数据存在噪声,可在模型参数中设置
max_samples,用部分数据训练提升鲁棒性 - 如需完全自定义遗传规则(如选择、交叉、变异逻辑),可切换到
deap库,通过定义个体、适应度函数等实现定制化GP流程
内容的提问来源于stack exchange,提问作者José Lorente López
相关产品推荐
相关产品推荐

