知识点 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")