我已经使用随机森林为我的〜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)
如果我尝试将MDS与proximity_matrix
结合使用,则其模式大致相同:
我不是最熟悉MDS,但是当大多数在线文章建议使用该算法可视化距离/相似性矩阵时,我无法解释为什么该算法给我带来最糟糕的结果。
我还验证了矩阵的实际结果是合理的。例如,当我获得与某个特定Facebook广告最相似的广告时(该数据集是对Facebook广告系列效果的付费),我得到的确是有意义的结果(突出显示了我输入的广告,最相似的结果显示在下面) :
任何人都可以给我一些有关我可能做错了什么的指示吗?如果我使用PCA缩小尺寸,则会得到更多“正常”结果(至少两个主成分的差异都在扩大):
答案 0 :(得分:0)
我认为问题来自此行reduced_dimensions = mds.fit_transform(distance_matrix)
,您正在拟合模型,然后转换结果,而不是缩放输入数据并拟合模型。
我认为以这种方式进行操作会导致将其操纵为正态分布,在多个变量的情况下,该正态分布会产生钟形曲线或椭圆形。如果您只尝试mds.fit(distance_matrix)
会怎样?
道歉,因为这更适合作为评论,但我还不可以发表评论。