1. 多元线性回归基础概念想象你是一位房地产经纪人客户问你这套房子值多少钱你不会只看面积就报价还会考虑地段、房龄、学区等因素。多元线性回归就是帮我们同时考虑多个因素来预测结果的数学工具。简单线性回归y a bx就像只用面积预测房价而多元线性回归y a b₁x₁ b₂x₂ ...则像综合所有因素。在广告投放场景中我们可能同时有电视、广播、报纸三种媒体的投放预算x₁,x₂,x₃来预测销售额y。关键区别简单线性回归1个特征 → 二维平面中的直线多元线性回归n个特征 → n1维空间中的超平面我刚开始学习时犯过一个典型错误对每个特征单独做简单回归。比如分别用电视、广播预算预测销售额结果发现报纸广告的系数是正数但在多元模型中却接近零。后来才明白这是因为报纸和广播预算存在共线性——投放广播广告多的客户往往也会投报纸广告。2. 数据准备与探索性分析我们用经典的广告数据集包含200个市场的销售数据来演示。先加载数据并快速浏览import pandas as pd import seaborn as sns # 加载数据 ad pd.read_csv(Advertising.csv) print(ad.head()) # 绘制散点图矩阵 sns.pairplot(ad, x_vars[TV,radio,newspaper], y_varssales, height5)数据探索要点检查缺失值ad.isnull().sum()查看描述统计ad.describe()绘制相关性热图sns.heatmap(ad.corr(), annotTrue)我曾分析过一个电商数据集发现用户停留时间和购买金额相关性高达0.9。差点直接用作特征后来发现是数据记录错误——没购买的用户停留时间被错误记为0。这提醒我们相关性≠因果性。3. 模型构建与解释Python中有两种主流建模方式我推荐新手从scikit-learn开始from sklearn.linear_model import LinearRegression # 准备数据 X ad[[TV, radio, newspaper]] y ad[sales] # 建模 model LinearRegression() model.fit(X, y) # 查看系数 print(截距:, model.intercept_) print(系数:, dict(zip(X.columns, model.coef_)))更专业的statsmodels能提供更多统计信息import statsmodels.api as sm X_sm sm.add_constant(X) # 添加截距项 model_sm sm.OLS(y, X_sm).fit() print(model_sm.summary())系数解读示例TV系数0.0457 → 其他条件不变时电视广告每增加$1000销售额增加约45.7单位newspaper系数-0.001 → 几乎无影响且p值0.05统计不显著4. 假设检验与模型诊断好的回归模型需要满足四大假设线性关系残差散点图应随机分布正态性Q-Q图中点应近似直线同方差性残差大小不应随预测值变化无自相关Durbin-Watson检验值接近2诊断代码import matplotlib.pyplot as plt # 残差图 residuals model_sm.resid plt.scatter(model_sm.predict(), residuals) plt.axhline(y0, colorr, linestyle--) # Q-Q图 sm.qqplot(residuals, lines) plt.show() # DW检验 print(Durbin-Watson:, sm.stats.durbin_watson(residuals))遇到异方差问题时可以尝试对y值做log变换使用加权最小二乘法添加高阶项或交互项5. 特征选择实战当特征很多时我们需要筛选最有用的特征。下面比较三种方法5.1 逐步回归法def forward_selection(data, target): initial_features data.columns.tolist() best_features [] while len(initial_features) 0: remaining_features list(set(initial_features)-set(best_features)) new_pval pd.Series(indexremaining_features) for new_column in remaining_features: model sm.OLS(target, sm.add_constant(data[best_features[new_column]])).fit() new_pval[new_column] model.pvalues[new_column] min_p_value new_pval.min() if min_p_value 0.05: best_features.append(new_pval.idxmin()) else: break return best_features forward_selection(X, y)5.2 基于信息准则的选择# 计算所有组合 from itertools import combinations def evaluate_models(X, y): results [] for k in range(1, len(X.columns)1): for combo in combinations(X.columns, k): X_subset X[list(combo)] model sm.OLS(y, sm.add_constant(X_subset)).fit() results.append({ features: combo, aic: model.aic, bic: model.bic, r2: model.rsquared }) return pd.DataFrame(results) # 找出AIC最小的模型 df_results evaluate_models(X, y) df_results.loc[df_results[aic].idxmin()]5.3 正则化方法Lassofrom sklearn.linear_model import LassoCV lasso LassoCV(cv5).fit(X, y) print(最佳alpha:, lasso.alpha_) print(系数:, dict(zip(X.columns, lasso.coef_)))实战经验在电商用户预测项目中原始特征有50个。通过Lasso筛选后保留12个关键特征不仅提升模型速度AUC还提高了3%。6. 模型优化与改进基础模型表现不佳时可以尝试6.1 添加交互项# 添加TV和radio的交互项 ad[TV_radio] ad[TV] * ad[radio] model_interaction sm.OLS(ad[sales], sm.add_constant(ad[[TV,radio,TV_radio]])).fit()6.2 多项式特征from sklearn.preprocessing import PolynomialFeatures poly PolynomialFeatures(degree2, include_biasFalse) X_poly poly.fit_transform(X) model_poly LinearRegression().fit(X_poly, y)6.3 离群值处理# 用Cook距离检测离群值 influence model_sm.get_influence() cooks_d influence.cooks_distance[0] plt.stem(cooks_d)7. 模型评估与部署最后用交叉验证评估模型from sklearn.model_selection import cross_val_score scores cross_val_score(LinearRegression(), X, y, cv5, scoringr2) print(R2均值, scores.mean())部署时建议保存管道from sklearn.pipeline import make_pipeline from sklearn.preprocessing import StandardScaler pipe make_pipeline( StandardScaler(), LinearRegression() ) pipe.fit(X, y) # 保存模型 import joblib joblib.dump(pipe, sales_model.pkl)避坑指南测试集R²远低于训练集 → 可能过拟合减少特征或增加数据系数符号与业务常识相反 → 检查共线性或数据质量问题预测出现离谱值 → 检查输入特征是否超出训练数据范围