Как применить KNN к смешанному набору данных (числовому + категориальному) после выполнения горячего кодирования с использованием sklearn или pandas - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь создать рекомендацию на основе различных характеристик объекта (например, категорий, тегов, автора, заголовка, просмотров, общих ресурсов и т. Д.). Как вы можете видеть, эти функции имеют смешанный тип, а также я не имею никаких пользовательских данных. После отображения сведений об одном объекте я хочу отобразить еще 3 похожих объекта. Я пытаюсь использовать kNN со sklearn и обнаружил, что в таких случаях полезно использовать горячее кодирование. Но я не знаю, как применять их вместе с KNN. Любая помощь приветствуется, даже с совершенно другой библиотекой или подходом. Я новичок в ML.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Проверьте интерфейс Pipeline и это хорошее введение. Конвейеры - это чистый способ организации предварительной обработки с выбором моделей и гиперпараметров.

Моя базовая настройка выглядит так:

from sklearn.pipeline import Pipeline, FeatureUnion, make_pipeline
from sklearn.preprocessing import OneHotEncoder
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.neighbors import KNeighborsClassifier

class Columns(BaseEstimator, TransformerMixin):
    def __init__(self, names=None):
        self.names = names

    def fit(self, X, y=None, **fit_params):
        return self

    def transform(self, X):
        return X[self.names]

numeric = [list of numeric column names]
categorical = [list of categorical column names]

pipe = Pipeline([
    ("features", FeatureUnion([
        ('numeric', make_pipeline(Columns(names=numeric),StandardScaler())),
        ('categorical', make_pipeline(Columns(names=categorical),OneHotEncoder(sparse=False)))
    ])),
    ('model', KNeighborsClassifier())
])

Это позволяет вам просто опробовать различные классификаторы, функциональные преобразователи (например, MinMaxScaler () вместо StandardScaler ()), даже в большом сеточном поиске вместе с гиперпараметрами классификатора.

0 голосов
/ 14 мая 2018

Я предполагаю, что у вас уже есть данные, очищенные и сохраненные в pandas.DataFrame или другой массивоподобной структуре. На этом этапе вы должны сделать

import pandas as pd

# Retrieve and clean your data.
# Store it in an object df

df_OHE = pd.get_dummies(df)

# At this stage you will want to rescale your variable to bring them to a similar numeric range
# This is particularly important for KNN, as it uses a distance metric
from sklearn.preprocessing import StandardScaler
df_OHE_scaled = StandardScaler().fit_transform(df_OHE)

# Now you are all set to use these data to fit a KNN classifier.

См. pd.get_dummies () doc . И это обсуждение для объяснения необходимости масштабирования для КНН. Обратите внимание, что вы можете поэкспериментировать с другими типами скейлеров в sklearn.

P.S. Я предполагаю, что вы заинтересованы в решении на python, как вы упомянули эти конкретные пакеты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...