2017-10-10 93 views
0

我正在学习一点ML。我知道k-最近邻居(kNN)的基本知识,但我一直认为它用于例子中的连续数据。什么距离函数是用于分类特征的scikit-learn?

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

我看到如何容易地计算一个二元变量的距离,但是如果没有“订单”的分类变量呢?

编辑:我正在关注Kaggle问题的this教程。洁净数据之后,他有它的形式:

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个年龄段),以及分类但是无序的(例如,根据他们上过哪个端口,已经入住的是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 

然后这一切只是被传递给k近邻是这样的:

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东西?我们没有给出任何信息或指示。

回答

2

sklearn的kNN将对所有要素使用相同(选定)指标(在API中指示;无法混合指标!)。

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

通常功能不是连续的值,而是绝对的。

...

这种整数表示不能直接用于与scikit学习估计,因为这些期望连续输入,并且作为被命令,其通常不期望的(即该组的会解释的类别浏览器被任意订购)。

将分类特征转换为可与scikit-learn估计器一起使用的特征的一种可能性是使用OneHotEncoder中实现的一种K或一种热门编码。这个估计器将每个具有m个可能值的分类特征转换成m个二元特征,只有一个有效。

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

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

嗨,感谢您的回应,它的内容非常丰富。我想我感到困惑的是,在我遵循的Kaggle教程中(https://www.kaggle.com/startupsci/titanic-data-science-solutions/notebook),他们只是天真地将kNN应用于火车/测试数据与所有其他模型一样,其中包含混合功能,而不提供任何信息。这种混合数据在内部做什么?谢谢。 – MasterZibZob

+0

不,他们不是!他们正在将其应用于大量预处理的数据。 – sascha

+0

对不起,我应该让它更清楚我的OP(我现在编辑它)。数据是预处理和所有分类(我注意到我的帖子后),但它仍然是“不同”的分类类型,有些是二进制的,有些是多/有序的,有些是多/不是有序的。 kNN如何知道如何对这些不同类型应用距离? – MasterZibZob