2007年,Scikit-learn首次被Google Summer of Code项目开发使用,现在已经被认为是最受欢迎的机器学习Python库。
Scikit-learn被视为机器学习项目(尤其是在生产系统中)最佳选择之一的原因有很多,包括且不限于以下内容:Scikit-learn是一个非常强大的工具,能为库的开发提供了高水平的支持和严格的管理。
清晰一致的代码样式可确保我们的机器学习代码易于理解和再现,并大大降低了对机器学习模型进行编码的入门门槛。
Scikit-learn得到了很多第三方工具的支持,有非常丰富的功能适用于各种用例。
如果你正在学习机器学习,那么Scikit-learn可能是最好的入门库。其简单性意味着很容易入门,通过学习Scikit-learn的用法,我们还将掌握典型的机器学习工作流程中的关键步骤。
下文是对Scikit-learn的入门介绍,应该能让你全面了解Scikit-learn,并且能够开发一个简单的机器学习模型了。
如果你还没有安装Scikit的最新版本,可以运行以下命令代码:
pip install scikit-learn
该数据集也可以直接从Scikit-learn API导入。
from sklearn.datasets import load_wine
X,y = load_wine(return_X_y=True)
Estimators(估算器)
Scitkit-learn 库提供了多种预构建算法,可以执行有监督和无监督的机器学习。它们通常被称为估算器。
为项目选择何种估计器取决于我们拥有的数据集和我们要解决的问题。Scitkit-learn官方文档提供了如下所示的图表,可以帮助我们确定哪种算法适合我们的任务。
Scikit learn之所以能如此直接地使用,是因为无论我们使用的模型或算法是什么,用于模型训练和预测的代码结构都是相同的。
为了说明这一点,让我们来看一个例子。
假设我们正在处理一个回归问题,希望训练一个线性回归算法,并使用得到的模型进行预测。使用Scikit learn 的第一步是调用 logistic 回归估计器并将其另存为对象。下面的示例调用该算法并将其保存为一个名为 lr 的对象。
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
下一步是将模型拟合到一些训练数据中。这是使用 fit() 方法执行的。我们在特征和目标数据上调用 lr.fit(),并保存生成的模型为称为模型的对象。在下面的示例中,我还使用 train_test_split() 方法将数据集拆分为测试和训练数据。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
model = lr.fit(X_train, y_train)
接下来,我们使用模型和预测() 方法对以前不可见的数据进行预测。
predictions = model.predict(X_test)
如果我们现在要使用 Scitkit-learn 执行不同的任务,比如说,我们想训练一个随机森林分类器。代码看起来非常相似,并且具有相同的步骤数。
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf_model = rf.fit(X_train, y_train)
rf_predictions = rf_model.predict(X_test)
这种一致的代码结构使得开发机器学习模型非常直接,并且还生成高度可读和可重复的代码。
预处理
在大多数实际机器学习项目中,我们使用的数据不一定准备好训练模型。很可能首先需要执行一些数据预处理和转换步骤,例如处理缺失值、将分类数据转换为数字或应用要素缩放。
Scikit-learn 具有执行这些预处理步骤的内置方法。例如,SimpleImputer() 会使用我们选择的方法来填充缺失的值。
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
X_train_clean = imputer.fit(X_train)
模型评估
一旦一个模型被训练过,我们就需要衡量这个模型在预测新数据方面的好坏程度。此步骤称为模型评估,我们选择的度量将由我们希望解决的任务来确定。例如,通常在回归问题中,我们可以选择RMSE,而对于分类,则可以选择 F1 分数。
所有估算器都包含一个 score()方法,该方法返回与它们执行的机器学习任务最相关的默认指标。
Scikit-learn 还提供了一组指标函数,这些函数为模型提供了更详细的评估。例如,对于分类任务,库具有分类报告,提供精度、召回、F1 评分和总体精度。
分类报告代码和输出如下所示。
from sklearn.metrics import classification_report
print(classification_report(rf_predictions, y_test))
模型优化
Scikit-learn 库中的所有估算器都包含一系列参数,有多个选项,为特定算法选择的值都将影响最终模型的性能。例如,使用 RandomForestClass 表示器,我们可以将树的 max_depth 设置为可能的任何值,并且根据数据和任务的不同值,此参数的不同值将产生不同的结果。
这种尝试不同参数组合以找到最佳组合的过程称为超参数优化。
Scikit-learn 提供了两个自动执行此任务的工具,GridSearchCV 实现了一种称为详尽网格搜索的技术,以及执行随机参数优化的随机搜索 CV。
下面的示例使用 GridSearchCV 查找随机森林分类器的最佳参数,输出结果在代码下方。
param_grid = {
'n_estimators': [200, 500],
'max_features': ['auto', 'sqrt', 'log2'],
'max_depth' : [4,5,6,7,8],
'criterion' :['gini', 'entropy']
}
from sklearn.model_selection import GridSearchCV
CV = GridSearchCV(rf, param_grid, n_jobs= 1)
CV.fit(X_train, y_train)
print(CV.best_params_)
print(CV.best_score_)
管道
Scikit-learn 包以管道的形式提供了一种更加方便的代码封装形式。此工具允许将所有预处理任务与分类器步骤连接在一起,以便简单地在单个管道对象上调用 fit() 或 predict() 执行工作流中的所有步骤。
这样可以生成高可读代码,并减少机器学习工作流中步骤的重复。
为了创建管道,我们首先在下面的代码中定义我称之为管道的对象中的步骤。然后,我们可以简单地调用此对象的拟合来训练模型。此外,管道对象还可用于对新数据进行预测。
from sklearn.pipeline import Pipeline
pipe = Pipeline([('imputer', SimpleImputer()), ('rf', RandomForestClassifier())])
pipeline_model = pipe.fit(X_train, y_train)
pipeline_model.score(X_test, y_test)
总结
以上为本文所有内容,足以让你全面了解Scikit-learn,并且能够开发一个简单的机器学习模型了。
希望以上内容能够帮助大家轻松入门最适合用来进行机器学习的Python库。
--END--
作者:Rebecca Vickery