TabPFN's picture
Update app.py
57843e8
import sys
tabpfn_path = 'TabPFN'
sys.path.insert(0, tabpfn_path) # our submodule of the TabPFN repo (at 045c8400203ebd062346970b4f2c0ccda5a40618)
from TabPFN.scripts.transformer_prediction_interface import TabPFNClassifier
import numpy as np
import pandas as pd
import torch
import gradio as gr
import openml
from sklearn.model_selection import cross_val_score
def compute(file, y_attribute, cv_folds):
if file is None:
return 'Please upload a .arff file', y_attribute
if file.name.endswith('.arff'):
dataset = openml.datasets.OpenMLDataset('t', 'test', data_file=file.name)
X_, _, categorical_indicator_, attribute_names_ = dataset.get_data(
dataset_format="array")
if y_attribute not in attribute_names_:
return f"**Select attribute from {', '.join(attribute_names_)}**", y_attribute
X, y, categorical_indicator_, attribute_names_ = dataset.get_data(
dataset_format="array", target=y_attribute)
else:
return 'Please upload a .arff file', y_attribute
order = np.arange(y.shape[0])
np.random.seed(13)
np.random.shuffle(order)
X, y = torch.tensor(X[order]), torch.tensor(y[order])
classifier = TabPFNClassifier(base_path=tabpfn_path, device='cpu')
scores = cross_val_score(classifier, X, y, cv=cv_folds, scoring='roc_auc_ovo')
print(scores)
# classifier.fit(x_train, y_train)
# y_eval, p_eval = classifier.predict(x_eval, return_winning_probability=True)
# print(file, type(file))
return f"ROC AUC OVO Cross Val mean is {sum(scores) / len(scores)} from {scores}. " + (
"The PFN is only trained for datasets with up to 1024 training examples and it had to extrapolate to greater datasets for this evaluation." if len(
y) // cv_folds > 1024 else ""), y_attribute
def upload_file(file):
if file is None:
return
if file.name.endswith('.arff'):
dataset = openml.datasets.OpenMLDataset('t', 'test', data_file=file.name)
print(y_attribute)
X_, _, categorical_indicator_, attribute_names_ = dataset.get_data(
dataset_format="array")
return f"Select attribute from {', '.join(attribute_names_)}", attribute_names_[-1]
else:
return 'Please upload a .arff file', None
with gr.Blocks() as demo:
gr.Markdown("""This demo allows you to play with the **TabPFN**.
Upload a .arff file, select an attribute to predict and the number of cross validation folds and get the ROC AUC OVO score for one seed.
""")
cv_folds = gr.Dropdown([2, 3, 4, 5], value=2, label='Number of CV folds')
out_text = gr.Markdown()
y_attribute = gr.Textbox(label='y attribute')
inp_file = gr.File(
label='Drop a .arff file.')
examples = gr.Examples(examples=['balance-scale.arff'],
inputs=[inp_file],
outputs=[out_text, y_attribute],
fn=upload_file,
cache_examples=True)
btn = gr.Button("Calculate ROC AUC OVO")
# out_table = gr.DataFrame()
inp_file.change(fn=upload_file, inputs=inp_file, outputs=[out_text, y_attribute])
btn.click(fn=compute, inputs=[inp_file, y_attribute, cv_folds], outputs=[out_text, y_attribute])
demo.launch()