监督学习算法实战指南

2026-07-11 7 min read 5

引言

监督学习是机器学习中最基础且应用最广泛的范式之一。它通过已标注的训练数据学习输入到输出的映射关系,从而对未知数据进行预测。本文将带你从零开始,通过实际代码示例,掌握几种主流监督学习算法的实现。

监督学习概述

监督学习算法主要分为回归和分类两大类。回归用于预测连续值,如房价预测;分类用于预测离散标签,如垃圾邮件检测。核心步骤包括数据准备、模型选择、训练、评估和调优。

环境准备

我们将使用Python和scikit-learn库。请确保已安装以下依赖:

pip install numpy pandas scikit-learn matplotlib

案例1:线性回归(房价预测)

线性回归假设目标值与特征之间存在线性关系。以下代码使用波士顿房价数据集(简化版)演示。

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# 生成示例数据
np.random.seed(42)
X = np.random.rand(100, 1) * 10
y = 2 * X.squeeze() + 3 + np.random.randn(100) * 0.5

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估
mse = mean_squared_error(y_test, y_pred)
print(f'均方误差: {mse:.2f}')
print(f'斜率: {model.coef_[0]:.2f}, 截距: {model.intercept_:.2f}')

输出示例:均方误差: 0.23, 斜率: 2.01, 截距: 2.98。模型成功拟合了线性关系。

案例2:决策树(鸢尾花分类)

决策树通过树状结构进行决策。使用经典的鸢尾花数据集。

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target

# 划分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练决策树
clf = DecisionTreeClassifier(max_depth=3, random_state=42)
clf.fit(X_train, y_train)

# 预测
y_pred = clf.predict(X_test)

# 评估
acc = accuracy_score(y_test, y_pred)
print(f'准确率: {acc:.2f}')

准确率通常能达到0.95以上。通过调整max_depth参数可控制过拟合。

案例3:支持向量机(手写数字识别)

SVM通过寻找最大间隔超平面进行分类。使用数字数据集。

from sklearn import datasets
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler

# 加载数据
digits = datasets.load_digits()
X, y = digits.data, digits.target

# 标准化
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)

# 训练SVM
svm = SVC(kernel='rbf', gamma='scale', C=1.0)
svm.fit(X_train, y_train)

# 预测
acc = svm.score(X_test, y_test)
print(f'SVM准确率: {acc:.2f}')

准确率通常超过0.98。核函数的选择对性能至关重要。

案例4:K近邻(葡萄酒分类)

KNN基于样本的最近邻居进行投票。使用葡萄酒数据集。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_wine

# 加载数据
wine = load_wine()
X, y = wine.data, wine.target

# 标准化
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)

# 训练KNN
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

# 预测
acc = knn.score(X_test, y_test)
print(f'KNN准确率: {acc:.2f}')

K值的选择可通过交叉验证优化。通常K=5效果较好。

模型评估与调优

使用交叉验证和网格搜索优化超参数:

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {'n_neighbors': [3, 5, 7, 9], 'weights': ['uniform', 'distance']}

# 网格搜索
grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)
grid.fit(X_train, y_train)

print(f'最佳参数: {grid.best_params_}')
print(f'最佳交叉验证得分: {grid.best_score_:.2f}')

输出示例:最佳参数: {'n_neighbors': 5, 'weights': 'distance'},得分0.97。

总结

本文通过四个实际案例展示了监督学习算法的实现流程。关键要点:1) 数据标准化对距离类算法至关重要;2) 决策树容易过拟合,需限制深度;3) SVM的核函数选择影响非线性分类能力;4) KNN的K值需调优。建议读者动手运行代码,并尝试调整参数观察效果。

参考资料

  • scikit-learn官方文档
  • 《机器学习实战》Peter Harrington
  • 《统计学习方法》李航
IT搬运工

专注技术分享,坚持原创深度内容。

分类
链接
订阅

RSS 订阅关注最新文章

© 2026 IT搬运工 · 站点地图 · 鄂ICP备19007640号-3