多元线性回归:预测汽车油耗
本例演示了使用最小二乘法基于功率和质量预测汽车燃料消耗的多元线性回归模型的构建。 源数据取自mtcars数据集。
多元线性回归的基本公式:
哪里:
燃料消费料量(l/100km),
归一化发动机功率,
归一化车辆重量,
免费会员(拦截),
功率因数,
质量系数,
一个偶然的错误。
Mtcars数据集是一个关于32辆1973-74岁汽车特征的经典数据集,收集自Motor Trend杂志。 数据集包含有关油耗、发动机功率、重量、气缸数和其他车辆规格的信息。
该数据集广泛用于统计学,计量经济学和机器学习的学术课程,作为演示回归分析的标准示例。
安装和运行必要的库:
Pkg.add(["RDatasets", "Statistics", "DataFrames"])
using RDatasets # Для загрузки данных
using Plots # Визуализация
using Statistics # Статистические функции
using DataFrames # Работа с таблицами
加载和转换数据:
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])
下载经典的mtcars数据集并将美国计量单位转换为公制单位以获得更好的理解。 重量从数千磅转换为吨(乘以0.453592),燃料消耗从每加仑英里转换为每100公里升。 我们选择功率和重量作为预测燃料消耗的预测因子。
矩阵的归一化和准备:
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) # Преобразуем в вещественные числа
我们将z分数归一化应用于预测变量,将它们减少到标准形式(均值=0,标准差=1)。 这提高了算法的数值稳定性,并使系数彼此相当。 我们通过为自由回归项添加一列单位来形成矩阵X。
最小二乘解:
#Реализация МНК (аналитическое решение)
β = inv(X'X) * X'y # (XᵀX)⁻¹Xᵀy
我们使用经典的OLS公式来获得最优回归系数。 该公式最大限度地减少了残差的平方和,并为线性回归提供了唯一的解析解。 结果β包含三个系数:自由项、功率系数和质量系数。
模型质量的预测和评估:
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)。
多维回归的可视化:
# 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)
三维图形显示了这两个变量对燃料消耗的影响。 蓝色圆点表示实际观测值,而半透明表面表示回归模型的预测值。
# Вывод результатов
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км) - средний расход при средних мощности и массе")
结论:
在这个例子中,我们考虑了使用最小二乘法来构建基于经典mtcars数据集的多元线性回归模型,该数据集包含1973-74年制造的32辆汽车的特征。
因变量为汽车油耗(l/100km),归一化发动机功率和车辆重量为自变量。