如何用scikit-learn生成其他温度的合成数据用于机器学习训练
可行方案:用Scikit-learn及其他库生成合成温度数据
当然可以,以下是几种适配你数据场景的方案,从简单插值到机器学习拟合都有覆盖:
方法1:插值法(快速生成平滑数据)
如果你的数据趋势平滑,用插值法直接生成目标温度的Er值最便捷,适合填补中间值或延伸少量外值:
import pandas as pd from scipy.interpolate import interp1d # 替换为你groupby后的真实均值数据 existing_data = pd.DataFrame({ "Temp": [30, 40, 45, 50, 55, 60], "Er": [0.12, 0.08, 0.06, 0.05, 0.07, 0.10] # 示例值,替换成你的数据 }) # 创建插值函数(kind可选'linear'/'quadratic'/'cubic',二次插值适合多数实验数据) interp_func = interp1d(existing_data["Temp"], existing_data["Er"], kind='quadratic', fill_value="extrapolate") # 生成目标温度的合成数据 target_temps = [35, 65, 70] synthetic_Er = interp_func(target_temps) # 整理结果 synthetic_data = pd.DataFrame({ "Temp": target_temps, "Er": synthetic_Er.round(4) }) print(synthetic_data)
- 注:
fill_value="extrapolate"允许生成现有温度范围外的数据(如65、70),如果不需要外插可删除该参数。
方法2:Scikit-learn回归拟合(适合机器学习训练集)
如果需要生成带模拟噪声的合成数据(更贴近真实训练场景),可以先用回归模型拟合现有数据,再预测目标温度的输出,甚至添加随机噪声:
import pandas as pd import numpy as np from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression # 替换为你的真实均值数据 existing_data = pd.DataFrame({ "Temp": [30, 40, 45, 50, 55, 60], "Er": [0.12, 0.08, 0.06, 0.05, 0.07, 0.10] }) # 准备特征(Scikit-learn要求特征为二维数组) X = existing_data["Temp"].values.reshape(-1, 1) y = existing_data["Er"].values # 用多项式回归拟合(非线性场景也可替换为RandomForestRegressor/SVR) poly_features = PolynomialFeatures(degree=2) X_poly = poly_features.fit_transform(X) model = LinearRegression() model.fit(X_poly, y) # 预测目标温度的Er值 target_temps = np.array([35, 65, 70]).reshape(-1, 1) target_poly = poly_features.transform(target_temps) predicted_Er = model.predict(target_poly) # 可选:添加小噪声模拟真实数据波动(提升训练集真实性) noise = np.random.normal(0, 0.01 * predicted_Er.mean(), size=predicted_Er.shape) synthetic_Er = predicted_Er + noise # 整理结果 synthetic_data = pd.DataFrame({ "Temp": target_temps.flatten(), "Er": synthetic_Er.round(4) }) print(synthetic_data)
- 模型选择建议:数据非线性明显时,优先用
RandomForestRegressor或SVR;趋势平滑时,多项式回归足够。
方法3:高斯过程回归(带不确定性的生成)
如果需要量化合成数据的不确定性(比如置信区间),高斯过程回归是理想选择,适合科研或需要误差评估的场景:
import pandas as pd import numpy as np from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C # 替换为你的真实均值数据 existing_data = pd.DataFrame({ "Temp": [30, 40, 45, 50, 55, 60], "Er": [0.12, 0.08, 0.06, 0.05, 0.07, 0.10] }) X = existing_data["Temp"].values.reshape(-1, 1) y = existing_data["Er"].values # 定义核函数(适配非线性数据) kernel = C(1.0, (1e-3, 1e3)) * RBF(10, (1e-2, 1e2)) gpr = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=10) gpr.fit(X, y) # 预测目标温度,同时获取标准差(不确定性) target_temps = np.array([35, 65, 70]).reshape(-1, 1) predicted_Er, std_dev = gpr.predict(target_temps, return_std=True) # 整理结果 synthetic_data = pd.DataFrame({ "Temp": target_temps.flatten(), "Er": predicted_Er.round(4), "Uncertainty": std_dev.round(4) }) print(synthetic_data)
内容的提问来源于stack exchange,提问作者BaRud
相关产品推荐
相关产品推荐

