文章目录
- 机器学习之 sklearn 基础教程
- 1. 引言
- 2. 安装 sklearn
- 3. 数据集
- 3.1 加载数据集
- 3.2 数据集划分
- 4. 数据预处理
- 4.1 特征缩放
- 4.2 编码分类特征
- 5. 模型训练与评估
- 5.1 模型训练
- 5.2 模型评估
- 5.3 交叉验证
- 6. 模型调参
- 7. 模型调参(续)
- 7.1 GridSearchCV
- 7.1.1 使用 GridSearchCV
- 7.1.2 解读结果
- 7.1.3 预测和评估
- 7.2 RandomizedSearchCV
- 7.2.1 使用 RandomizedSearchCV
- 7.2.2 解读结果
- 7.3 管道(Pipeline)
- 7.3.1 创建管道
- 7.3.2 使用管道进行参数搜索
- 8. 模型持久化
- 8.1 保存模型
- 8.2 加载模型
- 9. 总结
- 9.1 模型评估与选择
- 9.2 交叉验证
- 9.3 模型调参技巧
- 9.4 模型持久化工具
- 9.5 部署与监控
- 10. 展望
机器学习之 sklearn 基础教程
本文章由文心一言生成,由arjunna整合编辑
1. 引言
scikit-learn
(通常简写为 sklearn
)是 Python 中最受欢迎的机器学习库之一。它提供了各种用于数据预处理、模型训练、评估以及模型选择的工具。本教程将详细介绍 sklearn
的基础用法,帮助你快速上手机器学习。
2. 安装 sklearn
你可以使用 pip 或 conda 来安装 sklearn
。以下是使用 pip 安装的命令:
pip install scikit-learn
3. 数据集
3.1 加载数据集
sklearn
自带了一些用于示例和测试的数据集,如鸢尾花数据集(Iris dataset)、波士顿房价数据集(Boston housing dataset)等。以下是如何加载鸢尾花数据集的示例:
from sklearn.datasets import load_irisiris = load_iris()
X = iris.data # 特征数据
y = iris.target # 目标标签
3.2 数据集划分
在训练模型之前,通常需要将数据集划分为训练集和测试集。sklearn
提供了 train_test_split
函数来实现这一功能:
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
4. 数据预处理
4.1 特征缩放
某些机器学习算法(如支持向量机、K近邻等)对特征的尺度敏感。因此,在进行模型训练之前,通常需要对特征进行缩放。sklearn
提供了 StandardScaler
和 MinMaxScaler
等工具来实现特征缩放。
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
4.2 编码分类特征
如果数据集中包含分类特征(即非数值型特征),则需要将其转换为数值型特征。sklearn
提供了 LabelEncoder
(用于单个分类特征)和 OneHotEncoder
(用于多个分类特征)等工具来实现这一功能。
5. 模型训练与评估
5.1 模型训练
sklearn
提供了许多内置的机器学习算法,如逻辑回归、支持向量机、决策树等。以下是如何使用 LogisticRegression
算法训练模型的示例:
from sklearn.linear_model import LogisticRegressionmodel = LogisticRegression()
model.fit(X_train_scaled, y_train)
5.2 模型评估
训练好模型后,我们需要评估其在测试集上的性能。sklearn
提供了各种评估指标,如准确率、精确率、召回率、F1 分数等。以下是如何计算模型准确率的示例:
from sklearn.metrics import accuracy_scorey_pred = model.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
5.3 交叉验证
为了更准确地评估模型的性能,可以使用交叉验证(Cross-Validation)。sklearn
提供了 cross_val_score
函数来实现这一功能:
from sklearn.model_selection import cross_val_scorescores = cross_val_score(model, X_train_scaled, y_train, cv=5)
print("Cross-validation scores:", scores)
print("Mean cross-validation score:", scores.mean())
6. 模型调参
sklearn
提供了 GridSearchCV
和 RandomizedSearchCV
等工具来自动搜索模型的最佳参数。以下是如何使用 GridSearchCV
进行参数搜索的示例:
from sklearn.model_selection import GridSearchCVparam_grid = {'C': [0.1, 1, 10, 100],'gamma': [1, 0.1, 0.01, 0.001],'kernel': ['rbf', 'linear']
}grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_train_scaled, y_train)print("Best parameters:", grid_search.best_params_)
7. 模型调参(续)
7.1 GridSearchCV
在上一节中,我们介绍了如何使用GridSearchCV
进行参数搜索。现在,我们将进一步讨论其用法和结果解读。
7.1.1 使用 GridSearchCV
from sklearn.model_selection import GridSearchCV# 假设我们已经定义了param_grid和LogisticRegression模型
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train_scaled, y_train)
7.1.2 解读结果
GridSearchCV
训练完成后,我们可以使用以下属性来查看结果:
best_params_
:返回最佳参数组合。best_score_
:返回最佳参数组合对应的平均交叉验证得分。best_estimator_
:返回使用最佳参数组合训练的模型。
print("Best parameters:", grid_search.best_params_)
print("Best cross-validation score:", grid_search.best_score_)
best_model = grid_search.best_estimator_
7.1.3 预测和评估
现在,我们可以使用最佳模型进行预测,并评估其在测试集上的性能:
y_pred = best_model.predict(X_test_scaled)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy on test set:", accuracy)
7.2 RandomizedSearchCV
RandomizedSearchCV
与GridSearchCV
类似,但它在参数网格中随机选择参数组合进行搜索,而不是像GridSearchCV
那样遍历所有可能的组合。这可以在参数空间非常大时提高效率。
7.2.1 使用 RandomizedSearchCV
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint as sp_randint# 定义随机搜索的参数分布
param_distributions = {'C': sp_randint(low=0, high=20),'gamma': sp_randint(low=3, high=0.00001),'kernel': ['rbf', 'linear'],'n_estimators': sp_randint(low=100, high=500), # 假设这是某个树集成模型的参数
}random_search = RandomizedSearchCV(LogisticRegression(), param_distributions, n_iter=10, cv=5, scoring='accuracy')
random_search.fit(X_train_scaled, y_train)
7.2.2 解读结果
与GridSearchCV
类似,我们可以使用best_params_
、best_score_
和best_estimator_
等属性来查看结果。
7.3 管道(Pipeline)
当数据预处理和模型训练需要多个步骤时,可以使用Pipeline
来组织这些步骤。Pipeline
可以将多个步骤组合成一个单一的估计器,从而简化工作流程并减少代码冗余。
7.3.1 创建管道
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScalersteps = [('scaler', StandardScaler()),('classifier', LogisticRegression())]pipeline = Pipeline(steps)# 现在,你可以像平常一样使用pipeline进行训练和预测
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
7.3.2 使用管道进行参数搜索
你还可以将管道与GridSearchCV
或RandomizedSearchCV
结合使用,以搜索包括预处理步骤在内的最佳参数组合。
8. 模型持久化
训练好的模型可以保存下来,以便在将来使用。sklearn
提供了joblib
模块来保存和加载模型。
8.1 保存模型
from sklearn.externals import joblib # 在较新版本的sklearn中,joblib已被独立出来,需要单独安装joblib.dump(best_model, 'best_model.pkl')
8.2 加载模型
loaded_model = joblib.load('best_model.pkl')
加载后的模型可以像之前一样进行预测。
9. 总结
本教程详细介绍了sklearn
的基础用法,包括数据加载、预处理、模型训练
在机器学习模型的训练、调参和保存过程中,还有一些其他值得探讨的内容。
9.1 模型评估与选择
在模型训练完成后,我们需要对模型进行评估以了解其性能。评估通常涉及将模型应用于一个独立的测试集,并计算各种性能指标,如准确率、召回率、F1分数、AUC-ROC等。这些指标可以帮助我们了解模型在不同场景下的表现,并据此选择最合适的模型。
9.2 交叉验证
交叉验证是一种评估模型性能的技术,它通过将数据集分成多个子集(通常是k个子集),然后多次使用不同的子集组合进行训练和测试,以得到更准确的性能估计。常见的交叉验证方法包括k折交叉验证、留一交叉验证等。交叉验证可以帮助我们更好地评估模型的泛化能力,避免过拟合或欠拟合的问题。
9.3 模型调参技巧
除了之前提到的网格搜索、随机搜索和贝叶斯优化等调参方法外,还有一些其他的调参技巧可以帮助我们更有效地找到最优参数。例如,我们可以使用贪心算法逐步增加进入模型的最佳参数,或者使用遗传算法等启发式搜索算法来探索参数空间。此外,了解模型的原理和实现细节也可以帮助我们更好地理解参数对模型性能的影响,从而更有效地进行调参。
9.4 模型持久化工具
除了joblib
外,还有其他一些工具可以用于保存和加载机器学习模型。例如,对于使用TensorFlow或PyTorch等深度学习框架训练的模型,我们可以使用这些框架提供的保存和加载功能。此外,还有一些通用的序列化库(如Pickle)也可以用于保存和加载Python对象,包括机器学习模型。然而,需要注意的是,不同的保存和加载工具可能具有不同的优缺点,我们需要根据具体的应用场景和需求来选择最合适的工具。
9.5 部署与监控
当我们将训练好的模型部署到实际应用中时,需要确保模型能够稳定地运行并产生准确的结果。为此,我们需要对模型进行监控和维护,包括定期检查模型的性能、更新数据集和重新训练模型等。此外,我们还需要考虑如何将模型的预测结果集成到现有的业务流程中,并确保模型与业务需求的匹配性。
10. 展望
随着机器学习技术的不断发展,我们将面临更多的挑战和机遇。未来,我们可以期待更先进的算法、更强大的计算能力和更丰富的数据集来推动机器学习技术的发展。同时,我们也需要关注如何更好地将机器学习技术应用于实际场景中,并解决实际应用中遇到的问题和挑战。