Попробуем спрогнозировать заявки на обслуживание оборудования на основе истории обращений в Сервисдеск.
У компании есть однотипное оборудование в разных регионах, например, машины или серверы.
Есть сервисный отдел, который выполняет заявки на обслуживание серверов: чистка, замена деталей, обновление ПО.
Есть система Service Desk, в которой история этих обращений хранится несколько лет. Специалист, осуществлявший обслуживание сервера, заполняет и закрывает заявку в системе Service Desk. Исходные данные: набор данных со следующими полями:
- номер запроса в службу поддержки;
- дата начала и дата окончания работ;
- регион и расположение сервера;
- сервер, производитель, модель, серийный номер;
- вид выполняемых работ (справочник);
- нет списания запчастей на ТО, что это за запчасти и на какой сервер списываются.
Однако было очень полезно зафиксировать эти данные;
- Срок завершения работ иногда указывается аж на месяц позже, что говорит о том, что не стоит рассчитывать на длительность работ. Поле пришлось убрать;
- Набор данных очень короткий, охватывает всего полтора года, с ноября 2019 года по август 2021 года.
Это уже очень плохо;
В датасете оборудование условно названо «Ноутбук».
Задача-минимум: спрогнозировать, какие серверы потребуют обслуживания в следующем месяце.
Задача-максимум: задача-минимум также состоит в том, чтобы спрогнозировать тип услуги, то есть какой сервер какой тип услуги потребует в следующем месяце.
В данной статье описаны основные моменты решения задачи минимума.
Я еще не справился с задачей-максимумом.
Добавьте параметр time_diff — «Обслуживался ли ноутбук в прошлом месяце»:
Для обучения возьмем период с начала по май:def get_timediff(df): temp = [] for i in df['NB_SerialNumber'].
unique(): df = data[data["NB_SerialNumber"] == i].
sort_values(by = ["YearMonth"]) df['Datetime'] = pd.to_datetime(df[['Day','Month','Year',]] .
astype(str).
apply(' '.
join, 1), format='%d %m %Y') df['time_diff'] = df['Datetime'].
diff() df['time_diff'] = df['time_diff'].
apply(lambda x: x.days/30) df['time_diff'] = df['time_diff'].
fillna(0) df['time_diff'] = df['time_diff'].
astype(int) temp.append(df) return(temp) my_data = get_timediff(data) my_data_df = pd.concat(my_data)
df_train = my_data_df[(my_data_df['YearMonth'].
isin(
[201911, 201912,
202001, 202002, 202003, 202004, 202005, 202006, 202007, 202008, 202009, 202010, 202011, 202012,
202101, 202102, 202103, 202104, 202105
]
) )]
Поскольку нам нужно только значение того, обслуживался ли он в прошлом месяце, в time_diff нужно только одно, остальное удаляется:
df_train.time_diff.value_counts()
df_train = df_train[df_train.time_diff != -1]
df_train = df_train[df_train.time_diff != 2]
df_train = df_train[df_train.time_diff != 3]
df_train = df_train[df_train.time_diff != 4]
df_train = df_train[df_train.time_diff != 5]
df_train = df_train[df_train.time_diff != 6]
df_train = df_train[df_train.time_diff != 7]
df_train = df_train[df_train.time_diff != 8]
df_train = df_train[df_train.time_diff != 9]
df_train = df_train[df_train.time_diff != 10]
df_train = df_train[df_train.time_diff != 11]
df_train = df_train[df_train.time_diff != 12]
df_train = df_train[df_train.time_diff != 14]
Укажем только категориальные характеристики:
categorical_features_indices = np.where(X_train.dtypes != np.float)[0]
Дальше мы учим:
model = CatBoostRegressor(iterations=100,
depth=15,
learning_rate=0.01,
loss_function='RMSE')
cat_features=[0,1,2,3,4,5,6]
model.fit(X_train, y_train, cat_features)
В качестве порогового значения принимаем 0,2:
preds_raw = model.predict(X_test, prediction_type='RawFormulaVal')
preds_raw_df=pd.DataFrame(preds_raw)
lst=[]
for i in preds_raw_df[0]:
Теги: #python #машинное обучение #Service Desk #машинное обучение
-
Stick Games: Новый Взгляд На Старые Игры
19 Oct, 24 -
Плагин Для Маскировки Ввода Номера Во Входе
19 Oct, 24