понять склеарн QuantileTransformer - PullRequest
6 голосов
/ 15 апреля 2019

Я пытаюсь использовать QuantileTransformer для преобразования нескольких столбцов, но результаты не кажутся удобными.Более того, это зависит от порядка столбцов даже для небольшого набора данных.

Я понимаю, что существует способ создания отдельного преобразователя для каждой функции, но, как я прочитал документацию , эта функциядолжен принять (n_samples, n_features) объект.

Вот google colab для воспроизведения результатов.

Есть ли способ применить QuantileTransformer и получить согласованные результаты (чтобыодни и те же исходные значения отображаются в одни и те же преобразованные значения вместо одного ко многим)?

import pandas as pd
from sklearn.preprocessing import QuantileTransformer

def unique_values(x):
    return x.unique().tolist()

df = pd.read_csv('https://storage.googleapis.com/ml_universities/california_housing_train.csv', usecols=[0, 1])
columns = ['latitude', 'longitude']

qt = QuantileTransformer()
q_features = qt.fit_transform(df)
suffix = '__qt'
qdf = df.join(pd.DataFrame(q_features, columns=columns), rsuffix=suffix)

for col in columns:
    q_col = f'{col}{suffix}'
    print({col: qdf[col].nunique(), q_col: qdf[q_col].nunique()})
    gdf = qdf.groupby(col)[q_col].agg([pd.Series.nunique, unique_values])
    print(gdf.sort_values('nunique', ascending=False).head())

Результаты:

{'latitude': 840, 'latitude__qt': 827}
          nunique                                      unique_values
latitude                                                            
34.07       102.0  [0.9865865865865866, 0.9719719719719734, 0.963...
34.08       101.0  [0.980980980980981, 0.9474474474474475, 0.9214...
34.06        94.0  [0.9846403596403596, 0.932932932932933, 0.9294...
34.10        88.0  [0.9891329870516945, 0.9882813721745806, 0.987...
34.05        87.0  [0.9719719719719734, 0.9269269269269284, 0.923...
{'longitude': 827, 'longitude__qt': 842}
           nunique                                      unique_values
longitude                                                            
-118.31       50.0  [0.6276276276276276, 0.5721203907954981, 0.511...
-118.32       49.0  [0.5369214480068981, 0.504004004004004, 0.4804...
-118.12       49.0  [0.5418393378488674, 0.5415415415415415, 0.540...
-117.25       48.0  [0.5335335335335335, 0.5327261051927988, 0.452...
-118.15       47.0  [0.5495495495495496, 0.5418393378488674, 0.541...

Другой порядок столбцов:

df = pd.read_csv('https://storage.googleapis.com/ml_universities/california_housing_train.csv', usecols=[0, 1])
columns = ['longitude', 'latitude']

qt = QuantileTransformer()
q_features = qt.fit_transform(df)
suffix = '__qt'
qdf = df.join(pd.DataFrame(q_features, columns=columns), rsuffix=suffix)

for col in columns:
    q_col = f'{col}{suffix}'
    print({col: qdf[col].nunique(), q_col: qdf[q_col].nunique()})
    gdf = qdf.groupby(col)[q_col].agg([pd.Series.nunique, unique_values])
    print(gdf.sort_values('nunique', ascending=False).head())

Результаты:

{'longitude': 827, 'longitude__qt': 827}
           nunique            unique_values
longitude                                  
-124.35        1.0  [9.999999977795539e-08]
-118.31        1.0     [0.5900900900900901]
-118.41        1.0      [0.531031031031031]
-118.40        1.0     [0.5355355355355356]
-118.39        1.0      [0.542542542542544]
{'latitude': 840, 'latitude__qt': 842}
          nunique                             unique_values
latitude                                                   
37.74         2.0  [0.7602602602602603, 0.7577577577577578]
37.37         2.0  [0.6806806806806807, 0.6816816816816816]
32.54         1.0                   [9.999999977795539e-08]
38.34         1.0                      [0.8848848848848849]
38.36         1.0                      [0.8873873873873874]
...