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

用于可解释机器学习的Python库

时间:2023-03-17 14:09:31 科技观察

随着对AI偏见的担忧增加,从业者解释模型产生的预测的能力以及模型本身的工作方式变得越来越重要。幸运的是,已经开发了许多python工具集来解决上述问题。在下文中,我将简要介绍现有的四个用于翻译和解释机器学习模型的成熟工具包。这些工具包可以通过pip安装,文档完善,强调通过可视化提高可解释性。yellowbricktoolkit本质上是scikit-learn的扩展,提供了一些非常实用漂亮的机器学习模型可视化工具。`visualiser`对象是scikit-learn估计器的核心接口,因此如果您之前熟悉scikit-learn的工作流程,就会非常熟悉。这个可视化工具涵盖了模型选择、特征重要性和模型性能分析等方面。让我们看几个简短的例子。该工具包可以通过pip安装,pipinstallellowbrick为了演示该工具包中的一些特性,我们将使用scikit-learn中的红酒识别数据集。该数据集包含13个特征和3个对象类别。可以直接用scikit-learn加载。在下面的代码中,我导入数据集并将其转换为熊猫数据框。该数据集可直接用于模型训练,无需其他数据处理。importpandasasdfromsklearnimportdatasetswine_data=datasets.load_wine()df_wine=pd.DataFrame(wine_data.data,columns=wine_data.feature_names)df_wine['target']=pd.Series(wine_data.target)使用scikit-learn进一步划分数据到测试集和训练集。importpandasasdfromsklearnimportdatasetswine_data=datasets.load_wine()df_wine=pd.DataFrame(wine_data.data,columns=wine_data.feature_names)df_wine['target']=pd.Series(wine_data.target)接下来,我们使用yellowbrick的visualiser来观察特征相关性。importpandasasdfromsklearnimportdatasetswine_data=datasets.load_wine()df_wine=pd.DataFrame(wine_data.data,columns=wine_data.feature_names)df_wine['target']=pd.Series(wine_data.target)现在,我们拟合一个随机森林分类器,并评估它的性能通过另一个可视化工具。fromyellowbrick.classifierimportClassificationReportfromsklearn.ensembleimportRandomForestClassifiermodel=RandomForestClassifier()visualizer=ClassificationReport(model,size=(1080,720))visualizer.fit(X_train,y_train)visualizer.score(X_test,y_test)visualizer.poof()ELI5ELI5是另一个可视化包,对于调试机器学习模型和解释它们产生的预测很有用。它适用于最常见的Python机器学习工具包,包括scikit-learn和XGBoost,以及Keras。让我们使用ELI5来观察我们上面训练的模型的特征重要性。importeli5eli5.show_weights(model,feature_names=X.columns.tolist())`show_weights`方法默认使用GAIN计算权重,但您也可以传入其他`importance_type`来控制特征重要性的计算。你也可以使用show_prediction来观察某个样本预测结果的原因。fromeli5importshow_predictionshow_prediction(model,X_train.iloc[1],feature_names=X.columns.tolist(),show_feature_values=True)LIMELIME(模型独立局部可解释)是一个用于解释模型预测的工具包。LIME支持解释来自各种分类器的单样本预测,并原生支持scikit-learn。下面我们用LIME来解释一下我们上面训练的模型的一些预测。LIME可以用pip安装pipinstalllime首先,我们构建explainer,它使用训练数据集数组、模型中使用的特征名称和目标变量的类别名称作为初始化参数。importlime.lime_tabularexplainer=lime.lime_tabular.LimeTabularExplainer(X_train.values,feature_names=X_train.columns.values.tolist(),class_names=y_train.unique())接下来,我们创建一个lambda函数来表示模型来预测样本。有关详细信息,请参阅这个优秀的、更深入的LIME教程。首先,我们构建解释器,它将训练数据集数组、模型中使用的特征名称和目标变量的类别名称作为初始化参数。predict_fn=lambdax:model.predict_proba(x).astype(float)随后,我们使用explainer对指定样本的预测结果进行解释。结果如下。LIME通过可视化结果展示了特征如何影响预测结果。exp=explainer.explain_instance(X_test.values[0],predict_fn,num_features=6)exp.show_in_notebook(show_all=False)MLxtend这个工具包包含一系列可用于机器学习的工具函数。包括通过堆叠和投票构建的分类器、模型评估、特征提取、特征工程和可视化。除了工具包的文档之外,本文还是了解有关工具包的更多详细信息的良好资源。让我们使用MLxtend来比较Ensemble之后的分类器的分类边界与其子分类器的分类边界之间的差异。同样,MLxtend也可以通过pip安装。pipinstallmlxtend引入一些工具包,frommlxtend.plottingimportplot_decision_regionsfrommlxtend.classifierimportEnsembleVoteClassifierimportmatplotlib.gridspecasgridspecimportitertoolsfromsklearnimportmodel_selectionfromsklearn.linear_modelimportLogisticRegressionfromsklearn.naive_bayesimportGaussianNBfromsklearn.ensembleimportRandomForestClassifier下面的可视化工具一次只能接受两个特征作为输入,所以我们创建了数组['proline','color_intensity']。Becausethese在上述使用ELI5的分析中,有两个特征具有最高的特征重要性。引入一些工具包,X_train_ml=X_train[['proline','color_intensity']].valuesy_train_ml=y_train.values接下来,我们创建一些分类器,将它们拟合在训练数据上,并通过MLxtend可视化它们的决策边界.输出来自下面的代码。clf1=LogisticRegression(random_state=1)clf2=RandomForestClassifier(random_state=1)clf3=GaussianNB()eclf=EnsembleVoteClassifier(clfs=[clf1,clf2,clf3],weights=[1,1,1])value=1.5width=0.75gs=gridspec.GridSpec(2,2)fig=plt.figure(figsize=(10,8))labels=['LogisticRegression','RandomForest','NaiveBayes','Ensemble']forclf,lab,grdinzip([clf1,clf2,clf3,eclf],标签,itertools.product([0,1],repeat=2)):clf.fit(X_train_ml,y_train_ml)ax=plt.subplot(gs[grd[0],grd[1]])fig=plot_decision_regions(X=X_train_ml,y=y_train_ml,clf=clf)plt.title(lab)以上绝不是模型可解释性和可视化工具包的完整列表。这篇博文包含其他值得一试的有用工具包列表。谢谢阅读!