在机器学习领域,开发和测试模型可能是一项耗时且繁琐的工作。例如,可能需要编写几行代码,等待每个模型运行,然后继续训练和测试接下来的五个模型。这个过程可能会让人感到非常疲惫。然而,当遇到类似的问题时,感到非常沮丧,开始寻找一种简化工作流程的方法。经过四个月的努力——编码和修复bug,很高兴能与大家分享解决方案。
创建了一个名为MultiTrain的Python模块,它允许在同一个数据集上训练多个机器学习模型,以分析性能并选择最佳模型。本文将展示如何使用MultiTrain解决一个基本的回归问题。如果想了解如何将其用于分类问题,请访问此处。
今天将测试哪种机器学习模型最适合预测服装厂员工的生产力。数据集可以在Kaggle上下载。要开始处理数据集,需要导入一些库。确保数据集与ipynb文件在同一路径下,否则需要设置文件路径。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
df = pd.read_csv('garments_worker_productivity.csv')
print(df.head())
现在已经将数据集导入到Jupyter笔记本中,希望查看数据集的前五行。需要使用一行代码来实现这一点。
不会使用任何主要的数据预处理技术或EDA,因为重点是如何使用MultiTrain库一次性训练和测试大量模型。强烈建议对数据集执行一些主要的预处理技术,因为脏数据会影响模型的预测。它还会影响机器学习算法的性能。
在检查前五行时,应该发现一个名为“department”的列,其中“sewing”被错误地拼写为“sweing”。可以用这行代码修复这个拼写错误。
df["department"] = df["department"].str.replace('sweing', 'sewing')
在上述快照中,可以看到拼写错误已经被纠正。当运行以下代码行时,将发现“department”列有一些重复值,需要在开始预测之前处理这个问题。
print(f'Unique Values in Department before cleaning: {df.department.unique()}')
df['department'] = df.department.str.strip()
print(f'Unique Values in Department after cleaning: {df.department.unique()}')
让将数据集中的所有缺失值替换为整数0。
for i in df.columns:
if df[i].isnull().sum() != 0:
df[i] = df[i].fillna(0)
大多数scikit-learn算法无法处理分类数据,因此需要将包含分类数据的列转换为数值数据。有几种其他编码分类数据的方法,例如序数编码、目标编码、二进制编码、频率编码、均值编码等。这些方法都有优缺点,建议尽可能多地测试它们,以确定哪种方法最适合数据集。
正如之前提到的,将在本教程中使用标签编码器对分类列进行编码。首先,需要获取分类列列表。可以使用以下代码行来实现。
cat_col = []
num_col = []
for i in df.columns:
if df[i].dtypes == object:
cat_col.append(i)
else:
num_col.append(i)
#remove the target columns
num_col.remove('actual_productivity')
现在已经在cat_col变量中获得了分类列的列表。现在可以应用标签编码器来将分类数据编码为数值数据。
label = LabelEncoder()
for i in cat_col:
df[i] = label.fit_transform(df[i])
所有以前由NaN表示的缺失值在“wip”列中现在已更改为0,三个分类列——季度、部门和天都已进行标签编码。
可能仍然需要修复数据集中的异常值,并根据自己的需要进行一些特征工程。
在开始模型训练之前,需要将数据集分割为其训练特征和标签。
features = df.drop('actual_productivity', axis=1)
labels = df['actual_productivity']
现在,需要将数据集分割为训练集和测试集。训练集用于训练机器学习算法,测试集用于评估它们的性能。
train = MultiRegressor(random_state=42,
cores=-1,
verbose=True)
split = train.split(X=features,
y=labels,
sizeOfTest=0.2,
randomState=42,
normalize='StandardScaler',
columns_to_scale=num_col,
shuffle=True)
split方法中的normalize参数允许通过传递任何选择的缩放器来缩放数值列;columns_to_scale参数然后接收想要缩放的列的列表,而不是自动缩放所有列。
将特征和标签分割为训练集和测试集后,将其附加到一个名为split的变量中。这个变量然后包含X_train、X_test、y_train和y_test;将在下面的函数中需要它。
fit = train.fit(X=features,
y=labels,
splitting=True,
split_data=split)
在笔记本中运行此代码,以查看完整的模型列表和分数。
对于那些可能更喜欢以图表而不是数据框查看模型性能结果的人来说,还有一个选项可以将数据框转换为图表。只需要运行以下代码。
train.show(param=fit,
t_split=True)