深入探索 Python 中的 Scikit-learn(sklearn)
简介
Scikit-learn(简称 sklearn)是 Python 中用于机器学习的一个强大且广泛使用的库。它提供了丰富的工具和算法,涵盖分类、回归、聚类、降维等多种机器学习任务,极大地简化了机器学习模型的开发过程,无论是新手入门还是专业人士进行复杂项目开发都离不开它。本文将详细介绍 sklearn 的基础概念、使用方法、常见实践以及最佳实践,帮助读者全面掌握这一强大工具。
目录
- 基础概念
- 数据集表示
- 估计器(Estimator)
- 转换器(Transformer)
- 预测器(Predictor)
- 使用方法
- 数据预处理
- 模型选择与训练
- 模型评估
- 常见实践
- 分类任务
- 回归任务
- 聚类任务
- 最佳实践
- 数据预处理技巧
- 模型调优策略
- 交叉验证的有效运用
- 小结
- 参考资料
基础概念
数据集表示
在 sklearn 中,数据集通常表示为二维数组。特征矩阵(feature matrix)是一个形状为 (n_samples, n_features)
的数组,其中 n_samples
是样本数量,n_features
是特征数量。目标变量(target variable)是一个长度为 n_samples
的一维数组,用于监督学习任务中的标签。
例如,对于一个包含 100 个样本,每个样本有 5 个特征的数据集,特征矩阵 X
的形状为 (100, 5)
,目标变量 y
的形状为 (100,)
。
估计器(Estimator)
估计器是 sklearn 中所有机器学习模型的基类。它包含两个主要方法:
fit(X, y)
:用于在给定的特征矩阵X
和目标变量y
上训练模型。predict(X)
:用于对新的特征矩阵X
进行预测。
例如,线性回归模型是一个估计器:
from sklearn.linear_model import LinearRegression
# 创建线性回归估计器
lin_reg = LinearRegression()
# 假设 X_train 和 y_train 是训练数据
lin_reg.fit(X_train, y_train)
# 假设 X_test 是测试数据
y_pred = lin_reg.predict(X_test)
转换器(Transformer)
转换器用于对数据进行预处理或特征工程。它有三个主要方法:
fit(X)
:计算用于转换数据的统计信息。transform(X)
:应用转换到数据X
上。fit_transform(X)
:先调用fit(X)
再调用transform(X)
。
例如,标准化数据的 StandardScaler
是一个转换器:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
预测器(Predictor)
预测器是用于预测的对象,它基于训练好的模型对新数据进行预测。估计器在训练后就可以作为预测器使用,通过 predict
方法进行预测。
使用方法
数据预处理
数据预处理是机器学习的重要步骤,sklearn 提供了多种工具。
- 标准化(Standardization):
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test)
- 归一化(Normalization):
from sklearn.preprocessing import Normalizer normalizer = Normalizer() X_train_normalized = normalizer.fit_transform(X_train) X_test_normalized = normalizer.transform(X_test)
- 编码分类变量(Encoding Categorical Variables):
from sklearn.preprocessing import OneHotEncoder encoder = OneHotEncoder(sparse=False) categorical_features = encoder.fit_transform(categorical_X_train)
模型选择与训练
选择合适的模型并进行训练:
- 分类模型:
from sklearn.svm import SVC svm_classifier = SVC(kernel='linear') svm_classifier.fit(X_train, y_train)
- 回归模型:
from sklearn.ensemble import RandomForestRegressor rf_regressor = RandomForestRegressor(n_estimators=100) rf_regressor.fit(X_train, y_train)
模型评估
评估模型性能的常用指标:
- 分类模型:
from sklearn.metrics import accuracy_score, precision_score, recall_score y_pred = svm_classifier.predict(X_test) accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred, average='weighted') recall = recall_score(y_test, y_pred, average='weighted')
- 回归模型:
from sklearn.metrics import mean_squared_error, r2_score y_pred = rf_regressor.predict(X_test) mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred)
常见实践
分类任务
以鸢尾花数据集为例:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练模型
svm_classifier = SVC(kernel='linear')
svm_classifier.fit(X_train, y_train)
# 预测并评估
y_pred = svm_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
回归任务
以波士顿房价数据集为例:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
# 加载数据集
boston = load_boston()
X = boston.data
y = boston.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练模型
rf_regressor = RandomForestRegressor(n_estimators=100)
rf_regressor.fit(X_train, y_train)
# 预测并评估
y_pred = rf_regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"MSE: {mse}")
聚类任务
以 KMeans 聚类为例:
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 生成样本数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 创建并训练 KMeans 模型
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='X', s=200, c='red')
plt.show()
最佳实践
数据预处理技巧
- 在进行标准化或归一化时,要分别对训练集和测试集进行操作,且测试集的转换参数要基于训练集。
- 对于缺失值处理,使用
Imputer
或更高级的插补方法。
模型调优策略
- 使用网格搜索(Grid Search)或随机搜索(Random Search)进行超参数调优:
from sklearn.model_selection import GridSearchCV param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']} grid_search = GridSearchCV(SVC(), param_grid, cv=5) grid_search.fit(X_train, y_train) best_params = grid_search.best_params_
- 利用学习曲线(Learning Curve)和验证曲线(Validation Curve)来分析模型的偏差和方差。
交叉验证的有效运用
- 使用不同的交叉验证策略,如 K 折交叉验证(K-Fold Cross-Validation)、分层 K 折交叉验证(Stratified K-Fold Cross-Validation)等。
- 在模型选择和调优过程中,始终使用交叉验证来评估模型性能。
小结
本文全面介绍了 Python 中 Scikit-learn 库的基础概念、使用方法、常见实践以及最佳实践。通过了解数据集表示、估计器、转换器和预测器等概念,掌握数据预处理、模型选择与训练以及模型评估的方法,实践分类、回归和聚类任务,并遵循最佳实践进行数据预处理、模型调优和交叉验证,读者能够更加深入地理解和高效地使用 sklearn 进行机器学习项目开发。
参考资料
- Scikit-learn 官方文档
- 《Python 机器学习基础教程》
- 《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》