Skip to content

经典算法

逻辑回归:名字叫回归,实际做分类

Section titled “逻辑回归:名字叫回归,实际做分类”

用 Sigmoid 将线性输出映射为概率:

P(y=1∣x)=11+e−(wTx+b)P(y=1|x) = \frac{1}{1 + e^{-(w^Tx + b)}}
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=200, n_features=4, random_state=42)
model = LogisticRegression()
model.fit(X, y)
print(f"准确率: {model.score(X, y):.3f}")
# predict_proba 返回每个类别的概率
probs = model.predict_proba(X[:3])
print(f"前 3 个样本的概率:\n{probs}")

决策边界:逻辑回归学习的是线性决策边界。对于非线性问题,需要使用多项式特征或核方法。

通过递归分裂数据,每次选择最优特征和阈值,构建树形决策规则:

flowchart TD
A[年龄 > 30?] -->|是| B[收入 > 5万?]
A -->|否| C[学生?]
B -->|是| D[批准 ✅]
B -->|否| E[拒绝 ❌]
C -->|是| F[批准 ✅]
C -->|否| G[拒绝 ❌]
from sklearn.tree import DecisionTreeClassifier, export_text
model = DecisionTreeClassifier(max_depth=3, random_state=42)
model.fit(X, y)
# 打印决策规则
print(export_text(model, feature_names=[f"特征{i}" for i in range(4)]))

关键参数:

  • max_depth:最大深度,防止过拟合
  • min_samples_split:节点最少样本数才分裂
  • criterion:gini(基尼系数)或 entropy(信息增益)

KNN 不做任何训练,预测时找最近的 K 个邻居投票:

from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X, y)
print(f"准确率: {model.score(X, y):.3f}")

K 值选择:

  • K 太小 → 对噪声敏感,过拟合
  • K 太大 → 决策边界过于平滑,欠拟合
  • 常用 K=nK = \sqrt{n} 或交叉验证选择
算法优点缺点适用场景
逻辑回归可解释、训练快只能线性分类基线模型、文本分类
决策树可解释、无需缩放容易过拟合需要解释的场景
KNN无需训练、简单推理慢、内存大小数据集、推荐系统