使用 PCA 解决回归问题时降低模型精度

数据挖掘 机器学习 Python 深度学习 主成分分析 过拟合
2022-02-19 18:25:35

我正在尝试建立一个预测问题来预测航班票价。我的数据集有几个分类变量,如类、小时、星期几、月份中的某一天、一年中的月份等。我正在使用 xgboost、ANN 等多种算法来拟合模型

最初,我对这些变量进行了热编码,总共有 90 个变量,当我尝试为这些数据拟合模型时,训练 r2_score 高约 0.90,而测试分数相对非常低(0.6)。

我对时间变量使用了正弦和余弦变换,这导致总共只有 27 个变量。有了这种训练,准确率下降到 0.83,但测试分数提高到 0.70

我当时认为我的变量很稀疏,并尝试进行 PCA,但这大大降低了训练集和测试集的性能。

所以我对此几乎没有疑问。

  1. 为什么 PCA 无济于事,反而会严重降低模型的性能
  2. 关于如何提高我的模型性能的任何建议?

代码


from xgboost import XGBRegressor
import pandas as pd
import matplotlib.pyplot as plt

dataset = pd.read_excel('Airline Dataset1.xlsx',sheet_name='Airline Dataset1')

dataset = dataset.drop(columns = ['SL. No.'])
dataset['time'] = dataset['time'] - 24

import numpy as np
dataset['time'] = np.where(dataset['time']==24,0,dataset['time'])

cat_cols = ['demand', 'from_ind', 'to_ind']

cyc_cols = ['time','weekday','month','monthday']

def cyclic_encode(data,col,col_max):
    data[col + '_sin'] = np.sin(2*np.pi*data[col]/col_max)
    data[col + '_cos'] = np.cos(2*np.pi*data[col]/col_max)
    return data 

cyclic_encode(dataset,'time',23)
cyclic_encode(dataset,'weekday',6)
cyclic_encode(dataset,'month',11)
cyclic_encode(dataset,'monthday',31)

dataset = dataset.drop(columns=cyc_cols)


ohe_dataset = pd.get_dummies(dataset,columns = cat_cols , drop_first=True)
X = ohe_dataset.iloc[:,:-1]
y = ohe_dataset.iloc[:,27:28]

# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train_us, X_test_us, y_train_us, y_test_us = train_test_split(X, y, test_size = 0.2, random_state = 0)


# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
sc_Y = StandardScaler()
X_train = sc_X.fit_transform(X_train_us)
X_test = sc_X.transform(X_test_us)

y_train = sc_Y.fit_transform(y_train_us)
y_test = sc_Y.transform(y_test_us)


#Applying PCA
from sklearn.decomposition import PCA
pca = PCA(n_components = 2)

X_train = pca.fit_transform(X_train,y_train)
X_test = pca.transform(X_test)
explained_variance = pca.explained_variance_ratio_

regressor = XGBRegressor()
model = regressor.fit(X_train,y_train)

# Predicting the Test & Train set with regressor built
y_pred = regressor.predict(X_test)
y_pred = sc_Y.inverse_transform(y_pred)
y_pred_train = regressor.predict(X_train)
y_pred_train = sc_Y.inverse_transform(y_pred_train)
y_train = sc_Y.inverse_transform(y_train)
y_test = sc_Y.inverse_transform(y_test)


#calculate r2_score
from sklearn.metrics import r2_score
score_train = r2_score(y_train,y_pred_train)
score_test = r2_score(y_test,y_pred)

谢谢

1个回答

当您进行 PCA 将您的问题投影到两个“n”维空间时,在您的情况下为 2 个维度。所以你正在拟合一个只有两个特征的模型。

如果您打印变量“explained_variance”,您将看到方差相对于您所拥有的总数的百分比。

改进模型的想法:搜索超参数,进行目标编码而不是 OHE,不要进行 PCA...

顺便说一句,决策树模型不需要对数据进行标准化。