繁体   English   中英

scikit-learn使用什么距离函数来分类特征?

[英]What distance function is scikit-learn using for categorical features?

我正在学习一点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-learn估计器一起使用,因为它们期望连续输入,并且会将类别解释为有序的,这通常是不希望的(即,任意设置浏览器的顺序)。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM