снижение точности модели при использовании PCA для задачи регрессии - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь построить задачу prection, чтобы предсказать стоимость перелета. В моем наборе данных есть несколько категориальных переменных, таких как класс, час, день недели, день месяца, месяц года и т. Д. c. Я использую несколько алгоритмов, таких как 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 Ответ

1 голос
/ 06 января 2020

Вам не нужен PCA для решения такой небольшой проблемы. Деревья решений работают очень хорошо, даже с тысячами переменных.

Вот несколько вещей, которые вы можете попробовать

  1. Пройдите список наблюдения и тренируйтесь, пока вы не наберете лишний набор проверки. https://github.com/dmlc/xgboost/blob/2d95b9a4b6d87e9f630c59995403988dee390c20/demo/guide-python/basic_walkthrough.py#L64
  2. попробовать все преобразования синус-косинуса и другое горячее кодирование вместе и создать модель (вместе с списком наблюдения)
  3. Поиск дополнительных причинных данных. Просто сезонные закономерности не вызывают колебаний стоимости авиабилетов. Для начала вы можете добавить флаги для праздников, праздников, важных дат. Также сделайте проектирование функций для близости к этим дням. Данные о погоде также легко найти и добавить.

PCA обычно помогает в тех случаях, когда у вас экстремальная размерность, например данные генома или используемый алгоритм плохо справляются с данными больших размеров, такими как kNN et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...