Python机器学习:从数据获取到模型部署

发布于:2024-10-09 ⋅ 阅读:(133) ⋅ 点赞:(0)

Python机器学习:从数据获取到模型部署

目录

  1. 🛠️ 端到端机器学习项目示例
    1.1 📊 数据获取与处理
    1.2 🧠 模型训练与评估
    1.3 🚀 部署模型(Flask或FastAPI集成)

1. 🛠️ 端到端机器学习项目示例

1.1 📊 数据获取与处理

机器学习项目的起点通常是数据的获取与处理。高质量的数据是模型成功的关键,而数据的处理过程是从原始数据到可供模型学习的重要阶段。本文将展示如何从公开数据源获取数据并进行预处理,以便进行后续的模型训练。

数据获取

以下代码展示了如何使用pandas库从CSV文件加载数据。假设使用的是Kaggle提供的房价预测数据集。

import pandas as pd

# 从CSV文件加载数据
data = pd.read_csv('housing_prices.csv')

# 查看数据结构
print(data.info())

# 查看前五行数据
print(data.head())

在这个示例中,pandas库提供了非常简便的数据加载方式,read_csv函数能够将CSV文件加载成DataFrame对象,这种格式的数据非常适合进行后续的清理和处理。

数据清洗与处理

原始数据通常包含一些不完整、异常或不适合直接输入到模型的数据,需要进行处理。在处理步骤中,常见的任务包括:处理缺失值、对类别型特征进行编码、标准化数值型特征等。

from sklearn.model_selection import train_test_split

# 删除有缺失值的行
data_cleaned = data.dropna()

# 特征和目标分离
X = data_cleaned.drop(columns=['Price'])
y = data_cleaned['Price']

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print(f"训练集样本数: {X_train.shape[0]}")
print(f"测试集样本数: {X_test.shape[0]}")

在这个数据清洗的过程中,首先通过dropna函数移除包含缺失值的行。然后,特征变量和目标变量被分离,特征存储在X中,目标存储在y中。最后,使用train_test_split将数据划分为训练集和测试集,确保模型训练时使用的是80%的数据,而剩余的20%用于模型评估。

特征工程

有时,数据中的某些特征并不能直接用于模型训练,尤其是类别型特征。在这种情况下,使用LabelEncoderOneHotEncoder将类别型数据转换为数值形式是必要的。

from sklearn.preprocessing import OneHotEncoder

# 对类别型特征进行独热编码
encoder = OneHotEncoder(sparse=False)
encoded_features = encoder.fit_transform(X_train[['Neighborhood', 'HouseStyle']])

# 将编码后的特征加入训练数据集中
X_train_encoded = pd.concat([X_train.drop(columns=['Neighborhood', 'HouseStyle']), 
                             pd.DataFrame(encoded_features)], axis=1)

在这里,OneHotEncoder用于将类别型特征NeighborhoodHouseStyle转化为数值形式。转化后的特征被拼接回原始的X_train数据中,最终生成可以供模型使用的训练数据。


1.2 🧠 模型训练与评估

在数据预处理完成后,下一步就是选择合适的机器学习模型并进行训练和评估。机器学习模型的选择取决于任务的性质,比如回归问题可以选择线性回归模型,而分类问题则可以选择逻辑回归或随机森林等模型。本文以回归任务为例,使用scikit-learn中的线性回归模型进行训练。

模型训练

以下代码展示了如何使用线性回归模型对房价进行预测。

from sklearn.linear_model import LinearRegression

# 初始化模型
model = LinearRegression()

# 训练模型
model.fit(X_train_encoded, y_train)

# 输出模型的截距和系数
print(f"模型截距: {model.intercept_}")
print(f"模型系数: {model.coef_}")

这里,LinearRegression模型通过fit函数对处理后的训练数据X_train_encoded和目标变量y_train进行训练。训练完成后,模型的截距和系数将输出,表示每个特征对预测结果的影响。

模型评估

模型训练完成后,需要通过测试集对模型进行评估,以了解其在未见过的数据上的表现。评估指标根据任务类型的不同有所差异,回归问题常用均方误差(MSE)和R平方值。

from sklearn.metrics import mean_squared_error, r2_score

# 对测试集进行预测
y_pred = model.predict(X_test)

# 计算均方误差和R平方值
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差: {mse}")
print(f"R平方值: {r2}")

均方误差(MSE)衡量预测值与真实值之间的差异,数值越小,模型的误差越小;R平方值(R²)则表示模型的解释能力,越接近1,模型的表现越好。

超参数调优

除了直接训练模型外,还可以通过超参数调优进一步提升模型的表现。以下是一个简单的交叉验证示例:

from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {'fit_intercept': [True, False], 'normalize': [True, False]}

# 进行网格搜索
grid_search = GridSearchCV(LinearRegression(), param_grid, cv=5)
grid_search.fit(X_train_encoded, y_train)

# 输出最佳参数
print(f"最佳参数: {grid_search.best_params_}")

通过GridSearchCV,可以自动选择不同的超参数组合,并使用交叉验证找到最佳的参数设置。这对于提升模型性能非常有帮助。


1.3 🚀 部署模型(Flask或FastAPI集成)

模型训练完成后,实际应用中需要将其部署到线上环境,以便让外部用户或系统调用。部署常见的方式是通过Flask或FastAPI将模型封装成API接口,使得客户端能够通过HTTP请求发送数据并获取预测结果。以下展示了如何使用Flask进行模型部署。

使用Flask部署模型

Flask是一个轻量级的Web框架,非常适合用于快速构建API接口。以下代码展示了如何将训练好的模型部署成一个Flask API。

from flask import Flask, request, jsonify
import pickle

# 初始化Flask应用
app = Flask(__name__)

# 加载训练好的模型
with open('model.pkl', 'rb') as f:
    model = pickle.load(f)

# 定义预测API
@app.route('/predict', methods=['POST'])
def predict():
    # 从POST请求中获取JSON数据
    data = request.json
    input_data = [data['feature1'], data['feature2'], data['feature3']]
    
    # 模型预测
    prediction = model.predict([input_data])
    
    # 返回预测结果
    return jsonify({'prediction': prediction[0]})

# 运行Flask应用
if __name__ == '__main__':
    app.run(debug=True)

在这个代码中,首先使用pickle加载了训练好的模型,然后通过Flask的route定义了一个POST接口。当客户端发送请求时,Flask会提取数据并调用模型的predict方法进行预测,最终返回结果。

使用FastAPI部署模型

FastAPI相比Flask有更高的性能,并且支持异步请求。以下是使用FastAPI部署模型的示例:

from fastapi import FastAPI
from pydantic import BaseModel
import pickle

# 定义请求体的数据结构
class InputData(BaseModel):
    feature1: float
    feature2: float
    feature3: float

# 初始化FastAPI应用
app = FastAPI()

# 加载训练好的模型
with open('model.pkl', 'rb') as f:
    model = pickle.load(f)

# 定义预测API
@app.post("/predict")
async def predict(data: InputData):
    # 提取输入数据
    input_data = [[data.feature1, data.feature2, data.feature3]]
    
    # 模型预测
    prediction = model.predict(input_data)
    
    # 返回预测结果
    return {'prediction': prediction[0]}

# 运行FastAPI应用(需在命令行使用:uvicorn script_name:app --reload)

FastAPI通过类型检查确保数据的格式正确,同时支持异步API请求,大大提升了并发处理的能力。要运行FastAPI应用,使用uvicorn

命令来启动服务。


网站公告

今日签到

点亮在社区的每一天
去签到