【人工智能】项目案例分析:生产环境中部署机器学习模型

  🏆🏆欢迎大家来到我们的天空🏆🏆

🏆 作者简介:我们的天空

🏆《头衔》:大厂高级软件测试工程师,阿里云开发者社区专家博主,CSDN人工智能领域新星创作者。
🏆《博客》:人工智能,深度学习,机器学习,python,自然语言处理,AIGC等分享。

所属的专栏:TensorFlow项目开发实战人工智能技术
🏆🏆主页:我们的天空

一、项目背景

假设我们正在为一个金融科技公司开发一个机器学习项目,该项目旨在通过预测客户的信用风险来优化贷款审批流程。我们的目标是在生产环境中部署一个经过训练的机器学习模型,以提供实时或批量的信用评分预测服务。

二、项目结构细化

1. 数据准备与预处理

  • 数据收集: 假设数据已经收集完成。
  • 数据清洗: 使用Pandas处理缺失值、异常值等。
  • 特征工程: 选择并构建有助于模型预测的特征。

2. 模型开发与训练

  • 模型选择: 选择随机森林算法。
  • 模型训练: 使用训练集数据训练模型。
  • 模型评估: 使用验证集评估模型性能。

3. 模型部署

  • 模型持久化: 使用pickle保存模型。
  • 环境配置: 确保生产环境与训练环境一致。
  • API开发: 使用Flask开发RESTful API。
  • 容器化: 使用Docker将模型和API服务打包成容器。
  • 部署: 将容器部署到云服务平台。

4. 监控与维护

  • 性能监控: 监控模型的准确性、延迟和吞吐量。
  • 日志记录: 记录系统错误和关键数据。
  • 模型更新: 定期更新模型。

三、项目结构示例 

credit-risk-prediction/
│
├── app/
│   ├── __init__.py
│   ├── app.py
│   ├── data_preprocessing.py
│   ├── model_saving.py
│   ├── model_training.py
│   └── requirements.txt
│
├── models/
│   └── random_forest_model.pkl
│
├── data/
│   ├── data.csv
│   └── new_data.csv
│
├── monitoring/
│   ├── prometheus/
│   │   └── prometheus.yml
│   └── grafana/
│       └── dashboard.json
│
├── logs/
│
├── backups/
│
├── Dockerfile
│
└── README.md

说明

  1. app/: 包含Flask应用的所有源代码和配置文件。

    • __init__.py: Flask应用初始化文件。
    • app.py: 主Flask应用文件。
    • data_preprocessing.py: 数据预处理脚本。
    • model_saving.py: 模型保存脚本。
    • model_training.py: 模型训练脚本。
    • requirements.txt: 所需的Python包列表。
  2. models/: 存储训练好的模型文件。

    • random_forest_model.pkl: 训练好的随机森林模型。
  3. data/: 存储原始数据和新数据。

    • data.csv: 初始数据集。
    • new_data.csv: 新数据集,用于模型更新。
  4. monitoring/: 存储监控配置文件。

    • prometheus/: Prometheus配置文件。
      • prometheus.yml: Prometheus配置文件。
    • grafana/: Grafana配置文件。
      • dashboard.json: Grafana仪表板配置文件。
  5. logs/: 存储应用日志。

    • 此目录将在运行时由Flask应用自动创建。
  6. backups/: 存储备份文件。

    • 此目录将在运行时由备份脚本自动创建。
  7. Dockerfile: Docker镜像构建文件。

  8. README.md: 项目文档和说明。

四、源代码示例

1. 数据预处理 (data_preprocessing.py)

import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

def load_data(file_path):
    """Load data from a CSV file."""
    return pd.read_csv(file_path)

def preprocess_data(df):
    # Define preprocessing for numeric columns (scale them)
    numeric_features = ['Age', 'Income', 'DebtRatio']
    numeric_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='median')),
        ('scaler', StandardScaler())])

    # Define preprocessing for categorical columns (one-hot encode them)
    categorical_features = ['Gender', 'MaritalStatus']
    categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
        ('onehot', OneHotEncoder(handle_unknown='ignore'))])

    # Combine preprocessing steps
    preprocessor = ColumnTransformer(
        transformers=[
            ('num', numeric_transformer, numeric_features),
            ('cat', categorical_transformer, categorical_features)])

    # Preprocess the data
    df = pd.DataFrame(preprocessor.fit_transform(df), columns=numeric_features + list(categorical_transformer.named_steps['onehot'].get_feature_names_out()))
    
    return df

 2. 模型训练 (model_training.py)

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score, classification_report

def train_model(X, y):
    # Split the dataset into training and testing sets
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # Define the parameter grid for hyperparameter tuning
    param_grid = {
        'n_estimators': [50, 100, 200],
        'max_depth': [None, 10, 20, 30],
        'min_samples_split': [2, 5, 10],
        'min_samples_leaf': [1, 2, 4]
    }

    # Create a random forest classifier
    model = RandomForestClassifier(random_state=42)

    # Perform grid search cross validation
    grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, scoring='accuracy')
    grid_search.fit(X_train, y_train)

    # Get the best model
    best_model = grid_search.best_estimator_

    # Evaluate the model on the test set
    y_pred = best_model.predict(X_test)
    print("Model Accuracy:", accuracy_score(y_test, y_pred))
    print(classification_report(y_test, y_pred))

    return best_model

 3. 模型保存 (model_saving.py)

import joblib

def save_model(model, filename):
    """Save the trained model to disk."""
    joblib.dump(model, filename)

def load_model(filename):
    """Load the trained model from disk."""
    return joblib.load(filename)

4. Flask API (app.py)

from flask import Flask, request, jsonify
from data_preprocessing import preprocess_data
from model_saving import load_model
import pandas as pd

app = Flask(__name__)

@app.route('/predict', methods=['POST'])
def make_prediction():
    data = request.json
    df = pd.DataFrame(data, index=[0])
    
    # Preprocess the incoming data
    preprocessed_df = preprocess_data(df)
    
    # Load the trained model
    model = load_model('models/random_forest_model.pkl')
    
    # Make predictions
    prediction = model.predict(preprocessed_df)
    
    return jsonify({'prediction': int(prediction[0])})

if __name__ == '__main__':
    app.run(debug=True)

5. Dockerfile

# Use an official Python runtime as a parent image
FROM python:3.8-slim-buster

# Set the working directory in the container
WORKDIR /app

# Copy the current directory contents into the container at /app
COPY . /app

# Install any needed packages specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Make port 5000 available to the world outside this container
EXPOSE 5000

# Define environment variable
ENV NAME World

# Run app.py when the container launches
CMD ["python", "app.py"]

 6. requirements.txt

flask==2.0.2
numpy==1.21.2
pandas==1.3.3
scikit-learn==0.24.2
joblib==1.0.1

五、部署步骤

  1.训练模型:

python model_training.py

  2.保存模型:

python model_saving.py

  3.构建 Docker 镜像:

docker build -t credit-risk-prediction .

  4.运行 Docker 容器:

docker run -p 5000:5000 credit-risk-prediction

  5.测试 API

curl -X POST -H "Content-Type: application/json" -d '{"Age":30,"Income":50000,"DebtRatio":0.2,"Gender":"Male","MaritalStatus":"Single"}' http://localhost:5000/predict

以上步骤涵盖了从数据预处理、模型训练、模型保存、API开发到最终部署的完整流程。在实际部署前,还需要进行详细的单元测试、集成测试以及性能测试来确保系统的稳定性和准确性。

六、监控与维护

  • 性能监控: 使用Prometheus、Grafana。
  • 日志记录: 使用ELK Stack (Elasticsearch, Logstash, Kibana)。
  • 模型更新: 定期根据新数据重新训练模型。 

1. 性能监控

Prometheus 和 Grafana 配置

 1.安装 Prometheus

wget https://github.com/prometheus/prometheus/releases/download/v2.39.0/prometheus-2.39.0.linux-amd64.tar.gz
tar xvf prometheus-2.39.0.linux-amd64.tar.gz
cd prometheus-2.39.0.linux-amd64

2.配置 Prometheus:

  • 创建 prometheus.yml 文件:
global:
  scrape_interval: 5s
  evaluation_interval: 5s

scrape_configs:
  - job_name: 'credit-risk'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['localhost:5000']

 3.启动 Prometheus:

./prometheus --config.file=prometheus.yml

4. 安装 Grafana:

wget https://dl.grafana.com/oss/release/grafana-9.4.7.linux-amd64.tar.gz
tar xvf grafana-9.4.7.linux-amd64.tar.gz
cd grafana-9.4.7

 5.启动 Grafana:

./bin/grafana-server web

6. 配置 Flask 应用以暴露监控数据:

from prometheus_client import start_http_server, Counter

# 初始化计数器
request_counter = Counter('request_total', 'Total number of requests.')

# 添加监控数据暴露
@app.after_request
def after_request(response):
    request_counter.inc()
    return response

if __name__ == '__main__':
    # 启动 Prometheus HTTP server
    start_http_server(8000)
    app.run(debug=True)

2. 日志记录

ELK Stack 配置

 1.安装 Elasticsearch:        

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.5.1-linux-x86_64.tar.gz
tar xvf elasticsearch-8.5.1-linux-x86_64.tar.gz
cd elasticsearch-8.5.1

 2.启动 Elasticsearch:

./bin/elasticsearch

3. 安装 Logstash:

wget https://artifacts.elastic.co/downloads/logstash/logstash-8.5.1-linux-x86_64.tar.gz
tar xvf logstash-8.5.1-linux-x86_64.tar.gz
cd logstash-8.5.1

4.配置 Logstash:

  • 创建 logstash.conf 文件
input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "credit-risk-%{+YYYY.MM.dd}"
  }
}

5. 启动 Logstash:

./bin/logstash -f logstash.conf

6.安装 Kibana:

wget https://artifacts.elastic.co/downloads/kibana/kibana-8.5.1-linux-x86_64.tar.gz
tar xvf kibana-8.5.1-linux-x86_64.tar.gz
cd kibana-8.5.1

7.启动 Kibana:

./bin/kibana

8.配置 Flask 应用以记录日志

import logging
from logging.handlers import SysLogHandler
from logstash_formatter import LogstashFormatterV1

# 配置日志记录
handler = SysLogHandler(address='/dev/log')
handler.setFormatter(LogstashFormatterV1())
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)

@app.route('/predict', methods=['POST'])
def make_prediction():
    # ...
    # 在这里记录日志
    app.logger.info(f"Prediction made: {int(prediction[0])}")
    # ...

3.模型更新

 1.创建模型更新脚本

# model_update.py
from model_training import train_model
from data_preprocessing import load_data, preprocess_data
from model_saving import save_model

def update_model():
    # Load and preprocess new data
    df = load_data('new_data.csv')
    df = preprocess_data(df)
    
    # Train new model
    X, y = df.drop('Risk', axis=1), df['Risk']
    new_model = train_model(X, y)
    
    # Save the new model
    save_model(new_model, 'models/random_forest_model.pkl')
    
if __name__ == '__main__':
    update_model()

2.定期执行模型更新脚本:

  • 使用cron定时任务:
crontab -e
# Add the following line to run the script every day at midnight
0 0 * * * python /path/to/model_update.py

七、总结

以上步骤覆盖了性能监控、日志记录和模型更新的关键组件和配置。这些组件可以帮助您更好地理解和维护部署在生产环境中的机器学习模型。

请注意,上述配置和代码示例仅供参考,您可能需要根据自己的具体需求进行调整。在生产环境中,还需要考虑安全性和稳定性等方面的问题,例如使用HTTPS、设置防火墙规则、备份数据等。

 如果文章内容对您有所触动,别忘了点赞、关注,收藏!

推荐阅读:

1.【人工智能】项目实践与案例分析:利用机器学习探测外太空中的系外行星

2.【人工智能】利用TensorFlow.js在浏览器中实现一个基本的情感分析系统

3.【人工智能】TensorFlow lite介绍、应用场景以及项目实践:使用TensorFlow Lite进行数字分类

4.【人工智能】项目案例分析:使用LSTM生成图书脚本

5.【人工智能】案例分析和项目实践:使用高斯过程回归预测股票价格

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@我们的天空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值