Выбор локации для скважины
  • AI Chat
  • Code
  • Report
  • Beta
    Spinner

    Выбор локации для скважины

    Допустим, вы работаете в добывающей компании «ГлавРосГосНефть». Нужно решить, где бурить новую скважину.

    Вам предоставлены пробы нефти в трёх регионах: в каждом 10 000 месторождений, где измерили качество нефти и объём её запасов. Постройте модель машинного обучения, которая поможет определить регион, где добыча принесёт наибольшую прибыль. Проанализируйте возможную прибыль и риски техникой Bootstrap.

    Шаги для выбора локации:

    • В избранном регионе ищут месторождения, для каждого определяют значения признаков;
    • Строят модель и оценивают объём запасов;
    • Выбирают месторождения с самым высокими оценками значений. Количество месторождений зависит от бюджета компании и стоимости разработки одной скважины;
    • Прибыль равна суммарной прибыли отобранных месторождений.

    Условия задачи:

    • Для обучения модели подходит только линейная регрессия (остальные — недостаточно предсказуемые).
    • При разведке региона исследуют 500 точек, из которых с помощью машинного обучения выбирают 200 лучших для разработки.
    • Бюджет на разработку скважин в регионе — 10 млрд рублей.
    • При нынешних ценах один баррель сырья приносит 450 рублей дохода. Доход с каждой единицы продукта составляет 450 тыс. рублей, поскольку объём указан в тысячах баррелей.
    • После оценки рисков нужно оставить лишь те регионы, в которых вероятность убытков меньше 2.5%. Среди них выбирают регион с наибольшей средней прибылью.

    Описание данных:

    • id — уникальный идентификатор скважины;
    • f0, f1, f2 — три признака точек;
    • product — объём запасов в скважине (тыс. баррелей).

    Загрузка и подготовка данных

    pip install sweetviz
    # импортируем библиотеки
    import pandas as pd
    import numpy as np
    from matplotlib import pyplot as plt
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import mean_squared_error
    from sklearn.linear_model import LinearRegression, Ridge, Lasso
    from sklearn.preprocessing import StandardScaler
    from sklearn.utils import shuffle
    from joblib import dump, load
    import sweetviz as sv
    # загрузим данные
    geo_data_0 = pd.read_csv('datasets/geo_data_0.csv')
    geo_data_1 = pd.read_csv('datasets/geo_data_1.csv')
    geo_data_2 = pd.read_csv('datasets/geo_data_2.csv')
    
    for data, name in zip([geo_data_0, geo_data_1, geo_data_2], 
                    ["geo_data_0", "geo_data_1", "geo_data_2"]):
        print("Регион {}".format(name))
        display(data.head(3))
        print("Количество дубликатов {}, пропущенных значений {}"
             .format(data.duplicated().sum(), data.isna().sum().sum()))
    • Проведем исследовательский анализ данных с помощью пакета sweetviz.
    report_0 = sv.analyze([geo_data_0[["f0", "f1", "f2", "product"]], "geo_data_0"], target_feat="product")
    report_0.show_html("sweetviz/geo_data_0.html")
    # report_0.show_notebook()
    report_1 = sv.analyze([geo_data_1[["f0", "f1", "f2", "product"]], "geo_data_1"], target_feat="product")
    report_1.show_html("sweetviz/geo_data_1.html")
    # report_1.show_notebook()
    report_2 = sv.analyze([geo_data_2[["f0", "f1", "f2", "product"]], "geo_data_2"], target_feat="product")
    report_2.show_html("sweetviz/geo_data_2.html")
    # report_2.show_notebook()

    Исследуемые данные обладают следующими особенностями:

    • не наблюдается пропущенных значений, дубликатов и выбросов;
    • распределение целевого признака (запас сырья) в регионах 0 и 2 близко к нормальному, а в регионе 1 больше соответствует равномерному, но с увеличенным содержанием скважин с минимальным и максимальным запасом сырья;
    • в регионе 0 целевой признак коррелирует со всеми 3 признаками (f0, f1, f2) и имеет наибольшую корреляцию с f2;
    • в регионах 1 и 2 целевой признак коррелируе главным образов с признаком f2 и намного слабее с остальными, причем в регионе 1 данная корреляция является очень сильной, в в регионе 2 находится на среднем уровне.

    Обучение и проверка модели

    • Разобъем данные для каждого региона на обущающую и валидационную выборку в соотношении 75/25.

    Создадим функцию, которая разбивает данные на необходимые для анализа признаки, и целевой признак, после чего делит их на обучающую и валидационную выборку.

    def data_split(geo_data, features_drop=["id", "product"], target="product",
                      test_size=.25, random_state=12345):
        """
        Функция принимает на вход датафрейм с геоданными.
        Делит его на признаки (f0, f1, f2) и целевой признак (product), 
        после этого разделяет на обучающую и валидационную выборки в соотношении 75/25.
        На выходе выдает словарь с признаками и целевым признаком получившихся выборок.
        """
        features = geo_data.drop(features_drop, axis=1)
        target = geo_data[target]
        
        features_train, features_valid, target_train, target_valid = \
                        train_test_split(features, target, test_size=test_size, random_state=random_state)
        
        return {"features_train": features_train, "target_train": target_train, 
                "features_valid": features_valid, "target_valid": target_valid}