📢 转载信息
原文作者:Iván Palomares Carrascosa
Image by Editor
# 引言
渴望开始你的第一个可管理机器学习项目,但对如何使用 Python 中流行的 Pandas 和 Scikit-learn 库感到迷茫?别再观望了。
在本文中,我将带领你完成一个温和、对初学者友好的机器学习项目,在此项目中我们将共同构建一个回归模型,根据社会经济属性来预测员工收入。在此过程中,我们将学习一些关键的机器学习概念和必要的技巧。
# 从原始数据集到干净的数据框
首先,与任何基于 Python 的项目一样,一个好的实践是从导入我们在整个过程中将要使用的必要库、模块和组件开始:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.impute import SimpleImputer from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error import joblib
接下来的说明将加载一个公开可用的数据集(位于此存储库)到 Pandas DataFrame 对象中:一个用于加载、分析和管理完全结构化数据(即表格格式数据)的整洁数据结构。加载后,我们会查看其基本属性和数据类型。
url = "https://raw.githubusercontent.com/gakudo-ai/open-datasets/main/employees_dataset_with_missing.csv" df = pd.read_csv(url) print(df.head()) print(df.info())
你会注意到该数据集包含 1000 个条目或实例——即描述 1000 名员工的数据——但对于大多数属性(如年龄、收入等),实际值少于 1000 个。为什么呢?因为 该数据集存在缺失值,这是现实世界数据中的常见问题,需要处理。
在我们的项目中,我们将目标设定为根据其余属性预测员工的收入。因此,我们将采用丢弃该属性值缺失的行的(即员工)方法。虽然对于预测属性,处理缺失值并进行估计或插补有时是可行的,但对于目标变量,我们需要完全已知的标签来训练我们的机器学习模型:关键在于,我们的机器学习模型通过接触具有已知预测输出的示例来进行学习。
还有一个专门的说明,仅检查缺失值:
print(df.isna().sum())
因此,让我们清理我们的 DataFrame,使其目标变量(收入)不包含缺失值:此代码将删除目标变量缺失的条目。
target = "income" train_df = df.dropna(subset=[target]) X = train_df.drop(columns=[target]) y = train_df[target]
那么,其余属性中的缺失值该怎么办呢?我们稍后会处理,但首先,我们需要将数据集分成两个主要子集:一个用于模型训练的训练集,以及一个用于评估模型在训练后性能的测试集,后者包含与模型训练期间看到的示例不同的数据。Scikit-learn 提供了一个单一指令来进行这种随机拆分:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
下一步更进一步,将数据转化为适合训练机器学习模型的绝佳形式:构建一个预处理管道。通常,此预处理应区分数值和分类特征,以便对每种类型的特征沿管道执行不同的预处理任务。例如,数值特征通常需要缩放,而分类特征可能需要映射或编码为数值,以便机器学习模型能够理解。为了说明起见,下面的代码演示了构建预处理管道的完整过程。它包括对数值和分类特征的自动识别,以便每种类型都能得到正确处理。
numeric_features = X.select_dtypes(include=["int64", "float64"]).columns categorical_features = X.select_dtypes(exclude=["int64", "float64"]).columns numeric_transformer = Pipeline([ ("imputer", SimpleImputer(strategy="median")) ]) categorical_transformer = Pipeline([ ("imputer", SimpleImputer(strategy="most_frequent")), ("onehot", OneHotEncoder(handle_unknown="ignore")) ]) preprocessor = ColumnTransformer([ ("num", numeric_transformer, numeric_features), ("cat", categorical_transformer, categorical_features) ])
你可以在这篇文章中了解更多关于数据预处理管道的信息。
将此管道应用于 DataFrame 后,将得到一个干净的、可供机器学习使用的版本。但我们将在下一步应用它,届时我们将把数据预处理和机器学习模型训练封装到一个单一的、总体的管道中。
# 从干净的数据框到准备部署的模型
现在我们将定义一个总体的管道,它:
- 应用先前定义的预处理过程——保存在
preprocessor变量中——分别处理数值和分类属性。 - 训练一个回归模型,即随机森林回归器,使用预处理后的训练数据来预测收入。
model = Pipeline([ ("preprocessor", preprocessor), ("regressor", RandomForestRegressor(random_state=42)) ]) model.fit(X_train, y_train)
重要的是,训练阶段只接收我们在拆分时创建的训练子集,而不是整个数据集。
现在,我们采用数据的另一个子集,即测试集,并用它来评估模型在这些示例员工上的性能。我们将使用平均绝对误差(MAE)作为我们的评估指标:
preds = model.predict(X_test) mae = mean_absolute_error(y_test, preds) print(f"\nModel MAE: {mae:.2f}")
你可能会得到一个大约 13000 的 MAE 值,这尚可接受但并不出色,考虑到大多数收入在 60K-90K 范围内。不过,对于第一个机器学习模型来说,这已经很不错了!
最后,我将向你展示如何将训练好的模型保存到文件中以便将来部署。
joblib.dump(model, "employee_income_model.joblib") print("Model saved as employee_income_model.joblib")
将训练好的模型保存到 .joblib 文件中对于将来的部署非常有用,因为它允许你立即重新加载和重用它,而无需从头开始重新训练。可以将其视为将所有预处理管道和训练好的模型“冻结”到一个可移植对象中。未来快速使用的部署选项包括将其插入到简单的 Python 脚本或笔记本中,或者使用 Streamlit、Gradio 或 Flask 等工具构建轻量级 Web 应用程序。
# 总结
在本文中,我们共同构建了一个用于回归的入门级机器学习模型,旨在预测员工收入,概述了从原始数据集到干净、预处理的 DataFrame,再到准备部署的模型的必要步骤。
Iván Palomares Carrascosa 是一位在人工智能、机器学习、深度学习和大型语言模型(LLMs)领域的领导者、作家、演讲者和顾问。他负责培训和指导他人如何在现实世界中利用人工智能。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
评论区