【发布时间】: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