机器学习入门实战:Python 3.12 + scikit-learn 1.5 完成房价预测与分类任务
·
机器学习入门实战: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监控模型性能 - 定期进行数据漂移检测
更多推荐




所有评论(0)