gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:39:34 26 4
gpt4 key购买 nike

我正在尝试构建一个预测问题来预测航类票价。我的数据集有几个分类变量,如类(class)、小时、星期几、月份、年份等。我使用多种算法(如 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)

谢谢

最佳答案

对于如此小的维度问题,你并不真正需要 PCA。即使有数千个变量,决策树也能表现良好。

这里有一些你可以尝试的事情

  1. 传递监视列表并进行训练,直到验证集不会过度拟合。 https://github.com/dmlc/xgboost/blob/2d95b9a4b6d87e9f630c59995403988dee390c20/demo/guide-python/basic_walkthrough.py#L64
  2. 一起尝试所有正弦余弦变换和其他一种热编码并制作一个模型(以及监视列表)
  3. 寻找更多因果数据。季节性模式不会导致机票价格波动。首先,您可以添加节日、假期、重要日期的标志。还可以进行特征工程以接近当今时代。天气数据也很容易查找和添加。

PCA 通常在您具有极端维度(例如基因组数据)或所涉及的算法在高维度数据(例如 kNN 等)中表现不佳的情况下有所帮助。

关于machine-learning - 使用 PCA 解决回归问题时模型精度降低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59614716/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com