【问题标题】:What distance function is scikit-learn using for categorical features?scikit-learn 对分类特征使用什么距离函数?
【发布时间】:2018-03-22 11:18:36
【问题描述】:

我正在学习一点机器学习。我知道 k 近邻 (kNN) 的基础知识,但我总是看到它在示例中用于连续数据。

我现在学习的教程使用 kNN 对一些混合类型的数据(连续特征和几个分类特征)进行分类。我知道对于连续的,通常只使用诸如欧几里得距离之类的东西,但是当它混合时他们如何处理呢?

我知道如何轻松计算二进制变量的距离,但是没有“顺序”的分类变量呢?

编辑:我正在关注this Kaggle 问题教程。清理数据后,他的格式为:

Survived    Pclass  Sex Age Fare    Embarked    Title   IsAlone Age*Class
0   0   3   0   1   0   0   1   0   3
1   1   1   1   2   3   1   3   0   2
2   1   3   1   1   1   0   2   1   3
3   1   1   1   2   3   0   3   0   2
4   0   3   0   2   1   0   1   1   6
5   0   3   0   1   1   2   1   1   3
6   0   1   0   3   3   0   1   1   3
7   0   3   0   0   2   0   4   0   0
8   1   3   1   1   1   0   3   0   3
9   1   2   1   0   2   1   3   0   0

(第一列实际上是ID)

所以这有点奇怪,因为它是二进制(例如,Sex)、分类和有序(例如,Age 被分成 4 或 5 个年龄段)和分类但无序(例如,Embarked 是 0、1、或 2 基于他们上的哪个端口,所以我认为它没有订单)。

数据拆分如下:

X_train = train_df.drop("Survived", axis=1)
Y_train = train_df["Survived"]
X_test  = test_df.drop("PassengerId", axis=1).copy()
X_train.shape, Y_train.shape, X_test.shape

然后这一切都像这样传递给 kNN:

knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, Y_train)
Y_pred = knn.predict(X_test)
acc_knn = round(knn.score(X_train, Y_train) * 100, 2)
acc_knn

那么它是如何处理 kNN 的呢?我们没有提供任何信息或指示。

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    sklearn 的 kNN 将对所有特征使用相同的(选择的)度量(在 API 中指出;没有混合度量的选项!)。

    您是对的,这在混合情况下是有问题的,但是为此准备数据是您的工作!标准方法是使用 one-hot 编码,如 here 所述:

    特征通常不是连续值而是分类值。

    ...

    这种整数表示不能直接与 scikit-learn 估计器一起使用,因为它们期望连续输入,并且会将类别解释为有序,这通常是不希望的(即浏览器集是任意排序的)。

    将分类特征转换为可与 scikit-learn 估计器一起使用的特征的一种可能性是使用 one-of-K 或 one-hot 编码,该编码在 OneHotEncoder 中实现。该估计器将具有 m 个可能值的每个分类特征转换为 m 个二进制特征,只有一个处于活动状态。

    根据您的数据,这可能会大大增加特征的数量!在这种情况下,您需要做出决定:

    • 使用密集数据结构(并且仍然能够在内部使用 kd-trees / ball-trees)
    • 使用稀疏数据结构(将使用暴力查找;Note: fitting on sparse input will override the setting of this parameter, using brute force.

    【讨论】:

    • 您好,感谢您的回复,它确实提供了丰富的信息。我想我感到困惑的是,在我正在关注的 Kaggle 教程(kaggle.com/startupsci/titanic-data-science-solutions/notebook)中,他们只是像所有其他模型一样天真地将 kNN 应用于训练/测试数据,其中包括混合特征,没有给它任何信息。它在内部用这些混合数据做什么?谢谢。
    • 没有。他们不是!他们将其应用于经过大量预处理的数据。
    • 对不起,我应该更清楚地说明我的 OP(我现在编辑了它)。数据经过预处理并且都是分类的(我在发布后注意到),但它仍然是“不同的”分类类型,有些是二进制的,有些是多/有序的,有些是多/无序的。 kNN 如何知道如何对这些不同类型应用距离?
    • 它不关心也不关心。在您文章下的 cmets 中,人们已经在抱怨 embarked
    • 啊,我明白了,抱歉我之前没听懂你的意思。因此,如果它们是有序的,天真地为分类特征做它可能不是坏事,但如果它们只是单独的值(如 Embarked),那么你应该使用 OHE,所以它不会对真正的混合特征值产生奇怪的影响不能“混”。谢谢!
    猜你喜欢
    • 2021-03-26
    • 2014-02-17
    • 2015-01-12
    • 1970-01-01
    • 2013-04-30
    • 2016-02-25
    • 2018-02-24
    • 2018-11-23
    • 2020-08-08
    相关资源
    最近更新 更多