期末复习别慌!用Python+Sklearn搞定机器学习常见考题(附代码实战)
·
用Python代码拆解机器学习期末考点:从理论到实战的复习指南
期末考试临近,那些晦涩的机器学习概念是否让你感到无从下手?传统的死记硬背方式往往事倍功半。本文将带你用Python和Sklearn库,把抽象的考题转化为可运行的代码实验,通过"手脑并用"的方式深入理解核心算法。不同于简单的题海战术,我们将重点剖析5大高频考点,每个知识点都配有可修改的代码模板和常见错误分析,让你在调试代码的过程中自然掌握关键概念。
1. 数据划分与模型评估:从理论到实践
机器学习项目的第一个关键步骤就是合理划分数据集。很多同学在考试中知道要分训练集和测试集,但往往不理解为什么要这样做。让我们用代码来揭示其中的原理。
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
# 数据划分:注意random_state参数的作用
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42)
# 训练KNN模型
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# 评估模型表现
train_score = knn.score(X_train, y_train)
test_score = knn.score(X_test, y_test)
print(f"训练集准确率:{train_score:.2f},测试集准确率:{test_score:.2f}")
提示:尝试修改random_state的值,观察模型表现如何变化。这能帮助你理解为什么在研究中需要固定随机种子。
评估指标的选择同样重要,不同问题需要不同的评估标准:
| 问题类型 | 常用评估指标 | Sklearn对应函数 |
|---|---|---|
| 分类问题 | 准确率、F1分数 | accuracy_score, f1_score |
| 回归问题 | MAE、MSE | mean_absolute_error, mean_squared_error |
| 聚类问题 | 轮廓系数 | silhouette_score |
2. 过拟合与欠拟合:可视化诊断与解决方案
理解过拟合和欠拟合的概念是考试中的必考点,但仅靠文字描述很难真正把握。下面我们通过生成多项式回归的例子,直观展示这两种情况。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 生成合成数据
np.random.seed(42)
X = np.linspace(-3, 3, 100)
y = np.sin(X) + np.random.normal(0, 0.1, len(X))
X = X[:, np.newaxis]
# 测试不同多项式阶数
degrees = [1, 4, 15]
plt.figure(figsize=(12, 4))
for i, degree in enumerate(degrees):
ax = plt.subplot(1, len(degrees), i+1)
# 构建多项式回归模型
model = make_pipeline(PolynomialFeatures(degree), LinearRegression())
model.fit(X, y)
# 预测并计算MSE
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
# 绘制结果
ax.scatter(X, y, s=10, label="数据点")
ax.plot(X, y_pred, color='r', label=f"degree {degree}\nMSE: {mse:.2f}")
ax.legend()
plt.tight_layout()
plt.show()
从图中可以清晰看到:
- 欠拟合(degree=1):模型过于简单,无法捕捉数据规律
- 适度拟合(degree=4):较好地拟合了数据趋势
- 过拟合(degree=15):完美拟合训练数据但失去了泛化能力
解决策略对比:
欠拟合解决方案
- 增加模型复杂度
- 添加更多特征
- 减少正则化强度
过拟合解决方案
- 获取更多训练数据
- 使用正则化方法(L1/L2)
- 采用交叉验证
- 简化模型结构
3. 核心算法实现:KNN与线性回归实战
考试中经常要求解释K近邻(KNN)和线性回归的原理,最好的理解方式就是自己实现一遍。下面我们不仅展示如何使用Sklearn,还会揭示算法背后的关键参数。
3.1 K近邻分类器详解
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
# 创建分类数据集
X, y = make_classification(n_samples=200, n_features=4,
n_classes=3, random_state=42)
# 测试不同的K值
k_values = range(1, 21)
cv_scores = []
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X, y, cv=5, scoring='accuracy')
cv_scores.append(scores.mean())
# 绘制K值选择曲线
plt.plot(k_values, cv_scores)
plt.xlabel('K值')
plt.ylabel('交叉验证准确率')
plt.xticks(k_values)
plt.title('K值选择对模型性能的影响')
plt.show()
KNN算法的关键点:
- 距离度量:默认使用欧式距离,也可选择曼哈顿距离等
- 权重计算:可以按距离加权,使近邻点影响更大
- K值选择:太小容易过拟合,太大可能欠拟合
3.2 线性回归深入解析
from sklearn.linear_model import LinearRegression, Ridge
from sklearn.datasets import make_regression
from sklearn.metrics import mean_squared_error
# 生成回归数据
X, y = make_regression(n_samples=100, n_features=1,
noise=20, random_state=42)
# 普通线性回归
lr = LinearRegression()
lr.fit(X, y)
lr_pred = lr.predict(X)
lr_mse = mean_squared_error(y, lr_pred)
# 带L2正则化的岭回归
ridge = Ridge(alpha=10)
ridge.fit(X, y)
ridge_pred = ridge.predict(X)
ridge_mse = mean_squared_error(y, ridge_pred)
# 可视化对比
plt.scatter(X, y, label='原始数据')
plt.plot(X, lr_pred, color='r',
label=f'线性回归 (MSE: {lr_mse:.2f})')
plt.plot(X, ridge_pred, color='g',
label=f'岭回归 (MSE: {ridge_mse:.2f})')
plt.legend()
plt.title('线性回归与正则化对比')
plt.show()
线性回归的核心概念:
- 系数解释:每个系数代表特征对目标的影响程度
- 正则化:L1正则产生稀疏解,L2正则防止系数过大
- 假设检验:可以通过p值判断特征重要性
4. 决策树与朴素贝叶斯:分类问题双雄
4.1 决策树的可视化解读
决策树在考试中经常出现名词解释和简答题,通过可视化可以直观理解其工作原理。
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.datasets import load_breast_cancer
# 加载乳腺癌数据集
data = load_breast_cancer()
X, y = data.data[:, :2], data.target # 只取前两个特征便于可视化
# 训练决策树
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X, y)
# 可视化决策树
plt.figure(figsize=(12, 8))
plot_tree(dt, filled=True, feature_names=data.feature_names[:2],
class_names=data.target_names)
plt.show()
决策树的关键参数:
max_depth:控制树的最大深度min_samples_split:节点分裂的最小样本数criterion:分裂标准(基尼系数或信息增益)
4.2 朴素贝叶斯实战
朴素贝叶斯虽然"朴素",但在文本分类等场景表现优异,是考试中的高频考点。
from sklearn.naive_bayes import GaussianNB, MultinomialNB
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import make_pipeline
from sklearn.metrics import classification_report
# 加载新闻数据集
categories = ['sci.space', 'comp.graphics']
newsgroups = fetch_20newsgroups(subset='train', categories=categories)
# 构建文本分类管道
model = make_pipeline(
TfidfVectorizer(stop_words='english'),
MultinomialNB()
)
# 训练并评估
model.fit(newsgroups.data, newsgroups.target)
y_pred = model.predict(newsgroups.data)
print(classification_report(newsgroups.target, y_pred,
target_names=newsgroups.target_names))
朴素贝叶斯的要点:
- 基于贝叶斯定理,假设特征条件独立
- 三种常见变体:
- GaussianNB:用于连续特征
- MultinomialNB:用于离散计数(如文本词频)
- BernoulliNB:用于二元特征
5. 支持向量机(SVM)与核方法
SVM是机器学习考试中的难点,尤其是核函数的概念。下面通过代码展示不同核函数的效果。
from sklearn.svm import SVC
from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler
# 创建非线性可分数据
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)
X = StandardScaler().fit_transform(X)
# 定义不同核函数的SVM
kernels = ['linear', 'poly', 'rbf', 'sigmoid']
models = [SVC(kernel=k, gamma=2, C=1).fit(X, y) for k in kernels]
# 可视化决策边界
plt.figure(figsize=(12, 8))
for i, (model, kernel) in enumerate(zip(models, kernels)):
plt.subplot(2, 2, i+1)
# 绘制决策边界
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 200),
np.linspace(y_min, y_max, 200))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k')
plt.title(f'核函数: {kernel}')
plt.tight_layout()
plt.show()
SVM的核心概念:
- 核技巧:将数据映射到高维空间使其线性可分
- 正则化参数C:控制分类错误的惩罚力度
- gamma参数:影响单个样本的影响范围
在期末考试复习时,建议重点关注每种算法的核心参数及其对模型性能的影响。例如,在SVM中:
- 当数据近似线性可分时,使用线性核效率最高
- 对于复杂的非线性决策边界,RBF核通常表现良好
- 多项式核适合中等复杂度的分类问题
更多推荐
所有评论(0)