71darkness17 / PFOhack

Repository of DP PFO hackaton
0 stars 0 forks source link

найти модели, которые можно юзать #1

Closed 71darkness17 closed 5 days ago

71darkness17 commented 6 days ago

Короче нам нужно реализовать две функции по моему: 1) Анализировать и прогнозировать спрос 2) Сравнивать с текущим предложением ржд и рекомендовать те или иные изменения Короче говоря наша задача - поддержка принятия решений

dmitryz1024 commented 6 days ago

https://habr.com/ru/articles/538188/

https://vc.ru/marketing/162408-sistema-prognoza-ottoka-klientov#:~:text=%D0%91%D0%B0%D0%B7%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0,%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B0%20%D0%BF%D1%80%D0%BE%D0%B3%D0%BD%D0%BE%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%BE%D1%82%D1%82%D0%BE%D0%BA%D0%B0.

https://paperswithcode.com/paper/deep-neural-decision-trees/review/

https://python.hotexamples.com/examples/hodgkin_huxley_channels/-/dndt/python-dndt-function-examples.html

dmitryz1024 commented 6 days ago

Интерпретация модели DNDT (Deep Neural Decision Trees) в контексте анализа факторов оттока клиентов может дать ценные инсайты для бизнеса. Рассмотрим, как это можно сделать шаг за шагом:

1. Понимание структуры модели

Модель DNDT сочетает нейронные сети и деревья решений:

2. Подготовка данных

Сначала необходимо определить ключевые факторы, которые могут влиять на отток клиентов. Например:

3. Обучение модели

Используйте собранные данные для обучения модели DNDT. Вам понадобится разбить данные на обучающую и тестовую выборки.

4. Визуализация дерева решений

После тренировки модели важно визуализировать дерево решений. Это поможет понять, какие факторы оказывают наибольшее влияние на предсказания. Используйте такие библиотеки, как Graphviz или matplotlib, для создания графиков дерева. Посмотрите на верхние ветви дерева; они будут указывать на наиболее значимые факторы.

from sklearn.tree import export_text
tree_rules = export_text(tree_model, feature_names=feature_names)
print(tree_rules)

5. Анализ влияния признаков

Для более глубокой интерпретации можно использовать методы анализа важности признаков:

import shap

explainer = shap.TreeExplainer(tree_model)
shap_values = explainer.shap_values(X_test)

shap.summary_plot(shap_values, X_test)

6. Интерпретация результатов

На основе полученной информации и визуализаций можно делать выводы:

7. Принятие решений

Используя полученные инсайты, можно разработать стратегии по удержанию клиентов:

Заключение

Модель DNDT позволяет не только предсказывать, кто из клиентов может уйти, но и объяснять, почему. Это делает её особенно ценной для бизнеса, стремящегося повысить удержание клиентов и улучшить взаимодействие с ними.

dmitryz1024 commented 6 days ago

Модели DNDT (Deep Neural Decision Trees) представляют собой интересное сочетание глубокого обучения и решений на основе деревьев. Они используют преимущества нейронных сетей для обработки входных данных, а затем применяют структуру дерева решений для интерпретации и принятия решений. Это позволяет комбинировать высокую выразительность нейросетей с поясняемостью моделей, подобно традиционным деревьям решений.

Основные характеристики DNDT:

  1. Глубокая архитектура: DNDT обычно включает несколько слоев нейронов, которые обрабатывают данные, прежде чем результаты передаются в дерево решений. Это позволяет моделям выявлять сложные зависимости в данных.

  2. Интерпретируемость: Одним из ключевых преимуществ DNDT является способность объяснять принятые решения. Дерево решений может быть визуализировано, что упрощает понимание модели.

  3. Гибридность: Использование как нейросетей, так и деревьев решений делает модель гибкой и способной хорошо справляться с разнообразными типами данных.

Пример реализации DNDT на Python

Следующий пример демонстрирует базовую модель DNDT с использованием библиотеки Keras для нейросети и scikit-learn для дерева решений. Возможно, потребуется установка дополнительных библиотек:

pip install numpy pandas tensorflow scikit-learn

Импорт нужных библиотек

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from tensorflow import keras
from tensorflow.keras import layers

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

Для примера мы создадим синтетический набор данных.

# Генерация синтетических данных
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, n_informative=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Создание модели нейронной сети

# Определение нейронной сети
def create_neural_network(input_dim):
    model = keras.Sequential()
    model.add(layers.Dense(64, activation='relu', input_shape=(input_dim,)))
    model.add(layers.Dense(32, activation='relu'))
    model.add(layers.Dense(16, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))  # Используем сигмоид для бинарной классификации
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model

# Создание и обучение нейронной сети
nn_model = create_neural_network(X_train.shape[1])
nn_model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2)

Извлечение признаков и построение дерева решений

Теперь мы можем использовать выходные данные нейронной сети в качестве входа для дерева решений.

# Получение предсказаний нейронной сети
nn_predictions_train = nn_model.predict(X_train)
nn_predictions_test = nn_model.predict(X_test)

# Обучение дерева решений
dt_model = DecisionTreeClassifier(max_depth=5, random_state=42)
dt_model.fit(nn_predictions_train, y_train)

# Оценка модели
test_accuracy = dt_model.score(nn_predictions_test, y_test)
print(f"Точность дерева решений: {test_accuracy:.2f}")

Заключение

Модели DNDT представляют собой интересное направление в области машинного обучения, сочетая мощь нейронных сетей и интерпретируемость деревьев решений. Такой подход может быть особенно полезным в тех областях, где важна как высокая точность предсказаний, так и способность объяснять принятые решения.

Если вас интересуют более сложные архитектуры или другие аспекты DNDT, не стесняйтесь спрашивать!

dmitryz1024 commented 6 days ago

Install TF-DF

!pip install tensorflow tensorflow_decision_forests

Load TF-DF

import tensorflow_decision_forests as tfdf import pandas as pd

Load a dataset in a Pandas dataframe.

train_df = pd.read_csv("project/train.csv") test_df = pd.read_csv("project/test.csv")

Convert the dataset into a TensorFlow dataset.

train_ds = tfdf.keras.pd_dataframe_to_tf_dataset(train_df, label="my_label") test_ds = tfdf.keras.pd_dataframe_to_tf_dataset(test_df, label="my_label")

Train a Random Forest model.

model = tfdf.keras.RandomForestModel() model.fit(train_ds)

Summary of the model structure.

model.summary()

Compute model accuracy.

model.compile(metrics=["accuracy"]) model.evaluate(test_ds, return_dict=True)

Export the model to a SavedModel.

model.save("project/model")

dmitryz1024 commented 6 days ago

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

Шаг 1: Подготовка среды

  1. Установите необходимые библиотеки:
    pip install pandas openpyxl python-docx PyPDF2 scikit-learn

Шаг 2: Чтение данных

  1. Создайте функцию для чтения данных из различных форматов:

    import pandas as pd
    from PyPDF2 import PdfReader
    from docx import Document
    
    def read_data(file_path):
       if file_path.endswith('.xls') or file_path.endswith('.xlsx'):
           return pd.read_excel(file_path)
       elif file_path.endswith('.pdf'):
           return read_pdf(file_path)
       elif file_path.endswith('.docx'):
           return read_docx(file_path)
       else:
           raise ValueError("Unsupported file format")
    
    def read_pdf(file_path):
       with open(file_path, 'rb') as f:
           reader = PdfReader(f)
           text = ""
           for page in reader.pages:
               text += page.extract_text() + "\n"
       return pd.DataFrame([line.split() for line in text.splitlines()])  # Уточните структуру
    
    def read_docx(file_path):
       doc = Document(file_path)
       text = "\n".join([p.text for p in doc.paragraphs])
       return pd.DataFrame([line.split() for line in text.splitlines()])  # Уточните структуру

Шаг 3: Обработка данных

  1. Объедините данные в единый DataFrame:

    import glob
    
    def load_all_data(directory):
       all_data = []
       for file in glob.glob(f"{directory}/*"):
           data = read_data(file)
           all_data.append(data)
       return pd.concat(all_data, ignore_index=True)

Шаг 4: Фильтрация и подготовка данных клиента

  1. Создайте функцию для фильтрации данных по ID клиента:
    def get_client_data(data, client_id):
       return data[data['client_id'] == client_id]

Шаг 5: Анализ данных с использованием DNDT

  1. Разработайте модель DNDT для анализа данных:

    from sklearn.ensemble import RandomForestClassifier
    from sklearn.model_selection import train_test_split
    
    def train_model(data):
       features = data.drop(columns=['client_id', 'target'])
       target = data['target']  # Предполагается, что у вас есть метка "target"
       X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2)
       model = RandomForestClassifier()
       model.fit(X_train, y_train)
       return model

Шаг 6: Вычисление важности клиентов

  1. Создайте функцию для получения весов клиентов:
    def get_client_weight(model, client_data):
       client_features = client_data.drop(columns=['client_id'])
       weight = model.predict_proba(client_features)[:, 1]  # Вероятность положительного класса
       return weight

Шаг 7: Итоговая программа

Теперь вы можете объединить все шаги в одну программу:

def main():
    directory = 'path/to/your/data'
    data = load_all_data(directory)

    model = train_model(data)

    client_weights = {}
    for client_id in data['client_id'].unique():
        client_data = get_client_data(data, client_id)
        weight = get_client_weight(model, client_data)
        client_weights[client_id] = weight

    # Сортировка клиентов по весу
    sorted_clients = sorted(client_weights.items(), key=lambda x: x[1], reverse=True)
    print("Ранжированный список клиентов:", sorted_clients)

if __name__ == "__main__":
    main()

Замечания

dmitryz1024 commented 6 days ago
import pandas as pd
from PyPDF2 import PdfReader
from docx import Document
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import glob

def read_data(file_path):
    if file_path.endswith('.xls') or file_path.endswith('.xlsx'):
        return pd.read_excel(file_path)
    elif file_path.endswith('.pdf'):
        return read_pdf(file_path)
    elif file_path.endswith('.docx'):
        return read_docx(file_path)
    else:
        raise ValueError("Unsupported file format")

def read_pdf(file_path):
    with open(file_path, 'rb') as f:
        reader = PdfReader(f)
        text = ""
        for page in reader.pages:
            text += page.extract_text() + "\n"
    return pd.DataFrame([line.split() for line in text.splitlines()])  # Уточните структуру

def read_docx(file_path):
    doc = Document(file_path)
    text = "\n".join([p.text for p in doc.paragraphs])
    return pd.DataFrame([line.split() for line in text.splitlines()])  # Уточните структуру

def load_all_data(directory):
    all_data = []
    for file in glob.glob(f"{directory}/*"):
        data = read_data(file)
        all_data.append(data)
    return pd.concat(all_data, ignore_index=True)

def get_client_data(data, client_id):
    return data[data['client_id'] == client_id]

def train_model(data):
    features = data.drop(columns=['client_id', 'target'])  # Убедитесь, что у вас есть метка "target"
    target = data['target']
    X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2)
    model = RandomForestClassifier()
    model.fit(X_train, y_train)
    return model

def get_client_weight(model, client_data):
    client_features = client_data.drop(columns=['client_id'])
    weight = model.predict_proba(client_features)[:, 1]  # Вероятность положительного класса
    return weight

def main():
    directory = 'path/to/your/data'  # Замените на путь к вашим данным
    data = load_all_data(directory)

    model = train_model(data)

    client_weights = {}
    for client_id in data['client_id'].unique():
        client_data = get_client_data(data, client_id)
        weight = get_client_weight(model, client_data)
        client_weights[client_id] = weight

    # Сортировка клиентов по весу
    sorted_clients = sorted(client_weights.items(), key=lambda x: x[1], reverse=True)
    print("Ранжированный список клиентов:", sorted_clients)

if __name__ == "__main__":
    main()
dmitryz1024 commented 6 days ago

Чтобы алгоритм работал корректно, ваши исходные файлы должны иметь определённую структуру и содержать необходимые данные. Вот основные рекомендации по формату данных:

1. Общая структура

Каждый файл (в формате .xls, .pdf, .docx) должен содержать таблицу данных с одинаковыми столбцами, которые можно объединить в один DataFrame. Основные колонки, которые вам понадобятся:

2. Пример структуры данных

Вот пример, как может выглядеть таблица:

client_id target volume_shipped revenue support_requests cargo_type last_deal_date
1 1 10000 500000 5 type_A 2024-10-01
2 0 5000 200000 10 type_B 2024-09-15
3 1 15000 800000 2 type_A 2024-10-10

3. Форматы файлов

4. Предварительная обработка данных

Перед использованием данных в модели, убедитесь, что:

5. Проверка данных

Не забудьте проверять данные на наличие пропусков и выбросов, чтобы избежать ошибок при обучении модели.

Если у вас есть конкретные примеры ваших файлов, могу помочь более детально!