Какую модель использовать для предсказания расхода деталей?
У меня есть данные для 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'])
Подгтовка данных:
- Предварительно отчильтрованы пустые значения
- Названия деталей тоже преведены к общему виду (один регистр, убрал окончания, отчистил от лишних символов)
- Разбивка данных:
- пробовал разбивать данные по строкам и давать их на вход
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.
- Возможно ли вообще с таким набором сделать качественный прогноз?
- Как стоит преобразовать данные, чтобы улучшить предсказание. Есть мысли по поводу сумирования расхода за прошлые года и давая это как параметр. Сделать таблицу, где будет столбец год а в строках расход деталей по годам.
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 (политика компании) В данных изменил названия и цифры, общие закономености сохранил.
Описание данных: Каждая строка соответствует уникальному компоненту, есть конечно компоненты с похожим названием и целью, но суть в том, что одна строчка один компонент.