Python机器学习:从数据获取到模型部署
目录
- 🛠️ 端到端机器学习项目示例
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%用于模型评估。
特征工程
有时,数据中的某些特征并不能直接用于模型训练,尤其是类别型特征。在这种情况下,使用LabelEncoder
或OneHotEncoder
将类别型数据转换为数值形式是必要的。
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
用于将类别型特征Neighborhood
和HouseStyle
转化为数值形式。转化后的特征被拼接回原始的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
命令来启动服务。