【问题标题】:Why does my sklearn MDS (multi-dimensional scaling) visualization appear so non-informative (perfectly circular and round)?为什么我的 sklearn MDS(多维缩放)可视化看起来如此无信息(完美的圆形和圆形)?
【发布时间】:2019-10-09 12:43:42
【问题描述】:

我已经使用随机森林计算了大约 1000 个数据点的邻近矩阵,但我使用 sklearn 的 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)

如果我尝试使用带有 proximity_matrix 的 MDS,它或多或少是相同的模式:

我不是最熟悉 MDS,但我无法解释为什么当大多数在线文章都建议使用它来可视化距离/相似度矩阵时,这个算法给我的结果最差。

我还验证了矩阵的实际结果是有意义的。例如,当我获得与特定 Facebook 广告最相似的广告(数据集是付费 Facebook 广告系列的表现)时,我得到的结果确实有意义(我输入的广告被突出显示,最相似的结果显示在下面) :

谁能给我一些指示我可能做错了什么?如果我使用 PCA 减少维度,我会得到更“正常”的结果(至少该方差在两个主成分中都在扩展):

【问题讨论】:

  • 我不确定这个算法是做什么的,或者具体是你想要达到的目标,但我想我还是会给出一些建议,因为这样的问题可能会受到较少的关注,因为它很复杂.您是否尝试过删除使用虚拟数据的步骤?也许这可能会产生某种正常化效果。对此,如果其中任何一个执行某种规范化,我猜这就是问题所在。
  • 虚拟数据是one-hot编码分类变量,否则无法表示为数值。这对于特征工程和数据清洗过程部分很重要。我正在尝试将数据点的逻辑组(在本例中为广告)一起显示。然而,MDS 算法本质上只是显示出均匀分布(即数据点通常彼此等距)
  • 我也有同样的问题

标签: python scikit-learn random-forest


【解决方案1】:

我相信问题出在reduced_dimensions = mds.fit_transform(distance_matrix) 这一行@您正在拟合您的模型,然后转换结果,而不是缩放输入数据并拟合模型。

我认为以这种方式进行操作会导致它被操纵成正态分布,在多个变量的情况下会生成钟形曲线或椭圆形。如果您只是尝试 mds.fit(distance_matrix) 会发生什么?

道歉,因为这作为评论更有意义,我还不允许评论。

【讨论】:

  • fit() 不会返回任何内容。它基本上计算缩放空间中的点,但不返回它们。
  • 对不起,我的意思是拟合然后使用模型进行预测,然后绘制预测以可视化
  • 您能否解释一下使用模型进行预测并绘制预测以可视化的意思?我不太清楚你的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2020-05-04
  • 2017-04-12
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多