Я вычислил матрицу близости для моих ~ 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)
Если я пытаюсь использовать MDSвместо этого proximity_matrix
это более или менее тот же шаблон:
Я не очень знаком с MDS, но могуЯ не могу объяснить, почему этот алгоритм дает мне наихудшие результаты, когда большинство онлайн-статей рекомендовали использовать его для визуализации матриц расстояния / сходства.
Я также подтвердил, что фактические результаты матрицы имеют смысл.Например, когда я получаю наиболее похожие объявления с определенным объявлением Facebook (набор данных оплачивается эффективностью кампаний Facebook), я получаю результаты, которые действительно имеют смысл (введенное мной объявление выделяется, а наиболее похожие результаты отображаются ниже):
Может кто-нибудь дать мне несколько советов о том, что я могу делать неправильно?Если я уменьшу размеры с помощью PCA, я получу немного более «нормальные» результаты (по крайней мере, эта разница распространяется на оба основных компонента):