Какую модель использовать для предсказания расхода деталей?

Рейтинг: 0Ответов: 0Опубликовано: 26.04.2023

У меня есть данные для 500 деталей в виде:

введите сюда описание изображения

Задача по ним предсказать расход на 2024 (соотвественно обучить модель на прошлых годах). Я делаю Label Encoder для групп и для названий деталей.

На вход моделям данные поступают в таком виде:

'comp_names','New_group', 'mean_eq', '2015', '2016','2017', '2018', '2019','2020','2021'.

comp_names - encoder для названий; New_group - encoder для группы;

Проверочные данные: 'comp_names','New_group', 'mean_eq', '2014', '2015', '2016','2017', '2018', '2019','2020'.

Далее я попробовал нармолизовать данные MinMaxScaler и тестировал модели с ним и без него. Я попробовал Линейную регрессию

model_lr = LinearRegression()
model_lr.fit(X_train, y_train)
y_pred = model_lr.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print('MSE:', mse)

CatBoostRegressor

gb = CatBoostRegressor()
gb.fit(X_train, y_train)

Также нейронную сеть

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(64, activation='relu', input_shape=(9,)),
    tf.keras.layers.Dropout(0.3),
    tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse', metrics=['mae'])

Подгтовка данных:

  1. Предварительно отчильтрованы пустые значения
  2. Названия деталей тоже преведены к общему виду (один регистр, убрал окончания, отчистил от лишних символов)
  3. Разбивка данных:
  • пробовал разбивать данные по строкам и давать их на вход
data_for_predict = df_filtered[['New_group', 'mean_eq',  '2015', '2016','2017', '2018', '2019','2020','2021']].values
data_for_test = df_filtered[['New_group', 'mean_eq', '2016','2017','2018', '2019','2020','2021','2022']].values
data_for_val = df_filtered[['New_group', 'mean_eq', '2014','2015','2016','2017','2018', '2019','2020',]].values
//блок выше использовал для разбивки по колонкам
scaler_x = MinMaxScaler()
scaler_y = MinMaxScaler()
norm_data_x = scaler_x.fit_transform(data_for_predict)
norm_data_y = scaler_y.fit_transform(df_filtered['2022'].values.reshape(-1,1))
// с помощью 
X_train, X_test, y_train, y_test = train_test_split(data_for_predict, df_filtered['2022'], test_size=0.2, random_state=42)
X1_train, X1_test, y1_train, y1_test = train_test_split(norm_data_x, norm_data_y, test_size=0.2, random_state=42)
  • пробовал разбивать данные по столбцам (2014..2020 для тренировочного и 2015-2021 для тестового)

Но по всем этим моделям предсказания довольно плохие. R2 score не выше 0.5.

  1. Возможно ли вообще с таким набором сделать качественный прогноз?
  2. Как стоит преобразовать данные, чтобы улучшить предсказание. Есть мысли по поводу сумирования расхода за прошлые года и давая это как параметр. Сделать таблицу, где будет столбец год а в строках расход деталей по годам.

DS example:

Group   Name    Количество оборудования где установлена деталь/ Сумму установленных деталей Год1    Год2    Год3    Год4    Год5    Год6    Год7    Год8    Год9    Год10   Год11   Год12   Год13
o   FIBER,OPTIC SENSOR  100%    0   0   0   0   0   3   1   0   2   1   0   0   2
ax  AUXILIARY CONTACT BLOCK 3S+ 67% 0   0   0   0   0   0   0   0   0   0   0   0   2
md  MODULE-DIAGNOSIS    100%    0   0   0   0   0   0   0   2   0   0   0   0   1
0   VACUUMPUMP  100%    0   0   0   0   0   0   0   0   0   2   0   0   1
sw  BNS260-11ZG 83% 0   0   0   0   0   0   0   0   0   0   0   0   1
co  SIGNALLING COLUMN MULTI 100%    0   0   0   2   0   0   1   0   0   1   0   5   2
mo  MOTOR   100%    0   0   0   0   1   3   3   2   0   0   0   0   1
como    Terminal    100%    0   0   0   0   0   0   0   2   0   0   0   1   2
pow STROBOSCOPE 100%    0   0   0   0   0   0   0   0   0   0   1   1   1
0   key     100%    1   3   8   2   4   7   4   3   4   1   3   1   4
re  DIOsDE  67% 0   0   0   0   0   0   0   0   0   0   0   0   2
con CONNECTOR   100%    0   0   0   0   0   0   0   0   0   0   0   1   1
b   BATTfERY    50% 0   0   0   0   0   0   0   0   0   0   0   0   2
m   MAGNET I    78% 0   0   0   0   0   0   0   0   3   0   1   2   1
m   SWITCH MAGN 100%    0   0   0   0   1   1   1   2   1   0   0   0   1
sw  PROX SWITCH 100%    0   0   0   0   0   0   1   0   0   2   1   5   3
cb  Miniature circuit breaker   100%    0   0   0   0   0   0   0   0   0   0   0   0   1
sw  PROX    100%    0   0   0   0   2   0   0   2   1   1   0   2   1
co  ROUND ANGLE     100%    0   0   0   0   0   0   0   0   0   0   0   1   1
    Continuous      100%    0   0   0   0   0   0   0   0   0   0   0   0   2
sw  PRESSURE    100%    0   0   0   2   3   0   4   3   7   4   4   10  5
un  RANSMISSIVE 100%    0   0   0   0   0   0   0   0   0   2   3   1   1
pow POWER   100%    0   0   0   0   0   0   0   0   0   0   0   0   1
md  BLOWER  100%    0   0   0   0   0   0   0   0   0   0   1   0   2
cp  CPU 100%    0   0   0   0   0   0   0   0   0   0   0   0   1
mo  MOTOR   100%    0   0   0   0   0   0   1   0   0   0   0   0   2
u   UNIT    100%    0   0   0   0   0   0   0   0   0   0   0   0   1
a   AU  48% 0   0   0   0   0   0   0   0   0   0   0   0   0
cb  CIRCUIT 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
com MODULE TERMINAL 18% 0   0   0   0   0   0   0   0   0   0   0   0   0
com MODULE TERMINAL 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
com MODULE TERMINAL 46% 0   0   0   0   0   0   0   0   0   0   0   0   0
com MODULE TERMINAL 33% 0   0   0   0   0   0   0   0   0   0   0   0   0
com MODULE TERMINAL 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
di  DI IN   100%    0   0   0   0   0   0   0   0   0   0   0   0   0
di  DI IN   100%    0   0   0   0   0   0   0   0   0   0   0   0   0
di  DI on   100%    0   0   0   0   0   0   0   0   0   0   0   0   0
ai  imd 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
con FRONT   100%    0   0   0   0   0   0   0   0   0   0   0   0   0
con Conmd   100%    0   0   0   0   0   0   0   0   0   0   0   0   0
con conid   67% 0   0   0   0   0   0   0   0   0   0   0   0   0
com Terminal    25% 0   0   0   0   0   0   0   0   0   0   0   0   0
prf coup    100%    0   0   0   0   0   0   0   0   0   0   0   0   0
ai  inoee   100%    0   0   0   0   0   0   0   0   0   0   0   0   0
pw  POWER   60% 0   0   0   0   0   0   0   0   0   0   1   0   0
p   photo   100%    0   0   0   0   0   0   0   0   0   0   0   0   0
do  do  100%    0   0   0   0   0   0   0   0   0   0   0   0   0
di  di  55% 0   0   0   0   0   0   0   0   0   0   0   0   0
be  bwck    100%    0   0   0   0   0   0   0   0   0   0   0   0   0
md  mda 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
op  opto    67% 0   0   0   0   0   0   0   0   0   0   0   0   0
sa  safety module   50% 0   0   0   0   0   0   0   0   1   0   1   0   0
do  do  100%    0   0   0   0   0   0   0   0   0   0   0   0   0
c   CPU 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
do  el  100%    0   0   0   0   0   0   0   0   0   0   0   0   0
pow pow 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
com mda 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
do  ter 100%    0   0   0   0   0   0   0   0   0   0   0   0   0
ai  imnp    100%    0   0   0   0   0   0   0   0   0   0   0   0   0
sa  cont    67% 0   0   0   0   0   0   0   0   0   0   1   0   0
cf  sped    50% 0   0   0   0   0   0   0   0   0   0   0   0   0
do  el  100%    0   0   0   0   0   0   0   0   0   0   0   0   1
ma  act 78% 0   0   0   0   0   0   0   0   0   0   0   0   0

Не могу воспользоваться kaggle , github или google drive (политика компании) В данных изменил названия и цифры, общие закономености сохранил.

Описание данных: Каждая строка соответствует уникальному компоненту, есть конечно компоненты с похожим названием и целью, но суть в том, что одна строчка один компонент.

Ответы

Ответов пока нет.