1. 线性回归:从数学原理到代码实现
线性回归是监督学习中最基础也最重要的算法之一,它通过拟合自变量与因变量之间的线性关系来进行预测。我们先从数学本质开始剖析。
1.1 最小二乘法的数学推导
线性回归的核心是最小二乘法(OLS)。假设我们有数据集D={(x₁,y₁),...,(xn,yn)},其中x∈ℝᵈ,y∈ℝ。模型试图找到参数w使得:
ŷ = wᵀx + b
损失函数定义为残差平方和:
L(w,b) = Σ(yi - wᵀxi - b)²
通过令∂L/∂w=0和∂L/∂b=0,可以得到闭式解:
w = (XᵀX)⁻¹Xᵀy
其中X是设计矩阵(每行一个样本)。这个解析解在特征维度不高时非常有效,但当特征维度d很大时,矩阵求逆的O(d³)复杂度会成为瓶颈。
提示:实际应用中常使用梯度下降法来避免直接求逆,特别是当特征维度超过10,000时。
1.2 Python实现与sklearn应用
用numpy实现基础版本:
python复制import numpy as np
class LinearRegression:
def __init__(self):
self.w = None
self.b = None
def fit(self, X, y):
X = np.hstack([np.ones((X.shape[0], 1)), X]) # 添加偏置项
theta = np.linalg.inv(X.T @ X) @ X.T @ y
self.b = theta[0]
self.w = theta[1:]
def predict(self, X):
return X @ self.w + self.b
使用sklearn的工业级实现:
python复制from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1)
model = LinearRegression()
model.fit(X, y)
print(f"R² score: {model.score(X, y):.3f}")
1.3 实战中的关键细节
- 特征缩放:虽然线性回归不需要严格的特征缩放,但建议进行标准化(StandardScaler)以提升数值稳定性
- 多重共线性:当特征高度相关时,XᵀX接近奇异矩阵,解决方案包括:
- 添加L2正则化(岭回归)
- 使用PCA降维
- 异常值处理:平方损失对异常值敏感,可考虑Huber损失等鲁棒损失函数
2. 逻辑回归:分类问题的概率建模
逻辑回归虽然名字含"回归",实则是经典的分类算法。它通过sigmoid函数将线性预测值映射到(0,1)区间,表示属于正类的概率。
2.1 从几率比到交叉熵损失
定义几率比(odds ratio):
odds = p/(1-p)
取对数得到对数几率:
log(odds) = wᵀx + b
通过sigmoid函数σ(z)=1/(1+e⁻ᶻ)将线性预测转换为概率:
p(y=1|x) = σ(wᵀx + b)
损失函数采用交叉熵:
L(w,b) = -Σ[yilog(pi) + (1-yi)log(1-pi)]
这个凸函数保证了梯度下降能找到全局最优解。
2.2 代码实现细节
手动实现核心部分:
python复制def sigmoid(z):
return 1 / (1 + np.exp(-z))
class LogisticRegression:
def __init__(self, lr=0.01, n_iters=1000):
self.lr = lr
self.n_iters = n_iters
def fit(self, X, y):
n_samples, n_features = X.shape
self.w = np.zeros(n_features)
self.b = 0
for _ in range(self.n_iters):
linear = X @ self.w + self.b
probs = sigmoid(linear)
dw = (1/n_samples) * X.T @ (probs - y)
db = (1/n_samples) * np.sum(probs - y)
self.w -= self.lr * dw
self.b -= self.lr * db
使用sklearn的优化实现:
python复制from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=10)
model = LogisticRegression(penalty='l2', C=1.0)
model.fit(X, y)
print(f"Accuracy: {model.score(X, y):.3f}")
2.3 分类边界的可视化理解
逻辑回归的决策边界是线性的,即在特征空间中的一个超平面。我们可以通过以下方式增强模型能力:
- 特征工程:添加多项式特征、交互项等
- 正则化选择:
- L1正则(lasso):产生稀疏解,适用于特征选择
- L2正则(ridge):防止过拟合,默认选择
- 多分类扩展:
- OvR(One-vs-Rest):训练K个二分类器
- Softmax回归:直接建模多类概率分布
3. 工业级应用中的进阶技巧
3.1 处理类别不平衡问题
当正负样本比例悬殊时(如1:100),需要特殊处理:
- 调整类别权重:
python复制model = LogisticRegression(class_weight='balanced') - 过采样/欠采样:
python复制from imblearn.over_sampling import SMOTE smote = SMOTE() X_res, y_res = smote.fit_resample(X, y) - 修改决策阈值:
python复制probas = model.predict_proba(X)[:, 1] y_pred = (probas > 0.3).astype(int) # 默认0.5
3.2 模型解释与特征重要性
逻辑回归的优势在于可解释性。可以通过以下方式解释模型:
- 系数分析:
python复制coef_df = pd.DataFrame({ 'feature': feature_names, 'coef': model.coef_[0] }).sort_values('coef', ascending=False) - SHAP值解释:
python复制import shap explainer = shap.LinearExplainer(model, X) shap_values = explainer.shap_values(X)
3.3 部署优化技巧
- 模型压缩:对系数进行量化,减少存储空间
- 加速预测:将sigmoid近似为分段线性函数
- 在线学习:对增量数据使用随机梯度下降
4. 从理论到实践:完整项目案例
4.1 房价预测实战(线性回归)
完整流程包括:
- 数据探索(EDA):
python复制import pandas as pd import seaborn as sns df = pd.read_csv('housing.csv') sns.pairplot(df[['price', 'sqft', 'bedrooms']]) - 特征工程:
python复制from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split X = df[['sqft', 'bedrooms', 'age']] y = df['price'] X_train, X_test, y_train, y_test = train_test_split(X, y) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) - 模型训练与评估:
python复制from sklearn.linear_model import Ridge from sklearn.metrics import mean_squared_error model = Ridge(alpha=1.0) model.fit(X_train_scaled, y_train) X_test_scaled = scaler.transform(X_test) preds = model.predict(X_test_scaled) print(f"RMSE: {np.sqrt(mean_squared_error(y_test, preds)):.2f}")
4.2 客户流失预测(逻辑回归)
典型业务场景实现:
- 数据预处理:
python复制df = pd.read_csv('churn.csv') df = pd.get_dummies(df, columns=['gender', 'contract_type']) - 模型构建:
python复制from sklearn.pipeline import Pipeline from sklearn.compose import ColumnTransformer numeric_features = ['tenure', 'monthly_charges'] preprocessor = ColumnTransformer( transformers=[ ('num', StandardScaler(), numeric_features) ]) pipeline = Pipeline([ ('preprocessor', preprocessor), ('classifier', LogisticRegression(solver='lbfgs', max_iter=1000)) ]) - 业务指标分析:
python复制from sklearn.metrics import classification_report, roc_auc_score print(classification_report(y_test, preds)) print(f"AUC: {roc_auc_score(y_test, model.predict_proba(X_test)[:,1]):.3f}")
在实际项目中,线性回归和逻辑回归往往作为基线模型出现。虽然它们结构简单,但通过精心设计的特征工程和正则化策略,常常能取得与复杂模型媲美的效果。特别是在需要模型解释性的场景,如金融风控、医疗诊断等领域,这两种算法仍然是首选方案。
