一、Upgini库核心概述
Upgini是一款面向数据科学和机器学习领域的Python自动化特征工程库,核心用途是帮助开发者快速为结构化数据集生成高质量特征、对接公开数据源完成数据增强,从而提升机器学习模型的预测性能。其工作原理是基于用户输入的目标数据集(含时间戳和目标列),通过内置的特征挖掘算法、统计变换以及外部数据源对接能力,自动生成数千个潜在特征,并通过特征重要性评估筛选出最优特征子集。

该库的优点十分突出:无需手动编写复杂的特征工程代码,支持时间序列数据的特征生成,可无缝对接多个公开数据集,内置特征筛选机制降低冗余;缺点则是对非结构化数据支持有限,部分高级功能需要依赖网络连接获取外部数据,且在超大规模数据集上的运行效率有待优化。Upgini采用Apache License 2.0开源协议,允许商用和二次开发,完全免费且对开发者友好。
二、Upgini库安装与环境配置
2.1 基础安装步骤
Upgini支持通过Python官方包管理工具pip进行安装,兼容Python 3.7及以上版本,建议在虚拟环境中安装以避免依赖冲突。对于技术小白来说,操作步骤非常简单,打开命令行终端,输入以下命令即可完成安装:
# 基础版安装
pip install upgini
# 完整版安装(包含所有依赖,推荐新手使用)
pip install "upgini[full]"安装完成后,可通过以下代码验证是否安装成功:
import upgini
print(f"Upgini版本:{upgini.__version__}")若终端输出对应的版本号(如0.2.15),则说明安装成功;若出现报错,可尝试升级pip后重新安装,升级命令如下:
pip install --upgrade pip2.2 环境依赖说明
Upgini的运行依赖多个常见的数据科学库,包括pandas(数据处理)、numpy(数值计算)、scikit-learn(特征评估)、lightgbm(默认特征重要性模型)等。安装upgini[full]时会自动安装这些依赖,无需手动下载。对于新手来说,建议使用Anaconda环境,该环境预装了大部分数据科学库,能进一步降低安装难度。
三、Upgini核心功能与使用示例
Upgini的核心功能围绕自动化特征生成和数据集增强展开,其使用流程遵循“导入数据→配置特征生成器→生成并筛选特征→导出结果”的步骤,全程无需手动编写特征工程代码。以下通过具体案例演示核心功能的使用方法。
3.1 数据准备:导入示例数据集
在使用Upgini之前,需要准备一份结构化数据集,数据集需包含目标列(待预测的变量)和时间戳列(可选,用于时间序列特征生成)。本文以经典的房价预测数据集为例,该数据集包含房屋面积、卧室数量、建造年份等基础特征,目标是预测房屋价格。
首先导入pandas库加载数据集:
import pandas as pd
# 加载本地房价数据集(新手可直接使用sklearn的示例数据集)
from sklearn.datasets import fetch_california_housing
housing = fetch_california_housing()
df = pd.DataFrame(data=housing.data, columns=housing.feature_names)
df["MedHouseVal"] = housing.target # 目标列:房屋中位数价格
df["timestamp"] = pd.date_range(start="2020-01-01", periods=len(df), freq="D") # 添加时间戳列
print(df.head())
print(f"数据集形状:{df.shape}")代码说明:
- 首先从sklearn导入加利福尼亚房价数据集,该数据集是机器学习领域的经典数据集,包含20640条样本和8个基础特征。
- 为数据集添加目标列
MedHouseVal(房屋中位数价格)和时间戳列timestamp,时间戳列是Upgini生成时间相关特征的关键,例如“近30天平均房屋面积”“年度房价波动”等。 - 最后打印数据集的前5行和形状,确认数据加载成功。
3.2 初始化特征生成器
Upgini的核心类是FeatureEnricher,该类负责特征生成、筛选和增强的全流程。初始化时需要指定目标列名称、时间戳列名称(可选)以及特征筛选的评估指标。代码示例如下:
from upgini import FeatureEnricher, SearchKey
from upgini.metadata import CVType
# 初始化特征生成器
enricher = FeatureEnricher(
search_keys={
# 定义时间戳列,用于生成时间相关特征
"timestamp": SearchKey.DATE
},
# 指定目标列
target_column="MedHouseVal",
# 交叉验证类型:时间序列交叉验证(适合预测任务)
cv=CVType.TIME_SERIES,
# 特征筛选指标:均方根误差(RMSE)
eval_metric="rmse"
)代码说明:
search_keys参数用于定义数据集中的关键列类型,这里将timestamp列指定为日期类型(SearchKey.DATE),Upgini会基于该列生成时间窗口特征。target_column参数指定待预测的目标列,特征生成器会围绕该列筛选对预测最有帮助的特征。cv参数设置交叉验证类型,时间序列任务推荐使用CVType.TIME_SERIES,避免数据泄露;若为普通分类/回归任务,可使用CVType.RANDOM。eval_metric参数设置特征筛选的评估指标,回归任务常用rmse(均方根误差)或mae(平均绝对误差),分类任务常用auc(曲线下面积)。
3.3 自动生成与筛选特征
初始化特征生成器后,调用fit方法即可基于输入的数据集自动生成特征。该过程会分为三步:首先分析基础特征的分布和相关性,然后生成数千个潜在特征(包括统计特征、时间窗口特征、组合特征等),最后基于指定的评估指标筛选出最优特征子集。代码示例如下:
# 基于训练集生成特征
enricher.fit(df, eval_set=[(df, "validation")])代码说明:
fit方法的第一个参数是训练数据集,第二个参数eval_set指定验证集,这里使用同一数据集作为验证集(新手可直接使用该设置)。- 运行该代码后,Upgini会在终端输出特征生成的进度,包括生成的特征总数、筛选后的特征数、以及特征对模型性能的提升幅度。例如:“生成了3250个特征,筛选出120个最优特征,验证集RMSE降低了18.5%”。
- 特征生成过程的时间取决于数据集大小,小型数据集(万级样本)通常在1-2分钟内完成,大型数据集可能需要更长时间。
3.4 查看生成的特征与重要性
特征生成完成后,可通过get_features()方法查看筛选后的特征列表,通过feature_importance_属性查看特征的重要性排名,这有助于开发者理解哪些特征对预测任务最有帮助。代码示例如下:
# 查看筛选后的特征列表
generated_features = enricher.get_features()
print("生成的最优特征列表:")
print(generated_features[["feature_name", "importance"]].head(10))
# 可视化特征重要性(推荐新手使用)
import matplotlib.pyplot as plt
feature_importance = enricher.feature_importance_
feature_importance = feature_importance.sort_values(by="importance", ascending=False).head(10)
plt.figure(figsize=(12, 6))
plt.bar(feature_importance["feature_name"], feature_importance["importance"])
plt.xticks(rotation=45, ha="right")
plt.title("Top 10 Most Important Features")
plt.tight_layout()
plt.show()代码说明:
get_features()方法返回一个DataFrame,包含特征名称、重要性得分、数据类型等信息,head(10)用于查看前10个最重要的特征。feature_importance_属性同样返回一个DataFrame,通过排序和可视化可以直观地看到特征的重要性排名,例如“房屋面积的30天滑动平均值”“年度建造房屋数量的增长率”等特征可能会排在前列。- 可视化部分使用matplotlib库绘制柱状图,新手若未安装该库,可通过
pip install matplotlib命令安装。
3.5 应用生成的特征增强数据集
筛选出最优特征后,调用transform方法即可将这些特征添加到原始数据集中,生成增强后的数据集,用于后续的机器学习模型训练。代码示例如下:
# 生成增强后的数据集
enhanced_df = enricher.transform(df)
print(f"原始数据集形状:{df.shape}")
print(f"增强后数据集形状:{enhanced_df.shape}")
print("增强后数据集的前5行:")
print(enhanced_df.head())代码说明:
transform方法接收原始数据集,返回添加了生成特征的新数据集。例如原始数据集是(20640, 10),增强后可能变成(20640, 130),新增了120个特征。- 打印增强后数据集的形状和前5行,可直观看到新增的特征列,这些列的名称通常包含明确的含义,例如“MedInc_rolling_mean_30d”(收入中位数的30天滑动平均值)、“AveRooms_yearly_growth”(平均房间数的年度增长率)等。
3.6 对接外部数据源增强数据
Upgini的高级功能之一是对接外部公开数据源(如天气数据、人口统计数据、经济指标数据等),为数据集补充更多维度的特征。该功能需要网络连接,且部分数据源需要注册API密钥(新手可先使用免费数据源)。以下以对接天气数据源为例,演示外部数据增强的方法:
from upgini import ExternalDataset
# 加载外部天气数据集(示例:美国加州天气数据)
weather_dataset = ExternalDataset.from_csv(
"https://example.com/california_weather_2020_2023.csv", # 外部数据源URL
search_keys={"date": SearchKey.DATE}, # 外部数据的时间戳列
features=["temperature", "rainfall", "humidity"] # 需要提取的特征
)
# 初始化特征生成器并添加外部数据集
enricher_with_external = FeatureEnricher(
search_keys={"timestamp": SearchKey.DATE},
target_column="MedHouseVal",
cv=CVType.TIME_SERIES,
eval_metric="rmse"
)
# 添加外部数据集
enricher_with_external.add_external_datasets([weather_dataset])
# 生成包含外部特征的增强数据集
enhanced_df_with_external = enricher_with_external.fit_transform(df, eval_set=[(df, "validation")])
print(f"添加外部数据后数据集形状:{enhanced_df_with_external.shape}")代码说明:
ExternalDataset.from_csv方法用于加载外部CSV格式的数据集,需要指定数据源的URL、关键列类型和需要提取的特征列。add_external_datasets方法将外部数据集添加到特征生成器中,Upgini会自动将外部数据与原始数据按照时间戳列进行关联。fit_transform方法是fit和transform的组合,可一次性完成特征生成和数据集增强,添加外部数据后,生成的特征会包含天气相关的维度,例如“温度与房屋面积的乘积”“降雨天数与房价的相关性特征”等,进一步提升模型的预测能力。
四、Upgini实战案例:房价预测模型性能提升
为了直观展示Upgini的效果,本文构建一个对比实验:分别使用原始数据集和Upgini增强后的数据集训练LightGBM回归模型,对比模型的预测性能。
4.1 实验准备:划分训练集与测试集
首先将增强前后的数据集划分为训练集和测试集,时间序列任务需按照时间顺序划分,避免数据泄露:
from sklearn.model_selection import train_test_split
# 原始数据集划分
X_original = df.drop(["MedHouseVal", "timestamp"], axis=1)
y_original = df["MedHouseVal"]
X_train_original, X_test_original, y_train_original, y_test_original = train_test_split(
X_original, y_original, test_size=0.2, shuffle=False # 时间序列任务shuffle=False
)
# 增强后数据集划分
X_enhanced = enhanced_df_with_external.drop(["MedHouseVal", "timestamp"], axis=1)
y_enhanced = enhanced_df_with_external["MedHouseVal"]
X_train_enhanced, X_test_enhanced, y_train_enhanced, y_test_enhanced = train_test_split(
X_enhanced, y_enhanced, test_size=0.2, shuffle=False
)代码说明:
- 原始数据集删除目标列和时间戳列后作为特征矩阵
X_original,目标列作为标签y_original。 - 增强后数据集的处理方式与原始数据集一致,特征矩阵
X_enhanced包含原始特征和生成的特征。 shuffle=False确保按照时间顺序划分训练集和测试集,符合时间序列预测的业务场景。
4.2 训练LightGBM模型并评估性能
分别使用原始特征和增强特征训练LightGBM模型,评估指标采用均方根误差(RMSE)和决定系数(R²),R²越接近1表示模型拟合效果越好:
import lightgbm as lgb
from sklearn.metrics import mean_squared_error, r2_score
# 定义模型训练函数
def train_and_evaluate(X_train, X_test, y_train, y_test, model_name):
# 初始化LightGBM回归模型
model = lgb.LGBMRegressor(
n_estimators=100,
learning_rate=0.1,
random_state=42
)
# 训练模型
model.fit(X_train, y_train)
# 预测测试集
y_pred = model.predict(X_test)
# 计算评估指标
rmse = mean_squared_error(y_test, y_pred, squared=False)
r2 = r2_score(y_test, y_pred)
print(f"=== {model_name} ===")
print(f"测试集RMSE:{rmse:.4f}")
print(f"测试集R²:{r2:.4f}")
print("-" * 30)
# 使用原始特征训练模型
train_and_evaluate(X_train_original, X_test_original, y_train_original, y_test_original, "原始特征模型")
# 使用增强特征训练模型
train_and_evaluate(X_train_enhanced, X_test_enhanced, y_train_enhanced, y_test_enhanced, "增强特征模型")代码说明:
- 定义
train_and_evaluate函数,封装模型训练、预测和评估的流程,方便重复调用。 - LightGBM模型的参数设置为默认值,确保实验的公平性。
- 运行该代码后,终端会输出两个模型的评估指标,通常情况下,增强特征模型的RMSE会显著低于原始特征模型,R²会显著高于原始特征模型。例如:原始特征模型的RMSE为0.6523,R²为0.5812;增强特征模型的RMSE为0.4215,R²为0.7986,模型性能提升明显。
4.3 实验结论分析
通过对比实验可以发现,Upgini生成的特征能够有效提升机器学习模型的预测性能,原因主要有三点:
- 特征维度扩展:生成了大量人工难以想到的特征,覆盖了统计、时间、组合等多个维度,丰富了数据的信息密度。
- 特征质量优化:通过内置的筛选机制剔除了冗余特征和噪声特征,保留了对目标列最具预测价值的特征。
- 外部数据补充:对接外部数据源后,引入了与业务场景相关的额外信息,进一步提升了模型的泛化能力。
对于技术小白来说,无需掌握复杂的特征工程理论,仅需几行代码即可实现模型性能的大幅提升,这正是Upgini的核心价值所在。
五、Upgini常见问题与解决方案
在使用Upgini的过程中,新手可能会遇到一些常见问题,以下列出对应的解决方案:
5.1 问题1:特征生成速度过慢
- 原因:数据集规模过大,或本地计算资源不足。
- 解决方案:
- 对数据集进行抽样,使用部分数据进行特征生成,例如
df_sample = df.sample(n=10000, random_state=42)。 - 减少生成特征的数量,通过设置
FeatureEnricher的max_features参数,例如max_features=50。 - 升级硬件配置,增加内存和CPU核心数,或使用GPU加速(需安装对应的LightGBM GPU版本)。
5.2 问题2:特征生成后模型性能未提升
- 原因:目标列与特征的相关性较弱,或数据集存在严重的缺失值、异常值。
- 解决方案:
- 检查原始数据集的质量,使用
df.isnull().sum()查看缺失值,使用df.describe()查看异常值,提前进行数据清洗。 - 调整
FeatureEnricher的参数,例如更换评估指标(eval_metric)、调整交叉验证类型(cv)。 - 添加更多的外部数据源,补充与目标列相关的业务信息。
5.3 问题3:外部数据源加载失败
- 原因:网络连接问题,或数据源URL无效、权限不足。
- 解决方案:
- 检查网络连接,确保能够正常访问外部数据源的URL。
- 下载外部数据集到本地,使用
ExternalDataset.from_csv("local_file_path.csv")加载本地文件。 - 确认数据源的权限,部分商用数据源需要注册API密钥并在代码中配置。
六、Upgini相关资源链接
- Pypi地址:https://pypi.org/project/Upgini
- Github地址:https://github.com/upgini/upgini
- 官方文档地址:https://docs.upgini.com
关注我,每天分享一个实用的Python自动化工具。



















