在构建和部署机器学习模型时,最佳好的方法是使它们尽可能的成为端到端的工作,这意味着尝试将大多数与模型相关的数据转换分组到一个对象中。
在ML世界中,采用pipeline的最简单方法是使用Scikit-learn。如果你不太了解它们,这篇文章就是为你准备的。我将通过一个简单的用例,首先尝试通过采用一个简单的机器学习工作流来解决这个问题,然后我将通过使用Scikit-Learn pipeline来解决这个问题,这样就能看出差异。
pipeline
pipeline允许你封装所有的预处理步骤,特性选择,扩展,特性编码,最重要的是它帮助我们防止数据泄漏,主要的好处是:
方便和封装:您只需要对数据调用fit和预测一次,就可以拟合整个估计序列。
联合参数选择:可以一次对pipeline中所有估计器的参数进行网格搜索。
在交叉验证中,安全pipeline有助于避免将测试数据中的统计信息泄漏到训练好的模型中
下面Scikit-learn pipelines流程图
一个转换序列(预处理,特征工程),和一个单一实体组装和执行的估计器(ML模型等)组成了pipelines。
转换对象(Transformers )是包含 FIT 和TRANSFORM方法的对象,例如one-hot encoder, simple imputer,等
估计器对象(Estimator )具有FIT和PREDICT方法的对象:(比如回归模型和分类模型等)
注意:在上面我已经连续放置了多个Transformers ,但它们不必这样设置,根据您的需要,您可以并行地实现它们。(你会在下面的例子中看到更多)
本例数据说明
我将使用来自Kaggle的数据集:Telco-Customer-Churn practice problem.
#ImportingtheDependenciesimportpandasaspdfromsklearn.model_selectionimporttrain_test_splitimportnumpyasnpimportwarningswarnings.filterwarnings('ignore') df=pd.read_csv("/kaggle/input/telco-customer-churn/WA_Fn-UseC_-Telco-Customer-Churn.csv") df
查看特征和数据类型
df.dtypes
#DefiningDependentVariablesX=df.drop(columns= ['Churn','customerID','gender','PhoneService', 'MultipleLines', 'PaperlessBilling','PaymentMethod'], axis=1) #IndependentVariabley=df['Churn'] #Convertingthisvariabletoobject, itisdeifinedasint64df['SeniorCitizen']=df['SeniorCitizen'].astype(object)
我们将专注于获得一个可行的模型,而不是专注于如何针对用例提出最佳模型。这里没有做任何EDA,而只是考虑不需要任何预处理的功能。
#SplitTrainTestX_train, X_test, y_train, y_test=train_test_split(X, y, test_size=0.30, random_state=124) #NumericFeaturenumeric_features= ['tenure'] #CategoricalFeaturescategorical_features= ['SeniorCitizen', 'Partner', 'Dependents', 'PhoneService', 'InternetService','OnlineSecurity','OnlineBackup', 'DeviceProtection','TechSupport','StreamingTV', 'StreamingMovies','Contract']
这里作为演示仅将准确性作为测试指标。
方案1:不使用pipeline的用例(典型ML工作流程)
#ImportingtheDependenciesfromsklearn.imputeimportSimpleImputerfromsklearn.preprocessingimportStandardScaler, OneHotEncoderfromsklearn.linear_modelimportLogisticRegression
在下面的第一个解决方案中,我将实现一个典型的机器学习工作流程,首先从定义转换对象开始,然后将这些对象拟合(FIT)到训练数据中(从数据中学习),然后应用这些转换 (TRANSFORM)功能训练数据 接下来,我们在转换后的数据上训练模型,现在我们将所有这些转换再一次应用于测试集。这里我们不应用任何FIT(因为它不必从数据中学习),我们仅应用TRANSFORM函数来防止数据的泄露
对训练数据使用“fit & transform”
在测试/新数据上使用“transform”。这样可以防止数据泄漏并将相同的转换应用于这两组数据。
得到结果如下