)
一句话概念借用了SVM分类的思想试图找到一个“管道”包裹住尽可能多的数据点在管道内的误差被忽略只计算管道外的误差。使用场景高维数据或者数据关系非常复杂非线性时配合核函数。支持向量回归模型使用示例# 支持向量回归 (SVR) from sklearn.svm import SVR from sklearn.linear_model import LinearRegression from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error # 1. 构造复杂非线性测试数据 np.random.seed(42) # 设置随机种子以确保结果可复现 # 生成基础自变量在0-10范围内 X np.sort(np.random.rand(100, 1) * 10, axis0) # 生成复杂的非线性目标变量正弦函数 多项式 噪声 # 这种非线性关系很难用普通线性回归拟合 Y_true np.sin(2 * X) 0.5 * X 0.2 * X**2 Y Y_true np.random.randn(100, 1) * 0.5 # 加入噪声 # 2. 数据标准化 scaler_X StandardScaler() scaler_Y StandardScaler() X_scaled scaler_X.fit_transform(X) Y_scaled scaler_Y.fit_transform(Y) # 3. 模型训练 # 普通线性回归作为基准 linear_model LinearRegression() linear_model.fit(X_scaled, Y_scaled) Y_linear_pred_scaled linear_model.predict(X_scaled) Y_linear_pred scaler_Y.inverse_transform(Y_linear_pred_scaled) # 支持向量回归 (SVR) # 线性核SVR svr_linear SVR(kernellinear, C100, epsilon0.1) svr_linear.fit(X_scaled, Y_scaled.ravel()) Y_svr_linear_pred_scaled svr_linear.predict(X_scaled) Y_svr_linear_pred scaler_Y.inverse_transform(Y_svr_linear_pred_scaled.reshape(-1, 1)) # RBF核SVR非线性 svr_rbf_1 SVR(kernelrbf, C100, epsilon0.1, gamma0.1) svr_rbf_1.fit(X_scaled, Y_scaled.ravel()) Y_svr_rbf_1_pred_scaled svr_rbf_1.predict(X_scaled) Y_svr_rbf_1_pred scaler_Y.inverse_transform(Y_svr_rbf_1_pred_scaled.reshape(-1, 1)) # 不同ε值的RBF核SVR svr_rbf_2 SVR(kernelrbf, C100, epsilon0.5, gamma0.1) svr_rbf_2.fit(X_scaled, Y_scaled.ravel()) Y_svr_rbf_2_pred_scaled svr_rbf_2.predict(X_scaled) Y_svr_rbf_2_pred scaler_Y.inverse_transform(Y_svr_rbf_2_pred_scaled.reshape(-1, 1)) # 4. 计算模型性能 mse_linear mean_squared_error(Y, Y_linear_pred) mse_svr_linear mean_squared_error(Y, Y_svr_linear_pred) mse_svr_rbf_1 mean_squared_error(Y, Y_svr_rbf_1_pred) mse_svr_rbf_2 mean_squared_error(Y, Y_svr_rbf_2_pred) # 5. 可视化结果 # ... 省略 ... # 4. 输出模型性能 print(\n 模型性能对比 ) print(f普通线性回归 MSE: {mse_linear:.4f}) print(f线性核SVR MSE: {mse_svr_linear:.4f}) print(fRBF核SVR (ε0.1) MSE: {mse_svr_rbf_1:.4f}) print(fRBF核SVR (ε0.5) MSE: {mse_svr_rbf_2:.4f}) # 展示支持向量 print(f\n SVR支持向量信息 ) print(fRBF核SVR (ε0.1) 使用的支持向量数量: {len(svr_rbf_1.support_)}) print(f线性核SVR 使用的支持向量数量: {len(svr_linear.support_)}) ## 运行结果 模型性能对比 普通线性回归 MSE: 3.3016 线性核SVR MSE: 3.3938 RBF核SVR (ε0.1) MSE: 0.6200 RBF核SVR (ε0.5) MSE: 4.7397 SVR支持向量信息 RBF核SVR (ε0.1) 使用的支持向量数量: 42 线性核SVR 使用的支持向量数量: 70 从图中可以看出RBF核SVR能够很好地拟合复杂非线性关系调整ε可以控制模型对误差的容忍度调整C可以平衡模型复杂度和对异常值的敏感度SVR只使用部分数据点支持向量进行预测这个示例完美展示了SVR在处理复杂非线性数据时的优势特别是其独特的ε-不敏感损失函数和核函数机制。1.11. 有序回归 (Ordinal Regression)一句话概念预测的结果是有顺序的类别比如“低、中、高”或者“不喜欢、一般、喜欢”。使用场景问卷调查评分1-5分、电影评级、疾病严重程度分级。有序回归模型使用示例# 有序回归 (Ordinal Regression) import statsmodels.api as sm from statsmodels.miscmodels.ordinal_model import OrderedModel # 1. 构造测试数据 np.random.seed(42) n_samples 500 # 特征年龄0-70岁和购买金额0-100元 age np.random.uniform(0, 70, n_samples) purchase np.random.uniform(0, 100, n_samples) # 真实系数购买金额对满意度影响更大 beta_age 0.03 # 年龄系数 beta_purchase 0.08 # 购买金额系数 intercept -2.0 # 基准截距 # 潜在变量连续值用于生成有序类别 latent ( intercept beta_age * age beta_purchase * purchase np.random.normal(0, 0.5, n_samples) ) # 使用分位数创建5个均衡的有序类别1-5分满意度 thresholds np.percentile(latent, [20, 40, 60, 80]) satisfaction np.digitize(latent, thresholds, rightFalse) 1 # 类别1-5 # 创建DataFrame df pd.DataFrame({age: age, purchase: purchase, satisfaction: satisfaction}) # 2. 拟合有序回归模型 model OrderedModel( df[satisfaction], df[[age, purchase]], distrlogit # 逻辑斯蒂链接函数 ) result model.fit(methodbfgs) # 使用BFGS优化算法 # 3. 生成预测 pred_probs result.predict(df[[age, purchase]]) predicted pred_probs.idxmax(axis1).astype(int) # 预测的类别概率最高的 # 4. 可视化结果 # ... 省略 ... # 5. 模型解释 print(\n模型系数解释:) print(f年龄系数: {result.params[age]:.4f} - 年龄每增加1岁满意度的潜在变量变化) print( f购买金额系数: {result.params[purchase]:.4f} - 购买金额每增加1元满意度的潜在变量变化 ) print(\n阈值估计:) for i, threshold in enumerate(result.params[2:]): # 前两个是特征系数后面是阈值 print(f满意度 {i1}-{i2} 阈值: {threshold:.4f}) ## 运行结果 模型系数解释: 年龄系数: 0.0872 - 年龄每增加1岁满意度的潜在变量变化 购买金额系数: 0.2626 - 购买金额每增加1元满意度的潜在变量变化 阈值估计: 满意度 1-2 阈值: 7.8416 满意度 2-3 阈值: 1.6160 满意度 3-4 阈值: 1.6758 满意度 4-5 阈值: 1.6772 从图中可以看出特征系数表示对潜在变量的影响程度阈值参数表示类别之间的分界点购买金额的影响大于年龄符合数据生成逻辑该代码完整展示了有序回归的理论基础、实现方法和结果分析特别适合处理如满意度评分、等级评定等有序分类数据。1.12. 泊松回归 (Poisson Regression)一句话概念专门用于预测“次数”或“计数”的回归假设数据符合泊松分布。使用场景预测某个路口每小时经过的车辆数、客服中心每天接到的电话数。泊松回归模型使用示例# 泊松回归 (Poisson Regression) from scipy import stats from scipy.optimize import minimize from scipy.special import gammaln from sklearn.metrics import mean_squared_error, mean_absolute_error # 生成模拟数据模拟客服中心每天接到的电话数 np.random.seed(42) # 设置随机种子确保结果可复现 # 自变量广告投入万元工作日标识1为工作日0为非工作日 n_samples 200 advertising_spend np.random.uniform(0, 10, n_samples) # 广告投入0-10万元 is_weekday np.random.binomial(1, 0.7, n_samples) # 70%是工作日 # 构造线性预测变量使用对数链接函数 linear_combination 0.5 0.3 * advertising_spend 0.4 * is_weekday # 泊松回归的期望值均值为 exp(线性组合) expected_counts np.exp(linear_combination) # 生成泊松分布的响应变量电话数量 calls_count np.random.poisson(expected_counts) # 创建数据集 X np.column_stack([advertising_spend, is_weekday]) y calls_count print(f生成了 {n_samples} 个样本) print(f平均电话数量: {np.mean(y):.2f}) print(f电话数量的标准差: {np.std(y):.2f}) # 泊松回归模型实现 class PoissonRegression: # ... 省略 ... # 拟合泊松回归模型 poisson_reg PoissonRegression() poisson_reg.fit(X, y) # 预测 y_pred poisson_reg.predict(X) print(泊松回归系数:) print(f截距: {poisson_reg.coefficients[0]:.4f}) print(f广告投入系数: {poisson_reg.coefficients[1]:.4f}) print(f工作日系数: {poisson_reg.coefficients[2]:.4f}) print(f广告投入每增加1万元电话数量变化倍数: {np.exp(poisson_reg.coefficients[1]):.4f}) print(f工作日相比非工作日电话数量变化倍数: {np.exp(poisson_reg.coefficients[2]):.4f}) # 绘制结果图像 # ... 省略 ... # 计算模型性能指标 mse mean_squared_error(y, y_pred) mae mean_absolute_error(y, y_pred) rmse np.sqrt(mse) print(f\n模型性能指标:) print(f均方误差 (MSE): {mse:.4f}) print(f平均绝对误差 (MAE): {mae:.4f}) print(f均方根误差 (RMSE): {rmse:.4f}) ## 运行结果 生成了 200 个样本 平均电话数量: 13.93 电话数量的标准差: 13.13 泊松回归系数: 截距: 0.4484 广告投入系数: 0.3098 工作日系数: 0.3904 广告投入每增加1万元电话数量变化倍数: 1.3632 工作日相比非工作日电话数量变化倍数: 1.4775 模型性能指标: 均方误差 (MSE): 14.5815 平均绝对误差 (MAE): 2.8126 均方根误差 (RMSE): 3.8186