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

时间:2017-10-10 22:39:07

标签: python machine-learning scikit-learn

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

我现在使用的教程使用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

然后它就像这样传递给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的呢?我们还没有给出任何信息或指示。

1 个答案:

答案 0 :(得分:3)

sklearn的kNN将对所有功能使用相同的(选定的)指标(在API中指明;无混合指标的选项!)。

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

  

通常,功能不是连续值,而是分类。

     

...

     

此类整数表示不能直接与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.