Python 中的主成分回归(逐步)
给定一组p个预测变量和一个响应变量,多元线性回归使用最小二乘法来最小化残差平方和 (RSS):
RSS = Σ(y i – ŷ i ) 2
金子:
- Σ :希腊符号,意思是和
- y i :第 i 个观测值的实际响应值
- ŷ i :基于多元线性回归模型的预测响应值
然而,当预测变量高度相关时, 多重共线性可能会成为一个问题。这可能会使模型系数估计不可靠并表现出较高的方差。
避免此问题的一种方法是使用主成分回归,它找到原始p个预测变量的M 个线性组合(称为“主成分”),然后使用最小二乘法来拟合使用主成分作为预测变量的线性回归模型。
本教程提供了如何在 Python 中执行主成分回归的分步示例。
第1步:导入必要的包
首先,我们将导入在 Python 中执行主成分回归 (PCR) 所需的包:
import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
from sklearn. preprocessing import scale
from sklearn import model_selection
from sklearn. model_selection import RepeatedKFold
from sklearn.model_selection import train_test_split
from sklearn. PCA import decomposition
from sklearn. linear_model import LinearRegression
from sklearn. metrics import mean_squared_error
第2步:加载数据
在此示例中,我们将使用名为mtcars的数据集,其中包含 33 辆不同汽车的信息。我们将使用hp作为响应变量,并使用以下变量作为预测变量:
- 英里/加仑
- 展示
- 拉屎
- 重量
- 快秒
以下代码展示了如何加载和显示此数据集:
#define URL where data is located
url = "https://raw.githubusercontent.com/Statorials/Python-Guides/main/mtcars.csv"
#read in data
data_full = pd. read_csv (url)
#select subset of data
data = data_full[["mpg", "disp", "drat", "wt", "qsec", "hp"]]
#view first six rows of data
data[0:6]
mpg disp drat wt qsec hp
0 21.0 160.0 3.90 2.620 16.46 110
1 21.0 160.0 3.90 2.875 17.02 110
2 22.8 108.0 3.85 2.320 18.61 93
3 21.4 258.0 3.08 3.215 19.44 110
4 18.7 360.0 3.15 3.440 17.02 175
5 18.1 225.0 2.76 3.460 20.22 105
步骤3:调整PCR模型
以下代码显示了如何使 PCR 模型适合此数据。请注意以下事项:
- pca.fit_transform(scale(X)) :这告诉 Python 每个预测变量都应该缩放为均值 0 和标准差 1。这确保了如果满足以下条件,则预测变量不会对模型产生太大影响:出现这种情况。以不同的单位来衡量。
- cv = RepeatedKFold() :这告诉 Python 使用k 折交叉验证来评估模型性能。对于本例,我们选择 k = 10 次,重复 3 次。
#define predictor and response variables
X = data[["mpg", "disp", "drat", "wt", "qsec"]]
y = data[["hp"]]
#scale predictor variables
pca = pca()
X_reduced = pca. fit_transform ( scale (X))
#define cross validation method
cv = RepeatedKFold(n_splits= 10 , n_repeats= 3 , random_state= 1 )
regr = LinearRegression()
mse = []
# Calculate MSE with only the intercept
score = -1*model_selection. cross_val_score (regr,
n.p. ones ((len(X_reduced),1)), y, cv=cv,
scoring=' neg_mean_squared_error '). mean ()
mse. append (score)
# Calculate MSE using cross-validation, adding one component at a time
for i in np. arange (1, 6):
score = -1*model_selection. cross_val_score (regr,
X_reduced[:,:i], y, cv=cv, scoring=' neg_mean_squared_error '). mean ()
mse. append (score)
# Plot cross-validation results
plt. plot (mse)
plt. xlabel ('Number of Principal Components')
plt. ylabel ('MSE')
plt. title ('hp')
该图沿 x 轴显示主成分数量,沿 y 轴显示 MSE(均方误差)检验。
从图中我们可以看到,通过添加两个主成分,检验的 MSE 会下降,但当添加两个以上主成分时,MSE 就会开始增加。
因此,最优模型仅包含前两个主成分。
我们还可以使用以下代码来计算通过将每个主成分添加到模型中来解释的响应变量的方差百分比:
n.p. cumsum (np. round (pca. explained_variance_ratio_ , decimals= 4 )* 100 )
array([69.83, 89.35, 95.88, 98.95, 99.99])
我们可以看到以下内容:
- 仅使用第一个主成分,我们可以解释响应变量中69.83%的变异。
- 通过添加第二个主成分,我们可以解释响应变量中89.35%的变异。
请注意,我们仍然可以通过使用更多的主成分来解释更多的方差,但是我们可以看到,添加两个以上的主成分实际上并不会增加解释方差的百分比太多。
第 4 步:使用最终模型进行预测
我们可以使用最终的双主成分 PCR 模型来对新观察结果进行预测。
以下代码展示了如何将原始数据集拆分为训练集和测试集,并使用具有两个主成分的 PCR 模型对测试集进行预测。
#split the dataset into training (70%) and testing (30%) sets
X_train,X_test,y_train,y_test = train_test_split (X,y,test_size= 0.3 , random_state= 0 )
#scale the training and testing data
X_reduced_train = pca. fit_transform ( scale (X_train))
X_reduced_test = pca. transform ( scale (X_test))[:,:1]
#train PCR model on training data
regr = LinearRegression()
reg. fit (X_reduced_train[:,:1], y_train)
#calculate RMSE
pred = regr. predict (X_reduced_test)
n.p. sqrt ( mean_squared_error (y_test, pred))
40.2096
我们看到 RMSE 测试结果为40.2096 。这是测试集观测值的预测hp值和观察到的hp值之间的平均偏差。
此示例中使用的完整 Python 代码可以在此处找到。