使用 sklearn 或 pandas 进行一次热编码后,如何在混合数据集(数值 + 分类)上应用 KNN

sns*_*sns 2 similarity knn pandas scikit-learn one-hot-encoding

我正在尝试根据对象的各种特征(例如:类别、标签、作者、标题、视图、共享等)创建推荐器。正如您所看到的,这些功能是混合类型的,而且我没有任何特定于用户的数据。显示对象之一的详细信息后,我想再显示 3 个类似的对象。我正在尝试将 kNN 与 sklearn 一起使用,并发现单热编码在这种情况下很有用。但我不知道如何将它们与 KNN 一起应用。欢迎任何帮助,即使使用完全不同的库或方法。我是 ML 的新手。

Mar*_* V. 7

查看管道接口和这个很好的介绍。管道是一种通过模型和超参数选择组织预处理的干净方式。

我的基本设置如下所示:

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())
])
Run Code Online (Sandbox Code Playgroud)

这允许您简单地尝试不同的分类器、特征转换器(例如 MinMaxScaler() 而不是 StandardScaler()),甚至在带有分类器超参数的大网格搜索中也是如此。


Myk*_*vyi 4

我假设您已经清理了数据并将其存储在一个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.
Run Code Online (Sandbox Code Playgroud)

请参阅pd.get_dummies() 文档。这个讨论是为了解释 KNN 缩放的必要性。请注意,您可以在 sklearn 中尝试其他类型的缩放器。

PS 我假设你对 python 的解决方案感兴趣,正如你提到的那些特定的包。