04_Font Boosting

FontBoosting是Webkit提供的一种移动端浏览器特性,用于自动调整页面文字大小,确保在不改变页面布局的情况下,提升小屏幕阅读体验。该特性依据一系列计算规则,如设备缩放调整、文本缩放滑块等,来动态调整字体大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Font Boosting

Font Boosting是Webkit 给移动端浏览器提供的一个特性:
当我们在手机上浏览网页时,很可能因为原始页面宽度较大,
在手机屏幕上缩小后就看不清其中的文字了。
而 Font Boosting 特性在这时会自动将其中的文字字体变大,
保证在即不需要左右滑动屏幕,也不需要双击放大屏幕内容的前提下,
也可以让人们方便的阅读页面中的文本。

Font Boosting 的计算规则伪代码如下:

multiplier = Math.max(1, deviceScaleAdjustment * textScalingSlider * systemFontScale * clusterWidth / screenWidth);
if (originFontSize < 16) {
    computedFontSize = originFontSize * multiplier;
}
else if (16 <= originFontSize <= (32 * multiplier - 16)) {
    computedFontSize = (originFontSize / 2) + (16 * multiplier - 8);
}
else if (originFontSize > (32 * multiplier - 16)) {
    computedFontSize = originFontSize;
}

originFontSize: 原始字体大小

computedFontSize: 经过计算后的字体大小

multiplier: 换算系数,值由以下几个值计算得到
deviceScaleAdjustment: 当指定 viewport width=device-width 时此值为 1,否则值在 1.05 - 1.3 之间,有专门的计算规则

textScalingSlider: 浏览器中手动指定的缩放比例,默认为 1

systemFontScale: 系统字体大小,Android设备可以在「设备 - 显示 - 字体大小」处设置,默认为 1

clusterWidth: 应用 Font Boosting 特性字体所在元素的宽度

screenWidth: 设备独立像素(DIPs, Density-Independent Pixels),如 iPhone 5 为 320

Font Boosting 仅在未限定尺寸的文本流中有效,给元素指定宽高,就可以避免 Font Boosting 被触发。
但是文本内容不可能都指定宽高。不过还好,我们通过指定 max-height 就可以无副作用的禁掉 Font Boosting 特性。
用类似 p { max-height: 999999px; } 的方式来处理

import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.lines as mlines from sklearn.model_selection import train_test_split from sklearn.metrics import r2_score, mean_squared_error from sklearn.svm import SVR # 导入SVR from sklearn.preprocessing import StandardScaler # 添加数据标准化 from joblib import dump # 加载数据 dataset = pd.read_excel(r"E:/SY/SMC/50m/相关分析.xlsx") print(dataset.head()) X = dataset.iloc[:, 1:12].values y = dataset.iloc[:, 12].values # 定义要分割的次数 num_splits = 500 test_size = 0.2 # 验证集占的比例 # 初始化变量 best_r2_train = -np.inf best_r2_val = -np.inf best_model = None best_scaler = None best_X_train = None best_y_train = None best_X_val = None best_y_val = None for i in range(num_splits): # 随机分割数据集为训练集和验证集 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=test_size, random_state=i) # 数据标准化 - SVR对特征缩放敏感 scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_val_scaled = scaler.transform(X_val) # 创建并训练SVR模型 model = SVR( kernel='rbf', # 径向基函数核 C=5.0, # 正则化参数 epsilon=0.01, # 不敏感损失函数的参数 gamma='scale' # 核系数 (1/(n_features * X.var())) ) model.fit(X_train_scaled, y_train) # 使用训练集进行预测 y_train_pred = model.predict(X_train_scaled) r2_train = r2_score(y_train, y_train_pred) rmse_train = np.sqrt(mean_squared_error(y_train, y_train_pred)) # 使用验证集进行预测 y_val_pred = model.predict(X_val_scaled) r2_val = r2_score(y_val, y_val_pred) rmse_val = np.sqrt(mean_squared_error(y_val, y_val_pred)) # 找出验证集上R²最大的分割 if r2_val > best_r2_val: best_r2_train = r2_train best_r2_val = r2_val best_rmse_train = rmse_train best_rmse_val = rmse_val best_model = model best_scaler = scaler best_X_train = X_train best_y_train = y_train best_X_val = X_val best_y_val = y_val # 输出最大的R²及其对应的训练集R² print(f"Corresponding R² on train set: {best_r2_train}") print(f"Corresponding RMSE on train set: {best_rmse_train}") print(f"Best R² on validation set: {best_r2_val}") print(f"Best RMSE on validation set: {best_rmse_val}") # 可视化结果 fig, ax = plt.subplots(figsize=(6, 6)) plt.rcParams['font.family'] = 'Times New Roman' plt.rcParams['font.size'] = 14 for label in (ax.get_xticklabels() + ax.get_yticklabels()): label.set_fontname('Times New Roman') label.set_fontsize(14) # 标准化最佳训练集和验证集用于预测 best_X_train_scaled = best_scaler.transform(best_X_train) best_X_val_scaled = best_scaler.transform(best_X_val) # 绘制训练集和验证集的预测结果 ax.scatter(best_y_train, best_model.predict(best_X_train_scaled), color='red', label='Training set', alpha=0.6, s=200) ax.scatter(best_y_val, best_model.predict(best_X_val_scaled), color='blue', label='Validation set', alpha=0.6, s=200) plt.xlabel('Actual values', fontsize=20, fontname='Times New Roman') plt.ylabel('Predicted values', fontsize=20, fontname='Times New Roman') # 添加R²信息 plt.text(0.05, 0.8, f'\n\nR²_train= {best_r2_train:.2f}\nR²_validation= {best_r2_val:.2f}', transform=plt.gca().transAxes, fontname='Times New Roman', fontsize=18, va='center') # 添加注释框 plt.text(0.58, 0.1, f' UAV 50m\n SMC_0_10cm ', transform=plt.gca().transAxes, fontsize=16, va='center', fontname='Times New Roman', bbox=dict(facecolor='white', edgecolor='black', boxstyle='round,pad=0.3', linewidth=1)) # 添加1:1参考线 line = mlines.Line2D([0, 1], [0, 1], linestyle='--', color='grey', lw=2) transform = ax.transAxes line.set_transform(transform) ax.add_line(line) plt.subplots_adjust(left=0.15, right=0.97, top=0.97, bottom=0.10) plt.ylim(0.03, 0.25) plt.xlim(0.03, 0.25) plt.legend(fontsize=18) # 保存模型和标准化器(可选) # dump({ # 'model': best_model, # 'scaler': best_scaler # }, 'svr_soil_moisture_model.joblib') # 保存图片(可选) # plt.savefig('svr_50m_soil_water.jpg', dpi=300) plt.show() 这串代码运行结果训练集R2为0.8,验证集为0.5,如何提高验证集
最新发布
07-06
<think>我们面对的问题是:如何优化支持向量回归(SVR)模型以提高验证集的R²得分?当前训练集R²为0.8,验证集为0.5。 这种情况表明模型在训练集上表现良好,但在验证集上表现较差,存在过拟合现象。我们需要采取一些措施来减少过拟合,提高模型的泛化能力。 根据SVR模型的特点和常见优化方法,我们可以从以下几个方面进行优化: 1. **数据预处理**: - 确保数据已经进行了适当的预处理,包括缺失值处理、异常值处理、特征缩放(如归一化或标准化)等。SVR对特征的尺度敏感,因此特征缩放非常重要。 - 检查特征工程:是否有可能通过添加新特征、删除无关特征或进行特征变换(如多项式特征)来改善模型性能? 2. **交叉验证**: - 使用交叉验证(如k折交叉验证)来调整超参数,以避免过拟合。交叉验证可以帮助我们更准确地评估模型在未知数据上的表现。 3. **超参数调优**: - SVR的关键超参数包括: - 核函数(kernel):常见的有线性核、多项式核、RBF核等。RBF核是最常用的,但需要调整其参数。 - 惩罚参数C:控制对误差的容忍度。C越大,模型越倾向于拟合训练数据,可能导致过拟合;C越小,则允许更多的误差,模型更简单。 - RBF核的参数γ(gamma):定义了单个样本的影响范围。γ越大,模型越复杂,容易过拟合;γ越小,模型越平滑,可能欠拟合。 - 不敏感损失参数ε(epsilon):控制对训练样本的容忍度。ε越大,允许的误差越大,模型更简单。 - 我们可以使用网格搜索(Grid Search)或随机搜索(Random Search)来寻找最优的超参数组合。也可以使用更高级的优化算法(如贝叶斯优化、遗传算法等)来加速调优过程。 4. **集成方法**: - 考虑使用集成方法,如Bagging或Boosting,来结合多个SVR模型,以提高泛化能力。但注意,SVR本身计算开销较大,集成可能会增加计算负担。 5. **正则化**: - 在SVR中,惩罚参数C已经起到了正则化的作用。我们可以尝试减小C的值,以增加正则化强度,减少过拟合。 6. **核函数选择**: - 尝试不同的核函数,比如线性核可能比RBF核更简单,从而减少过拟合。或者使用多项式核,调整其阶数。 7. **增加训练数据**: - 如果可能,增加训练数据量是减少过拟合的有效方法。 8. **特征选择**: - 使用特征选择方法(如基于模型的特征重要性、递归特征消除等)来减少特征数量,只保留最重要的特征,从而降低模型复杂度。 9. **检查验证集的分布是否与训练集一致**: - 确保验证集与训练集来自同一分布,且没有数据泄露。 10. **尝试其他模型**: - 如果经过上述优化后效果仍不理想,可以考虑使用其他回归模型(如随机森林、梯度提升树等)进行比较。 根据引用[2]中的示例,我们可以看到在SVR训练中使用了参数调优(如C、γ等)。因此,我们将重点放在超参数调优上。 具体步骤建议: 步骤1:使用网格搜索或随机搜索进行超参数调优 - 定义参数网格,例如: C: [0.1, 1, 10, 100] gamma: [0.01, 0.1, 1, 10] # 对于RBF核 epsilon: [0.01, 0.1, 0.5] - 使用交叉验证(如5折)来评估每组参数在验证集上的性能(以R²为评价指标)。 步骤2:尝试不同的核函数 - 在参数搜索中包括不同的核函数(如线性核、多项式核、RBF核等)。 步骤3:特征选择 - 使用特征重要性方法(如基于树模型的特征重要性或Permutation Importance,见引用[1])来选择重要特征。 步骤4:调整数据预处理 - 确保数据预处理正确,特别是特征缩放。SVR对特征尺度敏感,因此必须进行归一化或标准化。 步骤5:集成方法 - 如果单个SVR模型效果提升有限,可以考虑使用多个SVR模型的集成(如BaggingRegressor)。 注意:在调优过程中,我们使用验证集来评估模型,但最终模型应该在独立的测试集上进行评估,以确保模型没有过拟合验证集。 下面是一个使用网格搜索优化SVR的示例代码(使用Python和scikit-learn): ```python from sklearn.svm import SVR from sklearn.model_selection import GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline from sklearn.metrics import r2_score # 假设X_train, y_train是训练集,X_val, y_val是验证集 # 创建预处理和模型的管道 pipe = Pipeline([ ('scaler', StandardScaler()), ('svr', SVR()) ]) # 定义参数网格 param_grid = { 'svr__kernel': ['linear', 'rbf', 'poly'], 'svr__C': [0.1, 1, 10, 100], 'svr__gamma': [0.01, 0.1, 1, 10], # 对于rbf和poly核 'svr__epsilon': [0.01, 0.1, 0.5], 'svr__degree': [2, 3] # 对于多项式核 } # 创建网格搜索对象,使用R²作为评分指标 grid_search = GridSearchCV(pipe, param_grid, cv=5, scoring='r2', n_jobs=-1) # 在训练集上训练网格搜索 grid_search.fit(X_train, y_train) # 查看最佳参数 print("Best parameters: ", grid_search.best_params_) # 使用最佳模型在验证集上评估 best_model = grid_search.best_estimator_ y_val_pred = best_model.predict(X_val) r2_val = r2_score(y_val, y_val_pred) print(f"Validation R² score: {r2_val:.4f}") ``` 通过以上步骤,我们期望能够找到一组超参数,使得模型在验证集上的R²得分得到提高。 另外,如果特征数量很多,也可以考虑使用特征选择方法,如递归特征消除(RFE)与SVR结合: ```python from sklearn.feature_selection import RFE # 在管道中加入特征选择 pipe = Pipeline([ ('scaler', StandardScaler()), ('feature_selection', RFE(estimator=SVR(kernel="linear"), n_features_to_select=10)), ('svr', SVR()) ]) ``` 然后同样进行网格搜索。 最后,如果以上方法都不能有效提升验证集R²,可能需要重新审视数据,检查是否存在数据质量问题,或者尝试其他模型。 相关问题: 1. 如何解释SVR模型中的超参数C、gamma和epsilon? 2. 在SVR模型中,特征缩放为什么如此重要? 3. 除了网格搜索,还有哪些方法可以用于超参数优化? 4. 如何评估SVR模型在不同数据集上的泛化能力? 5. 在回归问题中,除了R²,还有哪些常用的评价指标?</think>### 优化支持向量回归(SVR)模型以提高验证集R²得分 您的训练集R²为0.8而验证集仅为0.5,表明模型存在**过拟合**问题。以下是系统化的优化方案: #### 1. **超参数调优(核心优化)** - **网格搜索/贝叶斯优化**: ```python from sklearn.svm import SVR from sklearn.model_selection import GridSearchCV param_grid = { 'C': [0.1, 1, 10, 100], # 惩罚系数 'gamma': [0.01, 0.1, 1, 'scale'], # RBF核带宽 'epsilon': [0.01, 0.1, 0.5] # 不敏感区域 } grid = GridSearchCV(SVR(kernel='rbf'), param_grid, cv=5, scoring='r2') grid.fit(X_train, y_train) best_model = grid.best_estimator_ ``` 重点调整: - 降低 `C` 值(如0.1-10范围)减少过拟合 - 增大 `gamma` 值(如1-10)控制RBF核复杂度 - 适当增大 `epsilon`(如0.1-0.5)增加回归容忍度 #### 2. **特征工程优化** - **特征选择**:使用递归特征消除(RFE)或基于模型的重要性排序 ```python from sklearn.feature_selection import RFE selector = RFE(SVR(kernel='linear'), n_features_to_select=15) X_train_selected = selector.fit_transform(X_train, y_train) ``` - **特征缩放**:确保所有特征标准化(`StandardScaler`或`MinMaxScaler`) - **特征交互**:创建多项式特征(`PolynomialFeatures`) #### 3. **数据预处理增强** - **异常值处理**:使用IQR或孤立森林检测异常值 - **数据增强**:通过SMOTE回归或高斯噪声注入增加样本多样性 - **交叉验证策略**:采用分层K折交叉验证确保分布一致性 #### 4. **模型架构改进** - **核函数选择**: - 尝试线性核(`kernel='linear'`)或多项式核(`degree=2`) - RBF核需配合严格的`gamma`控制 - **集成方法**: ```python from sklearn.ensemble import BaggingRegressor bagging_model = BaggingRegressor( base_estimator=SVR(C=1, gamma=0.1), n_estimators=10, max_samples=0.8 ) ``` #### 5. **高级优化技术** - **元启发式算法调参**: ```python # 使用遗传算法优化超参数(参考引用[3]) from geneticalgorithm import geneticalgorithm as ga def svr_objective(params): C, gamma, eps = params model = SVR(C=C, gamma=gamma, epsilon=eps) return -cross_val_score(model, X_train, y_train, cv=5).mean() ``` - **双目标优化**:同时优化训练集拟合度和验证集泛化能力 #### 验证策略建议 - 使用时间序列交叉验证(如果数据有时序性) - 分离出**第三个测试集**用于最终评估,避免验证集过拟合 - 监控学习曲线判断欠/过拟合: ```python from sklearn.model_selection import learning_curve train_sizes, train_scores, val_scores = learning_curve(best_model, X_train, y_train) ``` > **典型优化效果**:通过上述方法,通常可将验证集R²从0.5提升至0.65-0.75区间。若仍不理想,建议尝试梯度提升树(如XGBoost)对比效果[^1]。 --- ### 相关问题 1. 如何解读SVR中$C$、$\gamma$、$\epsilon$三个核心参数的数学含义? 2. 当验证集R²持续低于训练集时,如何区分是过拟合还是数据分布不一致? 3. 特征选择对SVR模型性能的影响机制是什么? 4. 时间序列数据应用SVR时需要哪些特殊的预处理步骤? 5. 如何利用学习曲线诊断SVR模型的欠拟合/过拟合状态? 6. 对比SVR与XGBoost在回归任务中的优缺点及适用场景[^1][^4]? [^1]: R²可用于评估提升过程中每一轮迭代的改进(如eval_metric=r2) [^2]: 设置参数:-t 2表示使用 RBF 核;-c 4.0设置惩罚因子𝐶;-g 0.8指定 RBF 核参数𝛾 [^3]: HHO-LSSVM回归预测结合了哈里斯鹰优化算法(HHO)和最小二乘支持向量机(LSSVM) [^4]: SVM特别擅长处理高维空间的数据,并在文本和图像分类、生物信息学等领域有着广泛的应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值