2017-10-10 90 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