http://www.pycaret.org/tutorials/html/REG101.html
回归分析是一组统计过程,用于估计因变量(’目标’)和一个或多个独立变量(‘特征’ )之间的关系。机器学习中回归的目标是预测销售量、数量、温度等连续值。
可以使用自己的数据集
我们使用的数据集名称为"Sarah Gets a Diamond",该数据集包含6000条数据记录,含有9列数据项。具体描述如下:
使用get_data()函数从互联网上获取钻石数据集。
from pycaret.datasets import get_data
dataset = get_data('diamond')
打印输出数据集的形状
#check the shape of data
dataset.shape
为了模拟真实的使用场景,我们从原始数据集中划分了600条样本数据用来评估模型的最终表现。在对模型进行训练的过程中,这600条数据对于模型来说是始终不可见的。
data = dataset.sample(frac=0.9, random_state=786).reset_index(drop=True)
data_unseen = dataset.drop(data.index).reset_index(drop=True)
print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))
setup()函数初始化 pycaret 中的环境,并创建transformation pipeline以准备建模和部署数据。在调用 pycaret 中的其他函数之前,必须调用 setup()。setup()函数必须包含dataframe类型的数据集和标签列的名称。其余参数都是可选的,并且可以用来定义预处理管线。
在执行setup()函数时,PyCaret 的推理算法将根据属性值自动推断所有特征的数据类型。但是有时会出现推断错误。为了解决这个问题,在执行 setup()函数之后,PyCaret会显示一个包含特征和它被推断出的数据类型的表格。如果所有的数据类型都被正确识别,按下Enter键继续或输入quit结束当前实验。在 PyCaret 中,确保数据类型正确至关重要,因为PyCaret会自动执行一些预处理任务,这些任务对机器学习算法来说都必不可少。对于每种数据类型,执行这些任务的方式都各不相同,这意味着特征的数据类型被正确配置十分重要。
from pycaret.regression import *
exp_reg101 = setup(data = data, target = 'Price', session_id=123)
# 使用 setup()中的numeric_features和 categorical_features 参数覆盖 PyCaret 推断的数据类型
numeric_features: string, default = None
If the inferred data types are not correct, numeric_features can be used to
overwrite the inferred type. If when running setup the type of 'column1' is
inferred as a categorical instead of numeric, then this parameter can be used
to overwrite by passing numeric_features = ['column1'].
setup()函数一旦执行完成便会打印输出包含几个重要信息的表格。大多数信息都与执行setup()函数时构造的预处理管道有关,但是有几个参数还是需要我们特别关注一下的。具体内容如下:
一旦setup()函数执行完成,PyCaret强烈推荐我们执行compare_models()函数,用于评估各个模型的性能,除非我们确切知道需要使用哪些模型来执行训练任务。
compare_models()函数训练模型库中的所有模型,并使用K-折交叉验证对它们进行度量评估(默认使用10折交叉验证,可以在函数中使用fold参数指定"K"值)。函数最终会打印输出一个分数表格,表头是6个最常用的回归指标(MAE,MSE,RMSE,R2,RMSLE 和 MAPE)
compare_models()
默认情况下,网格使用 R2(从高到低)进行排序,可以通过传递sort参数进行更改。例如,compare_models(sort = ‘ RMSLE’)将根据 RMSLE 对网格进行排序(由于越低越好,所以从低到高)。
虽然compare_models()是一个强大的函数,但是它并不返回任何经过训练的模型。PyCaret推荐的工作流程是在setup()函数执行结束之后,立即调用compare_models()函数来评估各个模型在数据集上的表现,并最终确定一些候选模型以供继续实验。因此,实际上允许用户创建模型的函数名为create_model() 。该函数创建了一个模型,并使用分层交叉验证对其进行评价。与 compare_models ()类似,打印输出一个分数表格。
为了易于说明,我们选用以下模型作为候选模型。
ada = create_model('ada')
#trained model object is stored in the variable 'ada'.
print(ada)
lightgbm = create_model('lightgbm')
dt = create_model('dt')
与 compare_models()类似,使用fold参数更改默认值。
例如: create _ model (‘ dt’ ,fold = 5)
当使用 create_model()函数创建模型时,它使用默认的超参数。为了调整超参数,我们可以使用tune_model()函数。该函数在预定义的搜索空间中自动调整模型的超参数,并使用 k-fold 交叉验证对其进行评价。
注意:与Ppcaret其他功能函数的参数相比,tune_model()函数并不接收一个训练好的模型作为它的参数,我们需要传递一个模型的名称作为它的参数。
tuned_ada = tune_model('ada')
在模型确定之前,可以使用plot_model()函数绘制残差图、预测误差、重要特征等图形,从不同的方面对模型的性能进行评价。该函数接收一个经过训练的模型对象作为参数,并根据测试/验证集返回绘制的图形。
#Residual Plot
plot_model(ada)
#Prediction Error Plot
plot_model(ada, plot = 'error')
#Feature Importance Plot
plot_model(ada, plot='feature')
另一种分析模型性能的方法是使用evaluate_model()函数,该函数为给定模型的所有可用图形显示用户界面。它在内部使用plot_model()函数。
evaluate_model(ada)
结果如下:
通过点选Plot Type,我们可以查看不同的图形。
在最终模型确定之前,最好通过预测测试/验证集中的数据并检查评估度量表来进行最后一次检查。
之前我们已经从原始数据集中分离出30%的数据(1621条样本数据)作为测试/验证集,我们之前看到的所有评估指标都是基于训练集(70%,3779条样本数据)的交叉验证结果。
predict_model(ada);
在这一步我们通常可以根据输出结果,判断模型是否出现过拟合的现象
Finalize_model()函数将模型与完整数据集进行匹配。这个函数的目的是在完整的数据集上训练模型,然后将其部署到生产环境中。下面这段英文完成说明了pycaret的使用流程。
Model finalization is the last step in the experiment. A normal machine learning workflow in PyCaret starts with setup(), followed by comparing all models using compare_models() and shortlisting a few candidate models (based on the metric of interest) to perform several modeling techniques such as hyperparameter tuning, ensembling, stacking etc. This workflow will eventually lead you to the best model for use in making predictions on new and unseen data.
The finalize_model() function fits the model onto the complete dataset including the test/hold-out sample (30% in this case). The purpose of this function is to train the model on the complete dataset before it is deployed in production.
final_ada = finalize_model(ada)
#Final Ada Machine parameters for deployment
print(final_ada)
注意: 一旦使用finalize_model()最终确定了模型,包括测试/验证集在内的整个数据集都将被用于模型的训练。
predict_model()函数用来对模型从未见过的数据集(data_unseen)进行预测。data_unseen是我们一开始时创建的变量,它包含最初数据集的10% (600条样本数据)
unseen_predictions = predict_model(final_ada, data=data_unseen)
unseen_predictions.head()
Label列被追加到data_unseen数据集上。Label是使用final_ada模型对样本数据进行预测得到的预测值。如果希望将预测结果取整,可以在predict_model()函数中使用round参数进行设置。
当我们有更多的新数据需要预测时会发生什么?必须把以上整个流程再做一遍吗?答案是否定的,PyCaret 的内置函数save_model()允许我们保存模型以及整个转换管道(transformation pipeline),以供以后使用。
save_model(final_ada,'Final Lightgbm Model 08Feb2020')
为了加载我们已经保存的模型,我们可以使用PyCaret的load_model()函数加载模型,然后将保存的模型应用到新的未知数据上,对其进行预测。
saved_final_ada = load_model('Final Lightgbm Model 08Feb2020')
一旦我们将模型加载到环境中之后,我们就可以使用predict_model()函数预测任何新的数据。
#Once the model is loaded in the environment, you can simply use it to predict on any new data using the same predict_model() function.
new_prediction = predict_model(saved_final_ada, data=data_unseen)
new_prediction.head()