数据科学家的工具箱:利用scikit-learn的顶级功能取得成功
理解scikit-learn:机器学习的统一方法
Python拥有许多库,使其成为最常用的编程语言之一。它们中的大多数具有类似的功能,可以互相使用并达到相同的结果。但是,当涉及到机器学习时,我们可以谈论的唯一库就是sklearn
。
无论您是ML从业者还是初学者,我知道您对sklearn
有一定的熟练掌握。但有时我们只是使用一些工具,因为每个人都这样做,而不问任何问题。
例如,您是否曾经问过自己:“sklearn
中最重要的5个特征是什么?”好吧,让我告诉你一件事:我花了大约2年的时间才问自己这个问题,所以如果您没有这样做,不要感到惭愧。
因此,在本文中,我将回答这个问题;以下是您会在本文中发现的内容:
目录:特征1:一致性特征2:广泛的算法特征3:数据预处理和特征工程特征4:模型评估和验证特征5:与Python数据科学生态系统的集成编码示例
特征1:一致性
sklearn
的强大之处在于它是一个一致的库。这是什么意思?这意味着它具有:
- 易于与外部DL / ML库集成。它可以与外部ML / DL库集成,例如
Keras
,Tensorflow
和XGBoost
,仅举几例。这种兼容性使我们能够将sklearn
的特性与这些库的特性结合起来,使我们的数据专业人员的开发阶段变得轻松和无痛。 - 使用简单。
sklearn
在提供的各种ML算法中维护相同的统一界面。这样我们不需要学习新的语法或模式:我们只需要遵循“相同的规则”并考虑开发我们的ML算法。您能想象在处理复杂的ML问题时,处理不同算法的不同语法吗?好吧,我不(而且,如果我不想!)。 - 文档完备。
sklearn
提供了广泛的文档,包括使用教程和示例。文档还涵盖了库的各个方面,从数据预处理到模型评估。您可以在此处参考文档。
特征2:广泛的算法
sklearn
库提供了非常广泛的ML算法,从监督到无监督学习,为SL案例实现回归和分类模型。
作为数据科学家,我们拥有这种广泛的可能性,使sklearn
成为ML的完美库:一个环境适用于我们日常工作中所需的所有模型。
我们只需要选择最合适的算法来解决我们具体的问题领域,而不必抱怨集成等问题:这是一个巨大的优势!
特征3:数据预处理和特征工程
数据预处理和特征工程是ML问题的重要部分,因为它们涉及为ML算法准备数据。以下是sklearn
为这些任务提供的特性:
数据预处理
- 处理缺失数据。如果您已经练习ML一段时间,我相信您会发现处理缺失数据有些痛苦。或者,至少对我来说是这样的。
sklearn
为我们提供了处理缺失数据的不同功能,例如:a)SimpleImputer()
类,它允许我们使用不同的策略(如平均值、中位数、模式或恒定值)来填充缺失值。可以将填充应用于特定列或整个数据集。b)IterativeImputer()
类,它使用ML模型迭代地填充缺失值。它使用所选模型的预测来填充缺失值。c)MissingIndicator()
类可用于在数据集中创建缺失值的二进制指标。它添加了一个新特征,标记一个值是否最初缺失或不存在,为模型提供了额外信息。 - 特征缩放。具有不同比例的特征可能会以不良的方式影响许多ML算法的性能。幸运的是,
sklearn
提供了一些方法来缩放特征,例如:a)标准化(StandardScaler()
),它将特征缩放为具有零均值和单位方差,以及b)归一化(MinMaxScaler()
),它将特征缩放到特定范围。 - 编码分类变量。许多ML算法无法直接处理分类变量。因此,
sklearn
提供了一些编码技术,例如:a)一位有效编码(OneHotEncoder()
)和b)序数编码(OrdinalEncoder()
)将分类变量转换为数字表示。这使得处理以字符串形式表示的数据并将其转换为数字变得容易,以便我们可以将这些数字提供给ML算法。 - 处理异常值。异常值是数据科学家的另一个常见问题,因为它们会影响机器学习模型的性能,因此需要特别处理。
sklearn
提供了一些异常值检测和去除技术,例如局部离群因子(LOF()
)算法和孤立森林算法(IsolationForest()
)。请注意,这些都是无监督的ML算法。
特征工程:
- 特征提取 .
sklearn
提供了不同的方法来从数据中提取有意义的特征。事实上,并不是所有的特征都对我们的机器学习问题有意义,通常我们最好只处理有意义的特征。在特征提取方面,sklearn
提供了:a)CountVectorizer()
类,它可以将文本文档转换为标记计数的矩阵,以及 b)TfidfVectorizer()
类,它计算词频-逆文档频率(TF-IDF)以表示文本数据。 - 降维 .
sklearn
提供了各种降维技术,有助于减少特征数量,同时保留必要的信息。两种流行的方法是:a) 主成分分析 (PCA()
) 和 b) t-分布随机邻居嵌入 (TSNE()
)。 - 特征选择 . 最后,
sklearn
还提供了多种特征选择方法,例如:a) 单变量特征选择 (SelectKBest()
),b) 递归特征消除 (RFE()
),以及 c) 基于树状模型的特征重要性排名 (SelectFromModel()
)。
特征 #4: 模型评估和验证
模型评估和验证是机器学习中至关重要的活动。作为数据科学家,我们的角色实际上是找到最适合数据的模型;但是这实际上是什么意思呢?
这意味着我们需要训练一些机器学习模型,并找到根据未见过的数据进行最佳预测(或分类)的模型。这意味着我们首先需要在训练数据上评估一些机器学习模型,然后在新的、未见过的数据上验证它们。sklearn
提供了不同的功能来帮助我们在这些基本任务中,例如:
- 交叉验证技术 . 交叉验证是一种重要的模型评估技术,它帮助我们处理过拟合。它通过将数据划分为多个子集,在不同的子集组合上训练模型,并平均结果以估计模型的性能。
sklearn
为我们提供了以下交叉验证方法:a) k-fold 交叉验证,b) 分层 k-fold 交叉验证,以及 c) 留一交叉验证。 - 评估指标 .
sklearn
提供了广泛的评估指标,允许我们数值化地量化分类和回归模型的性能。对于分类任务,我们可以在其他指标中命名,例如accuracy
,precision
,recall
,以及 AUC/ROC。相反,可以使用诸如均方误差 (MSE
)、平均绝对误差 (MAE
) 和 R² 等指标来评估回归任务,以及其他指标。如果您需要深入了解如何使用它们(和sklearn
提供的两种主要分类和回归指标),这里是分类指标的权威指南。这里是回归情况的权威指南。 - 超参数调整 . 模型评估和验证与超参数调整密切相关,其中涉及选择最佳模型参数组合以获得机器学习算法的最佳性能。
sklearn
提供了诸如GridSearchCV
和RandomizedSearchCV
的工具,用于使用交叉验证进行超参数调整。这些技术系统地探索超参数空间,并识别导致最佳模型性能的最佳超参数集,基于选择的评估指标。
特征 #5: 与 Python 数据科学生态系统的集成
sklearn
的一个超能力是与 Python 数据科学生态系统的集成。这使数据科学家能够利用 sklearn
与数据操作、可视化和分析的库和工具的强大功能。以下是一些示例:
- Pandas 和 Numpy。 将
sklearn
与Pandas
数据框架集成的可能性允许用户将数据框架直接传递到sklearn
的函数和类中。这使得在将数据馈送到sklearn
模型之前,使用Pandas
预处理和清理数据变得方便。此外,sklearn
在其数据表示方面大量依赖于NumPy
数组。事实上,它可以直接接受NumPy
数组作为训练任务的输入。 - Matplotlib 和 Seaborn .
sklearn
提供了内置支持,使用Matplotlib
绘制度量和模型评估结果。它允许用户可视化模型性能、特征重要性和其他相关统计数据,帮助我们理解我们的机器学习模型。此外,由于Seaborn
是建立在Matplotlib
之上的数据可视化库,因此sklearn
也与它很好地配合,允许用户将sklearn
的 ML 算法与Seaborn
的美学图表相结合,进行探索性数据分析和模型评估。
编码示例
在最后一段中,我想强调一些用法示例。如果您有使用 sklearn
的经验,我知道您知道如何使用它。但是,请注意,这里的重点不是展示这些功能如何工作:它只是强调工作流程如何工作,基于我们在前面的段落中所说的内容。因为,再说一遍:我们经常仅仅为了使用它们而使用一些工具,并且因为每个人都这样做,而不问任何问题。
示例1:与Pandas和NumPy的集成
让我们看看与 sklearn
,Pandas
和NumPy
的集成。为了简单起见,我们可以使用ChatGPT的提示。但在此之前,您可能需要知道如何有效地将提示工程作为数据科学家使用:
释放提示工程的力量给数据科学家
如果您与数据一起工作,如何编写有效的提示
towardsdatascience.com
提示可能如下:
当然!我将创建一个带有五个特征的示例Pandas数据帧,对其进行归一化处理,并将其拆分为训练和测试集。用线性回归模型拟合测试集。打印训练和测试集的 R²。
我们得到:
在此示例中,我创建了一个带有五个特征(
Feature1
到Feature5
)和一个目标变量(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)
- 使用
NumPy
创建特征和标签。 - 特征和标签变成了一个
Pandas
数据框。 Pandas
数据框变成了X
和y
:分别是特征的数据框和标签的Pandas
系列。- 对
X
和y
进行了缩放和分割。然后,使用线性回归模型对训练集和测试集进行预测并使用R²指标进行评估。
因此,我们可以看到,我们有一个直接的工作流程,从NumPy
开始,以sklearn
结束,给我们所需的结果。不需要任何“奇怪的操作”或集成。
示例2:与Matplotlib集成
为了展示sklearn
和Matplotlib
之间的集成,我们再次使用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曲线。
如果我们运行上面生成的代码,我们会得到:
所以,这是整个过程:
- 使用
NumPy
创建特征和标签。 - 特征和标签数组成为
X
和y
。 - 将特征和标签数组分割为训练集和测试集。然后,使用KNN和随机森林分类器拟合训练集。
- 使用
Matplotlib
库绘制ROC曲线,使我们能够比较两个分类器的性能。
再次说明,我们有一个直接的工作流,使用我们所需的所有库,打印我们想要的结果,没有“额外的操作”。
结论
在本文中,我们看到了使sklearn
成为ML完美库的前5个功能。正如我们在示例中看到的那样,工作流程干净而直接,允许我们进行分析,而无需进行任何其他操作。
虽然我们领域中的一些其他库正在增长(如PyCaret
,不过是一个低代码库),但sklearn
肯定拥有我们开发算法所需的一切,而无需考虑其他任何事情,例如集成,操作等。
免费Python电子书:
开始学习Python数据科学,但遇到困难了吗?订阅我的通讯并获取我的免费电子书:这将为您提供正确的学习路径,以通过实践经验学习Python数据科学。
喜欢这个故事吗?通过我的推荐链接以5美元/月的价格成为小猪AI会员:我将获得少量佣金,您不需要支付额外费用:
使用我的推荐链接加入小猪AI-Federico Trotta
阅读Federico Trotta(以及小猪AI上数千位其他作者)的每个故事。您的会员费用直接支持…
federicotrotta.medium.com