关于Scikit-Learn,你不一定知道的10件事

作者:Rebecca Vickery
编译:ronghuaiyang
首发:AI公园公众号

导读

Scikit-learn中有很多方便的功能,你不一定知道。

Scikit-learn是使用最广泛的Python机器学习库之一。它有一个标准化和简单的接口用来预处理数据和进行模型的训练,优化和评估。

该项目最初是由David Cournapeau开发的谷歌Summer of Code项目,并在2010年首次公开发布。自创建以来,这库已经发展成为一个丰富的生态系统,用于开发机器学习模型。

随着时间的推移,该项目开发了许多方便的功能,增强了其易用性。在本文中,我将介绍10个你可能不知道的最有用的特性。

1. Scikit-learn 有内置的数据集

Scikit-learn API有多种内置的toy和现实世界数据集。只需一行代码就可以访问这些函数,如果你正在学习或只是想快速尝试一些新功能,那么它们非常有用。

你还可以使用生成器方便地为回归make_regression()、聚类make_blobs()以及分类make_classification()生成合成数据集。

所有的加载工具都提供了返回已经分割成X(特征)和y(目标)的数据的选项,这样就可以直接使用它们来训练模型。

# Toy regression data set loadingfrom sklearn.datasets import load_bostonX,y = load_boston(return_X_y = True)# Synthetic regresion data set loadingfrom sklearn.datasets import make_regressionX,y = make_regression(n_samples=10000, noise=100, random_state=0)

2. 第三方公开数据集获取也很方便

如果你想通过Scikit-learn直接访问更多公开可用的数据集,有一个方便的函数可以让你直接从openml.org网站导入数据。这个网站包含超过21,000种不同的数据集,用于机器学习项目。

from sklearn.datasets import fetch_openmlX,y = fetch_openml("wine", version=1, as_frame=True, return_X_y=True)

3. 有现成的分类器来训练基线模型

在开发机器学习模型时,明智的做法是首先创建一个基线模型。这个模型本质上应该是一个“伪”模型,比如总是预测最经常出现的类。这为你的“智能”模型提供了一个基准,这样你就可以确保它比随机结果表现得更好。

Scikit-learn中包含用于分类任务的 DummyClassifier()和用于回归问题的DummyRegressor()

from sklearn.dummy import DummyClassifier# Fit the model on the wine dataset and return the model scoredummy_clf = DummyClassifier(strategy="most_frequent", random_state=0)dummy_clf.fit(X, y)dummy_clf.score(X, y)

4. Scikit-learn 有自己的绘图 API

Scikit-learn有一个内置的绘图API,它允许你在不导入任何其他库的情况下可视化模型性能。包括下列绘图功能:部分依赖图、混淆矩阵、精确度召回率曲线和ROC曲线。

import matplotlib.pyplot as plt from sklearn import metrics, model_selectionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_breast_cancerX,y = load_breast_cancer(return_X_y = True)X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)clf = RandomForestClassifier(random_state=0)clf.fit(X_train, y_train)metrics.plot_roc_curve(clf, X_test, y_test)plt.show()

5. Scikit-learn 具有内置的特征选择方法

提高模型性能的一种方法是只使用最好的特征集来训练模型,或者去除冗余的特征。这个过程称为特征选择。

Scikit-learn有许多函数来进行feature selection。其中一个是SelectPercentile()。该方法根据所选择的统计方法选择表现最好的X百分位特征进行评分。

from sklearn import model_selectionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_winefrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerfrom sklearn.feature_selection import SelectPercentile, chi2X,y = load_wine(return_X_y = True)X_trasformed = SelectPercentile(chi2, percentile=60).fit_transform(X, y)

6. Pipelines 可以让你把所有的机器学习工作流串到一起

除了为机器学习提供广泛的算法,Scikit-learn也有一系列的预处理和数据变换的功能。为了便于机器学习工作流的重现性和简单性,Scikit-learn创建了**pipeline **,它允许你将大量的预处理步骤与模型训练阶段链接在一起。

pipeline将工作流中的所有步骤存储为单个实体,可以通过fit和predict方法调用。在pipeline对象上调用fit方法时,将自动执行预处理步骤和模型训练。

from sklearn import model_selectionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_breast_cancerfrom sklearn.pipeline import Pipelinefrom sklearn.preprocessing import StandardScalerX,y = load_breast_cancer(return_X_y = True)X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)# Chain together scaling the variables with the modelpipe = Pipeline([('scaler', StandardScaler()), ('rf', RandomForestClassifier())])pipe.fit(X_train, y_train)pipe.score(X_test, y_test)

7. 使用ColumnTransformer,你可以对不同的特征应用不同的预处理

在许多数据集中,你将拥有不同类型的特征,需要应用不同的预处理步骤。例如,数据集中可能混合有分类数据和数值数据,你可能希望通过独热编码将分类数据转换为数值数据并缩放数值变量。

Scikit-learn pipeline中有一个函数ColumnTransformer,可以让你非常容易地通过索引或通过指定的列名来指定哪些列应用最合适的预处理。

from sklearn import model_selectionfrom sklearn.linear_model import LinearRegressionfrom sklearn.datasets import fetch_openmlfrom sklearn.compose import ColumnTransformerfrom sklearn.pipeline import Pipelinefrom sklearn.impute import SimpleImputerfrom sklearn.preprocessing import StandardScaler, OneHotEncoder# Load auto93 data set which contains both categorical and numeric featuresX,y = fetch_openml("auto93", version=1, as_frame=True, return_X_y=True)# Create lists of numeric and categorical features  numeric_features = X.select_dtypes(include=['int64', 'float64']).columnscategorical_features = X.select_dtypes(include=['object']).columnsX_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)# Create a numeric and categorical transformer to perform preprocessing stepsnumeric_transformer = Pipeline(steps=[    ('imputer', SimpleImputer(strategy='median')),    ('scaler', StandardScaler())])categorical_transformer = Pipeline(steps=[    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),    ('onehot', OneHotEncoder(handle_unknown='ignore'))])# Use the ColumnTransformer to apply to the correct featurespreprocessor = ColumnTransformer(    transformers=[        ('num', numeric_transformer, numeric_features),        ('cat', categorical_transformer, categorical_features)])# Append regressor to the preprocessorlr = Pipeline(steps=[('preprocessor', preprocessor),                      ('classifier', LinearRegression())])# Fit the complete pipelinelr.fit(X_train, y_train)print("model score: %.3f" % lr.score(X_test, y_test))

8. 你可以简单的输出一个HTML来表示你的pipeline

pipeline通常非常复杂,特别是在处理真实数据时。因此,Scikit-learn提供了一个方法来输出pipeline中步骤的HTML图,这非常方便。

from sklearn import set_configset_config(display='diagram')   lr

9. 有一个绘图函数来可视化决策树

plot_tree()函数允许你创建一个决策树模型中的步骤图。

import matplotlib.pyplot as plt from sklearn import metrics, model_selectionfrom sklearn.tree import DecisionTreeClassifier, plot_treefrom sklearn.datasets import load_breast_cancerX,y = load_breast_cancer(return_X_y = True)X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)clf = DecisionTreeClassifier()clf.fit(X_train, y_train)plot_tree(clf, filled=True)plt.show()

10. 有许多第三方的库可以扩展Scikit-learn的功能

许多第三方库都可以使用Scikit-learn并扩展其功能。其中两个例子包括category-encoders库,它为分类特征提供了更广泛的预处理方法,以及ELI5库,用于更好的模型可解释性。

这两个包也可以直接在Scikit-learn pipeline中使用。

—END—

英文原文:https://towardsdatascience.co…

推荐阅读

  • CVPR 2020:物体检测论文精选
  • 对比自监督学习
  • TensorFlow中最大的30个机器学习数据集
  • 实体链接:信息抽取中的NLP的基础任务

关注图像处理,自然语言处理,机器学习等人工智能领域,请点击关注AI公园专栏
欢迎关注微信公众号

发表评论

邮箱地址不会被公开。 必填项已用*标注