Анализ данных и базовая модель
Введение
Эта статья основана на данных конкурс a, который был опубликован компанией Driven Data для решения проблем водоснабжения в Танзании.Информация для конкурса была собрана Министерством водных ресурсов Танзании с использованием платформы с открытым исходным кодом Taarifa. Танзания — крупнейшая страна Восточной Африки с населением около 60 миллионов человек.
Половина населения не имеет доступа к чистой воде, а 2/3 населения страдает от плохих санитарных условий.
В бедных домах семьям часто приходится идти несколько часов пешком, чтобы набрать воду из водяных насосов.
Миллиарды долларов иностранной помощи предоставляются для решения проблемы пресной воды в Танзании.
Однако правительство Танзании по сей день не смогло решить эту проблему.
Значительная часть водяных насосов полностью вышла из строя или практически не работает, остальные требуют капитального ремонта.
Министерство водных ресурсов Танзании согласилось с Таарифой, и они объявили конкурс в надежде получить советы от сообщества по решению предстоящих задач.
Данные
Данные содержат множество характеристик (особенностей), связанных с водяными насосами, есть информация, связанная с географическим расположением пунктов водоснабжения, организациями, которые их построили и управляют, а также некоторые данные о регионах, территориях местного самоуправления.Также есть информация о видах и количестве платежей.
Водозаборные пункты делятся на исправный , нефункциональный И исправен, но требует ремонта .
Цель конкурса – построение модели, прогнозирующей функциональность точек водоснабжения.
Данные содержат 59400 строк и 40 столбцов.
Целевая метка содержится в отдельном файле.
Метрика, используемая для этого конкурса: классификационный коэффициент , который вычисляет процент строк, в которых прогнозируемый класс соответствует фактическому классу в тестовом наборе.
Максимальное значение — 1, минимальное — 0. Цель — максимизировать классификационный коэффициент .
Анализ данных
Описание полей в таблице данных:- sum_tsh — общий статический напор (количество воды, доступное в точке водоснабжения)
- date_recorded — дата сбора данных
- спонсор — спонсировавший строительство скважины
- gps_height — высота, на которой находится скважина
- монтажник — организация, построившая скважину
- долгота — Координаты GPS (долгота)
- широта — Координаты GPS (широта)
- wpt_name — имя, если есть
- num_private — нет информации
- бассейн — географический водный бассейн
- подпоселение — географическое положение
- регион — географическое положение
- регион_код — географическое местоположение (код)
- District_code — географическое местоположение (код)
- lga — географическое положение
- приход — географическое положение
- население — количество людей возле колодца
- public_meeting — да/нет
- записанные_by — кто собрал данные
- Scheme_management — кто управляет скважиной
- имя_схемы — кто контролирует колодец
- разрешение — требуется ли разрешение для доступа?
- Construction_year — год постройки
- Extract_type — тип скважины
- Extraction_type_group — группа типов скважин
- Extraction_type_class — класс типа скважины
- управление — как осуществляется управление скважиной
- Management_group — группа управления скважиной
- платеж — стоимость воды
- Payment_type — тип стоимости воды
- Water_quality — качество воды
- quality_group — группа качества воды
- количество — количество воды
- Quantity_group — группа количества воды
- источник — источник воды
- source_type — тип источника воды
- source_class — класс источника воды
- Waterpoint_type — тип скважины
- Waterpoint_type_group — группа типов скважин Прежде всего, давайте посмотрим на целевую метку — классы распределены неравномерно:
Стоит отметить, что существует небольшое количество марок водяных насосов, нуждающихся в ремонте.Решить проблему классового дисбаланса можно несколькими способами:
- сократить количество примеров в доминирующих классах (недостаточная выборка)
- повторяющиеся строки с небольшим количеством меток (избыточная выборка)
- генерировать синтетические выборки — это случайная выборка атрибутов из экземпляров класса меньшинства (SMOTE)
- ничего не делать и использовать возможности библиотек, которые выбраны для моделирования
Здесь .
Давайте посмотрим, как водяные насосы распределены по стране.
Некоторые данные содержат пустые значения.
Мы видим, что эта функция выделяется имя_схемы который имеет огромное количество пропущенных значений, а остальные имеют вполне умеренное количество.Следующая тепловая карта показывает наличие/отсутствие связи между переменными.
Стоит обратить внимание на взаимоотношения между разрешать , установщик И спонсор .
Давайте посмотрим на общую картину взаимоотношений на дендрограмме.
В характеристиках водяных насосов есть такой, который показывает количество воды.Мы можем проверить, как количество воды связано с состоянием насосов ( количество_группа) .
Видно, что есть много колодцев с достаточным количеством воды, которые не функционируют. С точки зрения эффективности инвестиций логично сосредоточить внимание в первую очередь на ремонте именно этой группы.Также можно отметить, что большинство сухих насосов не работают. Если бы они смогли найти способ наполнить эти колодцы водой, они, вероятно, смогли бы заработать деньги без дополнительных капиталовложений.
Влияет ли качество воды на состояние водяных насосов? Мы можем просмотреть данные, сгруппированные по группа_качества .
К сожалению, этот график малоинформативен, так как преобладает количество источников с хорошей водой.Попробуем сгруппировать только источники с водой более низкого качества.
Большинство скважин неизвестного качества из группа_качества не работает. Есть еще одна интересная характеристика водозаборов — их тип ( Waterpoint_type_group ).
Анализ данных по водозаборам показывает, что в группе с другой Очень много неработающих насосов.Они устарели? Мы можем проверить влияние года постройки насоса.
Ожидаемый результат: чем старше водозабор, тем выше вероятность того, что он не будет функционировать, в основном до 80-х годов.Теперь попробуем составить представление о финансирующих организациях.
Предположительно, состояние скважин может коррелировать с финансированием.
Рассмотрим только организации, которые финансируют более 500 точек водоснабжения.
«Данида» — совместная танзанийско-датская организация по финансированию скважин, и хотя у них много работающих водозаборов, процент неисправных очень высок.Аналогичная ситуация с RWSSP (Программой сельского водоснабжения и канализации), DHV и некоторыми другими.
Следует отметить, что большинство скважин, финансируемых Германией и частными лицами, находятся в рабочем состоянии.
Напротив, большое количество финансируемых государством скважин не функционируют. Большинство точек водоснабжения, установленных центральным правительством и районным советом, также не функционируют. Рассмотрим гипотезу о том, что чистота воды и водный бассейн, к которому принадлежит скважина, могут влиять на производительность.
Прежде всего, давайте посмотрим на водоемы.
Выделяются два бассейна: Реубен и озеро Руква.Здесь наибольшее количество аварийных скважин.
Известно, что некоторые скважины являются платными.
Можно предположить, что выплаты могут оказать положительное влияние на поддержание насосов в рабочем состоянии.
Гипотеза полностью подтверждается — оплата за воду помогает поддерживать источник в рабочем состоянии.Помимо категориальных параметров, данные содержат числовую информацию, на которую мы можем посмотреть и, возможно, найти что-то интересное.
Некоторые данные были заполнены значением 0 вместо реальных данных.Мы также можем это видеть сумма_тш выше для исправных скважин (метка = 0).
Также следует обратить внимание на выбросы в функции сумма_тш .
В качестве особенности можно отметить перепад высот и то, что значительная часть населения проживает на высоте 500 метров над средним уровнем моря.
Подготовка данных
Прежде чем мы начнем строить модель, нам необходимо очистить и подготовить данные.
- Особенность установщик содержит множество повторов с разными падежами, орфографическими ошибками и сокращениями.
Давайте сначала преобразуем все в нижний регистр.
Затем, используя простые правила, уменьшаем количество ошибок и делаем группировку.
- После очистки заменяем все элементы, встречающиеся менее 71 раза (0,95 квантиля), на «другие».
- Повторяем по аналогии с особенностью спонсор .
Порог отсечения составляет 98.
- Данные содержат объекты с очень похожими категориями.
Давайте выберем только один из них.
Поскольку данных в наборе данных не так много, мы оставляем функцию с наименьшим набором категорий.
Мы удалим следующие функции: схема_управление, группа_количества, качество_воды, тип_платежа, тип_извлечения, группа_типа_воды, код_региона.
- Мы заменим широта И долгота значения выбросов представляют собой медианное значение для соответствующего региона из код_региона.
- Аналогично повторениям пропущенных значений для поселок И имя_схемы .
- Отсутствующие значения в публичная_встреча И разрешать замените его медианным значением.
- Для поселок , публичная_встреча , имя_схемы , разрешать, Мы создаем дополнительные категориальные бинарные функции, которые будут помечать данные с пропущенными значениями.
Поскольку мы заменяем их медианами, то оставим для модели информацию о том, что были пробелы.
- Функции схема_управление , количество_группа , качество воды , код_региона , способ оплаты , тип_извлечения , Waterpoint_type_group , дата_записи , И записан можно удалить, так как он повторяет данные других признаков и будет бесполезен для модели.
Модель
Данные содержат большое количество категориальных признаков.Наиболее подходящей для получения базовой модели, на мой взгляд, является CatBoost .
Это высокопроизводительная библиотека повышения градиента с открытым исходным кодом.
Не будем подбирать оптимальные параметры, пусть это будет домашним заданием.
Давайте напишем функцию для инициализации и обучения модели.
AUC была выбрана для оценки потому, что данные сильно несбалансированы, и этот показатель вполне подходит для таких случаев, поскольку дисбаланс на него не влияет. Для целевой метрики мы можем написать нашу функцию.def fit_model(train_pool, test_pool, **kwargs): model = CatBoostClassifier( max_ctr_complexity=5, task_type='CPU', iterations=10000, eval_metric='AUC', od_type='Iter', od_wait=500, **kwargs )return model.fit( train_pool, eval_set=test_pool, verbose=1000, plot=False, use_best_model=True)
И использовать его на этапе обучения тоже будет домашним заданием.
def classification_rate(y, y_pred):
return np.sum(y==y_pred)/len(y)
Поскольку данных мало, разделение полной выборки на обучающую и тестовую части — не лучший вариант. В этом случае лучше использовать технику OOF (Out-of-Fold).
Мы не будем использовать сторонние библиотеки; попробуем написать простую функцию.
Обратите внимание, что необходимо разбить набор данных на складки.
def get_oof(n_folds, x_train, y, x_test, cat_features, seeds): ntrain = x_train.shape[0]
ntest = x_test.shape[0]
oof_train = np.zeros((len(seeds), ntrain, 3))
oof_test = np.zeros((ntest, 3))
oof_test_skf = np.empty((len(seeds), n_folds, ntest, 3)) test_pool = Pool(data=x_test, cat_features=cat_features)
models = {} for iseed, seed in enumerate(seeds):
kf = StratifiedKFold(
n_splits=n_folds,
shuffle=True,
random_state=seed)
for i, (train_index, test_index) in enumerate(kf.split(x_train, y)):
print(f'\nSeed {seed}, Fold {i}')
x_tr = x_train.iloc[train_index, :]
y_tr = y[train_index]
x_te = x_train.iloc[test_index, :]
y_te = y[test_index]
train_pool = Pool(data=x_tr, label=y_tr, cat_features=cat_features)
valid_pool = Pool(data=x_te, label=y_te, cat_features=cat_features)model = fit_model(
train_pool, valid_pool,
loss_function='MultiClass',
random_seed=seed
)
oof_train[iseed, test_index, :] = model.predict_proba(x_te)
oof_test_skf[iseed, i, :, :] = model.predict_proba(x_test)
models[(seed, i)] = modeloof_test[:, :] = oof_test_skf.mean(axis=1).
mean(axis=0)
oof_train = oof_train.mean(axis=0)
return oof_train, oof_test, models
Чтобы уменьшить зависимость от случайности разбиения, зададим несколько разных начальных значений для расчета предсказаний — параметр семена .
Кривая обучения одной из складок Кривые обучения выглядят оптимистично, и модель также должна хорошо прогнозировать.
Посмотрев на важность особенностей в модели, мы можем убедиться в отсутствии явной утечки информации (утечки).
После усреднения прогнозов: balanced accuracy: 0.6703822994494413
classification rate: 0.8198316498316498
Попробуем загрузить результаты на сайт с конкурсом и посмотреть результат.
Учитывая, что на момент написания статьи топ-5 был лучше всего на 0,005, можно сказать, что базовая модель получилась неплохой.
Проверим, что работа по анализу и очистке данных была проделана не зря — построим модель исключительно на основе исходных данных.
Единственное, что мы сделаем, это заполним недостающие значения нулями.
balanced accuracy: 0.6549535670689709
classification rate: 0.8108249158249158
Результат заметно хуже.
Полученные результаты
В статье:- знакомился с данными и искал идеи для модели;
- очищенные и подготовленные данные для модели;
- решил использовать CatBoost, так как большинство функций категоричны;
- написал функцию для прогнозирования ООФ;
- Мы получили отличные результаты для базовой модели.
В качестве домашнего задания предлагаю добавлять новые функции, выбирать оптимальные параметры модели, использовать другие библиотеки для увеличения градиента и строить ансамбли из полученных моделей.
Вы можете увидеть код из статьи Здесь .
Теги: #Машинное обучение #python #программирование #Еда #ml #Визуализация данных #машинное+обучение #конкуренция #классификация #kaggle #catboost #анализ
-
Второй День С Apple Tv
19 Oct, 24 -
Рассказываем О Devops Понятным Языком
19 Oct, 24 -
Интернет Вещей И 5G
19 Oct, 24 -
Микро Мировая Война
19 Oct, 24 -
О Подводном Авианосце
19 Oct, 24