基于abalone数据集预测的机器学习实战:从数据清洗到模型优化

1次阅读
没有评论

共计 1955 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

背景介绍

abalone 数据集是经典的生物学数据集,记录了鲍鱼的物理测量数据(如长度、直径、重量等)及其对应的年龄(通过贝壳环数推算)。该数据集常用于回归任务,预测鲍鱼年龄对养殖业有重要价值——年龄直接影响市场价格和繁殖周期。数据集包含 4177 条记录,8 个特征(1 个分类变量 ” 性别 ”,7 个连续变量),目标变量为环数(年龄 +1.5)。

基于 abalone 数据集预测的机器学习实战:从数据清洗到模型优化

数据预处理

缺失值处理

  1. 检查缺失值:df.isnull().sum() 显示无缺失,但实际数据中可能存在 0 或负值等不合理数据
  2. 异常值处理:通过箱线图发现体重特征存在极端值,使用 IQR 方法过滤(代码示例):
Q1 = df['Whole weight'].quantile(0.25)
Q3 = df['Whole weight'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['Whole weight'] < (Q1 - 1.5*IQR)) | (df['Whole weight'] > (Q3 + 1.5*IQR)))]

特征编码

  1. 性别特征(M/F/I)采用 One-Hot 编码,避免序数效应
  2. 连续特征保持原始数值,后续进行标准化

特征工程

特征选择

  1. 通过 Pearson 相关系数矩阵发现 ”Shell weight” 与目标变量相关性最高(0.63)
  2. 使用随机森林的特征重要性评估,发现三大关键特征:

  3. Shell weight

  4. Diameter
  5. Height

特征变换

  1. 对连续特征使用 StandardScaler 标准化
  2. 尝试创建新特征:” 体积估算值 ” = Length * Diameter * Height

模型选择与训练

对比三种基础模型在 5 折交叉验证下的表现:

  1. 线性回归:RMSE=2.31,R²=0.52
  2. 决策树:RMSE=2.05,R²=0.62
  3. 随机森林:RMSE=1.89,R²=0.68(表现最佳)

模型优化

网格搜索调参

针对随机森林的关键参数进行网格搜索:

param_grid = {'n_estimators': [100, 200],
    'max_depth': [None, 10, 20],
    'min_samples_split': [2, 5]
}
grid_search = GridSearchCV(estimator=rf, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)

最优参数组合:{'max_depth': 20, 'min_samples_split': 2, 'n_estimators': 200}

提升技巧

  1. 使用 Early Stopping 防止过拟合
  2. 添加 Bagging 增强模型稳定性

完整代码实现

# 数据加载与预处理
import pandas as pd
from sklearn.model_selection import train_test_split

df = pd.read_csv('abalone.csv')
# 异常值处理代码...
X = pd.get_dummies(df.drop('Rings', axis=1), columns=['Sex'])
y = df['Rings']

# 特征工程
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 模型训练
from sklearn.ensemble import RandomForestRegressor
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2)
rf = RandomForestRegressor(n_estimators=200, max_depth=20)
rf.fit(X_train, y_train)

# 评估
from sklearn.metrics import mean_squared_error
preds = rf.predict(X_test)
print(f'RMSE: {mean_squared_error(y_test, preds, squared=False):.2f}')

避坑指南

  1. 数据泄露:确保 scaler 只 fit 训练数据
  2. 类别不平衡:年龄分布右偏时考虑对数变换
  3. 特征共线性:检查 VIF 值,必要时使用 PCA 降维

性能评估

优化后的随机森林达到:

  • RMSE: 1.82
  • R²: 0.71
  • 特征重要性分析显示 Shell weight 贡献度达 42%

结语

通过系统性的特征工程和模型调优,我们成功将预测误差降低到 1.82 个环数。建议读者尝试:

  1. 添加其他领域知识特征(如生长率计算公式)
  2. 测试 XGBoost 等更复杂模型
  3. 使用 SHAP 值进行可解释性分析

完整的 Jupyter Notebook 和数据集已上传 GitHub 仓库(虚构链接),欢迎交流改进建议。

正文完
 0
评论(没有评论)