当前位置: 首页 > 科技观察

快速比较多个机器学习模型示例

时间:2023-03-19 10:08:53 科技观察

简介所有数据科学家在从事机器学习项目时都必须面对的一个问题是:哪种机器学习模型架构更适合我的数据?遗憾的是,对于哪种模式更好,目前还没有明确的答案。面对这种不确定性,通常的做法是:实验!在本文中,我将向您展示如何在数据集上快速测试多个模型,以找到可能提供良好性能的机器学习模型,从而让您专注于微调和优化您的模型。机器学习数据集在我们开始实验之前,我们需要一个数据集。我假设我们的问题是一个有监督的二元分类任务。让我们从从sklearn加载乳腺癌数据集开始。fromsklearn.datasetsimportload_breast_cancerX,y=data=load_breast_cancer(return_X_y=True)接下来,我们需要将数据拆分为训练集和测试集。分流比为75/25。fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.25,random_state=8675309)Python编码我们将快速测试6个不同模型在此数据集上的拟合度。LogisticRegressionRandomForestKNearestNeighborSupportVectorMachineGaussianNaiveBayesXGBoost为了更准确的表示每个模型的拟合度,其实是需要调整默认参数的,不过为了本文的演示目的,我会使用每个默认值每个模型的参数,这可以使总体思路更清晰。fromsklearn.linear_modelimportLogisticRegressionfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.svmimportSVCfromsklearn.ensembleimportRandomForestClassifierfromsklearn.naive_bayesimportGaussianNBfromxgboostimportXGBClassifierfromsklearnimportmodel_selectionfromsklearn.utilsimportclass_weightfromsklearn.metricsimportclassification_reportfromsklearn.metricsimportconfusion_matriximportnumpyasnpimportpandasaspddefrun_exps(X_train:pd.DataFrame,y_train:pd.DataFrame,X_test:pd.DataFrame,y_test:pd.DataFrame)->pd.DataFrame:'''Lightweightscripttotestmanymodelsandfindwinners:paramX_train:trainingsplit:paramy_train:trainingtargetvector:paramX_test:testsplit:paramy_test:testtargetvector:return:DataFrameofpredictions'''dfs=[]models=[('LogReg',LogisticRegression()),('RF',RandomForestClassifier()),('KNN',KNeighborsClassifier()),('SVM',SVC()),('GNB',GaussianNB()),('XGB',XGBClassifier())]results=[]names=[]scoring=['accuracy','precision_weighted','recall_weighted','f1_weighted','roc_auc']target_names=['malignant','benign']forname,modelinmodels:kfold=model_selection.KFold(n_splits=5,shuffle=True,random_state=90210)cv_results=model_selection.cross_validate(结果.append(cv_results)names.append(name)this_df=pd.DataFrame(cv_results)this_df['model']=namedfs.append(this_df)final=pd.concat(dfs,ignore_index=True)returnfinalfinal=run_exps(X_train,y_train,X_test,y_test)final上面的Python代码中有很多东西需要说明。首先,我们创建一个变量dfs来保存通过对训练集应用5折交叉验证而创建的数据集。接下来,模型保存在一个元组列表中,其中包含每个被测试分类器的名称和类别。在此之后,我们遍历此列表并运行5折交叉验证。每次运行的结果都记录在我们附加到dfs列表的pandas数据框中。必须注意的是,这里的指标是两个类的加权平均指标。测试集的分类报告如下:评估结果我们将分析从run_exps()脚本返回的final(dataframe)中的数据。为了更好地估计每个模型的指标分布,我对30个样本进行了经验引导。此外,我将重点关注两个指标:性能指标和拟合时间指标。下面的Python代码块实现了这一点。bootstraps=[]formodelinlist(set(final.model.values)):model_df=final.loc[final.model==model]bootstrap=model_df.sample(n=30,replace=True)bootstraps.append(bootstrap)bootstrap_df=pd.concat(bootstraps,ignore_index=True)results_long=pd.melt(bootstrap_df,id_vars=['model'],var_name='metrics',value_name='values')time_metrics=['fit_time','score_time']#fittimemetrics##PERFORMANCEMETRICSresults_long_nofit=results_long.loc[~results_long['metrics'].isin(time_metrics)]#getdfwithoutfitdataresults_long_nofit=results_long_nofit.sort_values(by='值')##TIMEMETRICSresults_long_fit=results_long.loc[results_long['metrics'].isin(time_metrics)]#dfwithfitdataresults_long_fit=results_long_fit.sort_values(by='values')首先,让我们绘制出自5-fold交叉试验的性能指标。importmatplotlib.pyplotaspltimportseabornassnsplt.figure(figsize=(20,12))sns.set(font_scale=2.5)g=sns.boxplot(x="model",y="values",hue="metrics",data=results_long_nofit,palette="Set3")plt.legend(bbox_to_anchor=(1.05,1),loc=2,borderaxespad=0.)plt.title('ComparisonofModelbyClassificationMetric')#plt.savefig('./benchmark_models_performance.png',dpi=300)plt.show()很明显,SVM在所有指标上对我们的数据拟合不佳,而集成决策树模型(随机森林和XGBoost)对数据拟合得很好。培训时间如何?plt.figure(figsize=(20,12))sns.set(font_scale=2.5)g=sns.boxplot(x="model",y="values",hue="metrics",data=results_long_fit,palette="Set3")plt.legend(bbox_to_anchor=(1.05,1),loc=2,borderaxespad=0.)plt.title('ComparisonofModelbyFitandScoreTime')plt.show()随机森林虽然相对于KNN,GNB和LogReg更慢,但其性能仅次于KNN。如果我继续改进模型,我可能会将大部分精力集中在随机森林上,因为它的性能几乎与XGBoost相同(它们的95%置信区间可能重叠),但训练速度几乎快4倍!如果您希望对这些模型执行更多分析(例如计算每个指标的置信区间),您将需要访问每个指标的均值和标准差。指标=列表(设置(results_long_nofit.metrics.values))bootstrap_df.groupby(['model'])[metrics].agg([np.std,np.mean])time_metrics=list(设置(results_long_fit.metrics.values))bootstrap_df.groupby(['model'])[time_metrics].agg([np.std,np.mean])结论上面的分析只考虑了平均准确率,召回率等,实际问题中,你是不太可能关心类之间的平均准确性,相反你可能特别关心某个类的准确性!此外,必须调整每个机器学习模型的超参数,以真正评估它们与数据的比较情况。适合度。

猜你喜欢