在这篇文章中,将深入探讨如何使用PyCaret的pycaret.regression
模块来学习以下内容:
数据标准化:对数据集进行归一化和缩放处理。
数据转换:应用转换以使数据线性化并近似正态分布。
目标变量转换:对目标变量应用转换。
合并稀有类别:在分类特征中合并稀有类别。
数值变量分箱:使用‘Sturges’规则对数值变量进行分箱,并将数值特征转换为分类特征。
模型集成和堆叠:使用Bagging、Boosting、Voting和广义堆叠等多种集成技术提升模型性能。
实验日志记录:使用PyCaret中的MLFlow后端记录实验。
在深入实践之前,简要回顾这些技术及其使用场景是非常重要的。这些技术主要帮助线性和参数算法,但也能在基于树的模型上看到显著的性能提升。
1) 数据标准化:常用于缩放或标准化,用于转换实际的数值,以便为机器学习提供有用的属性。
2) 数据转换:标准化缩小数据范围以消除方差中的幅度影响,而转换是一种更激进的技术,改变分布形状,使转换后的数据可以由正态或近似正态分布表示。
3) 目标变量转换:与上述转换技术类似,但这只应用于目标变量。
4) 合并稀有类别:许多时候,分类特征中的类别在频率分布中并不显著。这些类别可能会因为学习样本量有限而引入数据集中的噪声。
5) 数值变量分箱:分箱是将数值变量转换为分类特征的过程。分箱有时可以通过减少数据中的噪声或非线性来提高预测模型的准确性。
6) 模型集成和堆叠:集成是一种创建多个不同模型来预测结果的技术。要么使用不同的建模算法,要么使用训练数据集的不同样本。
7) 集成模型的超参数调整:将学习如何为集成模型进行超参数调整,这与简单机器学习模型的调整类似。
在本文中,将使用名为“Sarah Gets a Diamond”的数据集。这个故事是关于一个MBA学生为他未来的妻子Sarah选择正确的钻石。数据集包含6000条训练条目,有9列:
Id、克拉重量、切割、颜色、净度、抛光、对称性、报告、价格。
获取数据:
from pycaret.datasets import get_data
dataset = get_data('diamond', profile=True)
由于profile参数设置为True,因此会收到一个交互式数据概况和数据的探索性数据分析。这是一个非常全面的分析,在下面包含了一小部分截图。
在之前的文章中,学习了如何使用setup()在PyCaret中初始化环境。使用了一些额外的参数,因为没有执行任何预处理步骤。在本文中,将向展示如何通过使用setup()自定义预处理管道来提升到下一个水平。
exp_reg102 = setup(data = data, target = 'Price', session_id=123,
normalize = True, transformation = True, transform_target = True,
combine_rare_levels = True, rare_level_threshold = 0.05,
remove_multicollinearity = True, multicollinearity_threshold = 0.95,
bin_numeric_features = ['Carat Weight'],
log_experiment = True, experiment_name = 'diamond1')
现在环境已经完全功能化了!
类似于之前的文章,将使用compare_models()来比较所有模型。
top3 = compare_models(exclude = ['ransac'], n_select = 3)
在compare_models()中使用了n_select参数来选择表现最佳的前3个模型。默认情况下,compare models只返回表现最佳的模型。
在本文中,将使用一些参数与create_model()函数一起使用。
dt = create_model('dt', fold = 5) #with 5 Fold CV
rf = create_model('rf', round = 2) #metrics rounded to 2 decimal points
knn = create_model('knn')
将使用不同的n_iter参数构建两个调整后的Knn模型。
tuned_knn = tune_model(knn)
tuned_knn2 = tune_model(knn, n_iter = 50)
注意到使用n_iter参数的不同值,R2分数有所提高。
集成是一种常用的机器学习技术,用于提高基于树的模型的性能。将在本文中介绍Bagging和Boosting技术。
bagged_dt = ensemble_model(dt)
boosted_dt = ensemble_model(dt, method = 'Boosting')
stacker = stack_models(top3)