模型训练/测试的成对比较 - 如何调整参数?

时间:2021-07-12 16:34:10

标签: python random-forest xgboost modeling

由于某些原因,我有以下结构的基本数据框

print(df1.shape)
display(df1.head())
print(df2.shape)
display(df2.head())

enter image description here

顶部数据框是我的特征集,底部是输出集。为了将其转化为适合数据建模的问题,我首先要做的是:

x_train, x_test, y_train, y_test = train_test_split(df1, df2, train_size = 0.8)

然后我分成 80% 的训练和 20% 的测试。

由于输出集 (df2; y_test/y_train) 是单独的测量值,它们本身没有内在意义,我计算标签之间的成对距离以生成单个输出值,表示使用(距离计算) z-scoring之后;z-scoring代码这里没有描述但已经完成):

y_train = pdist(y_train, 'euclidean')
y_test = pdist(y_test, 'euclidean')

同样地,我将这个策略应用到特征集,以在每个特征的每个实例的单独观察之间生成成对距离。

def feature_distances(input_vector):
    modified_vector = np.array(input_vector).reshape(-1,1)
    vector_distances = pdist(modified_vector, 'euclidean')
    vector_distances = pd.Series(vector_distances)
    return vector_distances

x_train = x_train.apply(feature_distances, axis = 0)
x_test = x_test.apply(feature_distances, axis = 0)

然后我继续训练和测试我的所有模型。 现在我正在尝试线性回归、随机森林、xgboost。

有什么简单的方法可以在我的数据集中实施交叉验证方案? 由于我的问题需要计算观测值之间的成对距离,我正在努力寻找一种简单的方法来执行交叉验证方案以优化参数调整。

GridsearchCV 在这里不太适用,因为在测试/火车拆分的每个实例中,必须重新计算距离以避免测试与火车的污染。

希望清楚!

2 个答案:

答案 0 :(得分:0)

x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.8, random_state=n)

这里 X 是独立特征,y 是从属特征意味着你真正想要预测的 - 它可以是标签或连续值。我们在训练数据集上使用了 train_test_split,我们使用 (x_train, y_train) 来训练模型和 (x_test, y_test) 来测试模型以确保性能未知数据上的模型(x_testy_test)。在您的情况下,您将 y 设为 df2,这是错误的,只需找出您的目标特征并将其设为 y,无需拆分测试数据。

答案 1 :(得分:0)

首先,我从您的数据框的形状中了解到,您在输入中有 42 个样本和 1643 个特征,每个输出向量由 392 个值组成。

巨大的输入:如果您确定您的问题有 1643 个特征,您可能需要使用 PCA 来降低维度而不是成对距离。您应该收集更多样本而不是 42 个样本以避免过度拟合,因为没有足够的数据来训练和测试您的模型。

巨大输出:您可以使用 sampled_softmax_loss 来加速训练过程,如 TensorFlow documentation 中所述。您也可以阅读此here。如果您不想遵循这种方法,您可以继续使用此输出进行训练,但这需要一些时间。