Engee 文档
Notebook

多元线性回归:预测汽车油耗

本例演示了使用最小二乘法基于功率和质量预测汽车燃料消耗的多元线性回归模型的构建。 源数据取自mtcars数据集。

多元线性回归的基本公式:

哪里:

燃料消费料量(l/100km),

归一化发动机功率,

归一化车辆重量,

免费会员(拦截),

功率因数,

质量系数,

一个偶然的错误。

Mtcars数据集是一个关于32辆1973-74岁汽车特征的经典数据集,收集自Motor Trend杂志。 数据集包含有关油耗、发动机功率、重量、气缸数和其他车辆规格的信息。

该数据集广泛用于统计学,计量经济学和机器学习的学术课程,作为演示回归分析的标准示例。

安装和运行必要的库:

In [ ]:
Pkg.add(["RDatasets", "Statistics", "DataFrames"])
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using RDatasets        # Для загрузки данных
using Plots            # Визуализация
using Statistics       # Статистические функции
using DataFrames       # Работа с таблицами

加载和转换数据:

In [ ]:
cars = dataset("datasets", "mtcars")  # Загружаем встроенный набор данных

# Выбираем предикторы и целевую переменную
cars[:, "weight_tons"] = cars[:, "WT"] .* 0.453592  # Вес: из тысяч фунтов в тонны
X_raw = cars[:, ["HP", "weight_tons"]]   # Мощность (hp) и вес (тонны)
cars[:, "fuel_l100km"] = 235.22 ./ cars[:, "MPG"]  # Расход: из миль/галлон в л/100км
y = cars[:, "fuel_l100km"]               # Расход топлива (л/100км)

# Преобразуем названия колонок для ясности
rename!(X_raw, [:HP, :weight_tons])
Out[0]:
32×2 DataFrame
7 rows omitted
RowHPweight_tons
Int64Float64
11101.18841
21101.30408
3931.05233
41101.4583
51751.56036
61051.56943
72451.61932
8621.44696
9951.42881
101231.56036
111231.56036
121801.84612
131801.6919
21971.1181
221501.59664
231501.55809
242451.74179
251751.74406
26660.877701
27910.970687
281130.686285
292641.43789
301751.25645
313351.61932
321091.26099

下载经典的mtcars数据集并将美国计量单位转换为公制单位以获得更好的理解。 重量从数千磅转换为吨(乘以0.453592),燃料消耗从每加仑英里转换为每100公里升。 我们选择功率和重量作为预测燃料消耗的预测因子。

矩阵的归一化和准备:

In [ ]:
normalize(x) = (x .- mean(x)) ./ std(x)
X = hcat(ones(nrow(X_raw)), normalize(X_raw.HP), normalize(X_raw.weight_tons))

y = float(y)  # Преобразуем в вещественные числа
Out[0]:
32-element Vector{Float64}:
 11.200952380952382
 11.200952380952382
 10.316666666666666
 10.99158878504673
 12.578609625668449
 12.995580110497237
 16.44895104895105
  9.64016393442623
 10.316666666666666
 12.251041666666667
 13.214606741573034
 14.34268292682927
 13.596531791907514
  ⋮
 10.94046511627907
 15.175483870967742
 15.475000000000001
 17.685714285714283
 12.251041666666667
  8.616117216117216
  9.046923076923077
  7.737500000000001
 14.887341772151897
 11.94010152284264
 15.681333333333333
 10.99158878504673

我们将z分数归一化应用于预测变量,将它们减少到标准形式(均值=0,标准差=1)。 这提高了算法的数值稳定性,并使系数彼此相当。 我们通过为自由回归项添加一列单位来形成矩阵X。

最小二乘解:

In [ ]:
#Реализация МНК (аналитическое решение)
β = inv(X'X) * X'y  # (XᵀX)⁻¹Xᵀy
Out[0]:
3-element Vector{Float64}:
 12.755331278523013
  1.2062112633104227
  2.643362422121514

我们使用经典的OLS公式来获得最优回归系数。 该公式最大限度地减少了残差的平方和,并为线性回归提供了唯一的解析解。 结果β包含三个系数:自由项、功率系数和质量系数。

模型质量的预测和评估:

In [ ]:
y_pred = X * β
residuals = y - y_pred

# Метрики качества
mse = mean(residuals.^2)
rmse = sqrt(mse)
r2 = 1 - sum(residuals.^2) / sum((y .- mean(y)).^2);

我们计算预测的燃料消耗值,并找到实际值和预测值之间的差异。 我们计算关键质量指标:均方根误差(MSE),用于估计初始单位精度的根(RMSE),以及用于估计解释方差的判定系数(R2)。

多维回归的可视化:

In [ ]:
# 3D-визуализация для обоих признаков
p1 = plot(title="Многомерная регрессия", legend=:none, size=(800, 600))
scatter!(X_raw.HP, X_raw.weight_tons, y, marker=:circle, color=:blue, 
         xlabel="Мощность (л.с.)", ylabel="Масса (тонны)", zlabel="Расход (л/100км)")
surface!(sort(unique(X_raw.HP)), sort(unique(X_raw.weight_tons)), 
         (x,y) -> β[1] + β[2]*(x - mean(X_raw.HP))/std(X_raw.HP) + β[3]*(y - mean(X_raw.weight_tons))/std(X_raw.weight_tons),
         alpha=0.5)

display(p1)

三维图形显示了这两个变量对燃料消耗的影响。 蓝色圆点表示实际观测值,而半透明表面表示回归模型的预测值。

In [ ]:
# Вывод результатов
println("\nРезультаты регрессионного анализа:")
println("==================================================")
println("Коэффициенты модели:")
println(" - Константа (b0): ", round(β[1], digits=4), " л/100км")
println(" - Мощность (b1): ", round(β[2], digits=4), " л/100км на 1 std мощности")
println(" - Масса (b2):      ", round(β[3], digits=4), " л/100км на 1 std веса")
println("\nМетрики качества:")
println(" - MSE:  ", round(mse, digits=4), " (л/100км)²")
# @markdown Результат регрессионного анализа:
println(" - RMSE: ", round(rmse, digits=4), " л/100км")
println(" - R²:   ", round(r2, digits=4))
println("==================================================")

# Интерпретация коэффициентов
hp_std = std(X_raw.HP)
weight_std = std(X_raw.weight_tons)

println("\nИнтерпретация:")
println("- При увеличении мощности на 1 стандартное отклонение (≈$(round(hp_std, digits=1)) л.с.),")
println("  расход топлива изменяется на ", round(β[2], digits=2), " л/100км")
println("- При увеличении массы на 1 стандартное отклонение (≈$(round(weight_std, digits=2)) тонны),")
println("  расход топлива изменяется на ", round(β[3], digits=2), " л/100км")
println("- Intercept (", round(β[1], digits=1), " л/100км) - средний расход при средних мощности и массе")
Результаты регрессионного анализа:
==================================================
Коэффициенты модели:
 - Константа (b0): 12.7553 л/100км
 - Мощность (b1): 1.2062 л/100км на 1 std мощности
 - Масса (b2):      2.6434 л/100км на 1 std веса

Метрики качества:
 - MSE:  2.2109 (л/100км)²
 - RMSE: 1.4869 л/100км
 - R²:   0.8471
==================================================

Интерпретация:
- При увеличении мощности на 1 стандартное отклонение (≈68.6 л.с.),
  расход топлива изменяется на 1.21 л/100км
- При увеличении массы на 1 стандартное отклонение (≈0.44 тонны),
  расход топлива изменяется на 2.64 л/100км
- Intercept (12.8 л/100км) - средний расход при средних мощности и массе

结论:

在这个例子中,我们考虑了使用最小二乘法来构建基于经典mtcars数据集的多元线性回归模型,该数据集包含1973-74年制造的32辆汽车的特征。

因变量为汽车油耗(l/100km),归一化发动机功率和车辆重量为自变量。