1. 机器学习基础概念与实战意义机器学习就像教小孩认动物——你不需要解释猫有四条腿和胡须而是不断展示各种猫的图片直到孩子能自己认出新的猫。这种通过数据而非规则学习的能力正是机器学习的核心魅力。为什么需要从零实现模型直接调用sklearn的API确实方便但就像只会用计算器却不明白加减法原理当模型效果不佳时你会束手无策。自己实现一次线性回归你会真正理解为什么特征缩放能加速收敛为什么正则化能防止过拟合。我曾在一个房价预测项目里发现sklearn的Ridge回归总是不稳定直到自己实现了梯度下降才明白原始特征量纲差异导致损失函数呈狭长峡谷形状这才是优化震荡的真正原因。这种洞察只有亲手编码才能获得。2. 线性回归从数学原理到代码实现2.1 正规方程解的推导想象你要画一条直线穿过散点图使得所有点到直线的垂直距离平方和最小。这就是线性回归的几何意义数学上表示为import numpy as np class LinearRegression: def __init__(self): self.theta None # 参数向量 def fit_normal(self, X, y): # 添加偏置项 X_b np.c_[np.ones((len(X), 1)), X] # 正规方程解(X^T X)^-1 X^T y self.theta np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) return self.theta关键细节np.c_用于拼接全1列作为偏置项矩阵求逆可能失败当特征共线时实际工程中会加小扰动项保证可逆时间复杂度O(n³)特征超过1万时计算代价过高2.2 梯度下降实现当数据量大时迭代优化更实用。以下是最速下降法的核心代码def fit_gd(self, X, y, lr0.01, n_iters1000): X_b np.c_[np.ones((len(X), 1)), X] self.theta np.random.randn(X_b.shape[1]) # 随机初始化 for _ in range(n_iters): gradients 2/X_b.shape[0] * X_b.T.dot(X_b.dot(self.theta) - y) self.theta - lr * gradients调参经验学习率lr建议从0.001开始尝试批量梯度下降每次用全量数据计算梯度小批量(Mini-batch)通常更优添加动量项可避免锯齿形下降3. 模型评估超越准确率的全面诊断3.1 回归指标实现MSE会放大异常点影响MAE更鲁棒R²反映解释方差比例def mse_score(y_pred, y_true): return np.mean((y_pred - y_true)**2) def r2_score(y_pred, y_true): return 1 - np.sum((y_pred-y_true)**2)/np.sum((y_true-np.mean(y_true))**2)可视化诊断残差图残差vs预测值应随机分布Q-Q图检验误差正态性学习曲线观察欠/过拟合3.2 交叉验证技巧from sklearn.model_selection import KFold kf KFold(n_splits5) for train_idx, val_idx in kf.split(X): X_train, X_val X[train_idx], X[val_idx] y_train, y_val y[train_idx], y[val_idx] # 训练并评估...注意事项分类问题需用StratifiedKFold保持类别比例时间序列需用TimeSeriesSplit避免未来信息泄露建议重复多次交叉验证减少随机性影响4. 逻辑回归分类任务的基石4.1 Sigmoid函数与决策边界def sigmoid(z): return 1 / (1 np.exp(-z)) class LogisticRegression: def fit(self, X, y, lr0.1, n_iters10000): X_b np.c_[np.ones((len(X), 1)), X] self.theta np.zeros(X_b.shape[1]) for _ in range(n_iters): z X_b.dot(self.theta) h sigmoid(z) gradient X_b.T.dot(h - y) / len(y) self.theta - lr * gradient关键理解本质上是用线性回归预测对数几率(odds)决策边界是θ^T x0对应的超平面L2正则化(λ||θ||²)能有效防止系数膨胀4.2 多分类扩展# 一对多(One-vs-Rest)策略 from sklearn.multiclass import OneVsRestClassifier ovr OneVsRestClassifier(LogisticRegression()) ovr.fit(X_train, y_train)对比Softmax回归更适用于类别互斥的场景输出各类别概率分布总和为1需用交叉熵损失替代MSE5. 支持向量机几何间隔最大化5.1 硬间隔SVM对偶问题class SVM: def __init__(self, C1.0): self.C C # 惩罚系数 def fit(self, X, y): n_samples, n_features X.shape K X.dot(X.T) # 线性核 # 二次规划求解 P cvxopt.matrix(np.outer(y,y) * K) q cvxopt.matrix(-np.ones(n_samples)) G cvxopt.matrix(np.vstack((-np.eye(n_samples), np.eye(n_samples)))) h cvxopt.matrix(np.hstack((np.zeros(n_samples), np.ones(n_samples)*self.C))) A cvxopt.matrix(y.astype(float), (1,n_samples)) b cvxopt.matrix(0.0) solution cvxopt.solvers.qp(P, q, G, h, A, b) self.alpha np.ravel(solution[x]) # 支持向量 sv self.alpha 1e-5 self.support_vectors X[sv] self.dual_coef y[sv] * self.alpha[sv] self.intercept np.mean(y[sv] - np.dot(X[sv], self.coef_))核函数技巧def rbf_kernel(X1, X2, gamma0.1): sq_dist np.sum(X1**2, 1).reshape(-1,1) np.sum(X2**2,1) - 2*np.dot(X1, X2.T) return np.exp(-gamma * sq_dist)6. 模型对比与实战建议6.1 波士顿房价预测对比实验模型MSE(5折平均)训练时间(s)可解释性线性回归23.40.02★★★★岭回归(α1)21.80.03★★★☆SVM(rbf)18.61.25★★☆☆发现非线性SVM表现最好但训练慢正则化确实提升泛化能力特征工程如log变换比模型选择影响更大6.2 手写数字识别技巧# 像素特征标准化 X_train (X_train - X_train.min()) / (X_train.max() - X_train.min()) # 数据增强 from sklearn.preprocessing import rotate X_augmented [rotate(img, angle10) for img in X_train]经验总结小样本优先用SVM大数据用神经网络逻辑回归需要更精细的特征工程永远先做基线模型如kNN再尝试复杂方法