Project Icon

imodelsX

多功能文本模型分析与优化库

imodelsX是一个与Scikit-learn兼容的Python库,专注于文本模型和数据的解释、预测和优化。该库集成了多种可解释的建模技术,包括Tree-Prompt、iPrompt和Aug-Linear等。imodelsX还提供LLM封装器和数据集封装器等实用工具,简化文本数据处理流程。通过支持多种解释方法,imodelsX能够生成自然语言解释,并为用户提供易于实现的基线模型。

一个用于解释、预测和引导文本模型/数据的Scikit-learn友好库。
同时包含一些用于文本数据入门的实用工具。

📖 演示笔记本

可解释建模/引导

模型参考输出描述
Tree-Prompt🗂️, 🔗, 📄, 📖,解释
+ 引导
生成提示树以
引导LLM(官方
iPrompt🗂️, 🔗, 📄, 📖解释
+ 引导
生成解释数据模式的提示(官方
AutoPromptㅤㅤ🗂️, 🔗, 📄解释
+ 引导
使用输入梯度
找到自然语言提示
D3🗂️, 🔗, 📄, 📖解释解释两个分布之间的差异
SASCㅤㅤ🗂️, 🔗, 📄解释使用LLM解释
黑盒文本模块(官方
Aug-Linear🗂️, 🔗, 📄, 📖线性模型使用LLM提取嵌入
以拟合更好的线性模型(官方
Aug-Tree🗂️, 🔗, 📄, 📖决策树使用LLM扩展特征
以拟合更好的决策树(官方
QAEmb🗂️, 🔗, 📄, 📖可解释
嵌入
通过向LLM提问
生成可解释嵌入(官方
KAN🗂️, 🔗, 📄, 📖小型
网络
拟合2层Kolmogorov-Arnold网络

📖演示笔记本   🗂️ 文档   🔗 参考代码   📄 研究论文
⌛ 我们计划支持其他可解释算法,如RLPromptCBMsNBDT。如果您想贡献算法,欢迎提交PR 😄

通用工具

模型参考
🗂️ LLM包装器轻松调用不同的LLM
🗂️ 数据集包装器下载经过最小处理的huggingface数据集
🗂️ N元组包学习N元组的线性模型
🗂️ 线性微调在LLM嵌入之上微调单个线性层

快速入门

安装: pip install imodelsx(或者,为了更多控制,克隆并从源代码安装)

演示: 请参阅演示笔记本

自然语言解释

Tree-prompt

from imodelsx import TreePromptClassifier
import datasets
import numpy as np
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

# 设置数据
rng = np.random.default_rng(seed=42)
dset_train = datasets.load_dataset('rotten_tomatoes')['train']
dset_train = dset_train.select(rng.choice(
    len(dset_train), size=100, replace=False))
dset_val = datasets.load_dataset('rotten_tomatoes')['validation']
dset_val = dset_val.select(rng.choice(
    len(dset_val), size=100, replace=False))

# 设置参数
prompts = [
    "这部电影是",
    " 积极还是消极?这部电影是",
    " 这部电影的情感是",
    " 这部电影的剧情真的是",
    " 这部电影的演技是",
]
verbalizer = {0: " 消极。", 1: " 积极。"}
checkpoint = "gpt2"

# 拟合模型
m = TreePromptClassifier(
    checkpoint=checkpoint,
    prompts=prompts,
    verbalizer=verbalizer,
    cache_prompt_features_dir=None,  # 'cache_prompt_features_dir/gp2',
)
m.fit(dset_train["text"], dset_train["label"])


# 计算准确率
preds = m.predict(dset_val['text'])
print('\nTree-Prompt 准确率 (验证集) ->',
      np.mean(preds == dset_val['label']))  # -> 0.7

# 比较单个提示的准确率
for i, prompt in enumerate(prompts):
    print(i, prompt, '->', m.prompt_accs_[i])  # -> 0.65, 0.5, 0.5, 0.56, 0.51

# 可视化决策树
plot_tree(
    m.clf_,
    fontsize=10,
    feature_names=m.feature_names_,
    class_names=list(verbalizer.values()),
    filled=True,
)
plt.show()

iPrompt

from imodelsx import explain_dataset_iprompt, get_add_two_numbers_dataset

# 获取一个简单的两数相加数据集
input_strings, output_strings = get_add_two_numbers_dataset(num_examples=100)
for i in range(5):
    print(repr(input_strings[i]), repr(output_strings[i]))

# 用自然语言提示字符串解释输入和输出之间的关系
prompts, metadata = explain_dataset_iprompt(
    input_strings=input_strings,
    output_strings=output_strings,
    checkpoint='EleutherAI/gpt-j-6B', # 使用哪个语言模型
    num_learned_tokens=3, # 学习多长的提示
    n_shots=3, # 每个示例的shot数
    n_epochs=15, # 搜索多少轮
    verbose=0, # 打印多少信息
    llm_float16=True, # 是否以float16加载模型
)
--------
prompts是找到的自然语言提示字符串列表

D3 (DescribeDistributionalDifferences)

from imodelsx import explain_dataset_d3
hypotheses, hypothesis_scores = explain_dataset_d3(
    pos=positive_samples, # List[str]格式的正面示例
    neg=negative_samples, # 另一个List[str]
    num_steps=100,
    num_folds=2,
    batch_size=64,
)

SASC

这里我们解释一个模块而不是一个数据集

from imodelsx import explain_module_sasc
# 一个对字符串长度做出响应的玩具模块
mod = lambda str_list: np.array([len(s) for s in str_list])

# 一个最长字符串是动物名称的玩具数据集
text_str_list = ["红色", "蓝色", "x", "1", "2", "河马", "大象", "犀牛"]
explanation_dict = explain_module_sasc(
    text_str_list,
    mod,
    ngrams=1,
)

Aug-imodels

像使用scikit-learn模型一样使用这些。在训练过程中,它们通过LLM拟合更好的特征,但在测试时它们非常快速且完全透明。

from imodelsx import AugLinearClassifier, AugTreeClassifier, AugLinearRegressor, AugTreeRegressor
import datasets
import numpy as np

# 设置数据
dset = datasets.load_dataset('rotten_tomatoes')['train']
dset = dset.select(np.random.choice(len(dset), size=300, replace=False))
dset_val = datasets.load_dataset('rotten_tomatoes')['validation']
dset_val = dset_val.select(np.random.choice(len(dset_val), size=300, replace=False))
# 拟合模型
m = AugLinearClassifier(
    checkpoint='textattack/distilbert-base-uncased-rotten-tomatoes',
    ngrams=2, # 使用二元语法
)
m.fit(dset['text'], dset['label'])

# 预测
preds = m.predict(dset_val['text'])
print('验证集准确率', np.mean(preds == dset_val['label']))

# 解释
print('总n元语法系数数量:', len(m.coefs_dict_))
print('最正面的n元语法')
for k, v in sorted(m.coefs_dict_.items(), key=lambda item: item[1], reverse=True)[:8]:
    print('\t', k, round(v, 2))
print('最负面的n元语法')
for k, v in sorted(m.coefs_dict_.items(), key=lambda item: item[1])[:8]:
    print('\t', k, round(v, 2))

KAN

import imodelsx
from sklearn.datasets import make_classification, make_regression
from sklearn.metrics import accuracy_score
import numpy as np

X, y = make_classification(n_samples=5000, n_features=5, n_informative=3)
model = imodelsx.KANClassifier(hidden_layer_size=64, device='cpu',
                               regularize_activation=1.0, regularize_entropy=1.0)
model.fit(X, y)
y_pred = model.predict(X)
print('测试准确率', accuracy_score(y, y_pred))

# 现在尝试回归
X, y = make_regression(n_samples=5000, n_features=5, n_informative=3)
model = imodelsx.kan.KANRegressor(hidden_layer_size=64, device='cpu',
                                  regularize_activation=1.0, regularize_entropy=1.0)
model.fit(X, y)
y_pred = model.predict(X)
print('测试相关性', np.corrcoef(y, y_pred.flatten())[0, 1])

通用工具

简易基准

遵循sklearn API的易于拟合的基准模型。

from imodelsx import LinearFinetuneClassifier, LinearNgramClassifier
# 在LLM嵌入之上拟合一个简单的单层微调模型
m = LinearFinetuneClassifier(
    checkpoint='distilbert-base-uncased',
)
m.fit(dset['text'], dset['label'])
preds = m.predict(dset_val['text'])
acc = (preds == dset_val['label']).mean()
print('验证准确率', acc)

LLM包装器

用于调用不同语言模型的简易API,带有缓存功能(比langchain更轻量)。

import imodelsx.llm
# 支持任何huggingface checkpoint或openai checkpoint(包括对话模型)
llm = imodelsx.llm.get_llm(
    checkpoint="gpt2-xl",  # text-davinci-003, gpt-3.5-turbo, ...
    CACHE_DIR=".cache",
)
out = llm("愿原力与")
llm("愿原力与") # 当再次计算相同字符串时,使用缓存

数据包装器

用于加载huggingface数据集并进行基本预处理的API。

import imodelsx.data
dset, dataset_key_text = imodelsx.data.load_huggingface_dataset('ag_news')
# 确保dset有名为'train'和'validation'的分割,
# 且每个分割的输入数据包含在由{dataset_key_text}给定的列中

相关工作

  • imodels包(JOSS 2021 github)- 用于简洁、透明和准确预测建模的可解释ML包(兼容sklearn)。
  • 自适应小波蒸馏(NeurIPS 2021 pdf, github)- 将神经网络蒸馏为简洁的小波模型
  • 变换重要性(ICLR 2020 workshop pdf, github)- 使用简单的重参数化,允许计算输入变换的解耦重要性(例如,为不同频率分配重要性)
  • 分层解释(ICLR 2019 pdf, github)- 将CD扩展到CNN/任意DNN,并将解释聚合成层次结构
  • 解释正则化(ICML 2020 pdf, github)- 在训练期间惩罚CD/ACD得分,使模型泛化能力更强
  • PDR可解释性框架(PNAS 2019 pdf)- 用于指导和构建可解释机器学习的全面框架
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号