数据科学家的工具箱:利用scikit-learn的顶级功能取得成功

理解scikit-learn:机器学习的统一方法

Image by Tayeb MEZAHDIA on Pixabay

Python拥有许多库,使其成为最常用的编程语言之一。它们中的大多数具有类似的功能,可以互相使用并达到相同的结果。但是,当涉及到机器学习时,我们可以谈论的唯一库就是sklearn

无论您是ML从业者还是初学者,我知道您对sklearn有一定的熟练掌握。但有时我们只是使用一些工具,因为每个人都这样做,而不问任何问题。

例如,您是否曾经问过自己:“sklearn中最重要的5个特征是什么?”好吧,让我告诉你一件事:我花了大约2年的时间才问自己这个问题,所以如果您没有这样做,不要感到惭愧。

因此,在本文中,我将回答这个问题;以下是您会在本文中发现的内容:

目录:特征1:一致性特征2:广泛的算法特征3:数据预处理和特征工程特征4:模型评估和验证特征5:与Python数据科学生态系统的集成编码示例

特征1:一致性

sklearn的强大之处在于它是一个一致的库。这是什么意思?这意味着它具有:

  1. 易于与外部DL / ML库集成。它可以与外部ML / DL库集成,例如KerasTensorflowXGBoost,仅举几例。这种兼容性使我们能够将sklearn的特性与这些库的特性结合起来,使我们的数据专业人员的开发阶段变得轻松和无痛。
  2. 使用简单sklearn在提供的各种ML算法中维护相同的统一界面。这样我们不需要学习新的语法或模式:我们只需要遵循“相同的规则”并考虑开发我们的ML算法。您能想象在处理复杂的ML问题时,处理不同算法的不同语法吗?好吧,我不(而且,如果我不想!)。
  3. 文档完备sklearn提供了广泛的文档,包括使用教程和示例。文档还涵盖了库的各个方面,从数据预处理到模型评估。您可以在此处参考文档。

特征2:广泛的算法

sklearn库提供了非常广泛的ML算法,从监督到无监督学习,为SL案例实现回归和分类模型。

作为数据科学家,我们拥有这种广泛的可能性,使sklearn成为ML的完美库:一个环境适用于我们日常工作中所需的所有模型。

我们只需要选择最合适的算法来解决我们具体的问题领域,而不必抱怨集成等问题:这是一个巨大的优势!

特征3:数据预处理和特征工程

数据预处理和特征工程是ML问题的重要部分,因为它们涉及为ML算法准备数据。以下是sklearn为这些任务提供的特性:

数据预处理

  1. 处理缺失数据。如果您已经练习ML一段时间,我相信您会发现处理缺失数据有些痛苦。或者,至少对我来说是这样的。 sklearn为我们提供了处理缺失数据的不同功能,例如:a)SimpleImputer()类,它允许我们使用不同的策略(如平均值、中位数、模式或恒定值)来填充缺失值。可以将填充应用于特定列或整个数据集。b)IterativeImputer()类,它使用ML模型迭代地填充缺失值。它使用所选模型的预测来填充缺失值。c)MissingIndicator()类可用于在数据集中创建缺失值的二进制指标。它添加了一个新特征,标记一个值是否最初缺失或不存在,为模型提供了额外信息。
  2. 特征缩放。具有不同比例的特征可能会以不良的方式影响许多ML算法的性能。幸运的是,sklearn提供了一些方法来缩放特征,例如:a)标准化(StandardScaler()),它将特征缩放为具有零均值和单位方差,以及b)归一化(MinMaxScaler()),它将特征缩放到特定范围。
  3. 编码分类变量。许多ML算法无法直接处理分类变量。因此,sklearn提供了一些编码技术,例如:a)一位有效编码(OneHotEncoder())和b)序数编码(OrdinalEncoder())将分类变量转换为数字表示。这使得处理以字符串形式表示的数据并将其转换为数字变得容易,以便我们可以将这些数字提供给ML算法。
  4. 处理异常值。异常值是数据科学家的另一个常见问题,因为它们会影响机器学习模型的性能,因此需要特别处理。 sklearn提供了一些异常值检测和去除技术,例如局部离群因子(LOF())算法和孤立森林算法(IsolationForest())。请注意,这些都是无监督的ML算法。

特征工程:

  1. 特征提取 . sklearn 提供了不同的方法来从数据中提取有意义的特征。事实上,并不是所有的特征都对我们的机器学习问题有意义,通常我们最好只处理有意义的特征。在特征提取方面,sklearn 提供了:a) CountVectorizer() 类,它可以将文本文档转换为标记计数的矩阵,以及 b) TfidfVectorizer() 类,它计算词频-逆文档频率(TF-IDF)以表示文本数据。
  2. 降维 . sklearn 提供了各种降维技术,有助于减少特征数量,同时保留必要的信息。两种流行的方法是:a) 主成分分析 (PCA()) 和 b) t-分布随机邻居嵌入 (TSNE())。
  3. 特征选择 . 最后,sklearn 还提供了多种特征选择方法,例如:a) 单变量特征选择 (SelectKBest()),b) 递归特征消除 (RFE()),以及 c) 基于树状模型的特征重要性排名 (SelectFromModel())。

特征 #4: 模型评估和验证

模型评估和验证是机器学习中至关重要的活动。作为数据科学家,我们的角色实际上是找到最适合数据的模型;但是这实际上是什么意思呢?

这意味着我们需要训练一些机器学习模型,并找到根据未见过的数据进行最佳预测(或分类)的模型。这意味着我们首先需要在训练数据上评估一些机器学习模型,然后在新的、未见过的数据上验证它们。sklearn 提供了不同的功能来帮助我们在这些基本任务中,例如:

  1. 交叉验证技术 . 交叉验证是一种重要的模型评估技术,它帮助我们处理过拟合。它通过将数据划分为多个子集,在不同的子集组合上训练模型,并平均结果以估计模型的性能。sklearn 为我们提供了以下交叉验证方法:a) k-fold 交叉验证,b) 分层 k-fold 交叉验证,以及 c) 留一交叉验证。
  2. 评估指标 . sklearn 提供了广泛的评估指标,允许我们数值化地量化分类和回归模型的性能。对于分类任务,我们可以在其他指标中命名,例如 accuracyprecisionrecall,以及 AUC/ROC。相反,可以使用诸如均方误差 (MSE)、平均绝对误差 (MAE) 和 R² 等指标来评估回归任务,以及其他指标。如果您需要深入了解如何使用它们(和 sklearn 提供的两种主要分类和回归指标),这里是分类指标的权威指南。这里是回归情况的权威指南。
  3. 超参数调整 . 模型评估和验证与超参数调整密切相关,其中涉及选择最佳模型参数组合以获得机器学习算法的最佳性能。sklearn 提供了诸如 GridSearchCVRandomizedSearchCV 的工具,用于使用交叉验证进行超参数调整。这些技术系统地探索超参数空间,并识别导致最佳模型性能的最佳超参数集,基于选择的评估指标。

特征 #5: 与 Python 数据科学生态系统的集成

sklearn 的一个超能力是与 Python 数据科学生态系统的集成。这使数据科学家能够利用 sklearn 与数据操作、可视化和分析的库和工具的强大功能。以下是一些示例:

  1. Pandas 和 Numpy。sklearnPandas 数据框架集成的可能性允许用户将数据框架直接传递到 sklearn 的函数和类中。这使得在将数据馈送到 sklearn 模型之前,使用 Pandas 预处理和清理数据变得方便。此外,sklearn 在其数据表示方面大量依赖于 NumPy 数组。事实上,它可以直接接受 NumPy 数组作为训练任务的输入。
  2. Matplotlib 和 Seaborn . sklearn 提供了内置支持,使用 Matplotlib 绘制度量和模型评估结果。它允许用户可视化模型性能、特征重要性和其他相关统计数据,帮助我们理解我们的机器学习模型。此外,由于 Seaborn 是建立在 Matplotlib 之上的数据可视化库,因此 sklearn 也与它很好地配合,允许用户将 sklearn 的 ML 算法与 Seaborn 的美学图表相结合,进行探索性数据分析和模型评估。

编码示例

在最后一段中,我想强调一些用法示例。如果您有使用 sklearn 的经验,我知道您知道如何使用它。但是,请注意,这里的重点不是展示这些功能如何工作:它只是强调工作流程如何工作,基于我们在前面的段落中所说的内容。因为,再说一遍:我们经常仅仅为了使用它们而使用一些工具,并且因为每个人都这样做,而不问任何问题。

示例1:与Pandas和NumPy的集成

让我们看看与 sklearnPandasNumPy的集成。为了简单起见,我们可以使用ChatGPT的提示。但在此之前,您可能需要知道如何有效地将提示工程作为数据科学家使用:

释放提示工程的力量给数据科学家

如果您与数据一起工作,如何编写有效的提示

towardsdatascience.com

提示可能如下:

当然!我将创建一个带有五个特征的示例Pandas数据帧,对其进行归一化处理,并将其拆分为训练和测试集。用线性回归模型拟合测试集。打印训练和测试集的 R²。

我们得到:

在此示例中,我创建了一个带有五个特征( Feature1Feature5 )和一个目标变量(Target)的Pandas数据帧。然后,我使用scikit-learn的StandardScaler对特征数据进行了归一化处理。之后,我使用80:20比例将归一化的数据拆分为训练和测试集。接下来,我在训练集上训练了一个线性回归模型,并预测了训练和测试集的目标变量。最后,我计算并打印了训练集和测试集的R²得分。

因此,在工作流程层面上发生了什么:

import numpy as npimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import r2_scorefrom sklearn.preprocessing import StandardScaler# 生成至少有50个实例的随机特征np.random.seed(42)feature1 = np.random.randint(0, 10, size=100)feature2 = np.random.randint(0, 10, size=100)feature3 = np.random.randint(0, 10, size=100)feature4 = np.random.randint(0, 10, size=100)feature5 = np.random.randint(0, 10, size=100)target = np.random.randint(0, 100, size=100)# 创建一个Pandas数据帧data = {    'Feature1': feature1,    'Feature2': feature2,    'Feature3': feature3,    'Feature4': feature4,    'Feature5': feature5,    'Target': target}df = pd.DataFrame(data)# 将数据拆分为特征和目标X = df.drop('Target', axis=1)y = df['Target']# 使用StandardScaler对数据进行归一化处理scaler = StandardScaler()X_scaled = scaler.fit_transform(X)# 将归一化后的数据拆分为训练和测试集X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)# 在训练集上拟合线性回归模型reg_model = LinearRegression()reg_model.fit(X_train, y_train)# 预测训练和测试集的目标变量y_train_pred = reg_model.predict(X_train)y_test_pred = reg_model.predict(X_test)# 计算训练和测试集的R²得分r2_train = r2_score(y_train, y_train_pred)r2_test = r2_score(y_test, y_test_pred)# 打印R²得分print("训练集的R²得分:", r2_train)print("测试集的R²得分:", r2_test)
  1. 使用NumPy创建特征和标签。
  2. 特征和标签变成了一个Pandas数据框。
  3. Pandas数据框变成了Xy:分别是特征的数据框和标签的Pandas系列。
  4. Xy进行了缩放和分割。然后,使用线性回归模型对训练集和测试集进行预测并使用R²指标进行评估。

因此,我们可以看到,我们有一个直接的工作流程,从NumPy开始,以sklearn结束,给我们所需的结果。不需要任何“奇怪的操作”或集成。

示例2:与Matplotlib集成

为了展示sklearnMatplotlib之间的集成,我们再次使用ChatGPT和此提示:“使用在NumPy中生成的数据创建Python中的二元分类问题。将数据标准化并将其分割为训练和测试集。使用随机森林和KNN分类器拟合训练集。打印训练集的ROC曲线。”

我们得到:

当然!让我们使用Python中随机生成的数据创建一个二元分类问题,然后将数据标准化并将其分割为训练和测试集。我们将使用随机森林和K近邻(KNN)分类器来拟合训练集,最后,我们将绘制训练集的ROC曲线。

以下是代码:

import numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn.metrics import roc_curve, roc_auc_scoreimport matplotlib.pyplot as plt#设置随机种子以便再现结果np.random.seed(42)#生成随机数据num_samples = 1000num_features = 10#生成特征(X)X = np.random.randn(num_samples, num_features)#生成标签(y)y = np.random.randint(2, size=num_samples)#规范化特征X = (X - np.mean(X, axis=0)) / np.std(X, axis=0)#将数据分割为训练和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)#使用随机森林分类器拟合训练集rf_clf = RandomForestClassifier()rf_clf.fit(X_train, y_train)#使用K近邻(KNN)分类器拟合训练集knn_clf = KNeighborsClassifier()knn_clf.fit(X_train, y_train)#预测正类(类1)的概率y_train_rf_probs = rf_clf.predict_proba(X_train)[:, 1]y_train_knn_probs = knn_clf.predict_proba(X_train)[:, 1]#计算ROC曲线的假正率(FPR)、真正率(TPR)和阈值rf_fpr, rf_tpr, rf_thresholds = roc_curve(y_train, y_train_rf_probs)knn_fpr, knn_tpr, knn_thresholds = roc_curve(y_train, y_train_knn_probs)#计算ROC曲线的AUC得分rf_auc = roc_auc_score(y_train, y_train_rf_probs)knn_auc = roc_auc_score(y_train, y_train_knn_probs)#绘制ROC曲线plt.plot(rf_fpr, rf_tpr, label=f"Random Forest (AUC = {rf_auc:.2f})")plt.plot(knn_fpr, knn_tpr, label=f"KNN (AUC = {knn_auc:.2f})")plt.plot([0, 1], [0, 1], 'k--')  # 对于随机分类器的对角线plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title('ROC Curve - Train Set')plt.legend(loc='lower right')plt.show()

此代码生成具有10个特征和1000个样本的随机数据。然后,它标准化特征,将数据分割为训练和测试集,使用随机森林和KNN分类器拟合训练集,预测正类的概率,计算每个分类器的ROC曲线和AUC得分,最后,绘制训练集的ROC曲线。

如果我们运行上面生成的代码,我们会得到:

由上面生成的代码产生的ROC曲线。作者的图片。

所以,这是整个过程:

  1. 使用NumPy创建特征和标签。
  2. 特征和标签数组成为Xy
  3. 将特征和标签数组分割为训练集和测试集。然后,使用KNN和随机森林分类器拟合训练集。
  4. 使用Matplotlib库绘制ROC曲线,使我们能够比较两个分类器的性能。

再次说明,我们有一个直接的工作流,使用我们所需的所有库,打印我们想要的结果,没有“额外的操作”。

结论

在本文中,我们看到了使sklearn成为ML完美库的前5个功能。正如我们在示例中看到的那样,工作流程干净而直接,允许我们进行分析,而无需进行任何其他操作。

虽然我们领域中的一些其他库正在增长(如PyCaret,不过是一个低代码库),但sklearn肯定拥有我们开发算法所需的一切,而无需考虑其他任何事情,例如集成,操作等。

免费Python电子书:

开始学习Python数据科学,但遇到困难了吗?订阅我的通讯并获取我的免费电子书:这将为您提供正确的学习路径,以通过实践经验学习Python数据科学。

喜欢这个故事吗?通过我的推荐链接以5美元/月的价格成为小猪AI会员:我将获得少量佣金,您不需要支付额外费用:

阅读Federico Trotta(以及小猪AI上数千位其他作者)的每个故事。您的会员费用直接支持…

federicotrotta.medium.com