Py学习  »  机器学习算法

两分钟复现整个Nature正刊深度学习项目,用于地学预测!

GEE遥感训练营 • 8 月前 • 1507 次点击  

2025年1月发表在《Nature》上的一篇名为《Accurate predictions on small data with a tabular foundation model》的研究,研究提出了 TabPFN(Tabular Prior-data Fitted Network),结合Transformer和表格数据,直接起飞了。

image-20250301225844561
Nature正刊首页

最近的Claude 3.7十分强大,我们来复现看看。

准备工作

首先安装环境

pip install tabpfn

如果提示缺少什么库自己安装就行了,这个AI无法替代

代码

然后上3A级连招(AI写代码,AI写文档,AI做项目)

提示词:

阅读我的TabPFN示例代码,帮我在我自己的数据上使用该方法,其中因变量为P降水,自变量是Runoff,LWSCE,Area,输入数据为machine_l.csv。【这里复制Nature正刊提供的示例代码】

AI写出的代码:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
from tabpfn import TabPFNRegressor

# 读取数据
df = pd.read_csv('data/machine_l.csv')

# 定义特征和目标变量
X = df[['Runoff''LWSC''E''Area']]
y = df['P']

# 划分训练集和测试集,比例为8:2
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化TabPFN模型
model = TabPFNRegressor()

# 训练模型
model.fit(X_train, y_train)

# 预测
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)

# 计算评估指标
train_mse = mean_squared_error(y_train, y_pred_train)
test_mse = mean_squared_error(y_test, y_pred_test)
train_r2 = r2_score(y_train, y_pred_train)
test_r2 = r2_score(y_test, y_pred_test)
train_corr, _ = pearsonr(y_train, y_pred_train)
test_corr, _ = pearsonr(y_test, y_pred_test)

# 打印评估结果
print(f'训练集 MSE: {train_mse:.4f}')
print(f'测试集 MSE: {test_mse:.4f}')
print(f'训练集 R² Score: {train_r2:.4f}')
print(f'测试集 R² Score: {test_r2:.4f}')
print(f'训练集 相关系数: {train_corr:.4f}')
print(f'测试集 相关系数: {test_corr:.4f}')

# 可视化预测结果
plt.figure(figsize=(12, 5))

# 训练集预测结果
plt.subplot(1, 2, 1)
plt.scatter(y_train, y_pred_train, alpha=0.6)
plt.plot([y_train.min(), y_train.max()], [y_train.min(), y_train.max()], 'r--')
plt.xlabel('Actual Precipitation')
plt.ylabel('Predicted Precipitation')
plt.title(f'Training Set (R² = {train_r2:.4f})')

# 测试集预测结果
plt.subplot(1, 2, 2)
plt.scatter(y_test, y_pred_test, alpha=0.6)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--')
plt.xlabel('Actual Precipitation')
plt.ylabel('Predicted Precipitation')
plt.title(f'Test Set (R² = {test_r2:.4f})')

plt.tight_layout()
plt.show()

# 如果TabPFN支持特征重要性分析,可以添加相关代码
# 注意:TabPFN可能不直接支持SHAP值分析,这取决于库的实现
try:
    feature_importance = model.feature_importance(X_test)
    plt.figure(figsize=(10, 6))
    plt.barh(X.columns, feature_importance)
    plt.xlabel('Feature Importance')
    plt.title('TabPFN Feature Importance')
    plt.tight_layout()
    plt.show()
except:
    print("Feature importance analysis not available for TabPFN")

结果如图:

image-20250301232424802
训练集和测试集的结果

写一段代码,绘制训练集的美化散点图

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
plt.figure(figsize=(10, 6))
rc = {'font.sans-serif': ['Times New Roman']}
sns.set(context='notebook', style="darkgrid", font_scale=2, rc=rc)
sns.jointplot(x=y_train, y=y_pred_train, 
                  kind="reg", truncate=False,
                  xlim=(0, 120), ylim=(0, 120),
                   height=7)
image-20250301233438491
训练集的结果

Claude 3.7仅需一步就学习到了Nature正刊的代码,并成功应用到了我们的示例数据。

我们看到模型的R2相当高,在训练集和测试集上都很平衡,这非常不错!

接下来,我们运行可解释机器学习!

这一步模型不太确定是否能得到可解释结果,我们进一步提示:

请阅读官方的可解释shap示例代码,然后写出适合我们的数据正确的形式

# 创建SHAP解释器
explainer = shap.Explainer(model.predict, X_train)
# 计算SHAP值
shap_values = explainer(X_test)
# 绘制SHAP摘要图
shap.summary_plot(shap_values, X_test)
# 绘制SHAP条形图 - 显示特征的平均绝对SHAP值
plt.figure(figsize=(8, 6))
shap.plots.bar(shap_values, show=False)
plt.title('Feature Importance (Bar Plot)')
plt.tight_layout()
plt.show()

# 绘制SHAP瀑布图 - 展示单个预测的解释
plt.figure(figsize=(10, 6))
# 选择第一个样本进行解释
shap.plots.waterfall(shap_values[0], show=False)
plt.title('SHAP Waterfall Plot for First Sample')
plt.tight_layout()
plt.show()
image-20250301233510414
特征SHAP散点图
image-20250301233518695
特征重要性绝对值
image-20250301233527214
各个特征的效应

结果表明:

  • 对降水的预测贡献:蒸散发(E)> 径流(R)> 水储量变化(LWSC)> 流域面积(Area)

  • 其中E和R都是符号相反的贡献(这符合水量平衡原则)

可见,Claude 3.7很快就帮我们复现了Nature方法

工程创建

然后我们用刚刚写好的代码,启动Cursor的Agent模式(智能体模式)

image-20250301234142490
转变Chat模式为Agent模式

提示词:

请学习整个项目路径,在当前文件夹生成README和requirement文件,以符合工程规范。其中README应该包含文件结构。

结果如图,Cursor + Claude 3.7直接帮我把事情干完了:

image-20250301234106712
AI帮忙撰写的工程项目文件

我只需要点两个对号,确认就行了。

版本控制

然后,我们切换Git,直接让AI帮我控制版本

image-20250301234233498
AI辅助版本控制

提示词为:

在main分支直接push所有新内容,覆盖

然后,他把每一步需要执行的代码都写好了,我们都点接受就行了

注意,下面所有内容都是我点了运行,然后系统的git运行我的指令,AI实时检验结果并继续写代码,可以说是真正的Agent智能体了!

image-20250301234459963
AI帮我提交到Github仓库

最后,让我们检查远程GitHub仓库(https://github.com/GISWLH/GeoTabPFN):

image-20250301234705172
3A大作-Github仓库

无敌了,效果特别好!

以上所有的内容,我一个字母也没写,代码碰都没碰,全都点Accept直接接受AI的代码和工程。。。

3A级连招(AI写代码,AI写文档,AI做项目)真是太强了

说不定哪天自己就被取代了

自己尝试

如果你也想用Claude 3.7 + Cursor...

建议一张虚拟卡来订阅服务

登录野卡平台注册账号,登录,先开一张卡片,网址如下

https://yeka.ai/i/ER4VMUC2 (从此邀请码进入可以减免十几块钱的开卡费)

image-20250209004508227
野卡首页

然后选择订阅的产品(Cursor或Claude)

image-20250209004650904
支持多产品

直接充值相应金额(支付宝)

image-20250209004804390
就可以开一张虚拟卡

然后把卡片信息复制到你要订阅的服务中(Cursor或Claude),好处是自己的账号,自己官方充值,不担心封号或拼车。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/179670