优秀的编程知识分享平台

网站首页 > 技术文章 正文

关于机器学习中的Scikit-Learn,你不知道的10个实用功能

nanyue 2024-07-23 13:43:20 技术文章 11 ℃


Scikit-learn是使用最广泛的Python机器学习库之一。 它具有标准化和简单的界面,用于预处理数据以及模型训练,优化和评估。

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

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

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

Scikit-learn API内置了各种现实数据集,访问调用只需要一行代码,如果你正在学习或者想尝试新功能,它们将非常有用。

你还可以使用生成器:回归 make_regression(),聚类 make_blobs()和分类 make_classification()等生成综合数据集。

# 玩具回归数据集加载
from sklearn.datasets import load_boston

X,y = load_boston(return_X_y = True)

# 综合回归数据集加载
from sklearn.datasets import make_regression

X,y = make_regression(n_samples=10000, noise=100, random_state=0)

2.第三方公共数据集也很容易获得

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

from sklearn.datasets import fetch_openml

X,y = fetch_openml("wine", version=1, as_frame=True, return_X_y=True)

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

在开发机器学习模型时,最明智的做法是先创建一个基线模型。 本质上,该模型应该是“虚拟”模型,例如始终预测最频繁发生的类的模型。这里提供了一个基准来作为“智能”模型基准的基准,这样你就可以确保模型性能优于随机结果。

Scikit学习包括用于分类任务的 DummyClassifier()和用于基于回归问题的 DummyRegressor()。

from sklearn.dummy import DummyClassifier

#在葡萄酒数据集上拟合模型并返回模型分数
dummy_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_selection
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer

X,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具有许多执行数据选择的数据集。例如 SelectPercentile(),该方法根据所选的统计方法选择性能最好的X百分位特征进行评分。

from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectPercentile, chi2

X,y = load_wine(return_X_y = True)

X_trasformed = SelectPercentile(chi2, percentile=60).fit_transform(X, y)

6.机器学习工作流程中存在一条管道,允许我们将所有步骤连接在一起

除了提供各种用于机器学习的算法之外,Scikit-learn 还具有用于预处理和转换数据的一系列功能。 为了促进机器学习工作流程的可重复性和简化性,Scikit-learn 创建了管道,让我们可以将大量预处理步骤与模型训练阶段连接在一起。

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

from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

X,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)

# 将变量与模型联系在一起
pipe = Pipeline([('scaler', StandardScaler()), ('rf', RandomForestClassifier())])
pipe.fit(X_train, y_train)

pipe.score(X_test, y_test)

7.ColumnTransformer 可以对不同的特性应用不同的预处理

在许多数据集中,会有不同类型的特性,需要应用不同的预处理步骤。例如,可能有分类数据和数字数据的混合,我们希望可以通过一个热编码将分类数据转换为数字,并缩放数字变量。

Scikit-learn 管道有一个名为ColumnTransformer的函数,我们可以通过索引或指定列名来轻松指定要对哪些列应用做适当的预处理。

from sklearn import model_selection
from sklearn.linear_model import LinearRegression
from sklearn.datasets import fetch_openml
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# 加载同时包含分类和数字特征的auto93数据集
X,y = fetch_openml("auto93", version=1, as_frame=True, return_X_y=True)

# 创建数字和分类特征列表 
numeric_features = X.select_dtypes(include=['int64', 'float64']).columns
categorical_features = X.select_dtypes(include=['object']).columns

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)

# 创建数字和分类转换器以执行预处理步骤
numeric_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'))])

# 使用ColumnTransformer应用于正确的功能
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])

#向预处理器追加回归器
lr = Pipeline(steps=[('preprocessor', preprocessor),
                      ('classifier', LinearRegression())])

# 适配整个管道
lr.fit(X_train, y_train)
print("model score: %.3f" % lr.score(X_test, y_test))

8.轻松地输出管道的HTML表示形式

一般来说,管道会变得非常复杂,尤其是在处理真实世界的数据时。因此,scikitl-earn提供了一种非常方便的方法来输出管道中步骤的HTML图表。

from sklearn import set_config

set_config(display='diagram')   

lr

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

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

import matplotlib.pyplot as plt 
from sklearn import metrics, model_selection
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.datasets import load_breast_cancer

X,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 包,该库为分类特性提供了更大范围的预处理方法,以及 ELI5包用于实现更大的模型可解释性。

这两个库都可以直接在 Scikit-learn 管道中使用。

# 使用类别编码器的证据权重变压器的管道

from sklearn import model_selection
from sklearn.linear_model import LinearRegression
from sklearn.datasets import fetch_openml
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
import category_encoders as ce

#加载同时包含分类和数字特征的auto93数据集
X,y = fetch_openml("auto93", version=1, as_frame=True, return_X_y=True)

# 创建数字和分类特征列表
numeric_features = X.select_dtypes(include=['int64', 'float64']).columns
categorical_features = X.select_dtypes(include=['object']).columns

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, random_state=0)

# 创建数字和分类转换器以执行预处理步骤
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())])

categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
        ('woe', ce.woe.WOEEncoder())])

# 使用ColumnTransformer应用于正确的功能
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])

# 将回归附加到预处理器
lr = Pipeline(steps=[('preprocessor', preprocessor),
                      ('classifier', LinearRegression())])

# 适配整个管道
lr.fit(X_train, y_train)
print("model score: %.3f" % lr.score(X_test, y_test))

--END--

喜欢本文的同学记得转发+点赞~

更多内容,欢迎大家关注我们的公众号:为AI呐喊(weainahan)

Tags:

最近发表
标签列表