Почему моя визуализация склеарна MDS (многомерное масштабирование) выглядит неинформативной (идеально круглой и круглой)? - PullRequest
1 голос
/ 23 мая 2019

Я вычислил матрицу близости для моих ~ 1000 точек данных, используя Случайный Лес, но мои результаты визуализации этой матрицы с использованием MDS Склеарна довольно странные и их трудно рассуждать.

Код, который я использовал для обработкимои данные ниже:

data_url = "https://raw.githubusercontent.com/ychennay/ychennay.github.io/master/KAG_conversion_data.csv"

# read data into memory and drop columns
data_string = requests.get(data_url).content
conversions_df = pd.read_csv(StringIO(data_string.decode("utf-8"))
                            )

ad_ids = conversions_df["ad_id"].tolist()

conversions_df = pd.read_csv(StringIO(data_string.decode("utf-8"))
                            ).drop(columns=COLUMNS_TO_DROP)

conversions_df["bias"] = 1 # add a bias/intercept column

# define the target
y = conversions_df[TARGET]

# define features
X = conversions_df.loc[:, ~conversions_df.columns.isin(TARGET)]

# using dictionary convert columns into categorical data types
convert_dict = {'gender': "category",
                'interest':"category",
                "age": "category"}

conversions_df = conversions_df.astype(convert_dict)
dummified_data = pd.get_dummies(conversions_df, drop_first=True) # get dummy features for categorical variables

TARGET = ["Approved_Conversion"]
y = dummified_data[TARGET].values.reshape(-1)
X = dummified_data.loc[:, ~dummified_data.columns.isin(TARGET)]
conversions_df = conversions_df.astype(convert_dict)

После этой предварительной обработки я запускаю ее через RandomForestRegressor, пытаясь предсказать Approved_Conversions в качестве цели:

from sklearn.ensemble import RandomForestRegressor

B = 500
rf = RandomForestRegressor(n_estimators=B)
rf.fit(X, y)

final_positions = rf.apply(X)
proximity_matrix = np.zeros((len(X), len(X)))
# adapted implementation found here: h
# https://stackoverflow.com/questions/18703136/proximity-matrix-in-sklearn-ensemble-randomforestclassifier
for tree_idx in range(B):
    proximity_matrix += np.equal.outer(final_positions[:,tree_idx], 
                                       final_positions[:,tree_idx]).astype(float)
# divide by the # of estimators
proximity_matrix /= B

distance_matrix = 1 - proximity_matrix
distance_matrix = pd.DataFrame(distance_matrix, columns=ad_ids, index=ad_ids)

Однако, когда я строю графикмоя визуализация MDS, визуализация идеально круглая и не очень информативная.Я ожидал, что некоторые когерентные кластеры в данных, которые соответствуют группам точек данных, которые являются наиболее похожими:

from sklearn.manifold import MDS
# from sklearn.decomposition import PCA
mds = MDS(n_components=2,dissimilarity='precomputed')
reduced_dimensions = mds.fit_transform(distance_matrix)

enter image description here

Если я пытаюсь использовать MDSвместо этого proximity_matrix это более или менее тот же шаблон:

enter image description here

Я не очень знаком с MDS, но могуЯ не могу объяснить, почему этот алгоритм дает мне наихудшие результаты, когда большинство онлайн-статей рекомендовали использовать его для визуализации матриц расстояния / сходства.

Я также подтвердил, что фактические результаты матрицы имеют смысл.Например, когда я получаю наиболее похожие объявления с определенным объявлением Facebook (набор данных оплачивается эффективностью кампаний Facebook), я получаю результаты, которые действительно имеют смысл (введенное мной объявление выделяется, а наиболее похожие результаты отображаются ниже): enter image description here

Может кто-нибудь дать мне несколько советов о том, что я могу делать неправильно?Если я уменьшу размеры с помощью PCA, я получу немного более «нормальные» результаты (по крайней мере, эта разница распространяется на оба основных компонента):

enter image description here

1 Ответ

0 голосов
/ 23 мая 2019

Я полагаю, что проблема исходит из этой строки reduced_dimensions = mds.fit_transform(distance_matrix) Вы подгоняете свою модель и затем трансформируете результаты, а не масштабируете входные данные и подгоняете модель.

Я думаю, что выполнение этого способа приводит к тому, что его манипулируют в нормальном распределении, которое генерирует колокольчик или овал в случае нескольких переменных. Что произойдет, если вы просто попробуете mds.fit(distance_matrix)?

Извинения, так как это имеет больше смысла в качестве комментария, я просто не могу комментировать.

...