多元线性回归:预测汽车油耗
本例演示了使用最小二乘法基于功率和质量预测汽车燃料消耗的多元线性回归模型的构建。 源数据取自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"]] # 功率(马力)和重量(吨)
cars[:, "fuel_l100km"] = 235.22 ./ cars[:, "MPG"] # 消费:从英里/加仑到L/100公里
y = cars[:, "fuel_l100km"] # 燃料消费料量(l/100km)
# 为了清楚起见,让我们转换列名称
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。
最小二乘解:
# MNC实施(分析解决方案)
β = 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="消费量(l/100km)")
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("\回归分析结果:")
println("==================================================")
println("模型的系数:")
println(" -常数(b0): ", round(β[1], digits=4), " l/100公里")
println(" -功率(b1): ", round(β[2], digits=4), " 1std容量l/100km")
println(" -质量(b2): ", round(β[3], digits=4), " 每1std重量l/100km")
println("\质量的nMetrics:")
println(" - MSE: ", round(mse, digits=4), " (l/100公里)2")
# @markdown回归分析结果:
println(" - RMSE: ", round(rmse, digits=4), " l/100公里")
println(" - R²: ", round(r2, digits=4))
println("==================================================")
# 系数的解释
hp_std = std(X_raw.HP)
weight_std = std(X_raw.weight_tons)
println("\品特解读:")
println("-随着功率增加1个标准差(≈ $(round(hp_std,digits=1))hp),")
println(" 燃料消耗变化至 ", round(β[2], digits=2), " l/100公里")
println("-随着质量增加1个标准偏差(≈ $(round(weight_std,digits=2))吨),")
println(" 燃料消耗变化至 ", round(β[3], digits=2), " l/100公里")
println("- Intercept (", round(β[1], digits=1), " l/100km)-平均功率和重量的平均消耗")
结论:
在这个例子中,我们考虑了应用最小二乘法构建基于经典mtcars数据集的多元线性回归模型,该数据集包含1973-74年制造的32辆汽车的特征。
因变量为汽车油耗(l/100km),归一化发动机功率和车辆重量为自变量。