社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

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

GEE遥感训练营 • 2 天前 • 35 次点击  

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
 
35 次点击