scikit学习的分类特征使用什么距离函数



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

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

我明白了如何容易地计算二元变量的距离,但没有"顺序"的分类变量呢?

编辑:我正在学习这个关于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)

所以这有点奇怪,因为它是二元(例如,性别)、分类和有序(例如,年龄被分为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的事情的呢?我们还没有给它任何信息或指示。

sklearn的kNN将对所有功能使用相同的(选定的)度量(API中指出了这一点;没有混合度量的选项!)。

你是对的,在混合情况下这是有问题的,但你的工作是为此准备数据!标准的方法是使用一个热编码,如下所述:

通常特征不是作为连续值给出的,而是分类的。

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

将分类特征转换为可与scikit学习估计器一起使用的特征的一种可能性是使用在OneHotEncoder中实现的K之一或一个热编码。该估计器将具有m个可能值的每个分类特征转换为只有一个活动的m个二进制特征。

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

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

相关内容

  • 没有找到相关文章

最新更新