2.3 预测器 (Predictor) Scikit-learn 核心概念:深入理解预测器 (Predictor) 在机器学习领域,预测模型扮演着至关重要的角色。它们从数据中学习模式,并利用这些模式对未知数据进行预测。Scikit-learn (sklearn) 作为 Python 中最流行的机器学习库之一,提供了丰富的预测器 (Predictor) 类,涵盖了各种监督和非监督学习算法。理解 Scikit-learn 中的预测器是掌握库功能、构建有效机器学习模型的基石。 2.3 预测器 (Predictor):Scikit-learn 的核心组件 在 Scikit-learn 中,预测器 (Predictor) 是实现了 和 两个关键方法的对象。
在机器学习领域,预测模型扮演着至关重要的角色。它们从数据中学习模式,并利用这些模式对未知数据进行预测。Scikit-learn (sklearn) 作为 Python 中最流行的机器学习库之一,提供了丰富的预测器 (Predictor) 类,涵盖了各种监督和非监督学习算法。理解 Scikit-learn 中的预测器是掌握库功能、构建有效机器学习模型的基石。
在 Scikit-learn 中,预测器 (Predictor) 是实现了 fit(X, y) 和 predict(T) 两个关键方法的对象。简单来说,预测器负责学习数据中的模式 (通过 fit 方法) 并 利用学到的模式对新数据进行预测 (通过 predict 方法)。
核心概念拆解:
fit(X, y) 方法 (训练):
作用: fit 方法是预测器的核心训练方法。它接收训练数据 X 和对应的目标变量 y (对于监督学习),模型会根据这些数据学习特征与目标之间的关系,或者数据本身的结构 (对于非监督学习)。
输入:
X (特征矩阵): 通常是一个二维数组或稀疏矩阵,每一行代表一个样本,每一列代表一个特征。
y (目标变量): 对于监督学习,y 是与 X 中样本对应的目标值或标签。它可以是一维数组 (回归任务) 或二维数组 (多标签分类)。对于非监督学习,y 可以省略或设置为 None。
输出: fit 方法通常返回 self,即预测器自身。这允许链式调用,例如 model.fit(X, y).predict(T)。
内部机制: fit 方法内部的具体实现取决于预测器所代表的算法。例如,线性回归的 fit 方法会计算最佳拟合线的系数,决策树的 fit 方法会构建树结构,而 K-Means 聚类算法的 fit 方法会找到聚类中心。
predict(T) 方法 (预测):
作用: predict 方法利用 fit 方法学到的模型,对新的未知数据 T 进行预测。
输入:
T (待预测的特征矩阵): 结构与训练数据 X 相似,也是一个二维数组或稀疏矩阵。输出: predict 方法返回预测结果 y_pred。
对于分类任务,y_pred 通常是一维数组,包含每个样本的预测类别标签。
对于回归任务,y_pred 通常是一维数组,包含每个样本的预测数值。
对于某些非监督学习任务 (如聚类),predict 可能返回簇标签或转换后的数据。
预测器的类型:
Scikit-learn 提供了多种类型的预测器,可以根据学习任务的性质进行分类:
监督学习预测器 (Supervised Learning Predictors): 这类预测器在训练时需要目标变量 y,用于学习特征与目标之间的映射关系。
分类器 (Classifiers): 用于预测样本的类别标签。例如:逻辑回归 (Logistic Regression)、支持向量机 (Support Vector Machines, SVM)、决策树 (Decision Trees)、随机森林 (Random Forests)、K-近邻 (K-Nearest Neighbors, KNN) 等。
回归器 (Regressors): 用于预测样本的连续数值。例如:线性回归 (Linear Regression)、岭回归 (Ridge Regression)、套索回归 (Lasso Regression)、支持向量回归 (Support Vector Regression, SVR)、随机森林回归 (Random Forest Regressor) 等。
非监督学习预测器 (Unsupervised Learning Predictors): 这类预测器在训练时不需要目标变量 y,主要用于发现数据中的结构或模式。
聚类器 (Clustering): 用于将数据样本划分为不同的簇。例如:K-均值 (K-Means)、DBSCAN、层次聚类 (Agglomerative Clustering) 等。
降维器 (Dimensionality Reduction): 用于降低数据的维度,同时保留重要信息。例如:主成分分析 (Principal Component Analysis, PCA)、奇异值分解 (Singular Value Decomposition, SVD) 等。
异常检测器 (Anomaly Detection): 用于识别数据中的异常点。例如:One-Class SVM、孤立森林 (Isolation Forest) 等。
核心方法总结:
| 方法名 | 作用 | 适用阶段 | 输入 | 输出 |
|---|---|---|---|---|
fit(X, y) |
训练模型,学习数据模式 | 训练阶段 | X (特征矩阵), y (目标变量) (监督学习) |
self (预测器自身) |
predict(T) |
利用训练好的模型进行预测 | 预测阶段 | T (待预测的特征矩阵) |
y_pred (预测结果,类别标签或数值) |
fit_predict(X, y=None) |
训练并预测,常用于非监督学习或模型评估 | 训练和预测阶段 | X (特征矩阵), y (可选,取决于模型) |
y_pred (训练数据上的预测结果) |
score(X, y) |
评估模型性能,返回评估指标 | 评估阶段 | X (特征矩阵), y (目标变量) |
评估指标值 (如准确率、R^2 分数等) |
get_params() |
获取模型参数 | 配置阶段 | 无 | 模型参数字典 |
set_params(**params) |
设置模型参数 | 配置阶段 | **params (参数字典) |
self (预测器自身) |
接下来,我们将通过具体的代码示例,详细解释不同类型预测器的使用方法和核心概念。
1. 监督学习预测器:分类器 (Classifier)
示例:使用逻辑回归进行鸢尾花分类
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.datasets import load_iris from sklearn.metrics import accuracy_score # 1. 加载数据集 iris = load_iris() X, y = iris.data, iris.target # 2. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 3. 创建逻辑回归分类器 logistic_reg = LogisticRegression(random_state=42, max_iter=1000) # 初始化预测器 # 4. 训练模型 (fit 方法) logistic_reg.fit(X_train, y_train) # 使用训练数据训练模型 # 5. 预测 (predict 方法) y_pred = logistic_reg.predict(X_test) # 使用测试集进行预测 # 6. 评估模型性能 (score 方法 或其他评估指标) accuracy = accuracy_score(y_test, y_pred) # 计算准确率 print(f"逻辑回归在鸢尾花数据集上的准确率: {accuracy:.4f}") print(f"使用 score 方法评估准确率: {logistic_reg.score(X_test, y_test):.4f}") # 使用 score 方法直接评估 # 7. 获取模型参数 (get_params 方法) params = logistic_reg.get_params() print(f"逻辑回归模型参数: {params}") # 8. 设置模型参数 (set_params 方法) logistic_reg.set_params(C=0.1) # 修改正则化强度参数 C print(f"修改参数后的逻辑回归模型参数: {logistic_reg.get_params()}")
代码详解:
步骤 3: 创建预测器实例 logistic_reg = LogisticRegression(...): 首先,我们根据需要选择合适的预测器类 (这里是 LogisticRegression),并实例化一个预测器对象。在实例化时,可以设置模型的超参数 (hyperparameters),例如 random_state 用于控制随机性,max_iter 设置最大迭代次数。
步骤 4: 训练模型 logistic_reg.fit(X_train, y_train): 调用 fit 方法,传入训练数据 X_train 和对应的目标变量 y_train。逻辑回归模型会根据这些数据学习特征与类别标签之间的关系。fit 方法是模型学习的关键步骤,它会改变预测器内部的状态,使其能够进行预测。
步骤 5: 预测 y_pred = logistic_reg.predict(X_test): 调用 predict 方法,传入待预测的测试集 X_test。模型利用训练阶段学到的知识,对测试集中的每个样本进行类别预测,并将预测结果存储在 y_pred 中。
步骤 6: 评估模型 accuracy_score(y_test, y_pred) 和 logistic_reg.score(X_test, y_test): 使用评估指标 (如准确率 accuracy_score) 或预测器自带的 score 方法来评估模型在测试集上的性能。score 方法对于分类器通常默认返回准确率,对于回归器通常默认返回 R^2 分数。
步骤 7 & 8: 获取和设置模型参数 get_params() 和 set_params(): get_params 方法返回一个包含模型所有可调参数的字典。set_params 方法可以用来修改模型的超参数。这在模型调优和参数搜索中非常有用。
2. 监督学习预测器:回归器 (Regressor)
示例:使用线性回归进行波士顿房价预测
from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.datasets import load_boston from sklearn.metrics import mean_squared_error, r2_score # 1. 加载数据集 boston = load_boston() X, y = boston.data, boston.target # 2. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 3. 创建线性回归回归器 linear_reg = LinearRegression() # 初始化预测器 # 4. 训练模型 (fit 方法) linear_reg.fit(X_train, y_train) # 使用训练数据训练模型 # 5. 预测 (predict 方法) y_pred = linear_reg.predict(X_test) # 使用测试集进行预测 # 6. 评估模型性能 (score 方法 或其他评估指标) mse = mean_squared_error(y_test, y_pred) # 计算均方误差 r2 = r2_score(y_test, y_pred) # 计算 R^2 分数 print(f"线性回归在波士顿房价数据集上的均方误差 (MSE): {mse:.2f}") print(f"线性回归在波士顿房价数据集上的 R^2 分数: {r2:.4f}") print(f"使用 score 方法评估 R^2 分数: {linear_reg.score(X_test, y_test):.4f}") # 使用 score 方法直接评估
代码详解:
回归器的使用流程与分类器类似,主要区别在于:
预测器类: 使用 LinearRegression 等回归器类。
目标变量: y 是连续数值,代表房价。
评估指标: 使用回归任务常用的评估指标,如均方误差 (MSE) 和 R^2 分数。score 方法对于 LinearRegression 默认返回 R^2 分数。
3. 非监督学习预测器:聚类器 (Clustering)
示例:使用 K-Means 聚类算法对生成数据进行聚类
from sklearn.cluster import KMeans from sklearn.datasets import make_blobs import matplotlib.pyplot as plt # 1. 生成模拟数据 X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=42) # 2. 创建 K-Means 聚类器 kmeans = KMeans(n_clusters=4, random_state=42) # 初始化预测器,指定聚类数量 # 3. 训练并预测 (fit_predict 方法) cluster_labels = kmeans.fit_predict(X) # 训练并获取每个样本的簇标签 # 4. 可视化聚类结果 plt.scatter(X[:, 0], X[:, 1], c=cluster_labels, cmap='viridis') plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', label='Centroids') # 绘制聚类中心 plt.title("K-Means Clustering Results") plt.legend() plt.show() # 5. 预测新数据 (predict 方法) new_data = [[0, 0], [10, 10]] new_cluster_labels = kmeans.predict(new_data) print(f"新数据点的簇标签: {new_cluster_labels}")
代码详解:
步骤 2: 创建聚类器实例 kmeans = KMeans(...): 实例化 KMeans 聚类器,需要指定聚类数量 n_clusters。
步骤 3: 训练并预测 cluster_labels = kmeans.fit_predict(X): 对于非监督学习,通常使用 fit_predict 方法。该方法会先使用数据 X 训练模型 (找到聚类中心),然后直接返回训练数据 X 上每个样本的簇标签。
步骤 5: 预测新数据 new_cluster_labels = kmeans.predict(new_data): 训练完成后,可以使用 predict 方法对新的未知数据 new_data 进行聚类,得到它们所属的簇标签。
fit_predict 方法的特殊性:
fit_predict 方法结合了 fit 和 predict 两个步骤,主要用于以下场景:
非监督学习: 在非监督学习中,模型训练和预测通常在同一数据集上进行,例如聚类和降维。fit_predict 可以简化代码流程。
模型评估 (交叉验证): 在交叉验证等模型评估过程中,需要对训练集进行训练并立即在训练集上进行预测,以便进行后续的评估指标计算。
集成学习 (Ensemble Learning): 某些集成学习方法 (如 stacking) 需要基模型在训练集上进行预测,作为下一层模型的输入。fit_predict 可以方便地获取这些预测结果。
4. 非监督学习预测器:降维器 (Dimensionality Reduction)
示例:使用 PCA 进行数据降维
from sklearn.decomposition import PCA from sklearn.datasets import load_digits import matplotlib.pyplot as plt # 1. 加载数据集 (手写数字数据集) digits = load_digits() X, y = digits.data, digits.target # 2. 创建 PCA 降维器 pca = PCA(n_components=2) # 初始化 PCA 降维器,指定降维到 2 维 # 3. 训练并转换数据 (fit_transform 方法) X_reduced = pca.fit_transform(X) # 训练 PCA 并将数据降维 # 4. 可视化降维结果 plt.scatter(X_reduced[:, 0], X_reduced[:, 1], c=y, cmap='viridis') plt.title("PCA降维后的手写数字数据集") plt.xlabel("主成分 1") plt.ylabel("主成分 2") plt.colorbar(label='数字类别') plt.show() # 5. 转换新数据 (transform 方法) new_data = X[:5] # 取前 5 个样本作为新数据 X_new_reduced = pca.transform(new_data) print(f"降维后的新数据: {X_new_reduced}")
代码详解:
步骤 2: 创建降维器实例 pca = PCA(...): 实例化 PCA 降维器,需要指定降维后的维度 n_components。
步骤 3: 训练并转换数据 X_reduced = pca.fit_transform(X): 对于降维器,通常使用 fit_transform 方法。该方法会先使用数据 X 训练 PCA 模型 (计算主成分),然后将数据 X 转换到降维后的空间。
步骤 5: 转换新数据 X_new_reduced = pca.transform(new_data): 训练完成后,可以使用 transform 方法将新的未知数据 new_data 转换到相同的降维空间。
fit_transform 和 transform 方法的区别:
fit_transform(X): 用于训练数据 X。它会先调用 fit(X) 学习模型参数 (如 PCA 的主成分),然后使用学到的参数对 X 进行转换。
transform(T): 用于新的数据 T。它只进行转换,不重新训练模型。它使用在训练数据上学到的模型参数来转换 T。
总结:
Scikit-learn 的预测器 (Predictor) 是构建机器学习模型的基石。理解 fit、predict、fit_predict、score、get_params 和 set_params 等核心方法,以及不同类型预测器的应用场景,对于有效利用 Scikit-learn 库至关重要。通过本文的代码实践和内容详解,相信读者能够更深入地理解和掌握 Scikit-learn 预测器的使用,为构建更强大的机器学习模型打下坚实的基础。
在实际应用中,选择合适的预测器需要根据具体的任务类型、数据特征和性能要求进行权衡。Scikit-learn 提供了丰富的文档和示例,鼓励读者进一步探索不同预测器的特性和用法,并在实践中不断积累经验。