机器学习入门实战:Python 3.12 + scikit-learn 1.5 完成房价预测与分类任务

1. 环境准备与工具链搭建

工欲善其事,必先利其器。在开始机器学习实战前,我们需要配置高效的开发环境。以下是推荐的工具链组合:

# 验证Python版本
import sys
print(f"Python版本: {sys.version}")

# 检查scikit-learn安装
try:
    import sklearn
    print(f"scikit-learn版本: {sklearn.__version__}")
except ImportError:
    print("scikit-learn未安装")

核心工具选择依据

  • Jupyter Notebook :交互式开发的首选,特别适合数据探索和模型调试
  • Python 3.12 :最新稳定版带来的模式匹配等特性可提升代码可读性
  • scikit-learn 1.5 :新增的HistGradientBoosting对大规模数据支持更好

提示:使用conda创建独立环境可避免依赖冲突:

conda create -n ml_env python=3.12
conda activate ml_env
pip install scikit-learn==1.5.0 pandas matplotlib notebook

2. 数据科学工作流全解析

完整的机器学习项目遵循标准化流程,我们以房价预测为例展示关键步骤:

2.1 数据加载与探索

import pandas as pd
from sklearn.datasets import fetch_california_housing

# 加载加州房价数据集
housing = fetch_california_housing(as_frame=True)
df = housing.frame

# 数据概览
print(f"数据集形状: {df.shape}")
print("\n前5行数据:")
display(df.head())

# 统计摘要
print("\n数值特征统计:")
display(df.describe())

探索性分析技巧

  • 使用 seaborn.pairplot() 快速可视化特征间关系
  • 通过 missingno 矩阵识别缺失值模式
  • 计算特征与目标的Pearson相关系数

2.2 特征工程实战

特征处理是模型性能的关键决定因素:

from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# 数值特征标准化
num_features = ['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 
               'Population', 'AveOccup', 'Latitude', 'Longitude']
num_transformer = Pipeline(steps=[
    ('scaler', StandardScaler())
])

# 构建预处理管道
preprocessor = ColumnTransformer(
    transformers=[
        ('num', num_transformer, num_features)
    ])

# 应用转换
X = df.drop('MedHouseVal', axis=1)
y = df['MedHouseVal']
X_preprocessed = preprocessor.fit_transform(X)

特征工程进阶技巧

  • 使用 FeatureHasher 处理高基数分类特征
  • 通过 PolynomialFeatures 创建交互特征
  • 应用 TargetEncoder 进行有监督编码

3. 回归模型实战:加州房价预测

3.1 线性回归基础实现

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(
    X_preprocessed, y, test_size=0.2, random_state=42)

# 模型训练与评估
lr = LinearRegression()
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)

mse = mean_squared_error(y_test, y_pred)
print(f"线性回归MSE: {mse:.4f}")
print(f"模型系数: {lr.coef_}")

3.2 集成方法对比

from sklearn.ensemble import RandomForestRegressor, HistGradientBoostingRegressor

models = {
    "随机森林": RandomForestRegressor(n_estimators=100, random_state=42),
    "梯度提升": HistGradientBoostingRegressor(max_iter=100, random_state=42)
}

results = {}
for name, model in models.items():
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    results[name] = mse
    print(f"{name} MSE: {mse:.4f}")

模型选择建议

  • 小数据集:优先尝试线性模型和SVM
  • 中等数据:随机森林和梯度提升树
  • 大数据:使用HistGradientBoosting节省内存

4. 分类任务实战:乳腺癌检测

4.1 数据准备与基线模型

from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression

# 加载数据集
cancer = load_breast_cancer()
X = cancer.data
y = cancer.target

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 逻辑回归模型
logreg = LogisticRegression(max_iter=1000)
logreg.fit(X_scaled, y)

# 特征重要性分析
importance = pd.DataFrame({
    'feature': cancer.feature_names,
    'coef': logreg.coef_[0]
}).sort_values('coef', ascending=False)
display(importance.head(10))

4.2 模型评估与优化

from sklearn.metrics import classification_report, roc_auc_score
from sklearn.model_selection import cross_val_score

# 交叉验证评估
scores = cross_val_score(logreg, X_scaled, y, cv=5, scoring='roc_auc')
print(f"ROC AUC平均得分: {scores.mean():.3f} (±{scores.std():.3f})")

# 分类报告
y_pred = logreg.predict(X_scaled)
print(classification_report(y, y_pred, target_names=cancer.target_names))

性能提升技巧

  • 使用 GridSearchCV 进行超参数调优
  • 通过 SMOTE 处理类别不平衡
  • 尝试 SelectFromModel 进行特征选择

5. 模型部署与生产化

5.1 模型持久化方案

import joblib
from datetime import datetime

# 保存预处理器和模型
model_assets = {
    'preprocessor': preprocessor,
    'model': logreg,
    'metadata': {
        'version': '1.0',
        'train_date': datetime.now().isoformat()
    }
}

joblib.dump(model_assets, 'breast_cancer_model.joblib')

# 加载示例
loaded_assets = joblib.load('breast_cancer_model.joblib')

5.2 构建预测API

from fastapi import FastAPI
import numpy as np

app = FastAPI()

@app.post("/predict")
async def predict(features: list):
    """接收特征数组返回预测结果"""
    X = np.array(features).reshape(1, -1)
    X_processed = loaded_assets['preprocessor'].transform(X)
    proba = loaded_assets['model'].predict_proba(X_processed)
    return {
        'prediction': int(loaded_assets['model'].predict(X_processed)[0]),
        'probability': float(proba[0][1]),
        'model_version': loaded_assets['metadata']['version']
    }

生产环境建议

  • 使用 MLflow 进行全生命周期管理
  • 通过 Prometheus 监控模型性能
  • 定期进行数据漂移检测
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐