知识点 1:线性回归(Linear Regression)—— “一条直线走天下”

文字描述:
线性回归试图找到一条“最佳直线”来拟合数据点,使所有点到这条直线的垂直距离(残差)的平方和最小(最小二乘法)。它假设特征与目标之间存在线性关系。适用于预测连续数值,如房价、温度。

核心公式: y = w·x + b
损失函数:均方误差 MSE = (1/n) Σ(y_true - y_pred)²
优化方法:梯度下降 或 正规方程

代码示例(Python + sklearn):

python

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

# 生成假数据(假装是房价)
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
y = np.array([1.5, 3.8, 6.7, 9.0, 11.2])

model = LinearRegression()
model.fit(X, y)

preds = model.predict(X)
print(f"斜率 w: {model.coef_[0]:.2f}, 截距 b: {model.intercept_:.2f}")
print(f"MSE: {mean_squared_error(y, preds):.2f}")

知识点 2:逻辑回归(Logistic Regression)—— “虽然叫回归,但它是分类的间谍”

文字描述:
逻辑回归虽带“回归”二字,却是用于二分类的。它通过 Sigmoid 函数将线性输出压缩到 (0,1) 之间,作为“属于正类的概率”。决策边界通常设为 0.5。适用于垃圾邮件识别、患病预测等。

核心公式: P(y=1) = 1 / (1 + e^{-(w·x+b)})
损失函数:交叉熵损失(Log Loss)

代码示例:

python

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

# 生成二分类数据集
X, y = make_classification(n_samples=100, n_features=2, n_redundant=0, random_state=42)
clf = LogisticRegression()
clf.fit(X, y)

print(f"准确率: {clf.score(X, y):.2f}")
# 预测概率
proba = clf.predict_proba(X[:2])
print(f"前两个样本的预测概率: \n{proba}")

知识点 3:决策树(Decision Tree)—— “灵魂拷问机”

文字描述:
决策树通过一系列“是/否”问题(特征阈值)对数据进行分割,目标是使每个子节点的纯度最高(如信息增益最大或基尼系数最小)。易于理解,但容易过拟合,需剪枝。适用于可解释性要求高的场景。

核心指标:

  • 信息增益 = 熵(父) - Σ(子节点权重 × 熵(子))

  • 基尼不纯度 = 1 - Σ(p_i²)

代码示例:

python

from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

# 使用鸢尾花数据
from sklearn.datasets import load_iris
iris = load_iris()
tree = DecisionTreeClassifier(max_depth=3, random_state=42)
tree.fit(iris.data, iris.target)

# 可视化(趣味性)
plt.figure(figsize=(12,6))
plot_tree(tree, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.title("一棵会思考的树 🌳")
plt.show()

知识点 4:支持向量机(SVM)—— “划清界限狂魔”

文字描述:
SVM 寻找一个超平面,使不同类别之间的间隔(margin)最大化。它只依赖支持向量(离决策面最近的样本),对异常值鲁棒。通过核技巧(Kernel Trick)可处理非线性分类,如 RBF 核将数据映射到高维空间。

关键概念: 硬间隔(线性可分)、软间隔(允许少量误分类)、核函数

代码示例:

python

from sklearn.svm import SVC
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

X, y = make_moons(n_samples=200, noise=0.15, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

svm = SVC(kernel='rbf', gamma='scale', C=1.0)
svm.fit(X_train, y_train)
print(f"测试集准确率: {svm.score(X_test, y_test):.2f}")

知识点 5:K-Means 聚类—— “无监督的拉帮结派”

文字描述:
K-Means 将数据划分为 K 个簇,每个簇由其质心(均值点)代表。算法迭代:分配样本到最近的质心 → 更新质心为簇内均值。需预先指定 K,对初始质心敏感,常用 K-Means++ 初始化。

评估指标: 轮廓系数(Silhouette Score)、手肘法(Elbow Method)

代码示例:

python

from sklearn.cluster import KMeans
import numpy as np

# 生成3个团块的数据
from sklearn.datasets import make_blobs
X, _ = make_blobs(n_samples=300, centers=3, random_state=42)

kmeans = KMeans(n_clusters=3, init='k-means++', random_state=42)
labels = kmeans.fit_predict(X)

print(f"质心坐标: \n{kmeans.cluster_centers_}")
print(f"前10个样本的簇标签: {labels[:10]}")

知识点 6:交叉验证(Cross-Validation)—— “防止自我感觉良好”

文字描述:
交叉验证是一种模型评估方法,不将数据简单分为一组训练/测试,而是分成 K 折(K-Fold)。每折轮流做测试集,其余做训练集,最终取平均性能。能更稳健地评估模型泛化能力,避免因单次划分带来的运气成分。

常用: K-Fold(通常 K=5 或 10)、Stratified K-Fold(保持类别比例)

代码示例:

python

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_digits

digits = load_digits()
rf = RandomForestClassifier(n_estimators=10, random_state=42)

scores = cross_val_score(rf, digits.data, digits.target, cv=5, scoring='accuracy')
print(f"5折交叉验证准确率: {scores}")
print(f"平均: {scores.mean():.3f} ± {scores.std():.3f}")

知识点 7:正则化(L1 / L2)—— “给模型戴上紧箍咒”

文字描述:
正则化用于防止过拟合,通过在损失函数后加惩罚项来限制模型复杂度。

  • L1(Lasso):惩罚权重绝对值之和,可产生稀疏解(特征选择)。

  • L2(Ridge):惩罚权重平方和,使权重平滑,不产生稀疏但数值稳定。

  • 弹性网(Elastic Net):L1 + L2 的组合。

直观理解: 太复杂的模型会被“罚款”,从而更乖。

代码示例(线性回归对比):

python

from sklearn.linear_model import Ridge, Lasso
from sklearn.datasets import make_regression

X, y = make_regression(n_samples=100, n_features=20, noise=5, random_state=42)

ridge = Ridge(alpha=1.0)   # alpha 是惩罚强度
lasso = Lasso(alpha=0.1)
ridge.fit(X, y); lasso.fit(X, y)

print(f"Ridge 系数非零个数: {sum(ridge.coef_ != 0)}")
print(f"Lasso 系数非零个数: {sum(lasso.coef_ != 0)}  (更稀疏)")

知识点 8:梯度下降(Gradient Descent)—— “盲人下山法”

文字描述:
梯度下降是优化算法,通过计算损失函数对参数的梯度,沿负梯度方向更新参数,使损失逐步减小。

  • 批量梯度下降(BGD):用全部数据计算梯度(准确但慢)

  • 随机梯度下降(SGD):用一个样本计算(快但不稳定)

  • 小批量梯度下降(Mini-batch):折中,常用

关键超参数: 学习率(太大震荡,太小龟速)

代码示例(手动实现 SGD 线性回归):

python

import numpy as np

# 生成数据
X = np.random.rand(100, 1) * 10
y = 2.5 * X + 1.3 + np.random.randn(100, 1) * 0.5

w = np.random.randn(1)
b = np.random.randn(1)
lr = 0.01
epochs = 200

for epoch in range(epochs):
    # 随机选一个样本(SGD)
    idx = np.random.randint(100)
    x_i = X[idx]; y_i = y[idx]
    
    # 梯度
    y_pred = w * x_i + b
    dw = 2 * (y_pred - y_i) * x_i
    db = 2 * (y_pred - y_i)
    
    # 更新
    w -= lr * dw
    b -= lr * db

print(f"估计 w: {w[0]:.2f}, 真实 w: 2.5")
print(f"估计 b: {b[0]:.2f}, 真实 b: 1.3")

更多推荐