使用这些技巧将大大减少多余的工作。 \"我又犯了什么错\"的时间将减少。
> Photo by Nik Shuliahin on Unsplash
机器学习中最常见的误解之一是,机器学习工程师获得了结构良好的数据集,2 l F 3然后他们大部分时间都在优化模型参数。 如果您从事该行业,那么您就会知道这不是事实。 机器学习工程师大部分时间都在计划如何构建可捕获( . S 0 j e { x .所需结果的数据集,然后反复遍历该过程以使其正确。 当您通过精心设计的功能设法捕获正确y f 3 O / 1 $ b的结果时,机器学习模型将不会很难区分$ R # B -结果。
在我的职业生涯中,我主要处理分类问题,需0 ; T H F . =要从数据仓库(即Amazon Redshift或Google Big Qp P Y tuery)中提取数据集。 在迭代数据集构造和调整SQL查询时,我引入了许多错误,然后花费了数小时进K W *行调试P @ . = i。
突然,功能重要性发生了巨大变化k q | q O,目前尚不清楚原因
马上告诉您,如果您已经拥有数据集,并且不能影响其构造E S A 3 s方式(例如,从Kaggle下载),则不适合本博客。 该模板和技巧适用于需要反复处理P E Z I数据集构造的数据处理程序。
当我担任软件工程师时,我发现测试对于质量软件开发至关重要。 测试(写得好的时候)可以保证软件可以使用给定的参数。 我在这里与您分享的提示可确保数据集具有所需的属性。 该模板是一组针对数据集的测试。
您可以下载Jupyter笔记本。
不要错过我有关机器学习和] { E R = ? `数据科学的其他文章:
很少为数据科学家提供帮助
使用BERT和CNN识别仇恨言论
LSTM用于时间序列预测
流失预测
机器7 # s学习技巧,可节省您数小时的辛苦工作
开发机器学习库时不要重复我的错误
数据集
让我们创建一个具有随机特征的样本数据集。 一行代表具有其特征和二进制目标变量的客户。 customer_id是DataFrame中的索引。
np.r. ; C o O 9 & jandom.seed(42)V ? l r | % 3 2 #
n = 1000
df =u o w @ + Y pd.DataFrame(
{
\"customer_id\": [\"customer_%dZ ) p Z ? T\" %Y V d i for i in range(n)],
\"product_a_ratio\": np.ra( 5 H s A b Zndom.random_sample(n),
\"g 3 Q Y G U C Ystd_price_product_a\": np.random.normal(0, 1, n),
\v ; ` `"n_purchases_product_a\": np.random.randint(0, 10, n),
}
)
df.loc[100, \"std_pr, 5 F # z X N Cice_prc B U z $ E -oduct_a\"] = pd.N ; }A
df[\"product_b_ratio\"] = df[\"product_a_ratio\"]
df[\"y\"] = np.random.randint(0, 2, n)
df.set_index(\"customer_id\", inplace=True)
df.shape
df.head()
正负之间的交集
尽管很明显没Y Q z G y B B 6 H有正面标记为负面,但它确实发生了,值得检查一下。 该检查对于\"重新启j O _ K U ( | 2 &动内核并运行所有单元\"命令很有用,因为它} I L # 5 ^ Y m会中断执行。
assert (
len(set(df[df.y == 0].index).intersection(df[df.y == 16 } s t r s f 0 ])) == 0
), \"Positive customers have intersection with negative customers\"
重复项
复制品如何进入训练集中? 用SQL数据库中的联接! 例如。 您通过customer_id键将功能表与其他统p $ . T 4 P # % r计信息结合在一起,如果这些表中的任何一个对某个键具有多个条目,则会创建重复项。
让我们检查一b 7 E v下我们的数据集是否包含重复项。
assert& G p p t 5 Y o len(df[df.index.duplicated()]) == 0, \"There are duplicates in trainss ] r g 6 o ~ o Det\"
缺失值
以我的经验,缺少值的出现有两个. { # M原因:
实际缺失的值-客户没有针对某项功能的条目,
数据集q g ^ ] O中的错误-我们没K ! ]有将NULL映射到默认值,因为我们没有想到它。
在后一种情况下,我们可以简单地修复查询并映射NULL值。 对于真正的缺失值,我们需要知道我们的模型如何处理它们。
例如,n ! 6 8 o默认情况下,LightGBM支持缺少的值,我们可以设置所需的行为。 默认情况下,LightGBM使用N? ` | ^ 5 ` 0 F FA(NaN)表示缺失值。 通过设置zero_as_missing = true将其更改为使用零。 当zero_as_missing = fz @ D S j Lalse(默认值)时,稀疏矩阵(和LighE c Q M 1 ; s ltSVM)中未显示的值视为零。 当zero_as_mi ~ i e X c 5 ussing = true时,NA和零(包括稀疏矩阵(和LightS; K r `VM)中未显示的值)被视为丢失。
让我们检查一下我们的数据集是否包含缺失值。
for col in df.columns:
assert df[df[col].isnull()].shape[0] == 0, \"} : k n%s col has %d missing values\" % (
cq a q ! Bol,
df[df[col].isnull()].shape[0],
)
std_price_q l u Z Uproduct_a列只有一个缺失值。 让我们删除条目并重新运行检查。
df = df[df[\'std_price_product_a\'].notnull()].copy()
for col in df.columns:
assert df[df[col].isnull()].shape[0] == 0, \"%s col has %d missing values\" % (col, df[df[colq } G c V n n].isn` I U h a Z & aull()].shape[0])
在上面的示例中,可以看出这些检查有多有用。 我们7 8 W 6没有花时间进行调试! 支票会立即通知我们有关数据集中的意外值。 如果期望该功能缺少该值,我们可以将其列入白名 p A V单,以便下次检查时不R , u ~ w会出现问题。
特征比例
当我们进行要素工程设计时,某些要素的缩放比例为0–1或其他比例。 值得检查特征是否具有所需的属性。 在此示例中,我们仅检查要素是否在0到1之间的范围内,但是我建议您添加更多适合于数据集的检查。
features_on_0_1_scaleF M k u O c o = [
\'product_a_ratio\',
\'product_b_ratio\',
\'y\',
]
for col in fe2 k ^ R Watures_onw 2 8 ( & w D Q C_0_1_scale:
assert[ & V l k df[col].min() >= 0 and df[col].max() <= 1, \"%s is not on 0 - 1 scale\" % col
特征类型
在开始训练分类器之前,建议u i f | d 9 E (您为每个功能设置数据类型。 刚开始时,您可能感觉好像在做多余的工作,但让我们看下面的示例。
feature_types = {
\"product_a_ratio\": \"float64\",
\"std_price] V a c 4_product_a\": \"float64\",
\"n_purchases_product_a\": \"int64\",
\"product_b_ratio\": \"float64b n 2 8\",
@ p * [ W\"y\": \"int64\",
}
for feature, dtype in fea_ z D ` g r Dture_types.items():
df.loc[:, feature] = df[feature].astys g T ; I Mpe(dtype)
当我们向整数列添加缺失值时,数据类型会怎样? 列数据类型更改为对象数据类型。 当我们将其转换为numpy数组时,它具有浮点数而不是整数g K T p。 分类器可5 J u ^能会误认为序数或分类特征是连续的。
df.n_purchases_product_a.values[:10]
# output
array([0, 8, 0, 2,6 ? 1 _ 8 * i 7, 2, 3, 7, 0, 5])
# add NA to first row
df.loc[0, \"n_purchases_product_a\"] = pd.NA
df.n_purchasU 8 H 0 c R *es_product_a[:10].values
# output
array([g P x0.0, 8.0, 0.0, 2.0, 7.0, 2.0, 3.0, 7.0, 0.0, 5.0], dtype=object)
特征
通常,我们列出要在分类器中使用的功能,因此值得检查一下是否仅指定了一次。 这似乎微不足道,但在进行功能工程和第X次重新运行笔记本时可能会发生。
features = [
\"product_aW 6 u_ratio\",
\"std_price_product_a\",
\"n_purcU ~ B ~ H e l :hases_product_a\",
\A ; 0 n"product_b_ratio\ 6 Q R T } H 7",
]
assert leS ] } |n(set(features)) == len(features), \} 6 + M `"Features names are not unique\f % u U b"
我建议您也列出您在模型中不使用的列。 这样,您可以发现忘记添加的功能。
set(df.columns+ 6 c l x) - set(features)
#K H A H M e f O T Output
{\'y\'}
相关性
在建模时,检查特征之间的相关性至关重要。 Logisti0 F : R Yc回归是一种众所周知的算法,该算法在多重共线性方面存在问{ J D a o P T #题-当您的模型包含相互关联的多个特征时。 对于多重共线性没有问题的模型(例如随机森林或Boosting),高度相关的特征也存在问题。 该模型可以在特征a和9 m a ` V Z h U特征b之间划分特征重要性-但实际上,它们是相同的。
让我们看下面的例子。
co^ W _ ` Q m Orr = df[features].corr()
fig, ax = plt.subplots()
ax = sns.heatmap(corr, vmin=-1, vmax=1, center=1, square=True)
ax.set_xticklabels(ax.get_xticklabelQ K x C 2 vs(), rotation=45, horizontalalignment=\"right\");
在上面的热图中,我们可以观察到product_a_ratio和product_b_ratio高度相关。 在删除相关特征时,我们需要小心,因为尽管相关性X F [ Q k A很高,但它们仍然可以获取信息。 在我们的示例中,# g K a 9 [ 7 _要素的皮尔逊相关系数等于1.0,因此我们可以安全地删除其中之一。 好的做法也是写评论,W b U { a 2并在其中排除功能。
features = [
\"product_a_ratio\",
\"std_price_pro] x Z }duct_a\",
\"n_purchases_product_a\",
# \"product_b_ratio\", # feature has pearson correlation 1.0 with product_a_ratio
]
笔记
训练模型并检查指标后,下一步是对分数最高的几个样本进行完整性检查。 我通常会评论:
在训练集中标记为阳性的前O f 3 U ? w W5个阳性预测,
在训练集中标记为正面的前5个负面预测,
在训练集中标记为负面的前O o e P ( {5个正面预测。
这需要一些手动工作。 多次添加和删除功能时,前5个预测都会更改。 在第5个功能更改之后,现在还不清楚我是否已经查看过该示例。
为& 6 z 2 e ( p了节省时间,好的做法是在W 7 )DataFrame中添加一个nI I g ]otes列,并为您查看的每个样本写一个简短的注释。
df.loc[\'customer_0\', \"notes\s 7 +"] = 9 ; P `\"Positive in# } E - trainingJ * p 8 & $ m f set, but should be negativX u A ( ! K Be\"
df.loc[\'customer_1x j 9 M } A\'6 _ E V f f R, \"notes\"] = t L @ 9 8 A ! a\"good prediction as positive\"
df
结论
使用这些技巧使机器学习更加有趣,并且模板大大减少了多余的工作。 \"我又搞砸了什么\"的时间更少了。 机器学习的工作可能很混乱,因为g R z 9 H T您需要一遍又一遍地遍历同一代码。 本技巧和V Y [ :模板试图使混乱的秩序
您会补充您在职业生涯中学到的技巧吗?
(本文翻译自Roman Orac的文章《Machine Learning Tips that will save you hoursF 9 q M { = & u of head-scratching》,参考:https://towardsdatascience.com/maco u ?hine-learning-_ Z 9 f } ; j _tips-that-will-save-you-hours-0 R O + D ?of-head-scratching-c2a1d85* g C # L f 7 _1aa17) n * & ] F