StringSimilarityEncoder#
The StringSimilarityEncoder() 用一组浮点变量替换分类变量,这些浮点变量捕捉类别名称之间的相似性。新变量的值介于0和1之间,其中0表示没有相似性,1表示类别名称之间的完全匹配。
为了计算类别之间的相似度,StringSimilarityEncoder() 使用了 Gestalt 模式匹配。在内部,StringSimilarityEncoder() 使用了来自 difflib 的 SequanceMatcher() 中的 quick_ratio 方法。
相似度计算如下:
其中 T 是两个序列中元素的总数,M 是匹配的数量。
例如,类别“dog”和“dig”之间的相似度为0.66。T是两个类别中元素的总数,即6。这两个词之间有2个匹配项,即字母d和g,因此:2 * M / T = 2 * 2 / 6 = 0.66。
输出 StringSimilarityEncoder() 的结果#
让我们创建一个包含“狗”、“挖掘”和“猫”类别数据框:
import pandas as pd
from feature_engine.encoding import StringSimilarityEncoder
df = pd.DataFrame({"words": ["dog", "dig", "cat"]})
df
我们在以下输出中看到数据框:
words
0 dog
1 dig
2 cat
现在让我们对变量进行编码:
encoder = StringSimilarityEncoder()
dft = encoder.fit_transform(df)
dft
我们看到了以下编码的变量:
words_dog words_dig words_cat
0 1.000000 0.666667 0.0
1 0.666667 1.000000 0.0
2 0.000000 0.000000 1.0
注意 StringSimilarityEncoder() 用距离变量替换了原始变量。
StringSimilarityEncoder() 对比 One-hot 编码#
字符串相似度编码类似于独热编码,因为每个类别都被编码为一个新变量。但这些值不是1或0,而是观察类别与虚拟变量之间的相似度。它适用于定义不明确(或‘脏’)的分类变量。
仅编码流行类别#
The StringSimilarityEncoder() 还可以为 n 个最流行的类别创建相似性变量,其中 n 由用户决定。例如,如果我们仅对 6 个更流行的类别进行编码,通过设置参数 top_categories=6,转换器将仅添加 6 个最频繁类别的变量。最频繁的类别是那些具有最多观测值的类别。当分类变量具有高基数时,这种行为对于控制特征空间的扩展非常有用。
指定 StringSimilarityEncoder() 应如何处理缺失值#
The StringSimilarityEncoder() 有三种处理缺失值的选项,可以通过参数 missing_values 指定:
忽略 NaN(选项
ignore) - 在转换后将保留结果数据框中的 NaN。如果在管道中的下一步是插补或机器学习算法能够原生处理缺失数据,这可能很有用。填充NaN(选项
impute) - 将使用空字符串填充NaN,然后计算空字符串与变量类别之间的相似度。大多数情况下,结果数据框中的相似度值将为0。这是默认选项。引发错误(选项
raise) - 如果在fit、transform或fit_transform过程中存在 NaN,则会引发错误。这对于调试和监控目的可能很有用。
重要#
StringSimilarityEncoder() 将通过测量与已知类别的字符串相似度,来对未见类别进行编码。
不会对 StringSimilarityEncoder() 应用任何文本预处理。如果需要,请注意准备字符串分类变量。
StringSimilarityEncoder() 默认处理分类变量。它还具有编码数值变量的选项。当数值变量的值作为字符串比作为数字更有用时,这很有用。例如,对于条形码这样的变量。
示例#
让我们来看一个使用泰坦尼克号数据集的例子。首先我们加载数据并将其分为训练集和测试集:
import string
from sklearn.model_selection import train_test_split
from feature_engine.datasets import load_titanic
from feature_engine.encoding import StringSimilarityEncoder
def clean_titanic():
translate_table = str.maketrans('' , '', string.punctuation)
data = load_titanic()
data['home.dest'] = (
data['home.dest']
.str.strip()
.str.translate(translate_table)
.str.replace(' ', ' ')
.str.lower()
)
data['name'] = (
data['name']
.str.strip()
.str.translate(translate_table)
.str.replace(' ', ' ')
.str.lower()
)
data['ticket'] = (
data['ticket']
.str.strip()
.str.translate(translate_table)
.str.replace(' ', ' ')
.str.lower()
)
return data
data = clean_titanic()
# Separate into train and test sets
X_train, X_test, y_train, y_test = train_test_split(
data.drop(['survived', 'sex', 'cabin', 'embarked'], axis=1),
data['survived'],
test_size=0.3,
random_state=0
)
X_train.head()
下面,我们看到了数据集的前几行:
pclass name age sibsp parch \
501 2 mellinger miss madeleine violet 13 0 1
588 2 wells miss joan 4 1 1
402 2 duran y more miss florentina 30 1 0
1193 3 scanlan mr james NaN 0 0
686 3 bradley miss bridget delia 22 0 0
ticket fare boat body \
501 250644 19.5 14 NaN
588 29103 23 14 NaN
402 scparis 2148 13.8583 12 NaN
1193 36209 7.725 NaN NaN
686 334914 7.725 13 NaN
home.dest
501 england bennington vt
588 cornwall akron oh
402 barcelona spain havana cuba
1193 NaN
686 kingwilliamstown co cork ireland glens falls ny
现在,我们设置编码器仅对每个指示的分类变量的2个最频繁类别进行编码:
# set up the encoder
encoder = StringSimilarityEncoder(
top_categories=2,
variables=['name', 'home.dest', 'ticket'],
ignore_format=True
)
# fit the encoder
encoder.fit(X_train)
通过 fit() 方法,编码器将学习变量的最流行类别,这些类别存储在属性 encoder_dict_ 中。
encoder.encoder_dict_
{
'name': ['mellinger miss madeleine violet', 'barbara mrs catherine david'],
'home.dest': ['', 'new york ny'],
'ticket': ['ca 2343', 'ca 2144']
}
encoder_dict_ 包含了将为每个分类变量推导相似性变量的类别。
通过转换,我们继续对变量进行编码。注意,StringSimilarityEncoder() 将丢弃原始变量。
# transform the data
train_t = encoder.transform(X_train)
test_t = encoder.transform(X_test)
test_t.head()
下面,我们看到了生成的数据框:
pclass age sibsp parch fare boat body \
1139 3 38 0 0 7.8958 NaN NaN
533 2 21 0 1 21 12 NaN
459 2 42 1 0 27 NaN NaN
1150 3 NaN 0 0 14.5 NaN NaN
393 2 25 0 0 31.5 NaN NaN
name_mellinger miss madeleine violet name_barbara mrs catherine david \
1139 0.454545 0.550000
533 0.615385 0.524590
459 0.596491 0.603774
1150 0.641509 0.693878
393 0.408163 0.666667
home.dest_nan home.dest_new york ny ticket_ca 2343 ticket_ca 2144
1139 1.0 0.000000 0.461538 0.461538
533 0.0 0.370370 0.307692 0.307692
459 0.0 0.352941 0.461538 0.461538
1150 1.0 0.000000 0.307692 0.307692
393 0.0 0.437500 0.666667 0.666667