Интеллектуальный диалоговый конвейер машинного обучения, объединяющий агентов LangChain и XGBoost для автоматизированных рабочих процессов в области науки о данных

В этом руководстве мы объединяем аналитические возможности XGBoost с диалоговым интеллектом LangChain. Мы создаём комплексный конвейер, который может генерировать синтетические наборы данных, обучать модель XGBoost, оценивать её производительность и визуализировать ключевые выводы — всё это с помощью модульных инструментов LangChain.

Этапы работы

1. Генерация данных. Используем LangChain для генерации синтетического классификационного набора данных с помощью функции `make_classification` из `scikit-learn`.
2. Предварительная обработка данных. Разделяем данные на обучающую и тестовую выборки с помощью `traintestsplit`.
3. Обучение модели. Обучаем модель XGBoost на обучающей выборке.
4. Оценка модели. Оцениваем производительность модели на тестовой выборке.
5. Визуализация результатов. Визуализируем результаты с помощью `matplotlib` и `seaborn`.

Классы и функции

  • DataManager: управляет генерацией и предварительной обработкой данных.

  • XGBoostManager: управляет обучением и оценкой модели XGBoost.

  • createmlagent: создаёт агента LangChain с инструментами машинного обучения.

  • run_tutorial: выполняет полный туториал.

Пример кода

«`python
import pandas as pd
import numpy as np
import xgboost as xgb
from sklearn.datasets import make_classification
from sklearn.modelselection import traintest_split
from sklearn.metrics import accuracyscore, classificationreport, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
from langchain.tools import Tool
from langchain.agents import AgentType, initialize_agent
from langchain.memory import ConversationBufferMemory
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain_community.llms.fake import FakeListLLM
import json

class DataManager:
«»»Manages dataset generation and preprocessing»»»

def init(self, nsamples=1000, nfeatures=20, random_state=42):
self.nsamples = nsamples
self.nfeatures = nfeatures
self.randomstate = randomstate
self.Xtrain, self.Xtest, self.ytrain, self.ytest = None, None, None, None
self.featurenames = [f’feature{i}’ for i in range(n_features)]

def generate_data(self):
«»»Generate synthetic classification dataset»»»
X, y = make_classification(
nsamples=self.nsamples,
nfeatures=self.nfeatures,
n_informative=15,
n_redundant=5,
randomstate=self.randomstate
)

self.Xtrain, self.Xtest, self.ytrain, self.ytest = traintestsplit(
X, y, testsize=0.2, randomstate=self.random_state
)

return f»Dataset generated: {self.Xtrain.shape[0]} train samples, {self.Xtest.shape[0]} test samples»

def getdatasummary(self):
«»»Return summary statistics of the dataset»»»
if self.X_train is None:
return «No data generated yet. Please generate data first.»

summary = {
«trainsamples»: self.Xtrain.shape[0],
«testsamples»: self.Xtest.shape[0],
«features»: self.X_train.shape[1],
«class_distribution»: {
«train»: {0: int(np.sum(self.ytrain == 0)), 1: int(np.sum(self.ytrain == 1))},
«test»: {0: int(np.sum(self.ytest == 0)), 1: int(np.sum(self.ytest == 1))}
}
}
return json.dumps(summary, indent=2)

class XGBoostManager:
«»»Manages XGBoost model training and evaluation»»»

def init(self):
self.model = None
self.predictions = None
self.accuracy = None
self.feature_importance = None

def trainmodel(self, Xtrain, y_train, params=None):
«»»Train XGBoost classifier»»»
if params is None:
params = {
‘max_depth’: 6,
‘learning_rate’: 0.1,
‘n_estimators’: 100,
‘objective’: ‘binary:logistic’,
‘random_state’: 42
}

self.model = xgb.XGBClassifier(params)
self.model.fit(Xtrain, ytrain)

return f»Model trained successfully with {params[‘n_estimators’]} estimators»

def evaluatemodel(self, Xtest, y_test):
«»»Evaluate model performance»»»
if self.model is None:
return «No model trained yet. Please train model first.»

self.predictions = self.model.predict(X_test)
self.accuracy = accuracyscore(ytest, self.predictions)

report = classificationreport(ytest, self.predictions, output_dict=True)

result = {
«accuracy»: float(self.accuracy),
«precision»: float(report[‘1’][‘precision’]),
«recall»: float(report[‘1’][‘recall’]),
«f1_score»: float(report[‘1’][‘f1-score’])
}

return json.dumps(result, indent=2)

def getfeatureimportance(self, featurenames, topn=10):
«»»Get top N most important features»»»
if self.model is None:
return «No model trained yet.»

importance = self.model.featureimportances
featureimpdf = pd.DataFrame({
‘feature’: feature_names,
‘importance’: importance
}).sort_values(‘importance’, ascending=False)

return featureimpdf.head(topn).tostring()

def visualizeresults(self, Xtest, ytest, featurenames):
«»»Create visualizations for model results»»»
if self.model is None:
print(«No model trained yet.»)
return

fig, axes = plt.subplots(2, 2, figsize=(15, 12))

cm = confusionmatrix(ytest, self.predictions)
sns.heatmap(cm, annot=True, fmt=’d’, cmap=’Blues’, ax=axes[0, 0])
axes[0, 0].set_title(‘Confusion Matrix’)
axes[0, 0].set_ylabel(‘True Label’)
axes[0, 0].set_xlabel(‘Predicted Label’)

importance = self.model.featureimportances
indices = np.argsort(importance)[-10:]
axes[0, 1].barh(range(10), importance[indices])
axes[0, 1].set_yticks(range(10))
axes[0, 1].setyticklabels([featurenames[i] for i in indices])
axes[0, 1].set_title(‘Top 10 Feature Importances’)
axes[0, 1].set_xlabel(‘Importance’)

axes[1, 0].hist([y_test, self.predictions], label=[‘True’, ‘Predicted’], bins=2)
axes[1, 0].set_title(‘True vs Predicted Distribution’)
axes[1, 0].legend()
axes[1, 0].set_xticks([0, 1])

train_sizes = [0.2, 0.4, 0.6, 0.8, 1.0]
train_scores = [0.7, 0.8, 0.85, 0.88, 0.9]
axes[1, 1].plot(trainsizes, trainscores, marker=’o’)
axes[1, 1].set_title(‘Learning Curve (Simulated)’)
axes[1, 1].set_xlabel(‘Training Set Size’)
axes[1, 1].set_ylabel(‘Accuracy’)
axes[1, 1].grid(True)

plt.tight_layout()
plt.show()

def createmlagent(datamanager, xgbmanager):
«»»Create LangChain agent with ML tools»»»

tools = [
Tool(
name=»GenerateData»,
func=lambda x: datamanager.generatedata(),
description=»Generate synthetic dataset for training. No input needed.»
),
Tool(
name=»DataSummary»,
func=lambda x: datamanager.getdata_summary(),
description=»Get summary statistics of the dataset. No input needed.»
),
Tool(
name=»TrainModel»,
func=lambda x: xgbmanager.trainmodel(
datamanager.Xtrain, datamanager.ytrain
),
description=»Train XGBoost model on the dataset. No input needed.»
),
Tool(
name=»EvaluateModel»,
func=lambda x: xgbmanager.evaluatemodel(
datamanager.Xtest, datamanager.ytest
),
description=»Evaluate trained model performance. No input needed.»
),
Tool(
name=»FeatureImportance»,
func=lambda x: xgbmanager.getfeature_importance(
datamanager.featurenames, top_n=10
),
description=»Get top 10 most important features. No input needed.»
)
]

return tools

def run_tutorial():
«»»Execute the complete tutorial»»»

print(«=» * 80)
print(«ADVANCED LANGCHAIN + XGBOOST TUTORIAL»)
print(«=» * 80)

datamgr = DataManager(nsamples=1000, n_features=20)
xgb_mgr = XGBoostManager()

tools = createmlagent(datamgr, xgbmgr)

print(«1. Generating Dataset…»)
result = tools[0].func(«»)
print(result)

print(«2. Dataset Summary:»)
summary = tools[1].func(«»)
print(summary)

print(«3. Training XGBoost Model…»)
train_result = tools[2].func(«»)
print(train_result)

print(«4. Evaluating Model:»)
eval_result = tools[3].func(«»)
print(eval_result)

print(«5. Top Feature Importances:»)
importance = tools[4].func(«»)
print(importance)

print(«6. Generating Visualizations…»)
xgbmgr.visualizeresults(
datamgr.Xtest,
datamgr.ytest,
datamgr.featurenames
)

print(«=» * 80)
print(«TUTORIAL COMPLETE!»)
print(«=» * 80)
print(«nKey Takeaways:»)
print(«- LangChain tools can wrap ML operations»)
print(«- XGBoost provides powerful gradient boosting»)
print(«- Agent-based approach enables conversational ML pipelines»)
print(«- Easy integration with existing ML workflows»)

if name == «main«:
run_tutorial()
«`

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

1. Какие основные этапы включает в себя создание комплексного конвейера машинного обучения с использованием LangChain и XGBoost?

В статье описаны следующие этапы:
* Генерация данных с помощью LangChain и функции `make_classification` из `scikit-learn`.
* Предварительная обработка данных с помощью `traintestsplit`.
* Обучение модели XGBoost на обучающей выборке.
* Оценка производительности модели на тестовой выборке.
* Визуализация результатов с помощью `matplotlib` и `seaborn`.

2. Какие классы и функции используются для управления данными и моделью XGBoost в этом конвейере?

В статье упоминаются следующие классы и функции:
* `DataManager` — управляет генерацией и предварительной обработкой данных.
* `XGBoostManager` — управляет обучением и оценкой модели XGBoost.
* `createmlagent` — создаёт агента LangChain с инструментами машинного обучения.
* `run_tutorial` — выполняет полный туториал.

3. Какие инструменты LangChain используются для создания диалогового интерфейса в этом конвейере?

В статье говорится, что для создания диалогового интерфейса используются модульные инструменты LangChain. В частности, упоминается создание агента LangChain с инструментами машинного обучения с помощью функции `createmlagent`.

4. Какие преимущества предоставляет использование LangChain в сочетании с XGBoost для автоматизированных рабочих процессов в области науки о данных?

В статье утверждается, что использование LangChain в сочетании с XGBoost упрощает эксперименты, повышает интерпретируемость и открывает путь для более интеллектуальных, управляемых диалогом рабочих процессов в области науки о данных. Это достигается за счёт того, что LangChain может служить диалоговым интерфейсом для выполнения сложных операций машинного обучения.

Источник