Contents

MLJ中 线性模型 在回归预测中的简单使用

开始之前

我想向大家介绍一下一些线性模型的用法,以及他们对数据的拟合程度 在我开始学习 MLJ 时,我对他们的拟合能力有所怀疑,经常遇到欠拟合的情况,经过一次简单的测试后,才慢慢了解如何使用模型,处理特征 这里将这个测试介绍给各位

数据准备

我们模拟对函数 f(x) = x^2 + 2x 的拟合,在理想的预测结果 standardy 上加上一点噪音,形成训练用测试结果 coly 接下来依次定义

  • f(x)
  • standardy
  • coly
f(x) = x^2 + 2x
colx = DataFrame(x1=-10:10)
coly = f.(colx.x1) + rand(-2:2, length(colx.x1))
standardy = f.(colx.x1)

再绘制下图像

plot(colx.x1, standardy, label="standarty", color=:blue)
plot!(colx.x1, coly, label="coly", color=:red)

模型介绍

拟合数据我们使用 Ridge 回归,他在损失函数上添加了 L2 正则化

\begin{array}{cl} {\min \limits_{w, b}} & {\dfrac{1}{n}\sum_{i = 1}^n (w^{\top} x_i + b - y_i)^2} \\ {\text{s.t.}} &{\|w\|_2^2 \le t} \end{array}

\tag{6} 在 MLJLinearModels 中,RidgeRegressor 为

Ridge regression model with objective function

其中参数有

  • lambda (Real): strength of the L2 regularisation.
  • fit_intercept (Bool): whether to fit the intercept or not.
  • penalize_intercept (Bool): whether to penalize the intercept.
  • solver: type of solver to use (if nothing the default is used). The solver is Cholesky by default but can be Conjugate-Gradient as well. See ?Analytical for more information.

详细介绍以下 fit_intercept 和 penalize_intercept ,去 Slack 问了以下,大致可以理解为

  • fit_intercept 在假设函数上是否添加 偏差(bias)
  • penalize_intercept 是否惩罚偏差,修改其数值

接下来模型训练,直接调优得到最优模型,得到输出结果

using MLJLinearModels, StableRNGs
rng = StableRNG(1234)

ridge = RidgeRegressor()
r_lambda = range(ridge, :lambda, lower = 0.01, upper = 10, scale=:linear)
tuning = Grid(resolution = 20, rng=rng)
resampling = CV(nfolds = 6, rng=rng)
self_tuning_model = TunedModel(model = ridge,
			       range = r_lambda,
			       tuning = tuning,
			       resampling = resampling,
			       measure = rms
			       )
self_tuning_mach = machine(self_tuning_model, colx, coly)
fit!(self_tuning_mach)
best_model = fitted_params(self_tuning_mach).best_model
best_mach = machine(best_model, colx, coly)
fit!(best_mach)
outputy = predict(best_mach, colx)

然后我们通过图像查看拟合程度

plot(colx.x1, standardy, label="standardy", color=:blue)
plot!(colx.x1, outputy, label="outputy", color=:red)

可以看到,欠拟合了

添加特征

应对欠拟合的情况我们可以通过添加特征来解决 回到上面的问题,由于 f(x) = x^2 + 2x ,提供的数据中只有 x1=x 一个特征,我们尝试再添加一个特征 x2=x^2

let g(x) = x^2
  colx.x2 = g.(colx.x1)
  self_tuning_machine = machine(self_tuning_model, colx, coly)
  fit!(self_tuning_machine)
  best_model = fitted_params(self_tuning_mach).best_model
  best_mach = machine(best_model, colx, coly)
  fit!(best_mach)
  outputy = predict(best_mach, colx)

  plot(colx.x1, standardy, label="standardy", color=:blue)
  plot!(colx.x1, outputy, label="output", color=:red) |> display
end

可以看到,挺完美 那我们再添加一个特征 x3=x^3

let g(x) = x^3
  colx.x3 = g.(colx.x1)
  self_tuning_machine = machine(self_tuning_model, colx, coly)
  fit!(self_tuning_machine)
  best_model = fitted_params(self_tuning_mach).best_model
  best_mach = machine(best_model, colx, coly)
  fit!(best_mach)
  outputy = predict(best_mach, colx)

  plot(colx.x1, standardy, color=:blue, label="standard")
  plot!(colx.x1, outputY, color=:red, label="ouputy") |> display
end

最后说明

这次测试没有使用训练集和测试集,相当简陋,只是作为实验